qjackctl-1.0.6/PaxHeaders/CMakeLists.txt0000644000000000000000000000013215174607203015135 xustar0030 mtime=1777536643.502604493 30 atime=1777536643.502604493 30 ctime=1777536643.502604493 qjackctl-1.0.6/CMakeLists.txt0000644000175000001440000002571515174607203015137 0ustar00rncbcuserscmake_minimum_required (VERSION 3.15) project (QjackCtl VERSION 1.0.6 DESCRIPTION "JACK Audio Connection Kit - Qt GUI Interface" HOMEPAGE_URL "https://qjackctl.sourceforge.io" LANGUAGES C CXX) set (PROJECT_TITLE "${PROJECT_NAME}") string (TOLOWER "${PROJECT_TITLE}" PROJECT_NAME) set (PROJECT_COPYRIGHT "Copyright (C) 2003-2026, rncbc aka Rui Nuno Capela. All rights reserved.") set (PROJECT_DOMAIN "rncbc.org") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") execute_process ( COMMAND git describe --tags --dirty --abbrev=6 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE GIT_DESCRIBE_OUTPUT RESULT_VARIABLE GIT_DESCRIBE_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE) if (GIT_DESCRIBE_RESULT EQUAL 0) set (GIT_VERSION "${GIT_DESCRIBE_OUTPUT}") string (REGEX REPLACE "^[^0-9]+" "" GIT_VERSION "${GIT_VERSION}") string (REGEX REPLACE "-g" "git." GIT_VERSION "${GIT_VERSION}") string (REGEX REPLACE "[_|-]" "." GIT_VERSION "${GIT_VERSION}") execute_process ( COMMAND git rev-parse --abbrev-ref HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE GIT_REVPARSE_OUTPUT RESULT_VARIABLE GIT_REVPARSE_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE) if (GIT_REVPARSE_RESULT EQUAL 0 AND NOT GIT_REVPARSE_OUTPUT STREQUAL "main") set (GIT_VERSION "${GIT_VERSION} [${GIT_REVPARSE_OUTPUT}]") endif () set (PROJECT_VERSION "${GIT_VERSION}") endif () if (CMAKE_BUILD_TYPE MATCHES "Debug") set (CONFIG_DEBUG 1) set (CONFIG_BUILD_TYPE "debug") else () set (CONFIG_DEBUG 0) set (CONFIG_BUILD_TYPE "release") set (CMAKE_BUILD_TYPE "Release") endif () set (CONFIG_PREFIX "${CMAKE_INSTALL_PREFIX}") include (GNUInstallDirs) set (CONFIG_BINDIR "${CONFIG_PREFIX}/${CMAKE_INSTALL_BINDIR}") set (CONFIG_LIBDIR "${CONFIG_PREFIX}/${CMAKE_INSTALL_LIBDIR}") set (CONFIG_DATADIR "${CONFIG_PREFIX}/${CMAKE_INSTALL_DATADIR}") set (CONFIG_MANDIR "${CONFIG_PREFIX}/${CMAKE_INSTALL_MANDIR}") # Disable system tray argument option. option (CONFIG_SYSTEM_TRAY "Enable system tray (default=yes)" 1) # Enable JACK session support. option (CONFIG_JACK_SESSION "Enable JACK session support (default=yes)" 1) # Enable JACK port aliases support. option (CONFIG_JACK_PORT_ALIASES "Enable JACK port aliases support (default=yes)" 1) # Enable JACK metadata support. option (CONFIG_JACK_METADATA "Enable JACK metadata support (default=yes)" 1) # Enable JACK MIDI support option. option (CONFIG_JACK_MIDI "Enable JACK MIDI support (default=yes)" 1) # Enable JACK CV support option. option (CONFIG_JACK_CV "Enable JACK CV support (default=yes)" 1) # Enable JACK OSC support option. option (CONFIG_JACK_OSC "Enable JACK OSC support (default=yes)" 1) # Enable JACK version support. option (CONFIG_JACK_VERSION "Enable JACK version support (default=no)" 0) # Enable ALSA sequencer support option. option (CONFIG_ALSA_SEQ "Enable ALSA/MIDI sequencer support (default=yes)" 1) # Enable PortAudio argument option. option (CONFIG_PORTAUDIO "Enable PortAudio interface (default=yes)" 1) # Enable CoreAudio argument option. option (CONFIG_COREAUDIO "Enable CoreAudio interface (default=yes)" 1) # Enable D-Bus argument option. option (CONFIG_DBUS "Enable D-Bus interface (default=yes)" 1) # Enable unique/single instance. option (CONFIG_XUNIQUE "Enable unique/single instance (default=yes)" 1) # Enable debugger stack-trace option (assumes --enable-debug). option (CONFIG_STACKTRACE "Enable debugger stack-trace (default=no)" 0) # Enable Qt6 build preference. option (CONFIG_QT6 "Enable Qt6 build (default=yes)" 1) # Enable install QT DLLs for Windows targets using windeployqt. option (CONFIG_INSTALL_QT "Install Qt for MacOS and Windows targets (default=no)" 0) # Fix for new CMAKE_REQUIRED_LIBRARIES policy. if (POLICY CMP0075) cmake_policy (SET CMP0075 NEW) endif () # Check for Qt... if (CONFIG_QT6) find_package (Qt6 QUIET) if (NOT Qt6_FOUND) set (CONFIG_QT6 0) endif () endif () if (CONFIG_QT6) find_package (QT QUIET NAMES Qt6) else () find_package (QT QUIET NAMES Qt5) endif () find_package (Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Gui Widgets Xml Svg) if (CONFIG_XUNIQUE) find_package (Qt${QT_VERSION_MAJOR} COMPONENTS Network) if (NOT Qt${QT_VERSION_MAJOR}Network_FOUND) message (WARNING "*** QT Network library not found.") set (CONFIG_XUNIQUE 0) endif () endif () if (CONFIG_DBUS) find_package (Qt${QT_VERSION_MAJOR} COMPONENTS DBus) if (NOT Qt${QT_VERSION_MAJOR}DBus_FOUND) message (WARNING "*** QT DBus library not found.") set (CONFIG_DBUS 0) endif () endif () find_package (Qt${QT_VERSION_MAJOR}LinguistTools) include (CheckIncludeFile) include (CheckIncludeFiles) include (CheckIncludeFileCXX) include (CheckLibraryExists) include (CheckSymbolExists) # Checks for header files. if (UNIX AND NOT APPLE) check_include_files ("fcntl.h;unistd.h;signal.h" HAVE_SIGNAL_H) endif () # Find package modules include (FindPkgConfig) pkg_check_modules (JACK IMPORTED_TARGET jack>=0.100.0) if (JACK_FOUND) find_library (JACK_LIBRARY NAMES ${JACK_LIBRARIES} HINTS ${JACK_LIBDIR}) if (JACK_LIBRARY) set (CONFIG_JACK 1) set (CMAKE_REQUIRED_LIBRARIES "${JACK_LIBRARIES};${CMAKE_REQUIRED_LIBRARIES}") set (CMAKE_REQUIRED_INCLUDES "${JACK_INCLUDE_DIRS};${CMAKE_REQUIRED_INCLUDES}") else () message (FATAL_ERROR "*** JACK library not found.") set (CONFIG_JACK 0) endif () else () message (FATAL_ERROR "*** JACK package not found.") set (CONFIG_JACK 0) endif () # Check for jack/statistics.h header. check_include_file (jack/statistics.h HAVE_JACK_STATISTICS_H) if (NOT HAVE_JACK_STATISTICS_H) set (CONFIG_JACK_STATISTICS 0) else () set (CONFIG_JACK_STATISTICS 1) endif () # Check for JACK MIDI headers availability. if (CONFIG_JACK_MIDI) check_include_file (jack/midiport.h HAVE_JACK_MIDIPORT_H) if (NOT HAVE_JACK_MIDIPORT_H) set (CONFIG_JACK_MIDI 0) endif () endif () # Check for JACK session headers availability. if (CONFIG_JACK_SESSION) check_include_file (jack/session.h HAVE_JACK_SESSION_H) if (NOT HAVE_JACK_SESSION_H) set (CONFIG_JACK_SESSION 0) endif () endif () # Check for JACK metadata headers availability. if (CONFIG_JACK_METADATA) check_include_file (jack/metadata.h HAVE_JACK_METADATA_H) if (NOT HAVE_JACK_METADATA_H) set (CONFIG_JACK_METADATA 0) endif () endif () if (NOT CONFIG_JACK_METADATA) set (CONFIG_JACK_CV 0) set (CONFIG_JACK_OSC 0) endif () # Check for jack_is_realtime function. check_symbol_exists (jack_is_realtime "jack/jack.h" CONFIG_JACK_REALTIME) # Check for jack_free function. check_symbol_exists (jack_free "jack/jack.h" CONFIG_JACK_FREE) # Check for jack_set_port_rename_callback check_symbol_exists (jack_set_port_rename_callback "jack/jack.h" CONFIG_JACK_PORT_RENAME) # Check for jack_transport_query function. check_symbol_exists (jack_transport_query "jack/transport.h" CONFIG_JACK_TRANSPORT) # Check for jack_get_xrun_delayed_usecs function. check_symbol_exists (jack_get_xrun_delayed_usecs "jack/statistics.h" CONFIG_JACK_XRUN_DELAY) # Check for jack_get_max_delayed_usecs function. check_symbol_exists (jack_get_max_delayed_usecs "jack/statistics.h" CONFIG_JACK_MAX_DELAY) # Check for jack_port_get_aliases function. if (CONFIG_JACK_PORT_ALIASES) check_symbol_exists (jack_port_get_aliases "jack/jack.h" HAVE_JACK_PORT_ALIASES) if (NOT HAVE_JACK_PORT_ALIASES) set (CONFIG_JACK_PORT_ALIASES 0) endif () endif () # Check for jack_get_version_string function. if (CONFIG_JACK_VERSION) check_symbol_exists (jack_get_version_string "jack/jack.h" HAVE_JACK_VERSION) if (NOT HAVE_JACK_VERSION) set (CONFIG_JACK_VERSION 0) endif () endif () # Check for ALSA libraries. if (CONFIG_ALSA_SEQ) find_package (ALSA) if (ALSA_FOUND) set (CONFIG_ALSA_SEQ 1) set (CMAKE_REQUIRED_LIBRARIES "${ALSA_LIBRARIES};${CMAKE_REQUIRED_LIBRARIES}") set (CMAKE_REQUIRED_INCLUDES "${ALSA_INCLUDE_DIRS};${CMAKE_REQUIRED_INCLUDES}") else () message (WARNING "*** ALSA library not found.") set (CONFIG_ALSA_SEQ 0) endif () endif () # Check for PORTAUDIO libraries. if (CONFIG_PORTAUDIO) find_package (PortAudio) if (PortAudio_FOUND) set (CONFIG_PORTAUDIO 1) #set (CMAKE_REQUIRED_LIBRARIES "${PORTAUDIO_LIBRARY};${CMAKE_REQUIRED_LIBRARIES}") else () message (WARNING "*** PORTAUDIO library not found.") set (CONFIG_PORTAUDIO 0) endif () endif () if (CONFIG_COREAUDIO) if (APPLE) check_include_file ("CoreAudio/CoreAudio.h" HAVE_COREAUDIO_H) find_library(CORE_FOUNDATION_LIBRARY CoreFoundation) find_library(CORE_AUDIO_LIBRARY CoreAudio) endif () if (NOT APPLE OR NOT HAVE_COREAUDIO_H OR NOT CORE_FOUNDATION_LIBRARY OR NOT CORE_AUDIO_LIBRARY) set (CONFIG_COREAUDIO 0) endif () endif () add_subdirectory (src) # Finally check whether Qt is statically linked. if (QT_FEATURE_static) set(QT_VERSION "${QT_VERSION}-static") endif () # Configuration status macro (SHOW_OPTION text value) if (${value}) message ("${text}: yes") else () message ("${text}: no") endif () endmacro () message ("\n ${PROJECT_TITLE} ${PROJECT_VERSION} (Qt ${QT_VERSION})") message ("\n Build target . . . . . . . . . . . . . . . . . . .: ${CONFIG_BUILD_TYPE}\n") show_option (" JACK Audio Connection Kit support . . . . . . . ." CONFIG_JACK) show_option (" JACK Realtime support . . . . . . . . . . . . . ." CONFIG_JACK_REALTIME) show_option (" JACK Transport support . . . . . . . . . . . . . ." CONFIG_JACK_TRANSPORT) show_option (" JACK XRUN delay support . . . . . . . . . . . . ." CONFIG_JACK_XRUN_DELAY) show_option (" JACK Maximum scheduling delay support . . . . . ." CONFIG_JACK_MAX_DELAY) show_option (" JACK Port aliases support . . . . . . . . . . . ." CONFIG_JACK_PORT_ALIASES) show_option (" JACK Metadata support . . . . . . . . . . . . . ." CONFIG_JACK_METADATA) show_option (" JACK MIDI support . . . . . . . . . . . . . . . ." CONFIG_JACK_MIDI) show_option (" JACK CV support . . . . . . . . . . . . . . . . ." CONFIG_JACK_CV) show_option (" JACK OSC support . . . . . . . . . . . . . . . . ." CONFIG_JACK_OSC) show_option (" JACK Session support . . . . . . . . . . . . . . ." CONFIG_JACK_SESSION) show_option (" JACK Version support (JACK2) . . . . . . . . . . ." CONFIG_JACK_VERSION) show_option (" ALSA MIDI Sequencer support . . . . . . . . . . ." CONFIG_ALSA_SEQ) show_option (" System tray icon support . . . . . . . . . . . . ." CONFIG_SYSTEM_TRAY) show_option (" D-Bus interface support . . . . . . . . . . . . ." CONFIG_DBUS) show_option (" PortAudio interface support . . . . . . . . . . ." CONFIG_PORTAUDIO) show_option (" CoreAudio interface support . . . . . . . . . . ." CONFIG_COREAUDIO) message ("") show_option (" System tray icon support . . . . . . . . . . . . ." CONFIG_SYSTEM_TRAY) show_option (" Unique/Single instance support . . . . . . . . . ." CONFIG_XUNIQUE) show_option (" Debugger stack-trace (gdb) . . . . . . . . . . . ." CONFIG_STACKTRACE) show_option (" Install Qt on MacOS / Windows . . . . . . . . . ." CONFIG_INSTALL_QT) message ("\n Install prefix . . . . . . . . . . . . . . . . . .: ${CONFIG_PREFIX}\n") qjackctl-1.0.6/PaxHeaders/ChangeLog0000644000000000000000000000013215174607203014147 xustar0030 mtime=1777536643.502604493 30 atime=1777536643.502604493 30 ctime=1777536643.502604493 qjackctl-1.0.6/ChangeLog0000644000175000001440000021704115174607203014144 0ustar00rncbcusersQjackCtl - JACK Audio Connection Kit Qt GUI Interface ----------------------------------------------------- ChangeLog 1.0.6 2026-04-30 A Spring'26 Release. - Graph: make sure thumb-view widget background is filled/opaque (ie. not transparent) - Fixed JACK metadata properties assignment (aka. pretty-names) vs. native client/port name aliases. 1.0.5 2026-02-16 A Mid-Winter'26 Release. - Graph: Save node positions as soon as they are taken or moved around, avoiding accidental re-positioning to the previous or original state. - Get rid of CONFIG_WAYLAND build config option; add underlying platform name (eg. xcb, wayland) to Qt version string. 1.0.4 2025-03-27 An Early Spring'25 Release. - Fixed command line parsing (QCommandLineParser/Option) to not exiting the application with a segfault when showing help and version information. - Graph: force an actual complete refresh on main View/Refresh..., especially when changing the color theme palette on-the-fly. 1.0.3 2024-10-29 An Autumn'24 Release. - Long missing D-Bus method slot added: "reset" (dbus-send --system / org.rncbc.qjackctl.reset). - Graph: Node reference positioning changed to the top-left corner, improving the base snapping-to-grid perception. - Prepping up next development cycle (Qt >= 6.8) 1.0.2 2024-09-17 An End-of-Summer'24 Release. - Graph: when visible the thumb-view may now be drag-moved over to a different corner position anytime. - Session: introducing new Save session name/directory dialog. - Connections: connector line colors are now uniquely mapped on a (readable/output) client name basis. 1.0.1 2024-08-01 A Summer'24 Release. - Graph: thumb-view repositions and resizes immediately when visible. - Graph: Implement patchbay node search functionality: adds a floating text-entry field, which appears when typing in the canvas, selecting nodes that contains the typed text (maybe regular expression). - Graph: fixed a potential use-after-free issue on canvas nodes refresh and recycle. 1.0.0 2024-06-19 An Unthinkable Release. - Making up the unthinkable (aka. v1.0.0) - Cancel button option added to close to system-tray icon message. - Graph: Introducing thumbview context-menu. 0.9.91 2024-05-01 A Spring'24 Release Candidate 2. - Prepping the unthinkable (aka. v1.0.0-rc2) - Graph: Introducing the View/Thumbview option as a whole graph thumbnail overview helper. - Updated to latest framework level (Qt >= 6.7) 0.9.90 2024-04-10 A Spring'24 Release Candidate. - Prepping the unthinkable (aka. v1.0.0-rc1) - Custom color themes are now file based (*.conf); legacy still preserved ntl. - Old generic "Portuguese" translation (pt) has been corrected to the more proper "Portuguese (Brazil)" locale (pt_BR). - Simplified and shortened the main window title. 0.9.13 2024-01-24 A Winter'24 Release. - Graph: Make the main canvas background to mid-gray, when on non-dark color themes. - Turkish (tr) translation added. - Updated copyright headers into the New Year (2024). 0.9.12 2023-09-09 An End-of-Summer'23 Release. - Setup: disable Settings parameters altogether, except frames/period (aka. buffer-size) if running in the so called 'Active' pure-client mode (eg. under PipeWire's pw-jack substitution). - Connections: Fixed an old JACK client/ports aliases malfunction, hopefully. - Graph: Ctrl+left or middle-button click-dragging for panning, is now a lot smoother, hopefully. - Graph: Click-dragging with the mouse middle-button is now used for panning only, not to start a selection anymore. - Preppings to next development cycle (Qt >= 6.6) 0.9.11 2023-06-01 A Spring'23 Release. - Graph: Soft incremental bounds constraints now imposed to all new and old nodes positioning. - Prepping into the next development cycle (with Qt >= 6.5). 0.9.10 2023-03-23 An Early-Spring'23 Release. - Setup: revert to previous settings when dismissing the dialog. - Graph: Attempt to make port labels as short as possible. - Graph: introducing touch pinch-gesture for zooming. 0.9.9 2022-12-28 An End-of-Year'22 Release. - Graph: whether to draw connectors through or around nodes is a new user preference option (cf. View > Connect Through Nodes). - Graph: Allow middle mouse button for grabbing and dragging the main canvas. - Make up visual immediate feedback connectlons. 0.9.8 2022-10-03 An Early-Autumn'22 release. - Graph: View / Repel Overlapping Nodes option added. - Avoid nagging on D-BUS error messsage windows (or bubbles) when trying to start in pure JACK client mode (Active). - Add current system user-name to the singleton/unique application instance identifier. - Graph/Connect and Disconnect keyboard shortcuts added to existing [Ins] and [Del], as [Ctrl+C] and [Ctrl+D] respectively; also added [F2] as brand new keyboard shortcut for Edit/Rename... 0.9.7 2022-04-02 A Spring'22 Release. - Main application icon is now presented in scalable format (SVG). - Migrated command line parsing to QCommandLineParser/Option (Qt >= 5.2) - Fixed translations path to be relative to application runtime. 0.9.6 2022-01-09 A Winter'22 Release. - Dropped autotools (autoconf, automake, etc.) build system. - Limit or mitigate fast auto-scrolling when moving Graph client nodes off the viewport. - Whenever possible, adopt the previous named default preset, when starting the JACK-server on premises. - Conditional fix to MacOSX and FreeBSD builds. 0.9.5 2021-10-05 An Autumn'21 Release. - Streamlined Windows and MacOSX deliverables (by Alexis Murzeau). - Korean (ko) translation added (by JungHee Lee). 0.9.4 2021-07-04 An Early-Summer'21 Release. - All builds default to Qt6 (Qt >= 6.1) where available. - CMake is now the official build system. 0.9.3 2021-05-11 A Spring'21 Release. - Graph connection lines drop-shadow eye-candy has been optimized, improving a lot on moving highly-connected nodes, especially the ones with plenty of backward-curved connections. - All packaging builds switching to CMake. - Fixed default preset/aliases switching and reloading when entering pure-client mode (ie. "Active" status). 0.9.2 2021-03-14 An End-of-Winter'21 Release. - Clock source, Self-connect mode and Server synchronous mode options are now always enabled on the Setup / Settings dialog, although only available or effective to jackd2. - Graph Disconnect now applies to selected connections or nodes only. 0.9.1 2021-02-07 A Winter'21 Release. - Graph Disconnect now applies to all selected ports and connections. - Main window is now freely resizable, while keeping all the buttons stretched to the same aspect ratio. - Warning to confirm application close is now back in business when functioning as client only (Active). - Graph items are automatically raised when created or high-lighted (incremental z-value). - Add a little but straight horizontal line-gap to the Graph connections. - Customize the Graph zoom slider widget to reset upon mouse middle-button click. - Add Clear preset button to Setup dialog. - Use default values for most preset parameters: sample rate, frames/period (aka. buffer-size), periods/buffer, realtime priority, port maximum, client timeout, word length, wait time, channel maximum. - Early preparations for the New Year develop(ment) cycle. 0.9.0 2020-12-17 A Winter'20 Release. - List only available backend drivers when JACK D-BUS is enabled. - Graph client-name / node-title aliases persistence have been hopefully fixed. - Get rid of those "JACK has crashed" red-herrings from latest Windows(tm) builds. - Early fixing to build for Qt >= 6.0.0 and comply with C++17 standard. 0.6.3 2020-07-31 A Summer'20 Release. - Clock source and Self connect restriction options have been added to Setup / Settings / Advanced (only enabled when JACK D-BUS control interface is in effect). - Added preliminary support for JACK CV signal-type ports and JACK OSC event-type ports (Graph only). - Left-clicking on the system-tray icon now simply toggles the main widget visibility, disregarding if already hidden undercover to other windows. - Graph nodes and ports are now presented with some gradient background. - Fixed Setup dialog Cancel (or close) behavior when Settings > Parameters > Frames/Period (aka. buffer- size) it's the only setting that's changed. - Early fixing to build for Qt >= 5.15.0. 0.6.2 2020-03-24 A Spring'20 Release. - A scalable (.svg) icon version has been added. - Make man page compression reproducible (after request by Jelle van der Waa, while on the Vee-Ones, thanks). - Ditching deprecated QTime methods for QElapsedTimer's (in compliance to Qt >= 5.14.0). - Bumped copyright headers into the New Year (2020). 0.6.1 2019-12-22 The Winter'19 Release. - Custom color (palette) theme editor introduced; color (palette) theme changes are now effective immediately, except on default. - Second attempt to fix the yet non-official though CMake build configuration. - When using autotools and ./configure --with-qt=..., it is also necessary to adjust the PKG_CONFIG_PATH environment variable (after a merge request by plcl aka. Pedro López-Cabanillas, while on qmidinet, thanks). 0.6.0 2019-10-17 An Autumn'19 Release. - Graph: avoid self-connecting over their own ports when client nodes are selected as a whole group; also try to match port-types in a oderly fashion when connecting multiple selected ports. - Changing current JACK buffer size from Setup dialog (cf. Settings /Frames/Period) may now take effect just immediately ;) - An 'Apply' button as been added to the Setup dialog; ask whether to restart the JACK audio server, if any settings are changed. - Added alternate yet non-official CMake build option. - Fix HiDPI display screen effective support (Qt >= 5.6). - Command line arguments (--start, --preset=[label] and --active -patchbay=[path]) are passed and take effect on the current singleton/unique application instance, when enabled and already running. - System-tray icon context menu has been refactored to be exactly the same as the main-window context menu that is re-instantiated on demand. - Make sure compiler flags comply to c++11 as standard. 0.5.9 2019-07-12 A Summer'19 Release. - Updated for the newer Qt5 translation tools (>= 5.13). - Configure updated to check for qtchooser availability. 0.5.8 2019-05-25 A Spring'19 Release. - When enabled the current default preset settings are now read from the last known JACK D-BUS configuration. - Minor update to Debian packaging control file. - Removed all the remaining leftovers of old pre-FFADO 'freebob' driver support. 0.5.7 2019-03-11 A Spring-Break'19 Release. - Graph node and port title renaming and nodes position move changes are now undo/redo-able. - Graph client and port title in-place renaming is now integrated to native aliases and JACK metadata (aka. pretty-names). - Refactored all native client/port name aliases. - Re-defined all main application UNIX signal handling. 0.5.6 2019-03-11 Pre-LAC2019 Release Frenzy. - Refactored all singleton/unique application instance setup logic away from X11/Xcb hackery. - At last, JACK freewheel mode is now being detected as to postpone any active patchbay scans as much as possible. - Removed old pre-FFADO 'freebob' driver support. - HiDPI display screen support (Qt >= 5.6). - Graph port temporary highlighting while hovering, if and only if connecting ports of same type and complementary modes. - Bumped copyright headers into the New Year (2019). 0.5.5 2018-11-23 A Black-Friday'18 Release! - Old deprecated Qt4 build support is no more. - Graph port sort options added as View / Sort menu. - System tray options now subject to current desktop environment availability. - Also disable Setup / Misc / Other / Save JACK server configuration to (.jackdrc) when JACK D-Bus interface is enabled. - Whether to use server synchronous mode option added to Setup / Settings / Parameters (only applied when JACK D-BUS interface is enabled). - Disable some Setup / Settings / Advanced parameters when JACK D-Bus interface is enabled and vice-versa. - Attempt to power-cycle JACK D-Bus service on demand; - Marked as probably useless anyway, old "H/W Monitor" option (-H) is now being ditched from Setup / Settings / Advanced tab. - Graph port/connections highlighting. 0.5.4 2018-09-24 An Early Autumn'18 Release. - Graph port-type colors are now configurable (cf. menu View > Colors. - Make Graph nodes (ie. client boxes) transparent for yet some eye-candiness ;). Also keep the (Graph) current selection across port (dis)connections. - Drawing patchbay connector lines as (bezier) curves is now a difinitive and fixed feature (as long as no more remains from the so called "Cambric explosion era" are still lurking in there). - AppStream metadata updated to be the most compliant with latest freedesktop.org specification and recommendation. - Graph auto-layout improvement for brand new node clients. - Avoid showing setup warning when no server settings have changed. - Fixed JACK D-Bus settings for MIDI driver parameter. 0.5.3 2018-07-22 A Summer'18 Release. - Portuguese (pt) translation added (by Heitor Rocha). - AppData/AppStream metadata is now settled under an all permisssive license (FSFAP). - Improved Graph rubberband add (Shift) and toggle (Ctrl) multiple (de)selections. - Added user preference option: Setup / Misc / Buttons / Replace Connections with Graph button (on main window). - Added a zoom slider control to the Graph view status bar. 0.5.2 2018-05-27 Pre-LAC2018 release frenzy hotfix. - Respect ALSA Sequencer support option also on Graph view. - Regression to new Graph node/ports sorting comparator; also fixed multiple and many port removals, most probably causing it to crash due to double-free/delete potential. - Fixed the automatic aggregation of new Graph client nodes that are split as either input or output only (ie. system, terminal, physical or otherwise non-duplex nodes). - Added View/Zoom Range mode option to Graph tool. 0.5.1 2018-05-21 Pre-LAC2018 release frenzy. - Half a decade later, recent new custom entries may now get removed from Session Infra-client list. - Some rather old, better said "Cambric explosion era", user preference options have been ditched altogether: Display / Time Format; Display / Shiny glass light effect; Display / Connections/Draw connections and patchbay lines as Bezier curves; Misc/Configure as temporary server. - A brand new and way long overdue connections Graph widget is finally introduced, only to be accessible through the context menu at this time. - Extended multi-selection is now supported on all Connections client/port lists, allowing for multiple (dis)connections at once. - Disable singleton/unique application instance setup logic when the display server platform is not X11. - A little hardening on the configure (autoconf) macro side. 0.5.0 2017-12-16 End of Autum'17 release. - Current preset is always taken into account if ever changes while the Setup dialog is hidden (eg. via context menu). - Desktop entry specification file is now finally independent from build/configure template chains. - Updated target path for freedesktop.org's AppStream metainfo file (formerly AppData). 0.4.5 2017-04-27 Pre-LAC2017 release frenzy. - On some desktop-shells, the system tray icon blinking on XRUN ocurrences, have been found responsible to excessive CPU usage, an "eye-candy" effect which is now optional as far as Setup/ Display/Blink server mode indicator goes. - Added French man page (by Olivier Humbert, thanks). - Make builds reproducible byte for byte, by getting rid of the configure build date and time stamps. 0.4.4 2016-11-14 A Fall'16 release. - Fixed an early crash when the singleton/unique application instance setup option is turned off. - Almost complete overhaul on the configure script command line options, wrt. installation directories specification, eg. --prefix, --bindir, --libdir, --datadir and --mandir. 0.4.3 2016-09-14 End of Summer'16 release. - Fix build error caused by variable length array. - Fix some tooltip spelling (patch by Jaromír Mikeš, thanks). - Translation (not) fix for the default server name "(default)". - Old "Start minimized to system tray" option returns to setup. - Dropped the --enable-qt5 from configure as found redundant given that's the build default anyway (suggestion by Guido Scholz, while for Qtractor, thanks). - Late again French (fr) translation update (by Olivier Humbert aka. trebmuh, thanks). 0.4.2 2016-04-05 Spring'16 release frenzy. - Added a brand new "Enable JACK D-BUS interface" option, split from the old common "Enable D-BUS interface" setup option which now refers to its own self D-BUS interface exclusively. - Dropped old "Start minimized to system tray" option from setup. - Add double-click action (toggle start/stop) to systray (a pull request by Joel Moberg, thanks). - Added application keywords to freedesktop.org's AppData. - System-tray icon context menu has been fixed/hacked to show up again on Plasma 5 (aka. KDE5) notification status area. - Switched column entries in the unified interface device combo- box to make it work for macosx/coreaudio again. - Blind fix to a FTBFS on macosx/coreaudio platforms, a leftover from the unified interface device selection combo-box inception, almost two years ago. - Prevent x11extras module from use on non-X11/Unix plaforms. - Late French (fr) translation update (by Olivier Humbert, thanks). 0.4.1 2015-10-28 A Fall'15 release. - Probing portaudio audio device in a separate thread (by Kjetil Matheussen, thanks). - Messages standard output capture has been improved again, now in both ways a non-blocking pipe may get. - Regression fix for invalid system-tray icon dimensions reported by some desktop environment frameworks. - New hi-res application icon (by Uttrup Renzel, Max Christian Pohle, thanks). - System tray icon red background now blinks when a XRUN occurs. - Desktop environment session shutdown/logout management has been also adapted to Qt5 framework. - Single/unique application instance control adapted to Qt5/X11. - Prefer Qt5 over Qt4 by default with configure script. - Overrideable tooltips with latency info (re. Connections JACK client/ports: patch by Xavier Mendez, thanks). - Complete rewrite of Qt4 vs. Qt5 configure builds. - French (fr) translation update (by Olivier Humbert, thanks). 0.4.0 2015-07-15 Summer'15 release frenzy. - Some windows fixes added (patch by Kjetil Matheussen, thanks). - Most advanced Setup/Settings are moved into new Setup/Advanced settings tab; limit range for the real-time priority setting, now having 6 as absolute minimum valid value (after patches by Robin Gareus, thanks). - A new top-level widget window geometry state save and restore sub-routine is now in effect. - Delayed geometry setup for widget windows upon startup has been deprecated and scrapped altogether. - Setup/settings dialog tab is going into some layout changes; also got rid of old patchbay auto-refresh timer cruft, which was previously hidden/disabled. - New socket names are now automatically inferred from selected client names while on the Patchbay widget, Socket dialog. - Fixed for some strict tests for Qt4 vs. Qt5 configure builds. - German (de) translation update (by Guido Scholz, thanks). 0.3.13 2015-03-25 Pre-LAC2015 release frenzy. - Added application description as freedesktop.org's AppData. - Setup dialog form is now modeless. - Introducing brand new active patchbay reset/disconnect-all user preference option. - Current highlighted client/port connections are now drawn with thicker connector lines. - New user preference option on whether to show the nagging 'program will keep running in the system tray' message, on main window close. - Connections lines now drawn with anti-aliasing; connections splitter handles width is now reduced. - Drop missing or non-existent patchbay definition files from the most recent used list. 0.3.12 2014-10-19 JACK Pretty-names aliasing. - JACK client/port pretty-name (metadata) support is being introduced and seamlessly integrated with old Connections client/port aliases editing (rename) (refactored from an original patch by Paul Davis, thanks). - Application close confirm warning is now raising the main window as visible and active for due top level display, especially applicable when minimized to the system tray. - Messages standard output capture has been slightly improved as for non-blocking i/o, whenever available. - Translations install directory change. - Allow the build system to include an user specified LDFLAGS. - Missing input/output-latency parameter settings now settled for the D-BUS controlled JACK server and firewire back-end driver. 0.3.11 2013-12-31 A fifth of a Jubilee. - More preparations for Qt5 configure build. - Interface device selection is now unified, by moving the old '>' pop-up menu into the customized combo-box drop-down list showing all available card/device names and descriptions (on a patch by Arnout Engelen, thanks). - Added include to shut up gcc 4.7 build failures (patch by Alexis Ballier, thanks). 0.3.10 2013-04-01 The singing swan rehersal. - Session infra-client management finally being added. - Preparations for Qt5 migration. - Transport tempo (BPM) precision display fixed to 4 digits. - Color-candy (dang old ANSI terminal?) escape sequences are now silently stripped from jackdbus messages captured log (onliner from original patch by Brendan Jones, thanks). - List ALSA device card id. string instead of device number, while on setup dialog. - Japanese (ja) translation added (by Takashi Sakamoto). 0.3.9 2012-05-18 The last of the remnants. - Killing D-BUS controlled JACK server is now made optional, cf. Setup/Misc/Stop JACK audio server on application exit. (a patch by Roland Mas, thanks). - Added include to shut up gcc 4.7 build failures. - Make(ing) -jN parallel builds now available for the masses. - A mis-quoting bug at the command line argument string may have been crippling the (unmaintained) Windows port since ever, leaving its main function to start jackd dead in the water, belly down :) now hopefully fixed (following a mail transaction with Stephane Letz and Mathias Nagorni, thanks). - Currently a JACK2-only feature, the JACK version string display at the About dialog box, must now be explicitly enabled on configure time (--enable-jack-version). - A new so called "Server Suffix" parameter option appears to rescue on the situations where QjackCtl falls short on extra, exquisite and/or esoteric command line options eg. (net)jack1/2 differences. - Fixed D-Bus Input/Output device parameter settings, filled when either interface is selected for Capture/Playback only. (probable fix for bug #3441860). - Fixed Makefile.in handling of installation directories to the configure script eg. --datadir, --localedir, --mandir. (after an original patch from h3xx, thanks). - Main window is now brought to front and (re)activated when clicking on the system tray icon instead of just hiding it. - Add current xrun count to the system tray icon tooltip, if not zero (after patch #3314633 by Colin Fletcher, thanks). 0.3.8 2011-07-01 JACK Session versioning. - Debugging stacktrace now applies to all working threads. - Session "Save" button now a drop-down menu, replacing the session save type combo-box/drop-down list selection. Also, an early session directory versioning/numbering scheme is now in place, although optional. - Probable fix to debian bug report #624198 - segfault when pressing the stop button (by Grant Adrian Diffey, after a patch from Adrian Knoth, thanks). - Desktop environment session shutdown (eg. logout) is now tapped for graceful application exit, even though the main window is active (visible) and minimizing to system tray is enabled. Both were causing first shutdown/logout attempt to abort. Not anymore, hopefully ;). - Make sure all activated patchbay definition files are in their complete and absolute directory path forms. - Connections refresh button now does an immediate and true reconstruction of all clients and their respective ports and connections, unconditionally. - Command line server start option (-s, --start) is now made independent from configuration setup option (cf. Setup/Misc/Start JACK audio server on application startup). - Now handling cable socket types properly to let patchbay definitions work correctly, whenever having sockets with the very same literal name (twisted from patch #3183467, by Karsten, thanks;). - Abrupt focus behavior when any of the keyboard modifiers (Shift, Ctrl, Alt, Caps Lock) is hit while on Connections client/port aliases editing (rename) has been fixed. - Russian (ru) translation updated (by Alexandre Prokoudine). - Added include "errno.h" alegedly missing for BSD style systems (applying patch for bug #3126091). 0.3.7 2010-11-30 JACK Session managerism. - Session widget has session save type preserved as well. - Connections and the new Messages/Status widgets now have their last open tab preserved across program run-cycles. - Connections and Patchbay widgets have been finally given up on an old feature request: an Expand All items button. - A significant UI layout has been made: the Messages and Status widgets were merged into one, giving space to the brand new Session wigdet to be easy accessible from the main panel control window. - libX11 is now being added explicitly to the build link phase, as seen necessary on some bleeding-edge distros eg. Fedora 13, Debian 6. (closing bug #3050915). - Input/Output latency options were missing but now finally enabled for the firewire back-end. - General standard dialog buttons layout is now in place. - Avoid pre-loading a stalled patchbay definition filename and its nagging error on startup (fixes bug #3017078). - Client connection retrial logic scrapped. Being a leftover from early ages, when machines were slower and JACK server startup times were longer... now, if it can't connect first time as client, it will tear down the server whether it's starting up still or not at all. (cf. Setup/Settings/Start Delay for the rescue). - Server name is finally part of the server settings presets, thanks to Fons Adriaensen for the heads-up. - As a workaround regarding issues switching jack2's backends, Robin Gareus sends us yet another D-Bus method slot: "preset", (dbus-send --system / org.rncbc.qjackctl.preset string:PRESET). Thanks again. - Another D-Bus interface slot makes it through implementation: "quit" (eg. usage: dbus-send --system / org.rncbc.qjackctl.quit). Besides, there's also these new JACK session management actions which were being overlooked as well: "load", "save", "savequit" and "savetemplate" are also available as D-Bus method slots. - Make sure that Patchbay socket names are unique when adding or copying, fixing previous patch by Dominic Sacre. - JACK version is now being shown on the About box (jack2). - Slight Connections widget behavioral change: (dis)connecting a client (from) to one single port, (dis)connections will be applied in sequence from (to) all client output ports to (from) as many input ports there are in below, one by one (satisfying a 5 year old request from Yann Orlarey, thanks:). - JACK session support is being introduced. - Ignore first XRUN occurrence option dropped from statistics. - Initial widget geometry and visibility persistence logic has been slightly revised as much to avoid crash failures due to wrong main widget hidden state. - Double-quotes are now being added to device names which include blank characters and were rendering invalid all command line invocation of the classic JACK server (eg. specially due for Portaudio device names on Windows). - Transport play (rolling) status is now being guarded to avoid backfiring from extraneous transport state changes. - General source tree layout and build configuration change. - Italian (it) translation added (by Sergio Atzori). - Post-shutdown script invocation logic slightly refactored in attempt to enforce its execution on application quit. 0.3.6 2010-03-09 Full D-Busification! - Make sure socket names are unique on each side of the Patchbay (another patch from Dominic Sacre, thanks). - A bunch of primitive D-Bus interface slots have been added, allowing shortcut access to most of main applications actions like toggling Messages, Status, Connections, Patchbay widget pop-ups, reset stats, transport and so on. New bindings are given eg. via dbus-send --system / org.rncbc.qjackctl.(main, messages, status, connections, patchbay, setup, about, reset, rewind, backward, play, pause, forward). (from an original idea from Sebastian Gutsfeld, thanks). - Patchbay snapshot now tolerates JACK client port strings that have more than one semi-colon in it, honoring just the first one exactly as everywhere else eg. Connections. (a glitch as reported by Geoff Beasley while using a2jmidid). - Most modal message dialog boxes (eg. critical errors) are now replaced by system tray icon bubble messages where available (mitigating feature request #2936455). - Comply with jackd >= 0.118.0 which nowruns in real-time mode by default; use of -R is now deprecated from the jackd command line interface options; use -r to run in non-real-time-scheduling. - A man page has beed added. - Got rid of a pretty old and never really useful "jackd-realtime" server path option--actually, it was only seen available on the now defunct old Mandrake Linux distro. - D-Bus support, as provided by org.jackaudio.service aka jackdbus, is now being introduced and used wherever available and whenever enabled. Configuring, starting, stopping and logging the JACK back-end server through the "infamous" jackdbus service is now being seamlessly exploited. - Global configuration state is now explicitly saved/committed to disk when Setup dialog changes are accepted and applied. - Server name command line option added (-n, --server-name). - Single application instance restriction option added (X11). - Setup for the netjack (slave) "net" driver has now sample-rate and frames per buffer (period size) settings disabled and/or ignored, as those are pretty much auto-detected by default; also, a new "netone" backend driver option has been introduced (as suggested by Torben Hohn). - Czech (cs) translation added (by Pavel Fric). - Fixed some main window keyboard shortcuts. Escape key now closes Connections, Patchbay, Status and Messages widgets as usual (bug #2871548). - Fixed glitch on configure portaudio support, specially when the library is not detected as available. 0.3.5 2009-09-30 Slipped away! - Late support for UTF-8 encoded client/port names. - Allow only one single patchbay connection to or from an exclusive socket (mitigating bug #2859119). - Automatic crash-dump reports, debugger stack-traces (gdb), back- traces, whatever, are being introduced as a brand new configure option (--enable-stacktrace) and default enabled on debug build targets (--enable-debug). - Probable fix on the audio connections with regard to client/port (re)name changes (an ancient bug reported by Fons Adriaensen). - Portaudio device selector is now available (after a patch handed by Torben Hohn and Stephane Letz). - A couple of primitive D-Bus interface slots have been introduced, giving the option to start/stop the jackd server from the system bus eg. via dbus-send --system / org.rncbc.qjackctl.start (.stop), (a nice addition supplied by Robin Gareus, thanks). - New command line option (-a, --active-patchbay=[path]) to specify and activate a given patchbay definition file (a simple patch sent by John Schneiderman, thanks). - Added one significant digit to DSP Load percentage status display. - Tentative support for netjack (slave) by adding the "net" driver to the existing backend driver options on the Setup/Settings section. - Converted obsolete QMessageBox forms to standard buttons. - New patchbay snapshot now raises the dirty flag and allows for the immediate salvage of patchbay definition profile. - Conditional build for JACK port aliases support (JACK >= 0.109.2). - Alternate icon sizes other than default 16x16, are now effective to the Connections widget (Setup/Dislay/Connections Window/Icon size). 0.3.4 2008-12-05 Patchbay snapshot revamp. - Introducing the very first and complete translations in-package: German (de), Spanish (es), French (fr) and Russian (ru); credits in TRANSLATORS. - At last, after years of retarded procrastination, the old infamous patchbay snapshot feature has been the subject of a almost complete rewrite and it does try to give a way better mapping of all actual and current running client/port connections, both JACK (audio, MIDI) and ALSA MIDI, of course ;) - On Setup/Settings/Parameters dialog, all device selection options are now reset to default when disabled interactively. - Grayed/disabled palette color group fix for dark color themes. - Qt Software logo update. - Fait-divers: desktop menu file touched to openSUSE conventions. - ALSA PCM devices now only listed/enumerated iif strictly compliant with the audio mode criteria (Duplex, Capture-only or Playback-only) as kindly suggested by Nedko Ardaunov. - JACK client/port aliases may now be displayed as a global user option (see Setup/Display/Connections/JACK client/port aliases). - Lighten up the connections line and highlight colors, as seen to fit best on some darker background themes. - Patchbay snapshot fixed to differentiate socket clients according to its type (Audio, MIDI or ALSA-Seq), avoiding the mess and gross mistake of hanging disparate type ports under the same client item. - JACK_DEFAULT_SERVER environment variable is now appended to the X11 unique application identifier, allowing for having multiple instances each controlling its own JACK server, besides the default one. - Due to some trouble with newer Qt >= 4.4 applications regarding font size configuration, a new global user option is now available to the rescue: Setup/Misc/Defaults/Base font size (default is no-op). 0.3.3 2008-06-07 Patchbay JACK-MIDI, file logging and X11 uniqueness. - Attempt to load Qt's own translation support and get rid of the ever warning startup message, unless built in debug mode. (transaction by Guido Scholz, while on qsynth-devel, thanks). - Messages file logging makes its first long overdue appearance, with user configurable settings in Setup/Options/Logging. - Only one application instance is now allowed to be up and running, with immediate but graceful termination upon startup iif an already running instance is detected, which will see its main widget shown up and the server started automatically (Qt/X11 platform only). - Finally, full JACK MIDI support sneaks into the patchbay; socket types now differ in Audio, MIDI and ALSA, following the very same nomenclature as found on the Connections widget tabs. - Sun driver support (by Jacob Meuser). - Delay window positioning at startup option is now being disabled, on the Setup/Misc tab, when Minimize to system tray is enabled. - Cosmetic fix: Setup/Settings tab, 'Input Device' text label was using a slightly smaller font than the rest of the application (bug#1872545, reported by Jouni Rinne). 0.3.2 2007-12-20 Patchbay heads-up with season greetings. - Patchbay port matching has been slightly extended, this time allowing for the multiple or as many-to-many connections between socket plugs, provided these are specified in proper regex form (after a patch proposed by Dave Moore, thanks). - A new option to start the program minimized when the system tray icon is enabled, is now available from Setup/Misc/Start minimized to system tray (as kindly suggested by Marc-Olivier Barre). - Regression from QSystemTrayIcon (Qt4 >= 4.2) implementation, at least on X11 environments: while the main application widget was minimized to the system-tray, closing any other top-level widget was causing the immediate and unexpected application shutdown. - Some portaudio backend settings are now being enabled, specially suited for the jackdmp flavouring. - Server mode display blinking, usually shown as the RT indicator, is now an option (Setup/Display/Blink server mode indicator when started). - Tool/child windows position and size preservation fixed. - The connections/patchbay auto-refresh option has been finally removed due to several user requests, although deprecated for quite some time now it has been the probable cause of some periodic xrun occurrences due to graph-locking in jackd (while making Geoff Beasley angry in the process:). - Messages line limit was not being checked, now honored. - Simple as it could ever be, the build executive summary report is now given on configure. - Patchbay snapshot ot its socket and port ordering back. - ALSA Sequencer support is now an optional feature on setup, preventing the annoying "MIDI patchbay will be not available" warning message, ruining window placement on Linux systems where the snd-midi-seq kernel module is not loaded or not favorable (eg. OSS) at startup (by request from Jussi Laako). - Get configure to try and detect the correct qmake location and insert it the search order, so let the qt4 tools take precedence when --with-qt option is given and older qt3 ones coexist and are found located ahead in the PATH. - The connections widget is now being properly refreshed, due to some quirk in the QTreeWidget which was preventing some items, specially the expanded ones, to disappear in the void. Meanwhile, with a hand from Stephane Letz, the client/port lookup method was changed to prevent duplicated, missing entries or worse, crashes due to weird behaved windows applications. - The xrun count stats can now be reset simply by middle clicking on the systray icon or the main window's display area (thanks to patch sent by Dominic Sacre). - An improved version of the "shiny" background image was issued. The original somehow looked like two different images put together, probably most apparent on a bright TFT screen (by Dominic Sacre). - A warning is now being issued, asking whether one wants to remove a corresponding Patchbay connection, when client/ports are being disconnected over the Connections window, thus avoiding automatic reconnection annoyance due to normal active Patchbay behavior. - The infamous "Keep child windows always on top" global option is now supposed to behave a little better when disabled, layering child windows as naturally as far the window manager dictates. - Input/Output Channel setting is now allowed to be greater than 32; the special default text is now displayed, also on Input/Output Latency and Priority settings spin-boxes. - Andreas Persson just sent a patch that makes it possible to compile and run qjackctl with Qt version 4.1. Applied without hesitation, thanks. 0.3.1a 2007-07-19 System-tray tooltip icon crash fix. - An immediate showstopper crash upon client start was irradicated, which was affecting those with the system-tray icon disabled, as is the default (thanks to Ken Ellinwood for first reporting this sloppy one). 0.3.1 2007-07-18 Shallowed bug-fix release. - The current DSP load percentage activity is now also displayed on the system-tray icon tooltip. - An illusive but nasty Connections/Patchbay item tooltip crash bug has been hopefully fixed (Qt >= 4.3). - Now using QSystemTrayIcon class facility if available (Qt4 >= 4.2) making the system-tray option available on most platforms, notably on Windows and Mac OS X. - Usage of QProcess class has been severely refactored, now using QProcess::start() instead of QProcess::startDetached(), giving much tighter control over the started jackd(mp) process. Downside is that QjackCtl lost its ability and option to leave the process detached upon quitting the application. Too bad. - A new eye-candy bit has sneaked in: server mode display, that is the RT indicator, now blinks when server/client is started/active. - Combo-box setup history has been corrected on restore, which was discarding the very initial default (factory) contents. - Now that Qt4 is accessible to open-source Windows appplications, there's some experimental stuff sneaking in for jackdmp support on win32 (http://www.grame.fr/~letz/jackdmp.html). - Connections list items were initially sorted in descending order by default. Fixed. Client items are now naturally sorted, again. 0.3.0 2007-07-10 Qt4 migration was complete. - Qt4 migration was complete. Care must be taken with this new configuration file and location: this release starts a new one from scratch and won't reuse any of the previous existing ones, although cut and paste might help if you know what you're doing :) - On a last-minute addition, the "firewire" audio backend driver option has been also included, supporting the ffado.org project which is evolving where "freebob" is leaving (thanks to Klaus Zimmermann for this one). 0.2.23 2007-07-02 JACK MIDI support debut. - JACK MIDI support is now being introduced. Connections window now has a brand new MIDI tab, the older being renamed to ALSA, as for the ALSA/MIDI sequencer conveniency. The server settings now include the MIDI driver setup option (ALSA backend only). - Application icon is now installed to ${prefix}/share/pixmaps; application desktop entry file is now included in installation; spec file (RPM) is now a bit more openSUSE compliant; initial debianization. - Invalidation of the JACK client handle is now forced right on jack_shutdown notification, preventing a most probable fatal crash due to jack_deactivate and/or jack_client_close being called after the jack_watchdog kicks in. - Default font option names were adjusted to "Sans Serif" and "Monospace", wherever available. - The "keep child windows always on top" option is not set as default anymore, because window focus behavior gets tricky on some desktop environments (eg. Mac OS X, Gnome). - Autoconf (configure) scripting gets an update. 0.2.22 2007-03-31 Long overdue but better late than never. - Fixed default settings for the freebob backend (JACK >= 0.103.0). - CPU Load status label now says correctly DSP Load. - The most recently used patchbay definitions can now be correctly selected in round-robin fashion from its drop-down list widget. - Avoid mixing JACK MIDI ports with regular audio ports on the Connections and Patchbay widgets; strictly list only audio ports. - Added 192k sample rate to setup settings drop down list (as kindly reminded by Klaus Zimmermann, thanks). - Most top-level widgets were missing the normal-widget flag, which were causing some sticky size behavior on some window managers. 0.2.21 2006-10-07 Shrinking on screen real-estate. - GPL address update. - All window captions can now be set smaller as tool-widgets. This option takes effect when child windows are kept always on top. - For the brave of heart, specially the ones brave enough to try with Stephane Letz's jackdmp, a win32 build should be now possible. - The main window button text labels are now optional (after a kind suggestion by Geoff Beasley, thanks). - Increse default maximum number of ports setting from 128 to 256. - Initial freebob backend driver support. Also changed the coreaudio backend driver command line device name/id parameter. - Closing the main window while not as an active JACK client, nor under a server running state, will just quit the whole application, even though the system-tray icon option is in effect. - The most relevant transport commands (Rewind, Play and Pause) are now made available on the main window context popup menu. - The post-shutdown script is now also being called when using the Stop button, whether the jackd server has been started internally or not. The initial hard-coded default is now on and set to `killall jackd` (as a workaround to an old request from Stephane Letz). - The main window buttons display are now optional. One can choose whether the left, right and/or transport buttons are hidden, making it for a total of six different modes for the main window presentation (after a much simpler suggestion from Paul Davis and Stephane Letz). - Added configure support for x86_64 libraries (UNTESTED). 0.2.20 2006-03-05 Featuring patchbay socket forwarding. - Server path setting now accepts custom command line parameters (after a kind suggestion from Jussi Laako). - The internal XRUN callback notification statistics and reporting has been changed to be a bit less intrusive. - Patchbay socket dialog gets some more eye-candy as icons have been added to the client and plug selection (combobox) widgets. - Connections and patchbay lines coloring has changed just slightly :) - New patchbay socket forwarding feature. Any patchbay socket can now be set to have all its connections replicated (i.e. forwarded) to another one, which will behave actively as a clone of the former. Forward connections are shown by vertical directed colored lines, and can be selected either on socket dialog or from context menu (currently experimental, only applicable to input/writable sockets). - Optional specification of alternate JACK and/or ALSA installation paths on configure time (after a patch from Lucas Brasilino, thanks). 0.2.19a 2005-11-28 MIDI aliases are back in town. - ALSA sequencer client/port name aliases are functional again; all actual MIDI sequencer client/port numerical identifier prefixes are also back in business. 0.2.19 2005-11-19 MRU patchbay selection, Mac OS X and other fixes. - Connections widget views are now properly refreshed after renaming client/ports (aliases). - Disabled system tray and ALSA sequencer support on configure time, whenever building for MacOSX as default. - Fixed the major issues with selecting an audio interface on Mac OSX; the button the right of the interface combo is now much better looking than it was before; input/output channel counts are also updated automatically now (thanks to Jesse Chappell for the patch). - Prevent the setting of the coreaudio device id on the jackd command line (-n) whenever the default interface is being selected. - The connections and patchbay windows are now allowed to have a wider connection lines frame panel; splitter width sizes are now persistent across application sessions (thanks to Filipe Tomas for the hint). - Activation toggling feedback on the patchbay widget has been fixed; additionally and as found convenient, the most recently used patchbay definitions can now be loaded immediately by selecting from a drop-down list widget, which replaces the old static patchbay name status text, and adds a lil'icon too :) - All widget captions changed to include proper application title prefix. - Attempt to bring those aging autoconf templates to date; sample SPEC file for RPM build is now being included and generated at configure time. - The current selected device is now shown with a checkmark on the device selection menu(s), while on the settings dialog. - Set to use QApplication::setMainWidget() instead of registering the traditional lastWindowClosed() signal to quit() slot, just to let the -geometry command line argument have some effect on X11. 0.2.18 2005-07-18 The mantra of bugfixes stays on. - A freezing and endless loop condition on the patchbay socket item duplication (copy) has been fixed. - Fixed output disability when messages limit option is turned off (thanks again to Wolfgang Woehl for spotting this one). 0.2.17 2005-06-17 Systemic I/O Latency settings are in. - Systemic I/O Latency settings are now featured for the alsa, oss and coreaudio backends, letting you specify the known latency of external hardware for client aware compensation purposes (thanks to Wolfgang Woehl, for the reminder). - Update on last backstage changes to the coreaudio backend options (due to Stephane Letz. Thanks). 0.2.16 2005-06-13 OSS device name selection and Mac OS X breakthrough. - ALSA sequencer client/port name changes are now properly detected on the MIDI connections widget (as noted by Chris Cannam. Thanks). - Long overdue transport buttons (rewind, backward and forward) finally landed onto the main control window, at last :). - Duplication (copy) of patchbay socket items was added. - Do not ever try to start the JACK server if there's one already found running, on which case the client-only mode of operation is then activated (as kindly suggested by Orm Finnendahl, thanks). - After several Mac OS X user requests, ALSA/MIDI sequencer support is now an option, otherwise detected at configure time and conditionally compiled in if, and only if, ALSA is found available (which has been a primordial assumption on Linux systems:). Ah, and that just makes for the blind inclusion of another backend driver option: coreaudio. - Actual OSS device selection menu now featured on setup dialog; these adds to the device selection button menus for the OSS driver settings. - Delayed geometry setup of windows upon startup was added as an optional workaround to subtle problems due to window decoration information not being available at window creation time on some window managers (as patch proposed by Dirk Jagdmann. Thanks). - Fixed some minor but rather old bug that was quitting the application abruptly, when one switches off the system tray icon while the main application widget is hidden. - Cancel is now an option when creating a new patchbay definition. - Context menus are finally littered with icons. - Minor configure and Makefile install fixes, as Debian and Mac OS X specialties. Also, install does the right thing with target file modes (thanks to Matt Flax and Ebrahim Mayat, for pointing these out). 0.2.15a 2005-02-09 Return of the paranoid. - Regression from 0.2.13, of the not so stupid pseudo-mutex guards on the connections management framework, after fixing some crash reports from Fernando Pablo Lopez-Lezcano and Dave Phillips (thanks!); it pays to be such a paranoid after all :). 0.2.15 2005-02-06 Client/port names aliasing and other minors. - JACK/ALSA client and port name aliasing (renaming) is now an optional feature for the connections window; all client/port aliases are saved on a per preset basis (as proposed for Lionstracs' Mediastation). - Server state now shown (back gain) on the system tray icon tooltip; speaking of which, tooltips are now also featured on connections, status and patchbay windows. - New actual hardware device selection menu featured on setup dialog; these new button menus are only available for the ALSA driver settings. - Server path factory default to jackd instead of jackstart; preset setup button icons are back. - Fixed rare connection port item removal/disconnection dangling pointer bug. 0.2.14 2005-01-23 More progressive optimizations. - Put a limit on XRUN callback messages and statistics report rate, preventing the potential hosing of the GUI due to a XRUN cascade storm. The maximum reasonable report rate has been fixed to be one XRUN callback occurrence per second. - Set to ignore the SIGPIPE ("Broken pipe") signal, where available, as the default handler is usually fatal when a JACK client is zombified abruptly. - All conection view items are now sorted in natural case insensitive order, not just as audio port names as was before. - Got rid of those nonsense paranoid and rather stupid pseudo-mutex guards on the connections management framework and event notifications (nuff said :). - Optional confirmation warning on audio server shutdown, if there's some audio clients still active and connected (as suggested by Sampo Savolainen). - Check for on configure time (as of JACK 0.99.42+ CVS). - "Unlock memory" server setup option was added, allowing the release of memory used by common toolkit libraries (GTK+, Qt, FLTK, Wine) that were being superfluously locked on every GUI JACK client; number of periods has now the minimum allowed value of 2; server start delay widget converted to spinbox; setup dialog layout slighly changed. - Removed stand-alone usx2y driver support. Since JACK 0.99.41+ CVS, the special "rawusb" support on the Tascam US-122/224/428 USB Audio/MIDI interface controllers have been merged and properly integrated into the regular alsa backend driver. Being still experimental, this special mode of operation is now triggered only when "hw:N,2" is specified as the alsa device name (N = soundcard index of snd-usb-usx2y module). - Messages window limit is now enforced only when the line count exceeds in one third the user configured line count maximum; if Qt 3.2.0+ is in use, the QTextView widget is otherwise set to the optimized Qt::LogText format. - XRUN status items are kept double-dashed if none has been detected. 0.2.13 2004-11-21 Retouches and minor optimizations. - Main window is now properly minimized instead of simply hidden when the system tray icon is not available nor opted in (as suggested by Florian Schmidt). - Some informational status items are now updated 10 times less frequently (e.g. CPU Load, Sample Rate, Buffer Size, Realtime Mode, etc.), lowering the CPU burden of most probably redundant status updates. - XRUN detection and statistics are being conditionally included if jack_get_xrun_delayed_usecs() is available (as of JACK 0.99.7+ CVS). - Fixed ancient bug on client shutdown event handling, which was invoking the xrun notification handler by mistake. - Support for maximum scheduling delay status added; this status relies on jack_get_max_delayed_usecs() function availability at configure time, depending on a Lee Revell's non-official JACK patch. - Patchbay Activate button is now a toggle button widget, allowing the deactivation of the current patchbay profile. - Reset-status icon has been changed to a simple red circle instead of previous one which was much like a power-switch symbol. - Preset selection has been added to the context menu. 0.2.12a 2004-10-11 Audio connections now naturally sorted. - Client port list on audio connections are now hopefully fixed for good; the sort comparison function now takes full natural order into account. 0.2.12 2004-10-08 Larger icons and font option on connections/patchbay. - Fixed some old and slow memory-leak due to redundand and repetitive call to jack_port_by_name() (discovered and solved, thanks to Jesse Chappell); some other free() and configure fixes were also applied. - Shiny display effect toggling has immediate feedback on setup dialog. - Added new usx2y driver support. - New scaled connections/patchbay icons were added; meanwhile, all inline XPM icons were removed and brainlessly converted to PNG format. - New setup options as for the connections/patchbay view apprearence: larger icon sizes and font selection are now possible, to better ease manipulation on a touchscreen (feature requested for Lionstracs' Mediastation). - Connection line width follows icon size in discrete proportion. - "Other" setup options moved to a new dialog tab, "Misc"; new extreme item values, 32 and 16 frames, added to the drop-down list of the Frames/Buffer setting (as suggested by Mark Knetch). 0.2.11 2004-09-10 Shiny display now optional and other fixes. - Fixed Input/Output channels settings, being now either enabled when the ALSA driver is selected for Capture/Playback only. - Shiny display effect: after some conservative user complaints this pure cosmetic feature is now made optional ;) 0.2.10 2004-09-04 Shiny display and curved connections. - New pre-shutdown script setup option, allowing to specify a shell-script to be run before the JACK server daemon is shutted-down. This overrides any previous shutdown script setting, which should be now moved onto the existing post-shutdown script option, as to keep old procedural behaviour. - Avoid stopping JACK prematurely with QProcess::kill() (oneliner fix); stopping JACK will now take a little bit longer, but hopefully will take the time to cleanup properly (thanks to Kjetil Matheussen). - ALSA driver Duplex mode accepts alternate Input or Output device name. - Context menu reset option is now always enabled (yet another suggestion from Sampo Savolainen). - Main display background gets shinny effect; adjusted system tray background palette color mode. - Priority and setup control is now a spinbox ranging from 0..89 (as suggested by Florian Schmidt). Same for Periods/Buffer. - Patchbay connection lines are now drawn correctly when items are scrolled out of view. Additionally, the connection lines can now be optionally drawn as bezier spline curves (big thanks to Wilfried Huss). 0.2.9 2004-07-04 Sloppy boy fixes and minor featuritis. - Patchbay socket dialog client and plug list option items are now properly escaped as regular expressions. - JACK callbacks are now internally mapped to QCustomeEvent's instead of using the traditional pipe notifications. - The system tray popup menu is now featured as a context menu on the main application window too. - The reset status option is now included in the system tray popup menu. - Server stop command button now enabled during client startup interval; this makes it possible to stop the server just in case the client can't be activated for any reason. - Top level sub-windows are now always raised and set with active focus when shown to visibility. 0.2.8 2004-04-30 System tray icon and menu option. - New option for system tray icon and menu, which is known to be effective on KDE enabled desktops; support for freedesktop.org's system tray protocol specification has been included so this maybe also effective on Gnome2. - Capture or Playback-only optional alternate device interface name may now be specified for the ALSA audio driver server settings. - Maximum number of ports setting was added to server setup. - The dash (-) is now a legal character for preset names. 0.2.7b 2004-04-05 OSS driver setup fix. - OSS driver halfduplex setup operation is now fixed, thanks to Jussi Laako. 0.2.7a 2004-04-05 Compilation fix for Qt 3.1. - QSplitter::setChildrenCollapsible call is now conditionally compiled, applied only on Qt 3.2+. 0.2.7 2004-04-04 User-interface refinements and OSS driver support. - Connections and patchbay windows horizontal layout are now user configurable via splitter widgets. - Refresh on connections window now take effect on both tabs, Audio (JACK) and MIDI (ALSA). - OSS driver support and no-mlock option added to server settings, setup dialog (as of JACK 0.95.7+). - Temporary server configuration option added, applicable to the auto-start server feature on client applications, whether the server shall exit once all clients are closed. - Server mode (RT) status display added. - Warning messages are now prompted to the user when there are any pending changes not saved nor applied while on the setup dialog. - Translation support for the default preset name "(default)". - Messages window pops up whenever a critical error message is issued. 0.2.6 2004-02-29 More work in progress. - Message window line limit is now a configurable option on setup, as is whether the command-line local configuration file gets saved at all; the first argument of the command-line configuration is stuffed to be the executable server command absolute path, when possible. - Warning message issued if ALSA sequencer is not available on startup; also if server settings are changed while client is currently active. - Server autostart magic is locally disabled by forcing the environment variable JACK_NO_START_SERVER at startup; with any luck this will maintain qjackctl's behaviour whether the JACK server is already started or not. - Makefile.cvs makes its late entrance on the build toolset. 0.2.5 2004-02-16 Server survival option and command-line wrapper feature. - New option on application exit for leaving the JACK server daemon running, surviving the parent process; the confirmation prompt on application close now features a "Terminate", "Leave" and "Cancel" button options. - New command-line wrapper feature for JACK client applications, thus giving a convenient head start for the JACK audio server as needed (as suggested by Fernando Pablo Lopez-Lezcano, of Planet CCRMA fame). - Messages, Status, Connections and Patchbay pop-up windows are not hinted as dialogs anymore and thus are not centered relative to parent main window which has become a strict Qt dialog widget behaviour (as of Qt 3.3+). - Patchbay window content changes are now properly updated, without the need for a later manual refresh to redraw stalled connection lines. - The snapshot option for creating a new patchbay definition from current actual connections now takes client and port names as regular expressions and smart enough when regarding more than two contiguous decimal digits :) - Patchbay socket list view ordering is now properly preserved; socket dialog gets plug list handling ehancements; active patchbay gets reloaded when commited and saved to file; connections redraw on socket removal has been fixed. - Server literal command-line is now saved into local configuration file (~/.jackdrc) for convenience of future auto-start client applications. - New setup option on whether all child windows are kept on top of the main window, or otherwise floating with probable taskbar entries of their own. - Setup changes that are only effective next time the program is run gets an informational message box shown to the user. 0.2.4 2004-02-01 Exclusive patchbay sockets. - Patchbay definitions may now be configured with exclusive sockets; this way, only one defined connection is allowed as soon as it's available, being all others immediatelly disconnected whenever attempted. - On the connections view, current connected client ports are now slightly highlighted (blue) whenever a client or port is selected on the opposite column (as suggested by Lawrie Abbott). - Connections and patchbay drag and drop feature is now bilateral; you can now drag and drop an item from right to left to establish the connection. 0.2.3a 2004-01-19 Time format combo-box tooltip fix. - A qt-designer copy-paste leftover has been fixed; sloppy boy I am ;) 0.2.3 2004-01-19 Tenths, hundredths, milliseconds, whatever. - Custom time format setup for all elapsed times, allowing the display of tenths, hundredths or even milliseconds instead of just hundredths of second for transport time code. 0.2.2 2004-01-16 Hundredths are back. - Transport time is now shown with hundredths of second (hh:mm:ss.dd), as it was once before but not constant zero. - Client start delay now configurable on setup; this may be of help for slow machines or unusual long server driver startups (e.g. portaudio). - Client-only mode restart has been fixed. - Messages color retouching. - Popup menus memory leak fixed. 0.2.1 2003-12-29 The fix of fixes. - Fixed jackstart/jackd command line parameter argument concatenation. - Front panel status display font can now be customized. - Some connection graph changes were being silently missed, now fixed. - Messages window fallback fix; stdout handling has been retouched to be more line buffer oriented. 0.2.0 2003-12-12 ALSA sequencer patchbay entrance. - ALSA sequencer subscription patchbay feature, complementing current audio service with a MIDI application connection graph, gracefuly included on the same front-end. - Current preset name is shown on main window caption title. New button and form icons. Messages window blankness rendering fix. - Immediate server startup option was made persistent and therefore remembered across sessions. - Standard output/error stream capture setup option. 0.1.3 2003-11-26 Server settings profile/preset feature. - Server setup settings can now be profiled, named and saved as presets. Command line preset name option and scripting argument meta-symbols are also featured for convenience (kindly suggested by Sampo Savolainen). - New configure time argument debugging support (--enable-debug). 0.1.2 2003-11-16 More work in progress. - Qmake project file (qjackctl.pro) now generated by configure (autoconf), introducing the explicit binding support to libqt-mt (multi-thread). - Main window is not hinted as a dialog anymore, giving room to the minimize button on some other window managers; application close confirm warning is now an option. - Removed deprecated settings options: temporary directory and ASIO mode; new available settings for the ALSA driver: force 16bit format, maximum input channels and output channels (as of JACK 0.90.x). - Transport time display looses static hundredth seconds decimal digits. 0.1.1a 2003-11-01 Whatever happened to OK button icons. - Restored missing OK button icons. 0.1.1 2003-10-29 Minor feature enhancements and bugfixes. - Main window display items are now made fixed in width, at least those more prone to change frequently and thus caused some display jitter. - Messages, status, connections and patchbay module windows are now reopened automagicaly on startup as they were on previous session. - New patchbay definition snapshot option from current actual connections; current active patchbay filename status indication on title. - New icons patchbay editor window and socket dialogs; own stdout/stdin is now properly captured and shown on messages log window. - Fixed an obvious patchbay connection scan freezing bug; default .xml file extension enforcement on save. 0.1.0 2003-10-22 Major user interface redesign. - Main application window complete redesign, now more like a multimedia/LCD control panel -- old main window dialog tabs are now splitted in separate pop-up windows/dialogs; big time display options. In other words, this sums up to a nice complete application rewrite. - Deprecated options for forcing aRTs and jackd daemons are no longer available; this functionality can be officially superceded by the more generic startup/shutdown script options. - Seamless support for externally started JACK server, providing a client-only mode of operation; if the JACK daemon is already started, qjackctl enters in client detached mode automagically. - Messages window font is configurable and saved across sessions (by Jack O'Quin's humble request). Some colorization has been introduced on some event messages. - Preliminary patchbay persistence feature is under way. A patchbay definition editor is already included, following an alternative socket-plug patchbay model that aliases and is a direct map to the client-port JACK connections model. The patchbay definitions are stored as text/xml files. - New post-startup script option; immediate JACK server startup command line option (as suggested by Kasper Souren). 0.0.9a 2003-10-03 Tiny bugfixes. - Startup/shutdown script options now correctly saved and restored. - Dummy driver wait parameter is now properly set on startup. - Confirmation warning on disconnecting all ports (as suggested by Robert Jonsson). 0.0.9 2003-09-25 Work in progress. - New connection port item pixmaps that distinguishes physical from logical ports. - History of most recently used values gets saved for some settings and options comboboxes widgets. - New startup and shutdown script options, intended to supersede the mess of forcing artsd and jackd itself, in a near future ;) this way, one can also include the operation of the LADCCA daemon (following a suggestion from Kasper Souren). - Connections command buttons are now shortly disabled after clicking, avoiding accidental duplicated connections. 0.0.8 2003-09-19 Preliminary transport and buffer size status control. - Transport status and control introduced (requires JACK 0.80.0+); - Statistics tab renamed to Status, where the transport state info and simple play/pause control buttons are now placed; - Buffer size status is yet another item on the list view. 0.0.7 2003-09-15 Minor bugfixes. - Inverse alphabetic ordering fixed on Connections port listing. - Verbose option added; messages view font size fix; about Qt dialog; logo pixmap retouched. - Configure script now checks for Qt 3.1.1 or greater. 0.0.6 2003-09-12 Drag-n-drop and more feature enhancements and bugfixes. - Patchbay connection user interface handling has been fairly rewritten; (features new bugs while fixing old ones ;-) - Reset XRUN statistics button added; reset time recorded on statistics; calculated latency is now shown on settings; ASIO mode disables Periods/Buffer setting (all suggestions by Lawrie Abbott). - Context popup menu introduced for port connection handling; includes new command for disconnecting all currently connected ports. - Closing the application while JACK is running, is now presented with a warning confirmation message (preventing accidental Esc key press? :). - Patchbay port lists ordering are now more numerical-friendly than ever, taking account for sub-numbering port names (following yet another suggestion from Lawrie). - Connection drag-and-drop is now featured after many, many requests. - Corrected the configure script to properly recognize Qt 3.0.1 or greater. 0.0.5 2003-09-05 Minor feature enhancements and bugfixes. - Internationalization support added; future qjackctl_${LANG}.qm translation files are located on ${prefix}/share/locale . - New dummy and portaudio driver support (as of JACK release 0.80.0+). - A couple of silent memory leak bugs have been corrected. 0.0.4 2003-08-29 Minor changes and bugfixes. - The patchbay port lists are now sorted in a more numerical friendly manner (as suggested by Steve Harris); the sort code has been "borrowed" from qjackconnect, yet again. - Patchbay port connection lines are now always visible, even if their respective connected port items aren't. - Multiple simultaneous port connections can now be handled when a client application item is selected for connection/disconnection (again, suggested by Steve Harris), replicating and extending qjackconnect's similar behaviour. - An auto-refresh option for the patchbay connections is now available, for those cases when client code just can't handle properly some callbacks. - Window positioning and sizing is now almost persistent across sessions; as before, position is saved for the minimal view mode; but now, the details dialog view mode gets its position and size independantly saved also. 0.0.3 2003-08-07 Integrated visual patchbay. - A patchbay for jack port connections is now integrated, much like the greatest Mathias Nagorni's qjackconnect (http://www.suse.de/~mana/jack.html). 0.0.2 2003-08-02 Client code features introduced. - JACK library and header files are checked on configure. - Server CPU load, sample rate and time elapsed since last XRUN detected, are now displayed on statistics. 0.0.1 2003-07-26 Initial release. qjackctl-1.0.6/PaxHeaders/LICENSE0000644000000000000000000000013215174607203013402 xustar0030 mtime=1777536643.502914385 30 atime=1777536643.502604493 30 ctime=1777536643.502914385 qjackctl-1.0.6/LICENSE0000644000175000001440000004310315174607203013373 0ustar00rncbcusers GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. qjackctl-1.0.6/PaxHeaders/README0000644000000000000000000000013215174607203013255 xustar0030 mtime=1777536643.502914385 30 atime=1777536643.502914385 30 ctime=1777536643.502914385 qjackctl-1.0.6/README0000644000175000001440000001044615174607203013252 0ustar00rncbcusersQjackCtl - JACK Audio Connection Kit Qt GUI Interface ----------------------------------------------------- QjackCtl is a simple Qt application to control the JACK sound server (http://jackaudio.org), for the Linux Audio infrastructure. Written in C++ around the Qt framework for X11, most exclusively using Qt Designer. Provides a simple GUI dialog for setting several JACK server parameters, which are properly saved between sessions, and a way control of the status of the audio server. With time, this primordial interface has become richer by including a enhanced patchbay and connection control features. Homepage: https://qjackctl.sourceforge.io http://qjackctl.sourceforge.net License: GNU General Public License (GPL) Requirements ------------ The software requirements for build and runtime are listed as follows: Mandatory: - Qt framework, C++ class library and tools for cross-platform application and UI development https://qt.io/ - JACK Audio Connection Kit https://jackaudio.org/ Optional (opted-in at build time): - ALSA, Advanced Linux Sound Architecture https://www.alsa-project.org/ Installation ------------ Unpack the tarball and in the extracted source directory: cmake [-DCMAKE_INSTALL_PREFIX=] -B build cmake --build build [--parallel ] and optionally, as root: [sudo] cmake --install build Note that the default installation path () is /usr/local . Configuration ------------- QjackCtl holds its settings and configuration state per user, in a file located as $HOME/.config/rncbc.org/QjackCtl.conf . Normally, there's no need to edit this file, as it is recreated and rewritten everytime qjackctl is run. Bugs ---- Probably plenty still, QjackCtl maybe considered on beta stage already. It has been locally tested since JACK release 0.98.0, with custom 2.4 kernels with low-latency, preemptible and capabilities enabling patches. As for 2.6 kernels, the emergence of Ingo Molnar's Realtime Preemption kernel patch it's being now recommended for your taking benefit of the realtime and low-latency audio pleasure JACK can give. Support ------- QjackCtl is open source free software. For bug reports, feature requests, discussion forums, mailling lists, or any other matter related to the development of this piece of software, please use the Sourceforge project page (https://sourceforge.net/projects/qjackctl). You can also find timely and closer contact information on my personal web site (https://www.rncbc.org). Acknowledgments --------------- QjackCtl's user interface layout (and the whole idea for that matter) was partially borrowed from origoinal Lawrie Abbott's jacko project, which was taken from wxWindow/Python into the Qt/C++ arena. Since 2003-08-06, qjackctl has been included in the awesome Planet CCRMA (http://ccrma-www.stanford.edu/planetccrma/software/) software collection. Thanks a lot Fernando! Here are some people who helped this project in one way or another, and in fair and strict alphabetic order: Alexandre Prokoudine Kasper Souren Andreas Persson Kjetil Matheussen Arnout Engelen Ken Ellinwood Austin Acton Lawrie Abbott Ben Powers Lee Revell Chris Cannam Lucas Brasilino Dan Nigrin Marc-Olivier Barre Dave Moore Mark Knecht Dave Phillips Matthias Nagorni Dirk Jagdmann Melanie Dominic Sacre Nedko Arnaudov Fernando Pablo Lopez-Lezcano Orm Finnendahl Filipe Tomas Paul Davis Florian Schmidt Robert Jonsson Fons Adriaensen Robin Gareus Geoff Beasley Roland Mas Jack O'Quin Sampo Savolainen Jacob Meuser Stephane Letz Jesse Chappell Steve Harris Joachim Deguara Taybin Rutkin John Schneiderman Wilfried Huss Jussi Laako Wolfgang Woehl Karsten Wiese A special mention should go to the translators of QjackCtl (see TRANSLATORS). Thanks to you all. -- rncbc aka Rui Nuno Capela rncbc at rncbc dot org https://www.rncbc.org qjackctl-1.0.6/PaxHeaders/TRANSLATORS0000644000000000000000000000013215174607203014134 xustar0030 mtime=1777536643.502914385 30 atime=1777536643.502914385 30 ctime=1777536643.502914385 qjackctl-1.0.6/TRANSLATORS0000644000175000001440000000141615174607203014126 0ustar00rncbcusersCzech (cs) Pavel Fric German (de) Guido Scholz Spanish (es) Adrian Pardini Daryl Hanlon French (fr) Raphaël Doursenaud Olivier Humbert Italian (it) Sergio Atzori Japanese (ja) Takashi Sakamoto Korean (ko) JungHee Lee Dutch (nl) Peter Geirnaert Portuguese (pt_BR) Heitor Rocha Russian (ru) Alexandre Prokoudine Slovak (sk) Jose Riha Turkish (tr) Orkun Arapoğlu Ukrainian (uk) Yuri Chornoivan qjackctl-1.0.6/PaxHeaders/cmake0000644000000000000000000000013215174607203013400 xustar0030 mtime=1777536643.503486377 30 atime=1777536643.502914385 30 ctime=1777536643.503486377 qjackctl-1.0.6/cmake/0000755000175000001440000000000015174607203013445 5ustar00rncbcusersqjackctl-1.0.6/cmake/PaxHeaders/FindPortAudio.cmake0000644000000000000000000000013215174607203017166 xustar0030 mtime=1777536643.503486377 30 atime=1777536643.502914385 30 ctime=1777536643.503486377 qjackctl-1.0.6/cmake/FindPortAudio.cmake0000644000175000001440000000605215174607203017161 0ustar00rncbcusers# Distributed under the OSI-approved BSD 3-Clause License. See accompanying # file Copyright.txt or https://cmake.org/licensing for details. #[=======================================================================[.rst: FindPortAudio ----------- Find the PortAudio libraries Set PortAudio_ROOT cmake or environment variable to the PortAudio install root directory to use a specific PortAudio installation. IMPORTED targets ^^^^^^^^^^^^^^^^ This module defines the following :prop_tgt:`IMPORTED` target: ``PortAudio::PortAudio`` Result variables ^^^^^^^^^^^^^^^^ This module will set the following variables if found: ``PortAudio_INCLUDE_DIRS`` where to find portaudio.h, etc. ``PortAudio_LIBRARIES`` the libraries to link against to use PortAudio. ``PortAudio_FOUND`` TRUE if found #]=======================================================================] include(FindPackageHandleStandardArgs) # Use hints from pkg-config if available find_package (PkgConfig QUIET) if(PKG_CONFIG_FOUND) pkg_check_modules(PC_PortAudio portaudio-2.0) endif() find_package(Threads QUIET) # Look for the necessary header find_path(PortAudio_INCLUDE_DIR NAMES portaudio.h HINTS ${PC_PortAudio_INCLUDE_DIRS} ) mark_as_advanced(PortAudio_INCLUDE_DIR) # Look for the necessary library set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "") find_library(PortAudio_LIBRARY NAMES ${PC_PortAudio_LIBRARIES} portaudio NAMES_PER_DIR HINTS ${PC_PortAudio_LIBRARY_DIRS} ) mark_as_advanced(PortAudio_LIBRARY) set(PortAudio_INCLUDE_DIRS ${PortAudio_INCLUDE_DIR} CACHE PATH "PortAudio include directories") if(PC_PortAudio_FOUND) # Use pkg-config data as it might have additional transitive dependencies of portaudio # itself in case of using the static lib. set(PortAudio_LIBRARIES ${PC_PortAudio_LIBRARIES} CACHE FILEPATH "PortAudio libraries" ) find_package_handle_standard_args(PortAudio REQUIRED_VARS PortAudio_LIBRARIES PortAudio_INCLUDE_DIRS VERSION_VAR PortAudio_VERSION ) else() set(PortAudio_LIBRARIES ${PortAudio_LIBRARY} CACHE FILEPATH "PortAudio libraries" ) find_package_handle_standard_args(PortAudio REQUIRED_VARS PortAudio_LIBRARIES PortAudio_INCLUDE_DIRS) endif() if(PortAudio_FOUND) # Create the imported target if(NOT TARGET PortAudio::PortAudio) add_library(PortAudio::PortAudio UNKNOWN IMPORTED) set_target_properties(PortAudio::PortAudio PROPERTIES IMPORTED_LOCATION "${PortAudio_LIBRARY}") target_include_directories(PortAudio::PortAudio INTERFACE ${PortAudio_INCLUDE_DIRS}) target_link_libraries(PortAudio::PortAudio INTERFACE ${PortAudio_LIBRARIES}) if(WIN32 AND NOT PC_PortAudio_FOUND) # Needed when building against the static library target_link_libraries(PortAudio::PortAudio INTERFACE dsound setupapi winmm ole32 uuid) endif() if(Threads_FOUND) # Needed when building against the static library target_link_libraries(PortAudio::PortAudio INTERFACE Threads::Threads) endif() endif() else() message(STATUS "Set PortAudio_ROOT cmake or environment variable to the PortAudio install root directory to use a specific PortAudio installation.") endif() qjackctl-1.0.6/cmake/PaxHeaders/FindJack.cmake0000644000000000000000000000013215174607203016130 xustar0030 mtime=1777536643.502914385 30 atime=1777536643.502914385 30 ctime=1777536643.502914385 qjackctl-1.0.6/cmake/FindJack.cmake0000644000175000001440000000471215174607203016124 0ustar00rncbcusers# Distributed under the OSI-approved BSD 3-Clause License. See accompanying # file Copyright.txt or https://cmake.org/licensing for details. #[=======================================================================[.rst: FindJack ----------- Find the Jack libraries Set Jack_ROOT cmake or environment variable to the Jack install root directory to use a specific Jack installation. IMPORTED targets ^^^^^^^^^^^^^^^^ This module defines the following :prop_tgt:`IMPORTED` target: ``Jack::Jack`` Result variables ^^^^^^^^^^^^^^^^ This module will set the following variables if found: ``Jack_INCLUDE_DIRS`` where to find Jack.h, etc. ``Jack_LIBRARIES`` the libraries to link against to use Jack. ``Jack_FOUND`` TRUE if found #]=======================================================================] if(WIN32) if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") set(JACK_DEFAULT_PATHS "C:/Program Files (x86)/JACK2;C:/Program Files/JACK2") set(JACK_DEFAULT_NAME "jack") set(JACK_DEFAULT_LIB_SUFFIX "lib32;lib") else() set(JACK_DEFAULT_PATHS "C:/Program Files/JACK2") set(JACK_DEFAULT_NAME "jack64;jack") set(JACK_DEFAULT_LIB_SUFFIX "lib") endif() set(CMAKE_FIND_LIBRARY_PREFIXES "lib;") else() set(JACK_DEFAULT_NAME "jack") set(JACK_DEFAULT_LIB_SUFFIX "lib") endif() find_package (PkgConfig QUIET) if(PKG_CONFIG_FOUND) pkg_check_modules (PC_JACK jack>=0.100.0) endif() # Look for the necessary header find_path(Jack_INCLUDE_DIR NAMES jack/jack.h PATH_SUFFIXES include includes HINTS ${PC_JACK_INCLUDE_DIRS} PATHS ${JACK_DEFAULT_PATHS} ) mark_as_advanced(Jack_INCLUDE_DIR) # Look for the necessary library find_library(Jack_LIBRARY NAMES ${PC_JACK_LIBRARIES} ${JACK_DEFAULT_NAME} NAMES_PER_DIR PATH_SUFFIXES ${JACK_DEFAULT_LIB_SUFFIX} HINTS ${PC_JACK_LIBRARY_DIRS} PATHS ${JACK_DEFAULT_PATHS} ) mark_as_advanced(Jack_LIBRARY) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Jack REQUIRED_VARS Jack_LIBRARY Jack_INCLUDE_DIR) # Create the imported target if(Jack_FOUND) set(Jack_INCLUDE_DIRS ${Jack_INCLUDE_DIR}) set(Jack_LIBRARIES ${Jack_LIBRARY}) if(NOT TARGET Jack::Jack) add_library(Jack::Jack UNKNOWN IMPORTED) set_target_properties(Jack::Jack PROPERTIES IMPORTED_LOCATION "${Jack_LIBRARY}") target_include_directories(Jack::Jack INTERFACE "${Jack_INCLUDE_DIR}") endif() else() message(STATUS "Set Jack_ROOT cmake or environment variable to the Jack install root directory to use a specific Jack installation.") endif() qjackctl-1.0.6/PaxHeaders/src0000644000000000000000000000013215174607203013107 xustar0030 mtime=1777536643.517914276 30 atime=1777536643.503565761 30 ctime=1777536643.517914276 qjackctl-1.0.6/src/0000755000175000001440000000000015174607203013154 5ustar00rncbcusersqjackctl-1.0.6/src/PaxHeaders/qjackctlSessionForm.h0000644000000000000000000000013215174607203017321 xustar0030 mtime=1777536643.515914291 30 atime=1777536643.515914291 30 ctime=1777536643.515914291 qjackctl-1.0.6/src/qjackctlSessionForm.h0000644000175000001440000001173515174607203017320 0ustar00rncbcusers// qjackctlSessionForm.h // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSessionForm_h #define __qjackctlSessionForm_h #include "ui_qjackctlSessionForm.h" #include "qjackctlSession.h" #include #include // Forward declarations. class qjackctlSetup; class QMenu; class QIcon; class QLineEdit; class QToolButton; //------------------------------------------------------------------------- // qjackctlSessionInfraClientItemEditor class qjackctlSessionInfraClientItemEditor : public QWidget { Q_OBJECT public: // Constructor. qjackctlSessionInfraClientItemEditor( QWidget *pParent, const QModelIndex& index); // Shortcut text accessors. void setText(const QString& sText); QString text() const; // Default (initial) shortcut text accessors. void setDefaultText(const QString& sDefaultText) { m_sDefaultText = sDefaultText; } const QString& defaultText() const { return m_sDefaultText; } signals: void finishSignal(); protected slots: void browseSlot(); void resetSlot(); void finishSlot(); private: // Instance variables. QModelIndex m_index; QLineEdit *m_pItemEdit; QToolButton *m_pBrowseButton; QToolButton *m_pResetButton; QString m_sDefaultText; }; //------------------------------------------------------------------------- // qjackctlSessionInfraClientItemDelegate class qjackctlSessionInfraClientItemDelegate : public QItemDelegate { Q_OBJECT public: // Constructor. qjackctlSessionInfraClientItemDelegate(QObject *pParent = nullptr); protected: QWidget *createEditor(QWidget *pParent, const QStyleOptionViewItem& option, const QModelIndex& index) const; void setEditorData(QWidget *pEditor, const QModelIndex &index) const; void setModelData(QWidget *pEditor, QAbstractItemModel *pModel, const QModelIndex& index) const; protected slots: void commitEditor(); }; //---------------------------------------------------------------------------- // qjackctlSessionForm -- UI wrapper form. class qjackctlSessionForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlSessionForm(QWidget *pParent = nullptr, Qt::WindowFlags wflags = Qt::WindowFlags()); // Destructor. ~qjackctlSessionForm(); // Global setup method. void setup(qjackctlSetup *pSetup); // Maybe ask whether we can close. bool queryClose(); // Recent session directories and save type accessors. const QStringList& sessionDirs() const; void setSessionSaveVersion(bool bSessionSaveVersion); bool isSessionSaveVersion() const; // Recent menu accessor. QMenu *recentMenu() const; // Save menu accessor. QMenu *saveMenu() const; void stabilizeForm(bool bEnabled); public slots: void loadSession(); void saveSessionSave(); void saveSessionSaveAndQuit(); void saveSessionSaveTemplate(); void saveSessionVersion(bool); void updateSession(); protected slots: void recentSession(); void updateRecentMenu(); void clearRecentMenu(); void sessionViewContextMenu(const QPoint& pos); void addInfraClient(); void editInfraClient(); void editInfraClientCommit(); void removeInfraClient(); void selectInfraClient(); void updateInfraClients(); void infraClientContextMenu(const QPoint& pos); protected: void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void closeEvent(QCloseEvent *); void keyPressEvent(QKeyEvent *); typedef qjackctlSession::SaveType SaveType; void saveSessionEx(SaveType stype); void loadSessionDir(const QString& sSessionDir); void saveSessionDir(const QString& sSessionDir, SaveType stype); void updateRecent(const QString& sSessionDir); void updateSessionView(); static QIcon iconStatus(const QIcon& icon, bool bStatus); private: // The Qt-designer UI struct... Ui::qjackctlSessionForm m_ui; // Common (sigleton) session object. qjackctlSession *m_pSession; // Recent session menu. QMenu *m_pRecentMenu; // Save session menu. QMenu *m_pSaveMenu; // Setup options. qjackctlSetup *m_pSetup; // Session directory history. QStringList m_sessionDirs; // session versioning flag. bool m_bSessionSaveVersion; }; #endif // __qjackctlSessionForm_h // end of qjackctlSessionForm.h qjackctl-1.0.6/src/PaxHeaders/qjackctlSessionForm.cpp0000644000000000000000000000013215174607203017654 xustar0030 mtime=1777536643.515914291 30 atime=1777536643.515914291 30 ctime=1777536643.515914291 qjackctl-1.0.6/src/qjackctlSessionForm.cpp0000644000175000001440000007040015174607203017645 0ustar00rncbcusers// qjackctlSessionForm.cpp // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlSessionForm.h" #include "qjackctlSessionSaveForm.h" #include "qjackctlMainForm.h" #include #include #include #include #include #include #include #include #include #include #include #include // Local prototypes. static void remove_dir_list(const QList& list); static void remove_dir(const QString& sDir); // Remove specific file path. static void remove_dir ( const QString& sDir ) { QDir dir(sDir); remove_dir_list( dir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot)); dir.rmdir(sDir); } static void remove_dir_list ( const QList& list ) { QListIterator iter(list); while (iter.hasNext()) { const QFileInfo& info = iter.next(); const QString& sPath = info.absoluteFilePath(); if (info.isDir()) { remove_dir(sPath); } else { QFile::remove(sPath); } } } //------------------------------------------------------------------------- // qjackctlSessionInfraClientItemEditor qjackctlSessionInfraClientItemEditor::qjackctlSessionInfraClientItemEditor ( QWidget *pParent, const QModelIndex& index ) : QWidget(pParent), m_index(index) { m_pItemEdit = new QLineEdit(/*this*/); if (index.column() == 1) { m_pBrowseButton = new QToolButton(/*this*/); m_pBrowseButton->setFixedWidth(18); m_pBrowseButton->setText("..."); } else m_pBrowseButton = nullptr; m_pResetButton = new QToolButton(/*this*/); m_pResetButton->setFixedWidth(18); m_pResetButton->setText("x"); QHBoxLayout *pLayout = new QHBoxLayout(); pLayout->setSpacing(0); pLayout->setContentsMargins(0, 0, 0, 0); pLayout->addWidget(m_pItemEdit); if (m_pBrowseButton) pLayout->addWidget(m_pBrowseButton); pLayout->addWidget(m_pResetButton); QWidget::setLayout(pLayout); QWidget::setFocusPolicy(Qt::StrongFocus); QWidget::setFocusProxy(m_pItemEdit); QObject::connect(m_pItemEdit, SIGNAL(editingFinished()), SLOT(finishSlot())); if (m_pBrowseButton) QObject::connect(m_pBrowseButton, SIGNAL(clicked()), SLOT(browseSlot())); QObject::connect(m_pResetButton, SIGNAL(clicked()), SLOT(resetSlot())); } // Item text accessors. void qjackctlSessionInfraClientItemEditor::setText ( const QString& sText ) { m_pItemEdit->setText(sText); } QString qjackctlSessionInfraClientItemEditor::text (void) const { return m_pItemEdit->text(); } // Item command browser. void qjackctlSessionInfraClientItemEditor::browseSlot (void) { const bool bBlockSignals = m_pItemEdit->blockSignals(true); const QString& sCommand = QFileDialog::getOpenFileName(parentWidget(), tr("Infra-command")); if (!sCommand.isEmpty()) m_pItemEdit->setText(sCommand); m_pItemEdit->blockSignals(bBlockSignals); } // Item text clear/toggler. void qjackctlSessionInfraClientItemEditor::resetSlot (void) { if (m_pItemEdit->text() == m_sDefaultText) m_pItemEdit->clear(); else m_pItemEdit->setText(m_sDefaultText); m_pItemEdit->setFocus(); } // Item text finish notification. void qjackctlSessionInfraClientItemEditor::finishSlot (void) { const bool bBlockSignals = m_pItemEdit->blockSignals(true); emit finishSignal(); m_index = QModelIndex(); m_sDefaultText.clear(); m_pItemEdit->blockSignals(bBlockSignals); } //------------------------------------------------------------------------- // qjackctlSessionInfraClientItemDelegate qjackctlSessionInfraClientItemDelegate::qjackctlSessionInfraClientItemDelegate ( QObject *pParent ) : QItemDelegate(pParent) { } QWidget *qjackctlSessionInfraClientItemDelegate::createEditor ( QWidget *pParent, const QStyleOptionViewItem& /*option*/, const QModelIndex& index ) const { qjackctlSessionInfraClientItemEditor *pItemEditor = new qjackctlSessionInfraClientItemEditor(pParent, index); pItemEditor->setDefaultText( index.model()->data(index, Qt::DisplayRole).toString()); QObject::connect(pItemEditor, SIGNAL(finishSignal()), SLOT(commitEditor())); return pItemEditor; } void qjackctlSessionInfraClientItemDelegate::setEditorData ( QWidget *pEditor, const QModelIndex& index ) const { qjackctlSessionInfraClientItemEditor *pItemEditor = qobject_cast (pEditor); pItemEditor->setText( index.model()->data(index, Qt::DisplayRole).toString()); } void qjackctlSessionInfraClientItemDelegate::setModelData ( QWidget *pEditor, QAbstractItemModel *pModel, const QModelIndex& index ) const { qjackctlSessionInfraClientItemEditor *pItemEditor = qobject_cast (pEditor); pModel->setData(index, pItemEditor->text()); } void qjackctlSessionInfraClientItemDelegate::commitEditor (void) { qjackctlSessionInfraClientItemEditor *pItemEditor = qobject_cast (sender()); const QString& sText = pItemEditor->text(); const QString& sDefaultText = pItemEditor->defaultText(); if (sText != sDefaultText) emit commitData(pItemEditor); emit closeEditor(pItemEditor); } //---------------------------------------------------------------------------- // qjackctlSessionForm -- UI wrapper form. // Constructor. qjackctlSessionForm::qjackctlSessionForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); m_pSetup = nullptr; m_bSessionSaveVersion = false; // Common (sigleton) session object. m_pSession = new qjackctlSession(); // Set recent menu stuff... m_pRecentMenu = new QMenu(tr("&Recent")); m_ui.RecentSessionPushButton->setMenu(m_pRecentMenu); m_pSaveMenu = new QMenu(tr("&Save")); m_pSaveMenu->setIcon(QIcon(":/images/save1.png")); m_pSaveMenu->addAction(QIcon(":/images/save1.png"), tr("&Save..."), this, SLOT(saveSessionSave())); #ifdef CONFIG_JACK_SESSION m_pSaveMenu->addAction( tr("Save and &Quit..."), this, SLOT(saveSessionSaveAndQuit())); m_pSaveMenu->addAction( tr("Save &Template..."), this, SLOT(saveSessionSaveTemplate())); #endif m_ui.SaveSessionPushButton->setMenu(m_pSaveMenu); // Session tree view... QHeaderView *pHeader = m_ui.SessionTreeView->header(); // pHeader->setDefaultAlignment(Qt::AlignLeft); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) // pHeader->setSectionResizeMode(QHeaderView::ResizeToContents); #else // pHeader->setResizeMode(QHeaderView::ResizeToContents); #endif pHeader->resizeSection(0, 200); // Client/Ports pHeader->resizeSection(1, 40); // UUID pHeader->setStretchLastSection(true); m_ui.SessionTreeView->setContextMenuPolicy(Qt::CustomContextMenu); // Infra-client list view... pHeader = m_ui.InfraClientListView->header(); // pHeader->setDefaultAlignment(Qt::AlignLeft); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) // pHeader->setSectionResizeMode(QHeaderView::ResizeToContents); #else // pHeader->setResizeMode(QHeaderView::ResizeToContents); #endif pHeader->resizeSection(0, 120); // Infra-client pHeader->setStretchLastSection(true); m_ui.InfraClientListView->setItemDelegate( new qjackctlSessionInfraClientItemDelegate(m_ui.InfraClientListView)); m_ui.InfraClientListView->setContextMenuPolicy(Qt::CustomContextMenu); m_ui.InfraClientListView->sortItems(0, Qt::AscendingOrder); // UI connections... QObject::connect(m_ui.LoadSessionPushButton, SIGNAL(clicked()), SLOT(loadSession())); QObject::connect(m_ui.UpdateSessionPushButton, SIGNAL(clicked()), SLOT(updateSession())); QObject::connect(m_ui.SessionTreeView, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(sessionViewContextMenu(const QPoint&))); QObject::connect(m_ui.InfraClientListView, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), SLOT(selectInfraClient())); QObject::connect(m_ui.AddInfraClientPushButton, SIGNAL(clicked()), SLOT(addInfraClient())); QObject::connect(m_ui.EditInfraClientPushButton, SIGNAL(clicked()), SLOT(editInfraClient())); QObject::connect(m_ui.RemoveInfraClientPushButton, SIGNAL(clicked()), SLOT(removeInfraClient())); QObject::connect(m_ui.InfraClientListView->itemDelegate(), SIGNAL(commitData(QWidget *)), SLOT(editInfraClientCommit())); QObject::connect(m_ui.InfraClientListView, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(infraClientContextMenu(const QPoint&))); // Start disabled. stabilizeForm(false); } // Destructor. qjackctlSessionForm::~qjackctlSessionForm (void) { delete m_pSaveMenu; delete m_pRecentMenu; delete m_pSession; } // Set reference to global options, mostly needed for // the initial session save type and directories. void qjackctlSessionForm::setup ( qjackctlSetup *pSetup ) { m_pSetup = pSetup; if (m_pSetup) { // Have recent session directories and versioning option... m_sessionDirs = m_pSetup->sessionDirs; m_bSessionSaveVersion = m_pSetup->bSessionSaveVersion; // Setup infra-clients table view... QList sizes; sizes.append(320); sizes.append(120); m_pSetup->loadSplitterSizes(m_ui.InfraClientSplitter, sizes); // Load infra-clients table-view... m_pSession->loadInfraClients(m_pSetup->settings()); } updateRecentMenu(); updateInfraClients(); } // Maybe ask whether we can close. bool qjackctlSessionForm::queryClose (void) { bool bQueryClose = true; // Maybe just save some splitter sizes... if (m_pSetup && bQueryClose) { // Rebuild infra-clients list... m_pSession->clearInfraClients(); qjackctlSession::InfraClientList& list = m_pSession->infra_clients(); const int iItemCount = m_ui.InfraClientListView->topLevelItemCount(); for (int i = 0; i < iItemCount; ++i) { QTreeWidgetItem *pItem = m_ui.InfraClientListView->topLevelItem(i); if (pItem) { const QString& sKey = pItem->text(0); const QString& sValue = pItem->text(1); if (!sValue.isEmpty()) { qjackctlSession::InfraClientItem *pInfraClientItem = new qjackctlSession::InfraClientItem; pInfraClientItem->client_name = sKey; pInfraClientItem->client_command = sValue; list.insert(sKey, pInfraClientItem); } } } // Save infra-clients table-view... m_pSession->saveInfraClients(m_pSetup->settings()); m_pSetup->saveSplitterSizes(m_ui.InfraClientSplitter); } return bQueryClose; } // Recent session directories accessor. const QStringList& qjackctlSessionForm::sessionDirs (void) const { return m_sessionDirs; } // Session save versioning option. void qjackctlSessionForm::setSessionSaveVersion ( bool bSessionSaveVersion ) { m_bSessionSaveVersion = bSessionSaveVersion; } bool qjackctlSessionForm::isSessionSaveVersion (void) const { return m_bSessionSaveVersion; } // Recent menu accessor. QMenu *qjackctlSessionForm::recentMenu (void) const { return m_pRecentMenu; } // Save menu accessor. QMenu *qjackctlSessionForm::saveMenu (void) const { return m_pSaveMenu; } // Notify our parent that we're emerging. void qjackctlSessionForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeFormEx(); QWidget::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlSessionForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeFormEx(); } // Just about to notify main-window that we're closing. void qjackctlSessionForm::closeEvent ( QCloseEvent *pCloseEvent ) { if (m_pSetup) { // Save recent session directories and versioning option... m_pSetup->sessionDirs = m_sessionDirs; m_pSetup->bSessionSaveVersion = m_bSessionSaveVersion; } QWidget::closeEvent(pCloseEvent); } // Open/load session from specific file path. void qjackctlSessionForm::loadSession (void) { QString sSessionDir; #if 0 QFileDialog loadDialog(this, tr("Load Session")); loadDialog.setAcceptMode(QFileDialog::AcceptOpen); loadDialog.setFileMode(QFileDialog::Directory); loadDialog.setViewMode(QFileDialog::List); loadDialog.setOptions(QFileDialog::ShowDirsOnly); loadDialog.setNameFilter(tr("Session directory")); loadDialog.setHistory(m_sessionDirs); if (!m_sessionDirs.isEmpty()) loadDialog.setDirectory(m_sessionDirs.first()); if (!loadDialog.exec()) return; sSessionDir = loadDialog.selectedFiles().first(); #else if (!m_sessionDirs.isEmpty()) sSessionDir = m_sessionDirs.first(); sSessionDir = QFileDialog::getExistingDirectory( this, tr("Load Session"), sSessionDir); #endif loadSessionDir(sSessionDir); } // Load a recent session. void qjackctlSessionForm::recentSession (void) { QAction *pAction = qobject_cast (sender()); if (pAction) { const int i = pAction->data().toInt(); if (i >= 0 && i < m_sessionDirs.count()) loadSessionDir(m_sessionDirs.at(i)); } } // Save current session to specific file path. void qjackctlSessionForm::saveSessionSave (void) { saveSessionEx(SaveType::Save); } void qjackctlSessionForm::saveSessionSaveAndQuit (void) { saveSessionEx(SaveType::SaveAndQuit); } void qjackctlSessionForm::saveSessionSaveTemplate (void) { saveSessionEx(SaveType::SaveTemplate); } void qjackctlSessionForm::saveSessionEx ( SaveType stype ) { QString sTitle = tr("Save Session"); switch (stype) { case SaveType::Save: default: break; case SaveType::SaveAndQuit: sTitle += ' ' + tr("and Quit"); break; case SaveType::SaveTemplate: sTitle += ' ' + tr("Template"); break; } qjackctlSessionSaveForm saveForm(this, sTitle, m_sessionDirs); saveForm.setSessionSaveVersion(isSessionSaveVersion()); if (saveForm.exec()) { setSessionSaveVersion(saveForm.isSessionSaveVersion()); saveSessionDir(saveForm.sessionDir(), stype); } } // Save current session to specific file path. void qjackctlSessionForm::saveSessionVersion ( bool bOn ) { setSessionSaveVersion(bOn); } // Update the recent session list and menu. void qjackctlSessionForm::updateRecent ( const QString& sSessionDir ) { const int i = m_sessionDirs.indexOf(sSessionDir); if (i >= 0) m_sessionDirs.removeAt(i); m_sessionDirs.prepend(sSessionDir); updateRecentMenu(); } // Update/stabilize recent sessions menu. void qjackctlSessionForm::updateRecentMenu (void) { int iRecent = m_sessionDirs.count(); for (; iRecent > 8; --iRecent) m_sessionDirs.pop_back(); m_pRecentMenu->clear(); for (int i = 0; i < iRecent; ++i) { const QString& sSessionDir = m_sessionDirs.at(i); if (QDir(sSessionDir).exists()) { QAction *pAction = m_pRecentMenu->addAction( QFileInfo(sSessionDir).fileName(), this, SLOT(recentSession())); pAction->setData(i); } } if (iRecent > 0) { m_pRecentMenu->addSeparator(); m_pRecentMenu->addAction(tr("&Clear"), this, SLOT(clearRecentMenu())); } m_ui.RecentSessionPushButton->setEnabled(iRecent > 0); } // Clear recent sessions menu. void qjackctlSessionForm::clearRecentMenu (void) { m_sessionDirs.clear(); updateRecentMenu(); } // Open/load session from specific file path. void qjackctlSessionForm::loadSessionDir ( const QString& sSessionDir ) { if (sSessionDir.isEmpty()) return; const QDir sessionDir(sSessionDir); if (!sessionDir.exists("session.xml")) { QMessageBox::critical(this, tr("Warning") + " - " QJACKCTL_TITLE, tr("A session could not be found in this folder:\n\n\"%1\"") .arg(sSessionDir)); return; } qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == nullptr) return; pMainForm->appendMessages( tr("%1: loading session...").arg(sSessionDir)); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); const bool bLoadSession = m_pSession->load(sSessionDir); if (bLoadSession) updateRecent(sessionDir.absolutePath()); updateSessionView(); QApplication::restoreOverrideCursor(); pMainForm->appendMessages( tr("%1: load session %2.").arg(sSessionDir) .arg(bLoadSession ? "OK" : "FAILED")); } // Save current session to specific file path. void qjackctlSessionForm::saveSessionDir ( const QString& sSessionDir, SaveType stype ) { if (sSessionDir.isEmpty()) return; QDir sessionDir(sSessionDir); const QList list = sessionDir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot); if (!list.isEmpty()) { if (sessionDir.exists("session.xml")) { if (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_TITLE, tr("A session already exists in this folder:\n\n\"%1\"\n\n" "Are you sure to overwrite the existing session?").arg(sSessionDir), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel) return; } else { if (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_TITLE, tr("This folder already exists and is not empty:\n\n\"%1\"\n\n" "Are you sure to overwrite the existing folder?").arg(sSessionDir), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel) return; } // remove_dir_list(list); } qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == nullptr) return; pMainForm->appendMessages( tr("%1: saving session...").arg(sSessionDir)); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); if (!list.isEmpty()) { if (isSessionSaveVersion()) { int iSessionDirNo = 0; const QString sSessionDirMask = sSessionDir + ".%1"; QFileInfo fi(sSessionDirMask.arg(++iSessionDirNo)); while (fi.exists()) fi.setFile(sSessionDirMask.arg(++iSessionDirNo)); sessionDir.rename(sSessionDir, fi.absoluteFilePath()); } else remove_dir_list(list); sessionDir.refresh(); } if (!sessionDir.exists()) sessionDir.mkpath(sSessionDir); const bool bSaveSession = m_pSession->save(sSessionDir, stype); if (bSaveSession) updateRecent(sSessionDir); updateSessionView(); QApplication::restoreOverrideCursor(); pMainForm->appendMessages( tr("%1: save session %2.").arg(sSessionDir) .arg(bSaveSession ? "OK" : "FAILED")); } // Set icon error status according to given flag. QIcon qjackctlSessionForm::iconStatus ( const QIcon& icon, bool bStatus ) { QPixmap pm(icon.pixmap(16, 16)); // Merge with the overlay pixmap... if (bStatus) { const QPixmap pmOverlay(":/images/error1.png"); if (!pmOverlay.mask().isNull()) { QBitmap mask = pm.mask(); QPainter(&mask).drawPixmap(0, 0, pmOverlay.mask()); pm.setMask(mask); QPainter(&pm).drawPixmap(0, 0, pmOverlay); } } return QIcon(pm); } // Update/populate session tree view. void qjackctlSessionForm::updateSessionView (void) { m_ui.SessionTreeView->clear(); QList items; const QIcon iconClient(":/images/client1.png"); const QIcon iconPort(":/images/port1.png"); const QIcon iconConnect(":/images/connect1.png"); qjackctlSession::ClientList::ConstIterator iterClient = m_pSession->clients().constBegin(); for ( ; iterClient != m_pSession->clients().constEnd(); ++iterClient) { qjackctlSession::ClientItem *pClientItem = iterClient.value(); QTreeWidgetItem *pTopLevelItem = new QTreeWidgetItem(); pTopLevelItem->setIcon(0, iconStatus(iconClient, pClientItem->connected)); pTopLevelItem->setText(0, pClientItem->client_name); pTopLevelItem->setText(1, pClientItem->client_uuid); pTopLevelItem->setText(2, pClientItem->client_command); QListIterator iterPort(pClientItem->ports); QTreeWidgetItem *pChildItem = nullptr; while (iterPort.hasNext()) { qjackctlSession::PortItem *pPortItem = iterPort.next(); pChildItem = new QTreeWidgetItem(pTopLevelItem, pChildItem); pChildItem->setIcon(0, iconStatus(iconPort, pPortItem->connected)); pChildItem->setText(0, pPortItem->port_name); QListIterator iterConnect(pPortItem->connects); QTreeWidgetItem *pLeafItem = nullptr; while (iterConnect.hasNext()) { qjackctlSession::ConnectItem *pConnectItem = iterConnect.next(); pLeafItem = new QTreeWidgetItem(pChildItem, pLeafItem); pLeafItem->setIcon(0, iconStatus(iconConnect, !pConnectItem->connected)); pLeafItem->setText(0, pConnectItem->client_name + ':' + pConnectItem->port_name); } } items.append(pTopLevelItem); } m_ui.SessionTreeView->insertTopLevelItems(0, items); m_ui.SessionTreeView->expandAll(); } // Update/populate session connections and tree view. void qjackctlSessionForm::updateSession (void) { m_pSession->update(); updateSessionView(); updateInfraClients(); } // Context menu event handler. void qjackctlSessionForm::sessionViewContextMenu ( const QPoint& pos ) { QMenu menu(this); QAction *pAction; bool bEnabled = false; qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) bEnabled = (pMainForm->jackClient() != nullptr); pAction = menu.addAction(QIcon(":/images/open1.png"), tr("&Load..."), this, SLOT(loadSession())); pAction->setEnabled(bEnabled); pAction = menu.addMenu(m_pRecentMenu); pAction->setEnabled(bEnabled && !m_pRecentMenu->isEmpty()); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/save1.png"), tr("&Save..."), this, SLOT(saveSessionSave())); pAction->setEnabled(bEnabled); #ifdef CONFIG_JACK_SESSION pAction = menu.addAction( tr("Save and &Quit..."), this, SLOT(saveSessionSaveAndQuit())); pAction->setEnabled(bEnabled); pAction = menu.addAction( tr("Save &Template..."), this, SLOT(saveSessionSaveTemplate())); pAction->setEnabled(bEnabled); #endif menu.addSeparator(); pAction = menu.addAction( tr("&Versioning"), this, SLOT(saveSessionVersion(bool))); pAction->setCheckable(true); pAction->setChecked(isSessionSaveVersion()); pAction->setEnabled(bEnabled); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("Re&fresh"), this, SLOT(updateSession())); menu.exec(m_ui.SessionTreeView->mapToGlobal(pos)); } // Add a new infra-client entry. void qjackctlSessionForm::addInfraClient (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::addInfraClient()"); #endif const QString& sNewInfraClient = tr("New Client"); QTreeWidgetItem *pItem = nullptr; const QList& items = m_ui.InfraClientListView->findItems(sNewInfraClient, Qt::MatchExactly); if (items.isEmpty()) { pItem = m_ui.InfraClientListView->currentItem(); pItem = new QTreeWidgetItem(m_ui.InfraClientListView, pItem); pItem->setIcon(0, iconStatus(QIcon(":/images/client1.png"), true)); pItem->setText(0, sNewInfraClient); pItem->setFlags(pItem->flags() | Qt::ItemIsEditable); } else { pItem = items.first(); } m_ui.InfraClientListView->editItem(pItem, 0); } // Edit current infra-client entry. void qjackctlSessionForm::editInfraClient (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::editInfraClient()"); #endif QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); if (pItem) m_ui.InfraClientListView->editItem(pItem, 1); } void qjackctlSessionForm::editInfraClientCommit (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::editInfraClientCommit()"); #endif QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); if (pItem) { const QString& sKey = pItem->text(0); if (!sKey.isEmpty()) { const QString& sValue = pItem->text(1); qjackctlSession::InfraClientItem *pInfraClientItem = nullptr; qjackctlSession::InfraClientList& list = m_pSession->infra_clients(); qjackctlSession::InfraClientList::Iterator iter = list.find(sKey); if (iter == list.end()) { pInfraClientItem = new qjackctlSession::InfraClientItem; pInfraClientItem->client_name = sKey; pInfraClientItem->client_command = sValue; list.insert(sKey, pInfraClientItem); } else { pInfraClientItem = iter.value(); pInfraClientItem->client_command = sValue; } pItem->setIcon(0, iconStatus(QIcon(":/images/client1.png"), pInfraClientItem->client_command.isEmpty())); } } } // Remove current infra-client entry. void qjackctlSessionForm::removeInfraClient (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::removeInfraClient()"); #endif QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); if (pItem) { const QString& sKey = pItem->text(0); qjackctlSession::InfraClientList& list = m_pSession->infra_clients(); qjackctlSession::InfraClientList::Iterator iter = list.find(sKey); if (iter != list.end()) list.erase(iter); delete pItem; updateInfraClients(); } } // Select current infra-client entry. void qjackctlSessionForm::selectInfraClient (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::selectInfraClient()"); #endif QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); m_ui.AddInfraClientPushButton->setEnabled(true); m_ui.EditInfraClientPushButton->setEnabled(pItem != nullptr); m_ui.RemoveInfraClientPushButton->setEnabled(pItem != nullptr); } // Update/populate infra-clients commands list view. void qjackctlSessionForm::updateInfraClients (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::updateInfraClients()"); #endif const int iOldItem = m_ui.InfraClientListView->indexOfTopLevelItem( m_ui.InfraClientListView->currentItem()); m_ui.InfraClientListView->clear(); const QIcon iconClient(":/images/client1.png"); QTreeWidgetItem *pItem = nullptr; qjackctlSession::InfraClientList& list = m_pSession->infra_clients(); qjackctlSession::InfraClientList::ConstIterator iter = list.constBegin(); const qjackctlSession::InfraClientList::ConstIterator& iter_end = list.constEnd(); for( ; iter != iter_end; ++iter) { qjackctlSession::InfraClientItem *pInfraClientItem = iter.value(); pItem = new QTreeWidgetItem(m_ui.InfraClientListView, pItem); pItem->setIcon(0, iconStatus(iconClient, pInfraClientItem->client_command.isEmpty())); pItem->setText(0, pInfraClientItem->client_name); pItem->setText(1, pInfraClientItem->client_command); pItem->setFlags(pItem->flags() | Qt::ItemIsEditable); } int iItemCount = m_ui.InfraClientListView->topLevelItemCount(); if (iOldItem >= 0 && iOldItem < iItemCount) { m_ui.InfraClientListView->setCurrentItem( m_ui.InfraClientListView->topLevelItem(iOldItem)); } } // Infra-client list context menu. void qjackctlSessionForm::infraClientContextMenu ( const QPoint& pos ) { QMenu menu(this); QAction *pAction; QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); pAction = menu.addAction(QIcon(":/images/add1.png"), tr("&Add"), this, SLOT(addInfraClient())); // pAction->setEnabled(true); pAction = menu.addAction(QIcon(":/images/edit1.png"), tr("&Edit"), this, SLOT(editInfraClient())); pAction->setEnabled(pItem != nullptr); pAction = menu.addAction(QIcon(":/images/remove1.png"), tr("Re&move"), this, SLOT(removeInfraClient())); pAction->setEnabled(pItem != nullptr); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("Re&fresh"), this, SLOT(updateInfraClients())); // pAction->setEnabled(true); menu.exec(m_ui.InfraClientListView->mapToGlobal(pos)); } // Stabilize form status. void qjackctlSessionForm::stabilizeForm ( bool bEnabled ) { m_ui.LoadSessionPushButton->setEnabled(bEnabled); m_ui.RecentSessionPushButton->setEnabled(bEnabled && !m_pRecentMenu->isEmpty()); m_ui.SaveSessionPushButton->setEnabled(bEnabled); m_ui.UpdateSessionPushButton->setEnabled(bEnabled); if (!bEnabled) { m_pSession->clear(); m_ui.SessionTreeView->clear(); } selectInfraClient(); } // Keyboard event handler. void qjackctlSessionForm::keyPressEvent ( QKeyEvent *pKeyEvent ) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::keyPressEvent(%d)", pKeyEvent->key()); #endif const int iKey = pKeyEvent->key(); switch (iKey) { case Qt::Key_Escape: close(); break; default: QWidget::keyPressEvent(pKeyEvent); break; } } // end of qjackctlSessionForm.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlMessagesStatusForm.ui0000644000000000000000000000013215174607203021037 xustar0030 mtime=1777536643.512914312 30 atime=1777536643.512914312 30 ctime=1777536643.512914312 qjackctl-1.0.6/src/qjackctlMessagesStatusForm.ui0000644000175000001440000001441015174607203021027 0ustar00rncbcusers rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2021, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlMessagesStatusForm 0 0 480 320 0 0 Messages / Status :/images/messagesstatus1.png 0 :/images/messages1.png &Messages Messages log 320 80 Messages output log false QTextEdit::NoWrap true :/images/status1.png &Status Status information 0 0 240 0 Statistics since last server startup true QAbstractItemView::NoSelection true true false true Description Value Reset XRUN statistic values Re&set :/images/reset1.png Qt::Horizontal QSizePolicy::Expanding 313 16 Refresh XRUN statistic values &Refresh :/images/refresh1.png MessagesTextView StatsListView ResetPushButton RefreshPushButton qjackctl-1.0.6/src/PaxHeaders/appdata0000644000000000000000000000013215174607203014521 xustar0030 mtime=1777536643.503874424 30 atime=1777536643.503565761 30 ctime=1777536643.503874424 qjackctl-1.0.6/src/appdata/0000755000175000001440000000000015174607203014566 5ustar00rncbcusersqjackctl-1.0.6/src/appdata/PaxHeaders/org.rncbc.qjackctl.metainfo.xml0000644000000000000000000000013215174607203022571 xustar0030 mtime=1777536643.503874424 30 atime=1777536643.503874424 30 ctime=1777536643.503874424 qjackctl-1.0.6/src/appdata/org.rncbc.qjackctl.metainfo.xml0000644000175000001440000000601615174607203022564 0ustar00rncbcusers org.rncbc.qjackctl FSFAP GPL-2.0+ QjackCtl JACK Audio Connection Kit Qt GUI Interface Interface graphique Qt pour le kit de connexion audio JACK

JACK Audio Connection Kit - Qt GUI Interface: A simple Qt application to control the JACK server. Written in C++ around the Qt framework for X11, most exclusively using Qt Designer. Provides a simple GUI dialog for setting several JACK server parameters, which are properly saved between sessions, and a way control of the status of the audio server. With time, this primordial interface has become richer by including a enhanced patchbay and connection control features.

Interface graphique Qt pour le kit de connexion audio Jack : une application Qt simple pour contrôler le server Jack. Écrite en c++ autour du kit de développement Qt pour X11, presque exclusivement en utilisant Qt Designer. Fourni une interface graphique simple de dialogue pour plusieurs paramètres du serveur JACK qui sont sauvegardés proprement entre les sessions, et un moyen de contrôle du status du serveur audio. Avec le temps, cette interface primordiale est devenue plus riche en incluant une baie de brassage améliorée et des fonctionnalités de contrôle de connexion.

org.rncbc.qjackctl.desktop qjackctl https://qjackctl.sourceforge.io/image/qjackctl-screenshot1.png The main window showing the application in action La fenêtre principale montrant l'application en action Audio MIDI ALSA JACK Qt https://qjackctl.sourceforge.io https://github.com/rncbc/qjackctl rncbc.org rncbc aka. Rui Nuno Capela rncbc@rncbc.org
qjackctl-1.0.6/src/appdata/PaxHeaders/Info.plist0000644000000000000000000000013215174607203016546 xustar0030 mtime=1777536643.503838412 30 atime=1777536643.503838412 30 ctime=1777536643.503838412 qjackctl-1.0.6/src/appdata/Info.plist0000644000175000001440000000145315174607203016541 0ustar00rncbcusers NSPrincipalClass NSApplication CFBundleIconFile QjackCtl.icns CFBundlePackageType APPL CFBundleGetInfoString JACK Audio Connection Kit Qt GUI Interface CFBundleSignature ???? CFBundleExecutable QjackCtl CFBundleIdentifier org.rncbc.QjackCtl NSMicrophoneUsageDescription JACK requires microphone permissions for audio input. NSSupportsAutomaticGraphicsSwitching qjackctl-1.0.6/src/appdata/PaxHeaders/org.rncbc.qjackctl.desktop0000644000000000000000000000013215174607203021641 xustar0030 mtime=1777536643.503874424 30 atime=1777536643.503838412 30 ctime=1777536643.503874424 qjackctl-1.0.6/src/appdata/org.rncbc.qjackctl.desktop0000644000175000001440000000222215174607203021627 0ustar00rncbcusers[Desktop Entry] Name=QjackCtl Version=1.0 GenericName=JACK Control GenericName[de]=JACK-Steuerung GenericName[fr]=Contrôle JACK GenericName[it]=Interfaccia di controllo per JACK GenericName[ru]=Управление JACK GenericName[uk]=Керуванн� JACK Comment=QjackCtl is a JACK Audio Connection Kit Qt GUI Interface Comment[de]=Grafisches Werkzeug zur Steuerung des JACK-Audio-Systems Comment[fr]=QjackCtl est une interface graphique Qt pour le kit de connexion audio JACK Comment[it]=QjackCtl è un'interfaccia di controllo per JACK basata su Qt Comment[ru]=Программа дл� управлени� звуковым �ервером JACK Comment[sk]=QjackCtl je grafické rozhranie (Qt) na ovládanie zvukového servera JACK Comment[uk]=QjackCtl є програмою дл� керуванн� звуковим �ервером JACK Exec=qjackctl -platform xcb Icon=org.rncbc.qjackctl Categories=Audio;AudioVideo;Midi;X-Alsa;X-Jack;Qt; Keywords=Audio;MIDI;ALSA;JACK;LV2;Qt; Keywords[uk]=Audio;MIDI;ALSA;JACK;LV2;Qt;Звук;міді;ал�а;джек; Terminal=false Type=Application StartupWMClass=qjackctl X-Window-Icon=qjackctl X-SuSE-translate=true qjackctl-1.0.6/src/PaxHeaders/qjackctlPatchbayForm.cpp0000644000000000000000000000013215174607203017764 xustar0030 mtime=1777536643.514914298 30 atime=1777536643.514914298 30 ctime=1777536643.514914298 qjackctl-1.0.6/src/qjackctlPatchbayForm.cpp0000644000175000001440000004506115174607203017762 0ustar00rncbcusers// qjackctlPatchbayForm.cpp // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlPatchbayForm.h" #include "qjackctlPatchbayFile.h" #include "qjackctlMainForm.h" #include #include #include #include #include #include //---------------------------------------------------------------------------- // qjackctlPatchbayForm -- UI wrapper form. // Constructor. qjackctlPatchbayForm::qjackctlPatchbayForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); m_pSetup = nullptr; // Create the patchbay view object. m_pPatchbay = new qjackctlPatchbay(m_ui.PatchbayView); m_iUntitled = 0; m_bActivePatchbay = false; m_iUpdate = 0; // UI connections... QObject::connect(m_ui.NewPatchbayPushButton, SIGNAL(clicked()), SLOT(newPatchbay())); QObject::connect(m_ui.LoadPatchbayPushButton, SIGNAL(clicked()), SLOT(loadPatchbay())); QObject::connect(m_ui.SavePatchbayPushButton, SIGNAL(clicked()), SLOT(savePatchbay())); QObject::connect(m_ui.PatchbayComboBox, SIGNAL(activated(int)), SLOT(selectPatchbay(int))); QObject::connect(m_ui.ActivatePatchbayPushButton, SIGNAL(clicked()), SLOT(toggleActivePatchbay())); QObject::connect(m_ui.OSocketAddPushButton, SIGNAL(clicked()), SLOT(addOSocket())); QObject::connect(m_ui.OSocketEditPushButton, SIGNAL(clicked()), SLOT(editOSocket())); QObject::connect(m_ui.OSocketCopyPushButton, SIGNAL(clicked()), SLOT(copyOSocket())); QObject::connect(m_ui.OSocketRemovePushButton, SIGNAL(clicked()), SLOT(removeOSocket())); QObject::connect(m_ui.OSocketMoveUpPushButton, SIGNAL(clicked()), SLOT(moveUpOSocket())); QObject::connect(m_ui.OSocketMoveDownPushButton, SIGNAL(clicked()), SLOT(moveDownOSocket())); QObject::connect(m_ui.ISocketAddPushButton, SIGNAL(clicked()), SLOT(addISocket())); QObject::connect(m_ui.ISocketEditPushButton, SIGNAL(clicked()), SLOT(editISocket())); QObject::connect(m_ui.ISocketCopyPushButton, SIGNAL(clicked()), SLOT(copyISocket())); QObject::connect(m_ui.ISocketRemovePushButton, SIGNAL(clicked()), SLOT(removeISocket())); QObject::connect(m_ui.ISocketMoveUpPushButton, SIGNAL(clicked()), SLOT(moveUpISocket())); QObject::connect(m_ui.ISocketMoveDownPushButton, SIGNAL(clicked()), SLOT(moveDownISocket())); QObject::connect(m_ui.ConnectPushButton, SIGNAL(clicked()), SLOT(connectSelected())); QObject::connect(m_ui.DisconnectPushButton, SIGNAL(clicked()), SLOT(disconnectSelected())); QObject::connect(m_ui.DisconnectAllPushButton, SIGNAL(clicked()), SLOT(disconnectAll())); QObject::connect(m_ui.ExpandAllPushButton, SIGNAL(clicked()), SLOT(expandAll())); QObject::connect(m_ui.RefreshPushButton, SIGNAL(clicked()), SLOT(refreshForm())); // Connect it to some UI feedback slot. QObject::connect(m_ui.PatchbayView->OListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(stabilizeForm())); QObject::connect(m_ui.PatchbayView->IListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(stabilizeForm())); // Dirty patchbay dispatcher (stabilization deferral). QObject::connect(m_ui.PatchbayView, SIGNAL(contentsChanged()), SLOT(contentsChanged())); newPatchbayFile(false); stabilizeForm(); } // Destructor. qjackctlPatchbayForm::~qjackctlPatchbayForm (void) { // May delete the patchbay view object. delete m_pPatchbay; } // Notify our parent that we're emerging. void qjackctlPatchbayForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeFormEx(); stabilizeForm(); QWidget::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlPatchbayForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeFormEx(); } // Just about to notify main-window that we're closing. void qjackctlPatchbayForm::closeEvent ( QCloseEvent *pCloseEvent ) { if (m_pSetup) { const QString& sPatchbayPath = patchbayPath(); if (!sPatchbayPath.isEmpty()) m_pSetup->sPatchbayPath = sPatchbayPath; } QWidget::closeEvent(pCloseEvent); } // Set reference to global options, mostly needed for the // initial sizes of the main splitter views... void qjackctlPatchbayForm::setup ( qjackctlSetup *pSetup ) { m_pSetup = pSetup; // Load main splitter sizes... if (m_pSetup) { QList sizes; sizes.append(180); sizes.append(60); sizes.append(180); m_pSetup->loadSplitterSizes(m_ui.PatchbayView, sizes); } } // Patchbay view accessor. qjackctlPatchbayView *qjackctlPatchbayForm::patchbayView (void) const { return m_ui.PatchbayView; } // Window close event handlers. bool qjackctlPatchbayForm::queryClose (void) { bool bQueryClose = true; if (m_ui.PatchbayView->dirty()) { switch (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_TITLE, tr("The patchbay definition has been changed:\n\n" "\"%1\"\n\nDo you want to save the changes?") .arg(m_sPatchbayName), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Save: savePatchbay(); // Fall thru.... case QMessageBox::Discard: break; default: // Cancel. bQueryClose = false; } } // Save main splitter sizes... if (m_pSetup && bQueryClose) m_pSetup->saveSplitterSizes(m_ui.PatchbayView); return bQueryClose; } // Contents change deferrer slot... void qjackctlPatchbayForm::contentsChanged (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshPatchbay(); } // Refresh complete form. void qjackctlPatchbayForm::refreshForm (void) { m_pPatchbay->refresh(); stabilizeForm(); } // A helper stabilization slot. void qjackctlPatchbayForm::stabilizeForm ( void ) { m_ui.SavePatchbayPushButton->setEnabled(m_ui.PatchbayView->dirty()); m_ui.ActivatePatchbayPushButton->setEnabled( QFileInfo(m_sPatchbayPath).exists()); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); m_bActivePatchbay = (pMainForm && pMainForm->isActivePatchbay(m_sPatchbayPath)); m_ui.ActivatePatchbayPushButton->setChecked(m_bActivePatchbay); if (m_ui.PatchbayView->dirty()) { m_ui.PatchbayComboBox->setItemText( m_ui.PatchbayComboBox->currentIndex(), tr("%1 [modified]").arg(m_sPatchbayName)); } // Take care that IT might be destroyed already... if (m_ui.PatchbayView->binding() == nullptr) return; bool bExpandAll = false; qjackctlSocketList *pSocketList; qjackctlSocketItem *pSocketItem; int iItemCount, iItem; pSocketList = m_pPatchbay->OSocketList(); pSocketItem = pSocketList->selectedSocketItem(); iItemCount = (pSocketList->listView())->topLevelItemCount(); bExpandAll = bExpandAll || (iItemCount > 0); if (pSocketItem) { iItem = (pSocketList->listView())->indexOfTopLevelItem(pSocketItem); m_ui.OSocketEditPushButton->setEnabled(true); m_ui.OSocketCopyPushButton->setEnabled(true); m_ui.OSocketRemovePushButton->setEnabled(true); m_ui.OSocketMoveUpPushButton->setEnabled(iItem > 0); m_ui.OSocketMoveDownPushButton->setEnabled(iItem < iItemCount - 1); } else { m_ui.OSocketEditPushButton->setEnabled(false); m_ui.OSocketCopyPushButton->setEnabled(false); m_ui.OSocketRemovePushButton->setEnabled(false); m_ui.OSocketMoveUpPushButton->setEnabled(false); m_ui.OSocketMoveDownPushButton->setEnabled(false); } pSocketList = m_pPatchbay->ISocketList(); pSocketItem = pSocketList->selectedSocketItem(); iItemCount = (pSocketList->listView())->topLevelItemCount(); bExpandAll = bExpandAll || (iItemCount > 0); if (pSocketItem) { iItem = (pSocketList->listView())->indexOfTopLevelItem(pSocketItem); m_ui.ISocketEditPushButton->setEnabled(true); m_ui.ISocketCopyPushButton->setEnabled(true); m_ui.ISocketRemovePushButton->setEnabled(true); m_ui.ISocketMoveUpPushButton->setEnabled(iItem > 0); m_ui.ISocketMoveDownPushButton->setEnabled(iItem < iItemCount - 1); } else { m_ui.ISocketEditPushButton->setEnabled(false); m_ui.ISocketCopyPushButton->setEnabled(false); m_ui.ISocketRemovePushButton->setEnabled(false); m_ui.ISocketMoveUpPushButton->setEnabled(false); m_ui.ISocketMoveDownPushButton->setEnabled(false); } m_ui.ConnectPushButton->setEnabled( m_pPatchbay->canConnectSelected()); m_ui.DisconnectPushButton->setEnabled( m_pPatchbay->canDisconnectSelected()); m_ui.DisconnectAllPushButton->setEnabled( m_pPatchbay->canDisconnectAll()); m_ui.ExpandAllPushButton->setEnabled(bExpandAll); } // Patchbay path accessor. const QString& qjackctlPatchbayForm::patchbayPath (void) const { return m_sPatchbayPath; } // Reset patchbay definition from scratch. void qjackctlPatchbayForm::newPatchbayFile ( bool bSnapshot ) { m_pPatchbay->clear(); m_sPatchbayPath.clear(); m_sPatchbayName = tr("Untitled%1").arg(m_iUntitled++); if (bSnapshot) m_pPatchbay->connectionsSnapshot(); // updateRecentPatchbays(); } // Load patchbay definitions from specific file path. bool qjackctlPatchbayForm::loadPatchbayFile ( const QString& sFileName ) { // Check if we're going to discard safely the current one... if (!queryClose()) return false; // We'll have a temporary rack... qjackctlPatchbayRack rack; // Step 1: load from file... if (!qjackctlPatchbayFile::load(&rack, sFileName)) { QMessageBox::critical(this, tr("Error") + " - " QJACKCTL_TITLE, tr("Could not load patchbay definition file: \n\n\"%1\"") .arg(sFileName), QMessageBox::Cancel); // Reset/disable further trials. m_sPatchbayPath.clear(); return false; } // Step 2: load from rack... m_pPatchbay->loadRack(&rack); // Step 3: stabilize form... m_sPatchbayPath = sFileName; m_sPatchbayName = QFileInfo(sFileName).completeBaseName(); // updateRecentPatchbays(); return true; } // Save current patchbay definition to specific file path. bool qjackctlPatchbayForm::savePatchbayFile ( const QString& sFileName ) { // We'll have a temporary rack... qjackctlPatchbayRack rack; // Step 1: save to rack... m_pPatchbay->saveRack(&rack); // Step 2: save to file... if (!qjackctlPatchbayFile::save(&rack, sFileName)) { QMessageBox::critical(this, tr("Error") + " - " QJACKCTL_TITLE, tr("Could not save patchbay definition file: \n\n\"%1\"") .arg(sFileName), QMessageBox::Cancel); return false; } // Step 3: stabilize form... m_sPatchbayPath = sFileName; m_sPatchbayName = QFileInfo(sFileName).completeBaseName(); // updateRecentPatchbays(); // Step 4: notify main form if applicable ... qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); m_bActivePatchbay = (pMainForm && pMainForm->isActivePatchbay(m_sPatchbayPath)); if (m_bActivePatchbay) pMainForm->updateActivePatchbay(); return true; } // Dirty-(re)load patchbay definitions from know rack. void qjackctlPatchbayForm::loadPatchbayRack ( qjackctlPatchbayRack *pRack ) { // Step 1: load from rack... m_pPatchbay->loadRack(pRack); // Override dirty flag. m_ui.PatchbayView->setDirty(true); // Done. stabilizeForm(); } // Create a new patchbay definition from scratch. void qjackctlPatchbayForm::newPatchbay (void) { // Assume a snapshot from scratch... bool bSnapshot = false; // Ask user what he/she wants to do... qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm && (pMainForm->jackClient() || pMainForm->alsaSeq())) { switch (QMessageBox::information(this, tr("New Patchbay definition") + " - " QJACKCTL_TITLE, tr("Create patchbay definition as a snapshot\n" "of all actual client connections?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel)) { case QMessageBox::Yes: bSnapshot = true; break; case QMessageBox::No: bSnapshot = false; break; default: // Cancel. return; } } // Check if we can discard safely the current one... if (!queryClose()) return; // Reset patchbay editor. newPatchbayFile(bSnapshot); updateRecentPatchbays(); stabilizeForm(); } // Load patchbay definitions from file. void qjackctlPatchbayForm::loadPatchbay (void) { QString sFileName = QFileDialog::getOpenFileName( this, tr("Load Patchbay Definition"), // Parent & Caption. m_sPatchbayPath, // Start here. tr("Patchbay Definition files") + " (*.xml)" // Filter (XML files) ); if (sFileName.isEmpty()) return; // Load it right away. if (loadPatchbayFile(sFileName)) updateRecentPatchbays(); stabilizeForm(); } // Save current patchbay definition to file. void qjackctlPatchbayForm::savePatchbay (void) { QString sFileName = QFileDialog::getSaveFileName( this, tr("Save Patchbay Definition"), // Parent & Caption. m_sPatchbayPath, // Start here. tr("Patchbay Definition files") + " (*.xml)" // Filter (XML files) ); if (sFileName.isEmpty()) return; // Enforce .xml extension... if (QFileInfo(sFileName).suffix().isEmpty()) sFileName += ".xml"; // Save it right away. if (savePatchbayFile(sFileName)) updateRecentPatchbays(); stabilizeForm(); } // A new patchbay has been selected void qjackctlPatchbayForm::selectPatchbay ( int iPatchbay ) { // Remember and avoid reloading the previous (first) selected one. if (iPatchbay > 0) { // Take care whether the first is untitled, and // thus not present in the recenet ptachbays list if (m_sPatchbayPath.isEmpty()) iPatchbay--; if (iPatchbay >= 0 && iPatchbay < m_recentPatchbays.count()) { // If we cannot load the new one, backout... loadPatchbayFile(m_recentPatchbays[iPatchbay]); updateRecentPatchbays(); } } stabilizeForm(); } // Set current active patchbay definition file. void qjackctlPatchbayForm::toggleActivePatchbay (void) { // Check if we're going to discard safely the current one... if (!queryClose()) return; // Activate it... qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) { pMainForm->setActivePatchbay( m_bActivePatchbay ? QString() : m_sPatchbayPath); } // Need to force/refresh the patchbay list... updateRecentPatchbays(); stabilizeForm(); } // Set/initialize the MRU patchbay list. void qjackctlPatchbayForm::setRecentPatchbays ( const QStringList& patchbays ) { m_recentPatchbays = patchbays; } // Update patchbay MRU variables and widgets. void qjackctlPatchbayForm::updateRecentPatchbays (void) { // Try not to be reeentrant. if (m_iUpdate > 0) return; m_iUpdate++; // Update the visible combobox... const QIcon icon(":/images/patchbay1.png"); m_ui.PatchbayComboBox->clear(); if (m_sPatchbayPath.isEmpty()) { // Display a probable untitled patchbay... m_ui.PatchbayComboBox->addItem(icon, m_sPatchbayName); } else { // Remove from list if already there (avoid duplicates)... int iIndex = m_recentPatchbays.indexOf(m_sPatchbayPath); if (iIndex >= 0) m_recentPatchbays.removeAt(iIndex); // Put it to front... m_recentPatchbays.push_front(m_sPatchbayPath); } // Time to keep the list under limits. while (m_recentPatchbays.count() > 8) m_recentPatchbays.pop_back(); // Update the main setup list... qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->setRecentPatchbays(m_recentPatchbays); QStringListIterator iter(m_recentPatchbays); while (iter.hasNext()) { const QString& sPatchbayPath = iter.next(); QString sText = QFileInfo(sPatchbayPath).completeBaseName(); if (pMainForm && pMainForm->isActivePatchbay(sPatchbayPath)) sText += " [" + tr("active") + "]"; m_ui.PatchbayComboBox->addItem(icon, sText); } // Sure this one must be currently selected. m_ui.PatchbayComboBox->setCurrentIndex(0); // stabilizeForm(); m_iUpdate--; } // Output socket list push button handlers gallore... void qjackctlPatchbayForm::addOSocket (void) { (m_pPatchbay->OSocketList())->addSocketItem(); } void qjackctlPatchbayForm::removeOSocket (void) { (m_pPatchbay->OSocketList())->removeSocketItem(); } void qjackctlPatchbayForm::editOSocket (void) { (m_pPatchbay->OSocketList())->editSocketItem(); } void qjackctlPatchbayForm::copyOSocket (void) { (m_pPatchbay->OSocketList())->copySocketItem(); } void qjackctlPatchbayForm::moveUpOSocket (void) { (m_pPatchbay->OSocketList())->moveUpSocketItem(); } void qjackctlPatchbayForm::moveDownOSocket (void) { (m_pPatchbay->OSocketList())->moveDownSocketItem(); } // Input socket list push button handlers gallore... void qjackctlPatchbayForm::addISocket (void) { (m_pPatchbay->ISocketList())->addSocketItem(); } void qjackctlPatchbayForm::removeISocket (void) { (m_pPatchbay->ISocketList())->removeSocketItem(); } void qjackctlPatchbayForm::editISocket (void) { (m_pPatchbay->ISocketList())->editSocketItem(); } void qjackctlPatchbayForm::copyISocket (void) { (m_pPatchbay->ISocketList())->copySocketItem(); } void qjackctlPatchbayForm::moveUpISocket (void) { (m_pPatchbay->ISocketList())->moveUpSocketItem(); } void qjackctlPatchbayForm::moveDownISocket (void) { (m_pPatchbay->ISocketList())->moveDownSocketItem(); } // Connect current selected ports. void qjackctlPatchbayForm::connectSelected (void) { m_pPatchbay->connectSelected(); } // Disconnect current selected ports. void qjackctlPatchbayForm::disconnectSelected (void) { m_pPatchbay->disconnectSelected(); } // Disconnect all connected ports. void qjackctlPatchbayForm::disconnectAll (void) { m_pPatchbay->disconnectAll(); } // Expand all socket items. void qjackctlPatchbayForm::expandAll (void) { m_pPatchbay->expandAll(); } // Keyboard event handler. void qjackctlPatchbayForm::keyPressEvent ( QKeyEvent *pKeyEvent ) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlPatchbayForm::keyPressEvent(%d)", pKeyEvent->key()); #endif int iKey = pKeyEvent->key(); switch (iKey) { case Qt::Key_Escape: close(); break; default: QWidget::keyPressEvent(pKeyEvent); break; } } // end of qjackctlPatchbayForm.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlConnect.cpp0000644000000000000000000000013215174607203016776 xustar0030 mtime=1777536643.509914334 30 atime=1777536643.509914334 30 ctime=1777536643.509914334 qjackctl-1.0.6/src/qjackctlConnect.cpp0000644000175000001440000015233715174607203017001 0ustar00rncbcusers// qjackctlConnect.cpp // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlConnect.h" #include #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) #include #include #endif //---------------------------------------------------------------------- // class qjackctlPortItem -- Port list item. // // Constructor. qjackctlPortItem::qjackctlPortItem ( qjackctlClientItem *pClient ) : QTreeWidgetItem(pClient, QJACKCTL_PORTITEM) { m_pClient = pClient; // m_sPortName = sPortName; m_iPortMark = 0; m_bHilite = false; m_pClient->ports().append(this); } // Default destructor. qjackctlPortItem::~qjackctlPortItem (void) { const int iPort = m_pClient->ports().indexOf(this); if (iPort >= 0) m_pClient->ports().removeAt(iPort); QListIterator iter(m_connects); while (iter.hasNext()) (iter.next())->removeConnect(this); m_connects.clear(); } // Instance accessors. void qjackctlPortItem::setPortName ( const QString& sPortName ) { m_sPortName = sPortName; updatePortName(); } const QString& qjackctlPortItem::clientName (void) const { return m_pClient->clientName(); } const QString& qjackctlPortItem::portName (void) const { return m_sPortName; } // Port name alias accessors. void qjackctlPortItem::setPortNameAlias ( const QString& sPortNameAlias ) { // Check aliasing... qjackctlClientListView *pClientListView = (m_pClient->clientList())->listView(); qjackctlAliasList *pAliasList = pClientListView->aliasList(); if (pAliasList) { const QString& sClientName = m_pClient->clientName(); pAliasList->setPortAlias(sClientName, m_sPortName, sPortNameAlias); pClientListView->emitAliasesChanged(); } } QString qjackctlPortItem::portNameAlias ( bool *pbRenameEnabled ) const { QString sPortNameAlias = m_sPortName; bool bRenameEnabled = false; // Check aliasing... qjackctlClientListView *pClientListView = (m_pClient->clientList())->listView(); qjackctlAliasList *pAliasList = pClientListView->aliasList(); if (pAliasList) { const QString& sClientName = m_pClient->clientName(); sPortNameAlias = pAliasList->portAlias(sClientName, m_sPortName); bRenameEnabled = pClientListView->isRenameEnabled(); } if (pbRenameEnabled) *pbRenameEnabled = bRenameEnabled; return sPortNameAlias; } // Proto-pretty/alias display name method. void qjackctlPortItem::updatePortName ( bool /*bRename*/ ) { bool bRenameEnabled = false; const QString& sPortNameEx = portNameAlias(&bRenameEnabled); setPortText(sPortNameEx, bRenameEnabled); } // Tooltip text builder. QString qjackctlPortItem::tooltip (void) const { return portName(); } // Port display name accessors. void qjackctlPortItem::setPortText ( const QString& sPortText, bool bRenameEnabled ) { QTreeWidgetItem::setText(0, sPortText); const Qt::ItemFlags flags = QTreeWidgetItem::flags(); if (bRenameEnabled) QTreeWidgetItem::setFlags(flags | Qt::ItemIsEditable); else QTreeWidgetItem::setFlags(flags & ~Qt::ItemIsEditable); } QString qjackctlPortItem::portText (void) const { return QTreeWidgetItem::text(0); } // Complete client:port name helper. QString qjackctlPortItem::clientPortName (void) const { return m_pClient->clientName() + ':' + m_sPortName; } // Connect client item accessor. qjackctlClientItem *qjackctlPortItem::client (void) const { return m_pClient; } // Client:port set housekeeping marker. void qjackctlPortItem::markPort ( int iMark ) { setHilite(false); m_iPortMark = iMark; if (iMark > 0) m_connects.clear(); } void qjackctlPortItem::markClientPort ( int iMark ) { markPort(iMark); m_pClient->markClient(iMark); } int qjackctlPortItem::portMark (void) const { return m_iPortMark; } // Connected port list primitives. void qjackctlPortItem::addConnect ( qjackctlPortItem *pPort ) { m_connects.append(pPort); } void qjackctlPortItem::removeConnect ( qjackctlPortItem *pPort ) { pPort->setHilite(false); const int iPort = m_connects.indexOf(pPort); if (iPort >= 0) m_connects.removeAt(iPort); } // Connected port finder. qjackctlPortItem *qjackctlPortItem::findConnect ( const QString& sClientPortName ) { QListIterator iter(m_connects); while (iter.hasNext()) { qjackctlPortItem *pPort = iter.next(); if (sClientPortName == pPort->clientPortName()) return pPort; } return nullptr; } qjackctlPortItem *qjackctlPortItem::findConnectPtr ( qjackctlPortItem *pPortPtr ) { QListIterator iter(m_connects); while (iter.hasNext()) { qjackctlPortItem *pPort = iter.next(); if (pPortPtr == pPort) return pPort; } return nullptr; } // Connection cache list accessor. const QList& qjackctlPortItem::connects (void) const { return m_connects; } // Connectiopn highlight methods. bool qjackctlPortItem::isHilite (void) const { return m_bHilite; } void qjackctlPortItem::setHilite ( bool bHilite ) { // Update the port highlightning if changed... if ((m_bHilite && !bHilite) || (!m_bHilite && bHilite)) { m_bHilite = bHilite; // Propagate this to the parent... m_pClient->setHilite(bHilite); } // Set the new color. QTreeWidget *pTreeWidget = QTreeWidgetItem::treeWidget(); if (pTreeWidget == nullptr) return; const QPalette& pal = pTreeWidget->palette(); QTreeWidgetItem::setForeground(0, m_bHilite ? (pal.base().color().value() < 0x7f ? Qt::cyan : Qt::blue) : pal.text().color()); } // Proxy sort override method. // - Natural decimal sorting comparator. bool qjackctlPortItem::operator< ( const QTreeWidgetItem& other ) const { return qjackctlClientList::lessThan(*this, other); } //---------------------------------------------------------------------- // class qjackctlClientItem -- Jack client list item. // // Constructor. qjackctlClientItem::qjackctlClientItem ( qjackctlClientList *pClientList ) : QTreeWidgetItem(pClientList->listView(), QJACKCTL_CLIENTITEM) { m_pClientList = pClientList; // m_sClientName = sClientName; m_iClientMark = 0; m_iHilite = 0; m_pClientList->clients().append(this); } // Default destructor. qjackctlClientItem::~qjackctlClientItem (void) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) qDeleteAll(m_ports); #endif m_ports.clear(); const int iClient = m_pClientList->clients().indexOf(this); if (iClient >= 0) m_pClientList->clients().removeAt(iClient); } // Port finder. qjackctlPortItem *qjackctlClientItem::findPort (const QString& sPortName) { QListIterator iter(m_ports); while (iter.hasNext()) { qjackctlPortItem *pPort = iter.next(); if (sPortName == pPort->portName()) return pPort; } return nullptr; } // Client list accessor. qjackctlClientList *qjackctlClientItem::clientList (void) const { return m_pClientList; } // Port list accessor. QList& qjackctlClientItem::ports (void) { return m_ports; } // Instance accessors. void qjackctlClientItem::setClientName ( const QString& sClientName ) { m_sClientName = sClientName; updateClientName(); } const QString& qjackctlClientItem::clientName (void) const { return m_sClientName; } // Client name alias accessors. void qjackctlClientItem::setClientNameAlias ( const QString& sClientNameAlias ) { qjackctlClientListView *pClientListView = m_pClientList->listView(); qjackctlAliasList *pAliasList = pClientListView->aliasList(); if (pAliasList) { pAliasList->setClientAlias(m_sClientName, sClientNameAlias); pClientListView->emitAliasesChanged(); } } QString qjackctlClientItem::clientNameAlias ( bool *pbRenameEnabled ) const { QString sClientNameAlias = m_sClientName; bool bRenameEnabled = false; // Check aliasing... qjackctlClientListView *pClientListView = m_pClientList->listView(); qjackctlAliasList *pAliasList = pClientListView->aliasList(); if (pAliasList) { sClientNameAlias = pAliasList->clientAlias(m_sClientName); bRenameEnabled = pClientListView->isRenameEnabled(); } if (pbRenameEnabled) *pbRenameEnabled = bRenameEnabled; return sClientNameAlias; } // Proto-pretty/alias display name method. void qjackctlClientItem::updateClientName ( bool /*bRename*/ ) { bool bRenameEnabled = false; const QString& sClientNameEx = clientNameAlias(&bRenameEnabled); setClientText(sClientNameEx, bRenameEnabled); } // Client display name accessors. void qjackctlClientItem::setClientText ( const QString& sClientText, bool bRenameEnabled ) { QTreeWidgetItem::setText(0, sClientText); const Qt::ItemFlags flags = QTreeWidgetItem::flags(); if (bRenameEnabled) QTreeWidgetItem::setFlags(flags | Qt::ItemIsEditable); else QTreeWidgetItem::setFlags(flags & ~Qt::ItemIsEditable); } QString qjackctlClientItem::clientText (void) const { return QTreeWidgetItem::text(0); } // Readable flag client accessor. bool qjackctlClientItem::isReadable (void) const { return m_pClientList->isReadable(); } // Client:port set housekeeping marker. void qjackctlClientItem::markClient ( int iMark ) { setHilite(false); m_iClientMark = iMark; } void qjackctlClientItem::markClientPorts ( int iMark ) { markClient(iMark); QListIterator iter(m_ports); while (iter.hasNext()) (iter.next())->markPort(iMark); } int qjackctlClientItem::cleanClientPorts ( int iMark ) { int iDirtyCount = 0; QMutableListIterator iter(m_ports); while (iter.hasNext()) { qjackctlPortItem *pPort = iter.next(); if (pPort->portMark() == iMark) { iter.remove(); delete pPort; ++iDirtyCount; } } return iDirtyCount; } int qjackctlClientItem::clientMark (void) const { return m_iClientMark; } // Connectiopn highlight methods. bool qjackctlClientItem::isHilite (void) const { return (m_iHilite > 0); } void qjackctlClientItem::setHilite ( bool bHilite ) { if (bHilite) m_iHilite++; else if (m_iHilite > 0) m_iHilite--; // Set the new color. QTreeWidget *pTreeWidget = QTreeWidgetItem::treeWidget(); if (pTreeWidget == nullptr) return; const QPalette& pal = pTreeWidget->palette(); QTreeWidgetItem::setForeground(0, m_iHilite > 0 ? (pal.base().color().value() < 0x7f ? Qt::darkCyan : Qt::darkBlue) : pal.text().color()); } // Socket item openness status. void qjackctlClientItem::setOpen ( bool bOpen ) { QTreeWidgetItem::setExpanded(bOpen); } bool qjackctlClientItem::isOpen (void) const { return QTreeWidgetItem::isExpanded(); } // Proxy sort override method. // - Natural decimal sorting comparator. bool qjackctlClientItem::operator< ( const QTreeWidgetItem& other ) const { return qjackctlClientList::lessThan(*this, other); } //---------------------------------------------------------------------- // qjackctlClientList -- Client list. // // Constructor. qjackctlClientList::qjackctlClientList ( qjackctlClientListView *pListView, bool bReadable ) { m_pListView = pListView; m_bReadable = bReadable; m_pHiliteItem = 0; } // Default destructor. qjackctlClientList::~qjackctlClientList (void) { clear(); } // Do proper contents cleanup. void qjackctlClientList::clear (void) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) qDeleteAll(m_clients); #endif m_clients.clear(); if (m_pListView) m_pListView->clear(); } // Client finder. qjackctlClientItem *qjackctlClientList::findClient ( const QString& sClientName ) { QListIterator iter(m_clients); while (iter.hasNext()) { qjackctlClientItem *pClient = iter.next(); if (sClientName == pClient->clientName()) return pClient; } return nullptr; } // Client:port finder. qjackctlPortItem *qjackctlClientList::findClientPort ( const QString& sClientPort ) { qjackctlPortItem *pPort = 0; const int iColon = sClientPort.indexOf(':'); if (iColon >= 0) { qjackctlClientItem *pClient = findClient(sClientPort.left(iColon)); if (pClient) { pPort = pClient->findPort( sClientPort.right(sClientPort.length() - iColon - 1)); } } return pPort; } // Client list accessor. QList& qjackctlClientList::clients (void) { return m_clients; } // List view accessor. qjackctlClientListView *qjackctlClientList::listView (void) const { return m_pListView; } // Readable flag client accessor. bool qjackctlClientList::isReadable (void) const { return m_bReadable; } // Client:port set housekeeping marker. void qjackctlClientList::markClientPorts ( int iMark ) { m_pHiliteItem = 0; QListIterator iter(m_clients); while (iter.hasNext()) (iter.next())->markClientPorts(iMark); } int qjackctlClientList::cleanClientPorts ( int iMark ) { int iDirtyCount = 0; QMutableListIterator iter(m_clients); while (iter.hasNext()) { qjackctlClientItem *pClient = iter.next(); if (pClient->clientMark() == iMark) { iter.remove(); delete pClient; ++iDirtyCount; } else { iDirtyCount += pClient->cleanClientPorts(iMark); } } return iDirtyCount; } // Client:port hilite update stabilization. void qjackctlClientList::hiliteClientPorts (void) { qjackctlClientItem *pClient; qjackctlPortItem *pPort; QTreeWidgetItem *pItem = m_pListView->currentItem(); // Dehilite the previous selected items. if (m_pHiliteItem && pItem != m_pHiliteItem) { if (m_pHiliteItem->type() == QJACKCTL_CLIENTITEM) { pClient = static_cast (m_pHiliteItem); QListIterator iter(pClient->ports()); while (iter.hasNext()) { pPort = iter.next(); QListIterator it(pPort->connects()); while (it.hasNext()) (it.next())->setHilite(false); } } else { pPort = static_cast (m_pHiliteItem); QListIterator it(pPort->connects()); while (it.hasNext()) (it.next())->setHilite(false); } } // Hilite the now current selected items. if (pItem) { if (pItem->type() == QJACKCTL_CLIENTITEM) { pClient = static_cast (pItem); QListIterator iter(pClient->ports()); while (iter.hasNext()) { pPort = iter.next(); QListIterator it(pPort->connects()); while (it.hasNext()) (it.next())->setHilite(true); } } else { pPort = static_cast (pItem); QListIterator it(pPort->connects()); while (it.hasNext()) (it.next())->setHilite(true); } } // Do remember this one, ever. m_pHiliteItem = pItem; } // Natural decimal sorting comparator. bool qjackctlClientList::lessThan ( const QTreeWidgetItem& item1, const QTreeWidgetItem& item2 ) { const QString& s1 = item1.text(0); const QString& s2 = item2.text(0); const int n1 = s1.length(); const int n2 = s2.length(); int i1, i2; for (i1 = i2 = 0; i1 < n1 && i2 < n2; ++i1, ++i2) { // skip (white)spaces... while (s1.at(i1).isSpace()) ++i1; while (s2.at(i2).isSpace()) ++i2; // Normalize (to uppercase) the next characters... QChar c1 = s1.at(i1).toUpper(); QChar c2 = s2.at(i2).toUpper(); if (c1.isDigit() && c2.isDigit()) { // Find the whole length numbers... int j1 = i1++; while (i1 < n1 && s1.at(i1).isDigit()) ++i1; int j2 = i2++; while (i2 < n2 && s2.at(i2).isDigit()) ++i2; // Compare as natural decimal-numbers... j1 = s1.mid(j1, i1 - j1).toInt(); j2 = s2.mid(j2, i2 - j2).toInt(); if (j1 != j2) return (j1 < j2); // Never go out of bounds... if (i1 >= n1 || i2 >= n2) break; // Go on with this next char... c1 = s1.at(i1).toUpper(); c2 = s2.at(i2).toUpper(); } // Compare this char... if (c1 != c2) return (c1 < c2); } // Probable exact match. return false; } // Do proper contents refresh/update. void qjackctlClientList::refresh (void) { QHeaderView *pHeader = m_pListView->header(); m_pListView->sortItems( pHeader->sortIndicatorSection(), pHeader->sortIndicatorOrder()); } //---------------------------------------------------------------------------- // qjackctlClientListView -- Client list view, supporting drag-n-drop. // Constructor. qjackctlClientListView::qjackctlClientListView ( qjackctlConnectView *pConnectView, bool bReadable ) : QTreeWidget(pConnectView) { m_pConnectView = pConnectView; m_pAutoOpenTimer = 0; m_iAutoOpenTimeout = 0; m_pDragItem = nullptr; m_pDragItem = nullptr; m_pAliasList = nullptr; m_bRenameEnabled = false; QHeaderView *pHeader = QTreeWidget::header(); pHeader->setDefaultAlignment(Qt::AlignLeft); // pHeader->setDefaultSectionSize(120); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) // pHeader->setSectionResizeMode(QHeaderView::Custom); pHeader->setSectionsMovable(false); pHeader->setSectionsClickable(true); #else // pHeader->setResizeMode(QHeaderView::Custom); pHeader->setMovable(false); pHeader->setClickable(true); #endif pHeader->setSortIndicatorShown(true); pHeader->setStretchLastSection(true); QTreeWidget::setRootIsDecorated(true); QTreeWidget::setUniformRowHeights(true); // QTreeWidget::setDragEnabled(true); QTreeWidget::setAcceptDrops(true); QTreeWidget::setDropIndicatorShown(true); QTreeWidget::setAutoScroll(true); QTreeWidget::setSelectionMode(QAbstractItemView::ExtendedSelection); QTreeWidget::setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); QTreeWidget::setSortingEnabled(true); QTreeWidget::setMinimumWidth(120); QTreeWidget::setColumnCount(1); QString sText; if (bReadable) sText = tr("Readable Clients / Output Ports"); else sText = tr("Writable Clients / Input Ports"); QTreeWidget::headerItem()->setText(0, sText); QTreeWidget::sortItems(0, Qt::AscendingOrder); QTreeWidget::setToolTip(sText); // Trap for help/tool-tips events. QTreeWidget::viewport()->installEventFilter(this); QObject::connect(QTreeWidget::itemDelegate(), SIGNAL(commitData(QWidget*)), SLOT(renamedSlot())); setAutoOpenTimeout(800); } // Default destructor. qjackctlClientListView::~qjackctlClientListView (void) { setAutoOpenTimeout(0); } // Binding indirect accessor. qjackctlConnect *qjackctlClientListView::binding() const { return m_pConnectView->binding(); } // Auto-open timeout method. void qjackctlClientListView::setAutoOpenTimeout ( int iAutoOpenTimeout ) { m_iAutoOpenTimeout = iAutoOpenTimeout; if (m_pAutoOpenTimer) delete m_pAutoOpenTimer; m_pAutoOpenTimer = nullptr; if (m_iAutoOpenTimeout > 0) { m_pAutoOpenTimer = new QTimer(this); QObject::connect(m_pAutoOpenTimer, SIGNAL(timeout()), SLOT(timeoutSlot())); } } // Auto-open timeout accessor. int qjackctlClientListView::autoOpenTimeout (void) const { return m_iAutoOpenTimeout; } // Aliasing support methods. void qjackctlClientListView::setAliasList ( qjackctlAliasList *pAliasList, bool bRenameEnabled ) { m_pAliasList = pAliasList; m_bRenameEnabled = bRenameEnabled; // For each client item, if any. const int iItemCount = QTreeWidget::topLevelItemCount(); for (int iItem = 0; iItem < iItemCount; ++iItem) { QTreeWidgetItem *pItem = QTreeWidget::topLevelItem(iItem); if (pItem->type() != QJACKCTL_CLIENTITEM) continue; qjackctlClientItem *pClientItem = static_cast (pItem); if (pClientItem == nullptr) continue; pClientItem->updateClientName(); // For each port item... const int iChildCount = pClientItem->childCount(); for (int iChild = 0; iChild < iChildCount; ++iChild) { QTreeWidgetItem *pChildItem = pClientItem->child(iChild); if (pChildItem->type() != QJACKCTL_PORTITEM) continue; qjackctlPortItem *pPortItem = static_cast (pChildItem); if (pPortItem == nullptr) continue; pPortItem->updatePortName(); } } } qjackctlAliasList *qjackctlClientListView::aliasList (void) const { return m_pAliasList; } bool qjackctlClientListView::isRenameEnabled (void) const { return m_bRenameEnabled; } // In-place aliasing slot. void qjackctlClientListView::startRenameSlot (void) { QTreeWidgetItem *pItem = QTreeWidget::currentItem(); if (pItem) QTreeWidget::editItem(pItem, 0); } // In-place aliasing slot. void qjackctlClientListView::renamedSlot (void) { if (m_pAliasList == nullptr) return; QTreeWidgetItem *pItem = QTreeWidget::currentItem(); if (pItem == nullptr) return; const QString& sText = pItem->text(0); if (pItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pClientItem = static_cast (pItem); pClientItem->setClientNameAlias(sText); pClientItem->updateClientName(true); } else { qjackctlPortItem *pPortItem = static_cast (pItem); pPortItem->setPortNameAlias(sText); pPortItem->updatePortName(true); } // m_pConnectView->setDirty(true); } // Auto-open timer slot. void qjackctlClientListView::timeoutSlot (void) { if (m_pAutoOpenTimer) { m_pAutoOpenTimer->stop(); if (m_pDropItem && m_pDropItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pClientItem = static_cast (m_pDropItem); if (pClientItem && !pClientItem->isOpen()) pClientItem->setOpen(true); } } } // Trap for help/tool-tip events. bool qjackctlClientListView::eventFilter ( QObject *pObject, QEvent *pEvent ) { QWidget *pViewport = QTreeWidget::viewport(); if (static_cast (pObject) == pViewport && pEvent->type() == QEvent::ToolTip) { QHelpEvent *pHelpEvent = static_cast (pEvent); if (pHelpEvent) { QTreeWidgetItem *pItem = QTreeWidget::itemAt(pHelpEvent->pos()); if (pItem && pItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pClientItem = static_cast (pItem); if (pClientItem) { QToolTip::showText(pHelpEvent->globalPos(), pClientItem->clientName(), pViewport); return true; } } else if (pItem && pItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pPortItem = static_cast (pItem); if (pPortItem) { QToolTip::showText(pHelpEvent->globalPos(), pPortItem->tooltip(), pViewport); return true; } } } } // Not handled here. return QTreeWidget::eventFilter(pObject, pEvent); } // Drag-n-drop stuff. QTreeWidgetItem *qjackctlClientListView::dragDropItem ( const QPoint& pos ) { QTreeWidgetItem *pItem = QTreeWidget::itemAt(pos); if (pItem) { if (m_pDropItem != pItem) { QTreeWidget::setCurrentItem(pItem); m_pDropItem = pItem; if (m_pAutoOpenTimer) m_pAutoOpenTimer->start(m_iAutoOpenTimeout); qjackctlConnect *pConnect = m_pConnectView->binding(); if ((pItem->flags() & Qt::ItemIsDropEnabled) == 0 || pConnect == nullptr || !pConnect->canConnectSelected()) pItem = nullptr; } } else { m_pDropItem = nullptr; if (m_pAutoOpenTimer) m_pAutoOpenTimer->stop(); } return pItem; } void qjackctlClientListView::dragEnterEvent ( QDragEnterEvent *pDragEnterEvent ) { if (pDragEnterEvent->source() != this && pDragEnterEvent->mimeData()->hasText() && #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) dragDropItem(pDragEnterEvent->position().toPoint())) { #else dragDropItem(pDragEnterEvent->pos())) { #endif pDragEnterEvent->accept(); } else { pDragEnterEvent->ignore(); } } void qjackctlClientListView::dragMoveEvent ( QDragMoveEvent *pDragMoveEvent ) { if (pDragMoveEvent->source() != this && pDragMoveEvent->mimeData()->hasText() && #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) dragDropItem(pDragMoveEvent->position().toPoint())) { #else dragDropItem(pDragMoveEvent->pos())) { #endif pDragMoveEvent->accept(); } else { pDragMoveEvent->ignore(); } } void qjackctlClientListView::dragLeaveEvent ( QDragLeaveEvent * ) { m_pDropItem = 0; if (m_pAutoOpenTimer) m_pAutoOpenTimer->stop(); } void qjackctlClientListView::dropEvent( QDropEvent *pDropEvent ) { if (pDropEvent->source() != this && pDropEvent->mimeData()->hasText() && #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) dragDropItem(pDropEvent->position().toPoint())) { #else dragDropItem(pDropEvent->pos())) { #endif const QString sText = pDropEvent->mimeData()->text(); qjackctlConnect *pConnect = m_pConnectView->binding(); if (!sText.isEmpty() && pConnect) pConnect->connectSelected(); } dragLeaveEvent(0); } // Handle mouse events for drag-and-drop stuff. void qjackctlClientListView::mousePressEvent ( QMouseEvent *pMouseEvent ) { QTreeWidget::mousePressEvent(pMouseEvent); if (pMouseEvent->button() == Qt::LeftButton) { m_posDrag = pMouseEvent->pos(); m_pDragItem = QTreeWidget::itemAt(m_posDrag); } } void qjackctlClientListView::mouseMoveEvent ( QMouseEvent *pMouseEvent ) { QTreeWidget::mouseMoveEvent(pMouseEvent); if ((pMouseEvent->buttons() & Qt::LeftButton) && m_pDragItem && ((pMouseEvent->pos() - m_posDrag).manhattanLength() >= QApplication::startDragDistance())) { // We'll start dragging something alright... QMimeData *pMimeData = new QMimeData(); pMimeData->setText(m_pDragItem->text(0)); QDrag *pDrag = new QDrag(this); pDrag->setMimeData(pMimeData); pDrag->setPixmap(m_pDragItem->icon(0).pixmap(16)); pDrag->setHotSpot(QPoint(-4, -12)); pDrag->exec(Qt::LinkAction); // We've dragged and maybe dropped it by now... m_pDragItem = nullptr; } } // Context menu request event handler. void qjackctlClientListView::contextMenuEvent ( QContextMenuEvent *pContextMenuEvent ) { qjackctlConnect *pConnect = m_pConnectView->binding(); if (pConnect == 0) return; QMenu menu(this); QAction *pAction; #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) pAction = menu.addAction(QIcon(":/images/connect1.png"), tr("&Connect"), tr("Alt+C", "Connect"), pConnect, SLOT(connectSelected())); pAction->setEnabled(pConnect->canConnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnect1.png"), tr("&Disconnect"), tr("Alt+D", "Disconnect"), pConnect, SLOT(disconnectSelected())); pAction->setEnabled(pConnect->canDisconnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnectall1.png"), tr("Disconnect &All"), tr("Alt+A", "Disconnect All"), pConnect, SLOT(disconnectAll())); pAction->setEnabled(pConnect->canDisconnectAll()); if (m_bRenameEnabled) { menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/edit1.png"), tr("Re&name"), tr("Alt+N", "Rename"), this, SLOT(startRenameSlot())); QTreeWidgetItem *pItem = QTreeWidget::currentItem(); pAction->setEnabled(pItem && (pItem->flags() & Qt::ItemIsEditable)); } menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("&Refresh"), tr("Alt+R", "Refresh"), pConnect, SLOT(refresh())); #else pAction = menu.addAction(QIcon(":/images/connect1.png"), tr("&Connect"), pConnect, SLOT(connectSelected()), tr("Alt+C", "Connect")); pAction->setEnabled(pConnect->canConnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnect1.png"), tr("&Disconnect"), pConnect, SLOT(disconnectSelected()), tr("Alt+D", "Disconnect")); pAction->setEnabled(pConnect->canDisconnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnectall1.png"), tr("Disconnect &All"), pConnect, SLOT(disconnectAll()), tr("Alt+A", "Disconnect All")); pAction->setEnabled(pConnect->canDisconnectAll()); if (m_bRenameEnabled) { menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/edit1.png"), tr("Re&name"), this, SLOT(startRenameSlot()), tr("Alt+N", "Rename")); QTreeWidgetItem *pItem = QTreeWidget::currentItem(); pAction->setEnabled(pItem && (pItem->flags() & Qt::ItemIsEditable)); } menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("&Refresh"), pConnect, SLOT(refresh()), tr("Alt+R", "Refresh")); #endif menu.exec(pContextMenuEvent->globalPos()); } // Dirty aliases notification. void qjackctlClientListView::emitAliasesChanged (void) { m_pConnectView->emitAliasesChanged(); } //---------------------------------------------------------------------- // qjackctlConnectorView -- Jack port connector widget. // // Constructor. qjackctlConnectorView::qjackctlConnectorView ( qjackctlConnectView *pConnectView ) : QWidget(pConnectView) { m_pConnectView = pConnectView; QWidget::setMinimumWidth(20); // QWidget::setMaximumWidth(120); QWidget::setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); } // Default destructor. qjackctlConnectorView::~qjackctlConnectorView (void) { } // Legal client/port item position helper. int qjackctlConnectorView::itemY ( QTreeWidgetItem *pItem ) const { QRect rect; QTreeWidget *pList = pItem->treeWidget(); QTreeWidgetItem *pParent = pItem->parent(); qjackctlClientItem *pClientItem = nullptr; if (pParent && pParent->type() == QJACKCTL_CLIENTITEM) pClientItem = static_cast (pParent); if (pClientItem && !pClientItem->isOpen()) { rect = pList->visualItemRect(pClientItem); } else { rect = pList->visualItemRect(pItem); } return rect.top() + rect.height() / 2; } // Draw visible port connection relation lines void qjackctlConnectorView::drawConnectionLine ( QPainter *pPainter, int x1, int y1, int x2, int y2, int h1, int h2, const QPen& pen ) { // Set apropriate pen... pPainter->setPen(pen); // Account for list view headers. y1 += h1; y2 += h2; // Invisible output ports don't get a connecting dot. if (y1 > h1) pPainter->drawLine(x1, y1, x1 + 4, y1); // Setup control points QPolygon spline(4); const int cp = int(float(x2 - x1 - 8) * 0.4f); spline.putPoints(0, 4, x1 + 4, y1, x1 + 4 + cp, y1, x2 - 4 - cp, y2, x2 - 4, y2); // The connection line, it self. QPainterPath path; path.moveTo(spline.at(0)); path.cubicTo(spline.at(1), spline.at(2), spline.at(3)); pPainter->strokePath(path, pen); // Invisible input ports don't get a connecting dot. if (y2 > h2) pPainter->drawLine(x2 - 4, y2, x2, y2); } // Draw visible port connection relation arrows. void qjackctlConnectorView::paintEvent ( QPaintEvent * ) { if (m_pConnectView == nullptr) return; if (m_pConnectView->OListView() == nullptr || m_pConnectView->IListView() == nullptr) return; qjackctlClientListView *pOListView = m_pConnectView->OListView(); qjackctlClientListView *pIListView = m_pConnectView->IListView(); const int yc = QWidget::pos().y(); const int yo = pOListView->pos().y(); const int yi = pIListView->pos().y(); QPainter painter(this); int x1, y1, h1; int x2, y2, h2; int rgb[3] = { 0x33, 0x66, 0x99 }; // Draw all lines anti-aliased... painter.setRenderHint(QPainter::Antialiasing); // Inline adaptive to darker background themes... if (QWidget::palette().window().color().value() < 0x7f) for (int i = 0; i < 3; ++i) rgb[i] += 0x33; // Almost constants. x1 = 0; x2 = QWidget::width(); h1 = (pOListView->header())->sizeHint().height(); h2 = (pIListView->header())->sizeHint().height(); // For each output client item... const int iItemCount = pOListView->topLevelItemCount(); for (int iItem = 0; iItem < iItemCount; ++iItem) { QTreeWidgetItem *pItem = pOListView->topLevelItem(iItem); if (pItem->type() != QJACKCTL_CLIENTITEM) continue; qjackctlClientItem *pOClient = static_cast (pItem); if (pOClient == nullptr) continue; // Set new connector color. const QString& sOClientName = pOClient->clientName(); int k = m_colorMap.value(sOClientName, -1); if (k < 0) { k = m_colorMap.size() + 1; m_colorMap.insert(sOClientName, k); } QPen pen(QColor(rgb[k % 3], rgb[(k / 3) % 3], rgb[(k / 9) % 3])); // For each port item const int iChildCount = pOClient->childCount(); for (int iChild = 0; iChild < iChildCount; ++iChild) { QTreeWidgetItem *pChild = pOClient->child(iChild); if (pChild->type() != QJACKCTL_PORTITEM) continue; qjackctlPortItem *pOPort = static_cast (pChild); if (pOPort) { // Set proposed line width... const int w1 = (pOPort->isHilite() ? 2 : 1); // Get starting connector arrow coordinates. y1 = itemY(pOPort) + (yo - yc); // Get port connections... QListIterator iter(pOPort->connects()); while (iter.hasNext()) { qjackctlPortItem *pIPort = iter.next(); // Obviously, should be a connection // from pOPort to pIPort items: y2 = itemY(pIPort) + (yi - yc); pen.setWidth(pIPort->isHilite() ? 2 : w1); drawConnectionLine(&painter, x1, y1, x2, y2, h1, h2, pen); } } } } } // Context menu request event handler. void qjackctlConnectorView::contextMenuEvent ( QContextMenuEvent *pContextMenuEvent ) { qjackctlConnect *pConnect = m_pConnectView->binding(); if (pConnect == 0) return; QMenu menu(this); QAction *pAction; #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) pAction = menu.addAction(QIcon(":/images/connect1.png"), tr("&Connect"), tr("Alt+C", "Connect"), pConnect, SLOT(connectSelected())); pAction->setEnabled(pConnect->canConnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnect1.png"), tr("&Disconnect"), tr("Alt+D", "Disconnect"), pConnect, SLOT(disconnectSelected())); pAction->setEnabled(pConnect->canDisconnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnectall1.png"), tr("Disconnect &All"), tr("Alt+A", "Disconnect All"), pConnect, SLOT(disconnectAll())); pAction->setEnabled(pConnect->canDisconnectAll()); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("&Refresh"), tr("Alt+R", "Refresh"), pConnect, SLOT(refresh())); #else pAction = menu.addAction(QIcon(":/images/connect1.png"), tr("&Connect"), pConnect, SLOT(connectSelected()), tr("Alt+C", "Connect")); pAction->setEnabled(pConnect->canConnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnect1.png"), tr("&Disconnect"), pConnect, SLOT(disconnectSelected()), tr("Alt+D", "Disconnect")); pAction->setEnabled(pConnect->canDisconnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnectall1.png"), tr("Disconnect &All"), pConnect, SLOT(disconnectAll()), tr("Alt+A", "Disconnect All")); pAction->setEnabled(pConnect->canDisconnectAll()); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("&Refresh"), pConnect, SLOT(refresh()), tr("Alt+R", "Refresh")); #endif menu.exec(pContextMenuEvent->globalPos()); } // Widget event slots... void qjackctlConnectorView::contentsChanged (void) { QWidget::update(); } //---------------------------------------------------------------------------- // qjackctlConnectView -- Integrated connections view widget. // Constructor. qjackctlConnectView::qjackctlConnectView ( QWidget *pParent ) : QSplitter(Qt::Horizontal, pParent) { m_pOListView = new qjackctlClientListView(this, true); m_pConnectorView = new qjackctlConnectorView(this); m_pIListView = new qjackctlClientListView(this, false); m_pConnect = nullptr; m_iIconSize = 0; QSplitter::setHandleWidth(2); QObject::connect(m_pOListView, SIGNAL(itemExpanded(QTreeWidgetItem *)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pOListView, SIGNAL(itemCollapsed(QTreeWidgetItem *)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pOListView->verticalScrollBar(), SIGNAL(valueChanged(int)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pOListView->header(), SIGNAL(sectionClicked(int)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pIListView, SIGNAL(itemExpanded(QTreeWidgetItem *)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pIListView, SIGNAL(itemCollapsed(QTreeWidgetItem *)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pIListView->verticalScrollBar(), SIGNAL(valueChanged(int)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pIListView->header(), SIGNAL(sectionClicked(int)), m_pConnectorView, SLOT(contentsChanged())); m_bDirty = false; } // Default destructor. qjackctlConnectView::~qjackctlConnectView (void) { } // Connect binding methods. void qjackctlConnectView::setBinding ( qjackctlConnect *pConnect ) { m_pConnect = pConnect; } qjackctlConnect *qjackctlConnectView::binding (void) const { return m_pConnect; } // Connect client list accessors. qjackctlClientList *qjackctlConnectView::OClientList (void) const { if (m_pConnect) return m_pConnect->OClientList(); else return nullptr; } qjackctlClientList *qjackctlConnectView::IClientList (void) const { if (m_pConnect) return m_pConnect->OClientList(); else return nullptr; } // Common icon size methods. void qjackctlConnectView::setIconSize ( int iIconSize ) { // Update only if changed. if (iIconSize == m_iIconSize) return; // Go for it... m_iIconSize = iIconSize; // Update item sizes properly... const int px = (16 << m_iIconSize); const QSize iconSize(px, px); m_pOListView->setIconSize(iconSize); m_pIListView->setIconSize(iconSize); // Call binding descendant implementation, // and do a complete content reset... if (m_pConnect) m_pConnect->updateContents(true); } int qjackctlConnectView::iconSize (void) const { return m_iIconSize; } // Dirty aliases notification. void qjackctlConnectView::emitAliasesChanged (void) { emit aliasesChanged(); } //---------------------------------------------------------------------- // qjackctlConnect -- Output-to-Input client/ports connection object. // // Constructor. qjackctlConnect::qjackctlConnect ( qjackctlConnectView *pConnectView ) { m_pConnectView = pConnectView; m_pOClientList = nullptr; m_pIClientList = nullptr; m_iMutex = 0; m_pConnectView->setBinding(this); } // Default destructor. qjackctlConnect::~qjackctlConnect (void) { // Force end of works here. m_iMutex++; m_pConnectView->setBinding(nullptr); if (m_pOClientList) delete m_pOClientList; if (m_pIClientList) delete m_pIClientList; m_pOClientList = nullptr; m_pIClientList = nullptr; m_pConnectView->connectorView()->update(); } // These must be accessed by the descendant constructor. qjackctlConnectView *qjackctlConnect::connectView (void) const { return m_pConnectView; } void qjackctlConnect::setOClientList ( qjackctlClientList *pOClientList ) { m_pOClientList = pOClientList; } void qjackctlConnect::setIClientList ( qjackctlClientList *pIClientList ) { m_pIClientList = pIClientList; } // Connection primitive. bool qjackctlConnect::connectPortsEx ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { if (pOPort->findConnectPtr(pIPort) != nullptr) return false; emit connecting(pOPort, pIPort); if (!connectPorts(pOPort, pIPort)) return false; pOPort->addConnect(pIPort); pIPort->addConnect(pOPort); return true; } // Disconnection primitive. bool qjackctlConnect::disconnectPortsEx ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { if (pOPort->findConnectPtr(pIPort) == nullptr) return false; emit disconnecting(pOPort, pIPort); if (!disconnectPorts(pOPort, pIPort)) return false; pOPort->removeConnect(pIPort); pIPort->removeConnect(pOPort); return true; } // Test if selected ports are connectable. bool qjackctlConnect::canConnectSelected (void) { bool bResult = false; if (startMutex()) { bResult = canConnectSelectedEx(); endMutex(); } return bResult; } bool qjackctlConnect::canConnectSelectedEx (void) { // Take this opportunity to highlight any current selections. m_pOClientList->hiliteClientPorts(); m_pIClientList->hiliteClientPorts(); m_pConnectView->connectorView()->update(); // Now with our predicate work... const QList oitems = (m_pOClientList->listView())->selectedItems(); const QList iitems = (m_pIClientList->listView())->selectedItems(); if (oitems.isEmpty() || iitems.isEmpty()) return false; QListIterator oiter(oitems); QListIterator iiter(iitems); const int iNumItems = qMax(oitems.count(), iitems.count()); for (int i = 0; i < iNumItems; ++i) { if (!oiter.hasNext()) oiter.toFront(); if (!iiter.hasNext()) iiter.toFront(); QTreeWidgetItem *pOItem = oiter.next(); QTreeWidgetItem *pIItem = iiter.next(); if (pOItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pOClient = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // Each-to-each connections... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator oport(pOClient->ports()); QListIterator iport(pIClient->ports()); while (oport.hasNext() && iport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = iport.next(); if (pOPort->findConnectPtr(pIPort) == nullptr) return true; } } else { // Many(all)-to-one/many connection... QListIterator oport(pOClient->ports()); while (oport.hasNext() && pIItem && pIItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = static_cast (pIItem); if (pOPort->findConnectPtr(pIPort) == nullptr) return true; pIItem = (m_pIClientList->listView())->itemBelow(pIItem); } } } else { qjackctlPortItem *pOPort = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // One-to-many(all) connection... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator iport(pIClient->ports()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); if (pOPort->findConnectPtr(pIPort) == nullptr) return true; } } else { // One-to-one connection... qjackctlPortItem *pIPort = static_cast (pIItem); return (pOPort->findConnectPtr(pIPort) == nullptr); } } } return false; } // Connect current selected ports. bool qjackctlConnect::connectSelected (void) { bool bResult = false; if (startMutex()) { bResult = connectSelectedEx(); endMutex(); } m_pConnectView->connectorView()->update(); if (bResult) emit connectChanged(); return bResult; } bool qjackctlConnect::connectSelectedEx (void) { const QList oitems = (m_pOClientList->listView())->selectedItems(); const QList iitems = (m_pIClientList->listView())->selectedItems(); if (oitems.isEmpty() || iitems.isEmpty()) return false; QListIterator oiter(oitems); QListIterator iiter(iitems); const int iNumItems = qMax(oitems.count(), iitems.count()); for (int i = 0; i < iNumItems; ++i) { if (!oiter.hasNext()) oiter.toFront(); if (!iiter.hasNext()) iiter.toFront(); QTreeWidgetItem *pOItem = oiter.next(); QTreeWidgetItem *pIItem = iiter.next(); if (pOItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pOClient = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // Each-to-each connections... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator oport(pOClient->ports()); QListIterator iport(pIClient->ports()); while (oport.hasNext() && iport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = iport.next(); connectPortsEx(pOPort, pIPort); } } else { // Many(all)-to-one/many connection... QListIterator oport(pOClient->ports()); while (oport.hasNext() && pIItem && pIItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = static_cast (pIItem); connectPortsEx(pOPort, pIPort); pIItem = (m_pIClientList->listView())->itemBelow(pIItem); } } } else { qjackctlPortItem *pOPort = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // One-to-many(all) connection... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator iport(pIClient->ports()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); connectPortsEx(pOPort, pIPort); } } else { // One-to-one connection... qjackctlPortItem *pIPort = static_cast (pIItem); connectPortsEx(pOPort, pIPort); } } } return true; } // Test if selected ports are disconnectable. bool qjackctlConnect::canDisconnectSelected (void) { bool bResult = false; if (startMutex()) { bResult = canDisconnectSelectedEx(); endMutex(); } return bResult; } bool qjackctlConnect::canDisconnectSelectedEx (void) { const QList oitems = (m_pOClientList->listView())->selectedItems(); const QList iitems = (m_pIClientList->listView())->selectedItems(); if (oitems.isEmpty() || iitems.isEmpty()) return false; QListIterator oiter(oitems); QListIterator iiter(iitems); const int iNumItems = qMax(oitems.count(), iitems.count()); for (int i = 0; i < iNumItems; ++i) { if (!oiter.hasNext()) oiter.toFront(); if (!iiter.hasNext()) iiter.toFront(); QTreeWidgetItem *pOItem = oiter.next(); QTreeWidgetItem *pIItem = iiter.next(); if (pOItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pOClient = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // Each-to-each connections... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator oport(pOClient->ports()); QListIterator iport(pIClient->ports()); while (oport.hasNext() && iport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = iport.next(); if (pOPort->findConnectPtr(pIPort) != nullptr) return true; } } else { // Many(all)-to-one/many connection... QListIterator oport(pOClient->ports()); while (oport.hasNext() && pIItem && pIItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = static_cast (pIItem); if (pOPort->findConnectPtr(pIPort) != nullptr) return true; pIItem = (m_pIClientList->listView())->itemBelow(pIItem); } } } else { qjackctlPortItem *pOPort = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // One-to-many(all) connection... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator iport(pIClient->ports()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); if (pOPort->findConnectPtr(pIPort) != nullptr) return true; } } else { // One-to-one connection... qjackctlPortItem *pIPort = static_cast (pIItem); return (pOPort->findConnectPtr(pIPort) != nullptr); } } } return false; } // Disconnect current selected ports. bool qjackctlConnect::disconnectSelected (void) { bool bResult = false; if (startMutex()) { bResult = disconnectSelectedEx(); endMutex(); } m_pConnectView->connectorView()->update(); if (bResult) emit connectChanged(); return bResult; } bool qjackctlConnect::disconnectSelectedEx (void) { const QList oitems = (m_pOClientList->listView())->selectedItems(); const QList iitems = (m_pIClientList->listView())->selectedItems(); if (oitems.isEmpty() || iitems.isEmpty()) return false; QListIterator oiter(oitems); QListIterator iiter(iitems); const int iNumItems = qMax(oitems.count(), iitems.count()); for (int i = 0; i < iNumItems; ++i) { if (!oiter.hasNext()) oiter.toFront(); if (!iiter.hasNext()) iiter.toFront(); QTreeWidgetItem *pOItem = oiter.next(); QTreeWidgetItem *pIItem = iiter.next(); if (pOItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pOClient = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // Each-to-each connections... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator oport(pOClient->ports()); QListIterator iport(pIClient->ports()); while (oport.hasNext() && iport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = iport.next(); disconnectPortsEx(pOPort, pIPort); } } else { // Many(all)-to-one/many connection... QListIterator oport(pOClient->ports()); while (oport.hasNext() && pIItem && pIItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = static_cast (pIItem); disconnectPortsEx(pOPort, pIPort); pIItem = (m_pIClientList->listView())->itemBelow(pIItem); } } } else { qjackctlPortItem *pOPort = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // One-to-many(all) connection... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator iport(pIClient->ports()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); disconnectPortsEx(pOPort, pIPort); } } else { // One-to-one connection... qjackctlPortItem *pIPort = static_cast (pIItem); disconnectPortsEx(pOPort, pIPort); } } } return true; } // Test if any port is disconnectable. bool qjackctlConnect::canDisconnectAll (void) { bool bResult = false; if (startMutex()) { bResult = canDisconnectAllEx(); endMutex(); } return bResult; } bool qjackctlConnect::canDisconnectAllEx (void) { QListIterator iter(m_pOClientList->clients()); while (iter.hasNext()) { qjackctlClientItem *pOClient = iter.next(); QListIterator oport(pOClient->ports()); while (oport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); if (pOPort->connects().count() > 0) return true; } } return false; } // Disconnect all ports. bool qjackctlConnect::disconnectAll (void) { if (QMessageBox::warning(m_pConnectView, tr("Warning") + " - " QJACKCTL_TITLE, tr("This will suspend sound processing\n" "from all client applications.\n\nAre you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { return false; } bool bResult = false; if (startMutex()) { bResult = disconnectAllEx(); endMutex(); } m_pConnectView->connectorView()->update(); if (bResult) emit connectChanged(); return bResult; } bool qjackctlConnect::disconnectAllEx (void) { QListIterator iter(m_pOClientList->clients()); while (iter.hasNext()) { qjackctlClientItem *pOClient = iter.next(); QListIterator oport(pOClient->ports()); while (oport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); QListIterator iport(pOPort->connects()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); disconnectPortsEx(pOPort, pIPort); } } } return true; } // Expand all client ports. void qjackctlConnect::expandAll (void) { (m_pOClientList->listView())->expandAll(); (m_pIClientList->listView())->expandAll(); (m_pConnectView->connectorView())->update(); } // Complete/incremental contents rebuilder; check dirty status if incremental. void qjackctlConnect::updateContents ( bool bClear ) { int iDirtyCount = 0; if (startMutex()) { // Do we do a complete rebuild? if (bClear) { m_pOClientList->clear(); m_pIClientList->clear(); updateIconPixmaps(); } // Add (newer) client:ports and respective connections... if (m_pOClientList->updateClientPorts() > 0) { m_pOClientList->refresh(); ++iDirtyCount; } if (m_pIClientList->updateClientPorts() > 0) { m_pIClientList->refresh(); ++iDirtyCount; } updateConnections(); endMutex(); } (m_pConnectView->connectorView())->update(); if (!bClear && iDirtyCount > 0) emit connectChanged(); } // Incremental contents rebuilder; check dirty status. void qjackctlConnect::refresh (void) { updateContents(false); } // Dunno. But this may avoid some conflicts. bool qjackctlConnect::startMutex (void) { const bool bMutex = (m_iMutex == 0); if (bMutex) m_iMutex++; return bMutex; } void qjackctlConnect::endMutex (void) { if (m_iMutex > 0) m_iMutex--; } // Connect client list accessors. qjackctlClientList *qjackctlConnect::OClientList (void) const { return m_pOClientList; } qjackctlClientList *qjackctlConnect::IClientList (void) const { return m_pIClientList; } // Common pixmap factory-method. QPixmap *qjackctlConnect::createIconPixmap ( const QString& sIconName ) { QString sName = sIconName; const int iSize = m_pConnectView->iconSize() * 32; if (iSize > 0) sName += QString("_%1x%2").arg(iSize).arg(iSize); return new QPixmap(":/images/" + sName + ".png"); } // end of qjackctlConnect.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlSessionSaveForm.h0000644000000000000000000000013215174607203020140 xustar0030 mtime=1777536643.516914284 30 atime=1777536643.516914284 30 ctime=1777536643.516914284 qjackctl-1.0.6/src/qjackctlSessionSaveForm.h0000644000175000001440000000416215174607203020133 0ustar00rncbcusers// qjackctlSessionSaveForm.h // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSessionSaveForm_h #define __qjackctlSessionSaveForm_h #include "ui_qjackctlSessionSaveForm.h" // forward decls. class qjackctlSetup; //---------------------------------------------------------------------------- // qjackctlSessionSaveForm -- UI wrapper form. class qjackctlSessionSaveForm : public QDialog { Q_OBJECT public: // Constructor. qjackctlSessionSaveForm(QWidget *pParent, const QString& sTitle, const QStringList& sessionDirs); // Destructor. ~qjackctlSessionSaveForm(); // Retrieve the accepted session directory, if the case arises. const QString& sessionDir() const; // Session directory versioning option. void setSessionSaveVersion(bool bSessionSaveVersion); bool isSessionSaveVersion() const; protected slots: void accept(); void reject(); void changeSessionName(const QString& sSessionName); void changeSessionDir(const QString& sSessionDir); void browseSessionDir(); protected: void stabilizeForm(); private: // The Qt-designer UI struct... Ui::qjackctlSessionSaveForm m_ui; // Instance variables... QString m_sSessionDir; }; #endif // __qjackctlSessionSaveForm_h // end of qjackctlSessionSaveForm.h qjackctl-1.0.6/src/PaxHeaders/qjackctlAlsaConnect.h0000644000000000000000000000013215174607203017244 xustar0030 mtime=1777536643.509914334 30 atime=1777536643.509914334 30 ctime=1777536643.509914334 qjackctl-1.0.6/src/qjackctlAlsaConnect.h0000644000175000001440000000725515174607203017245 0ustar00rncbcusers// qjackctlAlsaConnect.h // /**************************************************************************** Copyright (C) 2003-2021, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlAlsaConnect_h #define __qjackctlAlsaConnect_h #include "qjackctlAbout.h" #include "qjackctlConnect.h" #ifdef CONFIG_ALSA_SEQ #include #else typedef void snd_seq_t; #endif // Forward declarations. class qjackctlAlsaPort; class qjackctlAlsaClient; class qjackctlAlsaClientList; class qjackctlAlsaConnect; // Pixmap-set array indexes. #define QJACKCTL_ALSA_CLIENTO 0 // Output client item pixmap. #define QJACKCTL_ALSA_CLIENTI 1 // Input client item pixmap. #define QJACKCTL_ALSA_PORTO 2 // Output port pixmap. #define QJACKCTL_ALSA_PORTI 3 // Input port pixmap. #define QJACKCTL_ALSA_PIXMAPS 4 // Number of pixmaps in local array. // Jack port list item. class qjackctlAlsaPort : public qjackctlPortItem { public: // Constructor. qjackctlAlsaPort(qjackctlAlsaClient *pClient); // Default destructor. ~qjackctlAlsaPort(); // Jack handles accessors. int alsaClient() const; int alsaPort() const; }; // Jack client list item. class qjackctlAlsaClient : public qjackctlClientItem { public: // Constructor. qjackctlAlsaClient(qjackctlAlsaClientList *pClientList); // Default destructor. ~qjackctlAlsaClient(); // Jack client accessors. int alsaClient() const; // Port finder by id. qjackctlAlsaPort *findPort(int iAlsaPort); }; // Jack client list. class qjackctlAlsaClientList : public qjackctlClientList { public: // Constructor. qjackctlAlsaClientList(qjackctlClientListView *pListView, bool bReadable); // Default destructor. ~qjackctlAlsaClientList(); // Client finder by id. qjackctlAlsaClient *findClient(int iAlsaClient); // Client port finder by id. qjackctlAlsaPort *findClientPort(int iAlsaClient, int iAlsaPort); // Client:port refreshner (return newest item count). int updateClientPorts(); }; //---------------------------------------------------------------------------- // qjackctlAlsaConnect -- Connections model integrated object. class qjackctlAlsaConnect : public qjackctlConnect { public: // Constructor. qjackctlAlsaConnect(qjackctlConnectView *pConnectView); // Default destructor. ~qjackctlAlsaConnect(); // Common pixmap accessor. const QPixmap& pixmap(int iPixmap) const; protected: // Virtual Connect/Disconnection primitives. bool connectPorts (qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); bool disconnectPorts (qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); // Update port connection references. void updateConnections(); // Update icon size implementation. void updateIconPixmaps(); private: // Local pixmap-set janitor methods. void createIconPixmaps(); void deleteIconPixmaps(); // Local pixmap-set array. QPixmap *m_apPixmaps[QJACKCTL_ALSA_PIXMAPS]; }; #endif // __qjackctlAlsaConnect_h // end of qjackctlAlsaConnect.h qjackctl-1.0.6/src/PaxHeaders/qjackctlGraphForm.cpp0000644000000000000000000000013215174607203017272 xustar0030 mtime=1777536643.510914327 30 atime=1777536643.510914327 30 ctime=1777536643.510914327 qjackctl-1.0.6/src/qjackctlGraphForm.cpp0000644000175000001440000010735115174607203017271 0ustar00rncbcusers// qjackctlGraphForm.cpp // /**************************************************************************** Copyright (C) 2003-2025, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlGraphForm.h" #include "qjackctlJackGraph.h" #include "qjackctlAlsaGraph.h" #include "qjackctlMainForm.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include //---------------------------------------------------------------------------- // qjackctlGraphZoomSlider -- Custom slider widget. #include class qjackctlGraphZoomSlider : public QSlider { public: qjackctlGraphZoomSlider() : QSlider(Qt::Horizontal) { QSlider::setMinimum(10); QSlider::setMaximum(190); QSlider::setTickInterval(90); QSlider::setTickPosition(QSlider::TicksBothSides); } protected: void mousePressEvent(QMouseEvent *ev) { QSlider::mousePressEvent(ev); if (ev->button() == Qt::MiddleButton) QSlider::setValue(100); } }; //---------------------------------------------------------------------------- // qjackctlGraphForm -- UI wrapper form. // Constructor. qjackctlGraphForm::qjackctlGraphForm ( QWidget *parent, Qt::WindowFlags wflags ) : QMainWindow(parent, wflags), m_config(nullptr), m_jack(nullptr), m_alsa(nullptr) { // Setup UI struct... m_ui.setupUi(this); m_jack_changed = 0; m_alsa_changed = 0; m_ins = m_mids = m_outs = 0; m_repel_overlapping_nodes = 0; m_thumb = nullptr; m_thumb_update = 0; QUndoStack *commands = m_ui.graphCanvas->commands(); QAction *undo_action = commands->createUndoAction(this, tr("&Undo")); undo_action->setIcon(QIcon(":/images/graphUndo.png")); undo_action->setStatusTip(tr("Undo last edit action")); undo_action->setShortcuts(QKeySequence::Undo); QAction *redo_action = commands->createRedoAction(this, tr("&Redo")); redo_action->setIcon(QIcon(":/images/graphRedo.png")); redo_action->setStatusTip(tr("Redo last edit action")); redo_action->setShortcuts(QKeySequence::Redo); QAction *before_action = m_ui.editSelectAllAction; m_ui.editMenu->insertAction(before_action, undo_action); m_ui.editMenu->insertAction(before_action, redo_action); m_ui.editMenu->insertSeparator(before_action); before_action = m_ui.viewCenterAction; m_ui.ToolBar->insertAction(before_action, undo_action); m_ui.ToolBar->insertAction(before_action, redo_action); m_ui.ToolBar->insertSeparator(before_action); // Special zoom composite widget... QWidget *zoom_widget = new QWidget(); zoom_widget->setMaximumWidth(240); zoom_widget->setToolTip(tr("Zoom")); QHBoxLayout *zoom_layout = new QHBoxLayout(); zoom_layout->setContentsMargins(0, 0, 0, 0); zoom_layout->setSpacing(2); QToolButton *zoom_out = new QToolButton(); zoom_out->setDefaultAction(m_ui.viewZoomOutAction); zoom_out->setFixedSize(22, 22); zoom_layout->addWidget(zoom_out); m_zoom_slider = new qjackctlGraphZoomSlider(); m_zoom_slider->setFixedHeight(22); zoom_layout->addWidget(m_zoom_slider); QToolButton *zoom_in = new QToolButton(); zoom_in->setDefaultAction(m_ui.viewZoomInAction); zoom_in->setFixedSize(22, 22); zoom_layout->addWidget(zoom_in); m_zoom_spinbox = new QSpinBox(); m_zoom_spinbox->setFixedHeight(22); m_zoom_spinbox->setAlignment(Qt::AlignCenter); m_zoom_spinbox->setMinimum(10); m_zoom_spinbox->setMaximum(200); m_zoom_spinbox->setSuffix(" %"); zoom_layout->addWidget(m_zoom_spinbox); zoom_widget->setLayout(zoom_layout); m_ui.StatusBar->addPermanentWidget(zoom_widget); QObject::connect(m_zoom_spinbox, SIGNAL(valueChanged(int)), SLOT(zoomValueChanged(int))); QObject::connect(m_zoom_slider, SIGNAL(valueChanged(int)), SLOT(zoomValueChanged(int))); QObject::connect(m_ui.graphCanvas, SIGNAL(added(qjackctlGraphNode *)), SLOT(added(qjackctlGraphNode *))); QObject::connect(m_ui.graphCanvas, SIGNAL(updated(qjackctlGraphNode *)), SLOT(updated(qjackctlGraphNode *))); QObject::connect(m_ui.graphCanvas, SIGNAL(removed(qjackctlGraphNode *)), SLOT(removed(qjackctlGraphNode *))); QObject::connect(m_ui.graphCanvas, SIGNAL(connected(qjackctlGraphPort *, qjackctlGraphPort *)), SLOT(connected(qjackctlGraphPort *, qjackctlGraphPort *))); QObject::connect(m_ui.graphCanvas, SIGNAL(disconnected(qjackctlGraphPort *, qjackctlGraphPort *)), SLOT(disconnected(qjackctlGraphPort *, qjackctlGraphPort *))); QObject::connect(m_ui.graphCanvas, SIGNAL(connected(qjackctlGraphConnect *)), SLOT(connected(qjackctlGraphConnect *))); QObject::connect(m_ui.graphCanvas, SIGNAL(renamed(qjackctlGraphItem *, const QString&)), SLOT(renamed(qjackctlGraphItem *, const QString&))); QObject::connect(m_ui.graphCanvas, SIGNAL(changed()), SLOT(changed())); // Some actions surely need those // shortcuts firmly attached... addAction(m_ui.viewMenubarAction); addAction(m_ui.editSearchItemAction); // HACK: Make old Ins/Del standard shortcuts // for connect/disconnect available again... QList shortcuts; shortcuts.append(m_ui.graphConnectAction->shortcut()); shortcuts.append(QKeySequence("Ins")); m_ui.graphConnectAction->setShortcuts(shortcuts); shortcuts.clear(); shortcuts.append(m_ui.graphDisconnectAction->shortcut()); shortcuts.append(QKeySequence("Del")); m_ui.graphDisconnectAction->setShortcuts(shortcuts); QObject::connect(m_ui.graphConnectAction, SIGNAL(triggered(bool)), m_ui.graphCanvas, SLOT(connectItems())); QObject::connect(m_ui.graphDisconnectAction, SIGNAL(triggered(bool)), m_ui.graphCanvas, SLOT(disconnectItems())); QObject::connect(m_ui.graphCloseAction, SIGNAL(triggered(bool)), SLOT(close())); QObject::connect(m_ui.editSelectAllAction, SIGNAL(triggered(bool)), m_ui.graphCanvas, SLOT(selectAll())); QObject::connect(m_ui.editSelectNoneAction, SIGNAL(triggered(bool)), m_ui.graphCanvas, SLOT(selectNone())); QObject::connect(m_ui.editSelectInvertAction, SIGNAL(triggered(bool)), m_ui.graphCanvas, SLOT(selectInvert())); QObject::connect(m_ui.editRenameItemAction, SIGNAL(triggered(bool)), m_ui.graphCanvas, SLOT(renameItem())); QObject::connect(m_ui.editSearchItemAction, SIGNAL(triggered(bool)), m_ui.graphCanvas, SLOT(searchItem())); QObject::connect(m_ui.viewMenubarAction, SIGNAL(triggered(bool)), SLOT(viewMenubar(bool))); QObject::connect(m_ui.viewStatusbarAction, SIGNAL(triggered(bool)), SLOT(viewStatusbar(bool))); QObject::connect(m_ui.viewToolbarAction, SIGNAL(triggered(bool)), SLOT(viewToolbar(bool))); m_thumb_mode = new QActionGroup(this); m_thumb_mode->setExclusive(true); m_thumb_mode->addAction(m_ui.viewThumbviewTopLeftAction); m_thumb_mode->addAction(m_ui.viewThumbviewTopRightAction); m_thumb_mode->addAction(m_ui.viewThumbviewBottomLeftAction); m_thumb_mode->addAction(m_ui.viewThumbviewBottomRightAction); m_thumb_mode->addAction(m_ui.viewThumbviewNoneAction); m_ui.viewThumbviewTopLeftAction->setData(qjackctlGraphThumb::TopLeft); m_ui.viewThumbviewTopRightAction->setData(qjackctlGraphThumb::TopRight); m_ui.viewThumbviewBottomLeftAction->setData(qjackctlGraphThumb::BottomLeft); m_ui.viewThumbviewBottomRightAction->setData(qjackctlGraphThumb::BottomRight); m_ui.viewThumbviewNoneAction->setData(qjackctlGraphThumb::None); QObject::connect(m_ui.viewThumbviewTopLeftAction, SIGNAL(triggered(bool)), SLOT(viewThumbviewAction())); QObject::connect(m_ui.viewThumbviewTopRightAction, SIGNAL(triggered(bool)), SLOT(viewThumbviewAction())); QObject::connect(m_ui.viewThumbviewBottomLeftAction, SIGNAL(triggered(bool)), SLOT(viewThumbviewAction())); QObject::connect(m_ui.viewThumbviewBottomRightAction, SIGNAL(triggered(bool)), SLOT(viewThumbviewAction())); QObject::connect(m_ui.viewThumbviewNoneAction, SIGNAL(triggered(bool)), SLOT(viewThumbviewAction())); QObject::connect(m_ui.viewTextBesideIconsAction, SIGNAL(triggered(bool)), SLOT(viewTextBesideIcons(bool))); QObject::connect(m_ui.viewCenterAction, SIGNAL(triggered(bool)), SLOT(viewCenter())); QObject::connect(m_ui.viewRefreshAction, SIGNAL(triggered(bool)), SLOT(viewRefresh())); QObject::connect(m_ui.viewZoomInAction, SIGNAL(triggered(bool)), m_ui.graphCanvas, SLOT(zoomIn())); QObject::connect(m_ui.viewZoomOutAction, SIGNAL(triggered(bool)), m_ui.graphCanvas, SLOT(zoomOut())); QObject::connect(m_ui.viewZoomFitAction, SIGNAL(triggered(bool)), m_ui.graphCanvas, SLOT(zoomFit())); QObject::connect(m_ui.viewZoomResetAction, SIGNAL(triggered(bool)), m_ui.graphCanvas, SLOT(zoomReset())); QObject::connect(m_ui.viewZoomRangeAction, SIGNAL(triggered(bool)), SLOT(viewZoomRange(bool))); QObject::connect(m_ui.viewRepelOverlappingNodesAction, SIGNAL(triggered(bool)), SLOT(viewRepelOverlappingNodes(bool))); QObject::connect(m_ui.viewConnectThroughNodesAction, SIGNAL(triggered(bool)), SLOT(viewConnectThroughNodes(bool))); m_ui.viewColorsJackAudioAction->setData(qjackctlJackGraph::audioPortType()); m_ui.viewColorsJackMidiAction->setData(qjackctlJackGraph::midiPortType()); int iAddSeparator = 0; #ifdef CONFIG_JACK_CV m_ui.viewColorsJackCvAction->setData(qjackctlJackGraph::cvPortType()); m_ui.viewColorsMenu->insertAction( m_ui.viewColorsResetAction, m_ui.viewColorsJackCvAction); ++iAddSeparator; #endif #ifdef CONFIG_JACK_OSC m_ui.viewColorsJackOscAction->setData(qjackctlJackGraph::oscPortType()); m_ui.viewColorsMenu->insertAction( m_ui.viewColorsResetAction, m_ui.viewColorsJackOscAction); ++iAddSeparator; #endif if (iAddSeparator > 0) m_ui.viewColorsMenu->insertSeparator(m_ui.viewColorsResetAction); #ifdef CONFIG_ALSA_SEQ m_ui.viewColorsAlsaMidiAction->setData(qjackctlAlsaGraph::midiPortType()); m_ui.viewColorsMenu->insertAction( m_ui.viewColorsResetAction, m_ui.viewColorsAlsaMidiAction); m_ui.viewColorsMenu->insertSeparator(m_ui.viewColorsResetAction); #endif QObject::connect(m_ui.viewColorsJackAudioAction, SIGNAL(triggered(bool)), SLOT(viewColorsAction())); QObject::connect(m_ui.viewColorsJackMidiAction, SIGNAL(triggered(bool)), SLOT(viewColorsAction())); #ifdef CONFIG_JACK_CV QObject::connect(m_ui.viewColorsJackCvAction, SIGNAL(triggered(bool)), SLOT(viewColorsAction())); #endif #ifdef CONFIG_JACK_OSC QObject::connect(m_ui.viewColorsJackOscAction, SIGNAL(triggered(bool)), SLOT(viewColorsAction())); #endif #ifdef CONFIG_ALSA_SEQ QObject::connect(m_ui.viewColorsAlsaMidiAction, SIGNAL(triggered(bool)), SLOT(viewColorsAction())); #endif QObject::connect(m_ui.viewColorsResetAction, SIGNAL(triggered(bool)), SLOT(viewColorsReset())); m_sort_type = new QActionGroup(this); m_sort_type->setExclusive(true); m_sort_type->addAction(m_ui.viewSortPortNameAction); m_sort_type->addAction(m_ui.viewSortPortTitleAction); m_sort_type->addAction(m_ui.viewSortPortIndexAction); m_ui.viewSortPortNameAction->setData(qjackctlGraphPort::PortName); m_ui.viewSortPortTitleAction->setData(qjackctlGraphPort::PortTitle); m_ui.viewSortPortIndexAction->setData(qjackctlGraphPort::PortIndex); QObject::connect(m_ui.viewSortPortNameAction, SIGNAL(triggered(bool)), SLOT(viewSortTypeAction())); QObject::connect(m_ui.viewSortPortTitleAction, SIGNAL(triggered(bool)), SLOT(viewSortTypeAction())); QObject::connect(m_ui.viewSortPortIndexAction, SIGNAL(triggered(bool)), SLOT(viewSortTypeAction())); m_sort_order = new QActionGroup(this); m_sort_order->setExclusive(true); m_sort_order->addAction(m_ui.viewSortAscendingAction); m_sort_order->addAction(m_ui.viewSortDescendingAction); m_ui.viewSortAscendingAction->setData(qjackctlGraphPort::Ascending); m_ui.viewSortDescendingAction->setData(qjackctlGraphPort::Descending); QObject::connect(m_ui.viewSortAscendingAction, SIGNAL(triggered(bool)), SLOT(viewSortOrderAction())); QObject::connect(m_ui.viewSortDescendingAction, SIGNAL(triggered(bool)), SLOT(viewSortOrderAction())); QObject::connect(m_ui.helpAboutAction, SIGNAL(triggered(bool)), SLOT(helpAbout())); QObject::connect(m_ui.helpAboutQtAction, SIGNAL(triggered(bool)), SLOT(helpAboutQt())); QObject::connect(m_ui.ToolBar, SIGNAL(orientationChanged(Qt::Orientation)), SLOT(orientationChanged(Qt::Orientation))); m_ui.graphCanvas->setSearchPlaceholderText( m_ui.editSearchItemAction->statusTip() + QString(3, '.')); } // Destructor. qjackctlGraphForm::~qjackctlGraphForm (void) { if (m_thumb) delete m_thumb; delete m_thumb_mode; delete m_sort_order; delete m_sort_type; if (m_jack) delete m_jack; #ifdef CONFIG_ALSA_SEQ if (m_alsa) delete m_alsa; #endif if (m_config) delete m_config; } // Set reference to global options, mostly needed for // the initial state of the main dockable views and // those client/port aliasing feature. void qjackctlGraphForm::setup ( qjackctlSetup *pSetup ) { m_config = new qjackctlGraphConfig(&pSetup->settings()); m_ui.graphCanvas->setSettings(m_config->settings()); m_ui.graphCanvas->setAliases(&(pSetup->aliases)); m_config->restoreState(this); // Raise the operational sects... m_jack = new qjackctlJackGraph(m_ui.graphCanvas); #ifdef CONFIG_ALSA_SEQ if (pSetup->bAlsaSeqEnabled) m_alsa = new qjackctlAlsaGraph(m_ui.graphCanvas); #endif m_ui.viewMenubarAction->setChecked(m_config->isMenubar()); m_ui.viewToolbarAction->setChecked(m_config->isToolbar()); m_ui.viewStatusbarAction->setChecked(m_config->isStatusbar()); m_ui.viewTextBesideIconsAction->setChecked(m_config->isTextBesideIcons()); m_ui.viewZoomRangeAction->setChecked(m_config->isZoomRange()); m_ui.viewRepelOverlappingNodesAction->setChecked(m_config->isRepelOverlappingNodes()); m_ui.viewConnectThroughNodesAction->setChecked(m_config->isConnectThroughNodes()); const qjackctlGraphPort::SortType sort_type = qjackctlGraphPort::SortType(m_config->sortType()); qjackctlGraphPort::setSortType(sort_type); switch (sort_type) { case qjackctlGraphPort::PortIndex: m_ui.viewSortPortIndexAction->setChecked(true); break; case qjackctlGraphPort::PortTitle: m_ui.viewSortPortTitleAction->setChecked(true); break; case qjackctlGraphPort::PortName: default: m_ui.viewSortPortNameAction->setChecked(true); break; } const qjackctlGraphPort::SortOrder sort_order = qjackctlGraphPort::SortOrder(m_config->sortOrder()); qjackctlGraphPort::setSortOrder(sort_order); switch (sort_order) { case qjackctlGraphPort::Descending: m_ui.viewSortDescendingAction->setChecked(true); break; case qjackctlGraphPort::Ascending: default: m_ui.viewSortAscendingAction->setChecked(true); break; } viewMenubar(m_config->isMenubar()); viewToolbar(m_config->isToolbar()); viewStatusbar(m_config->isStatusbar()); viewThumbview(m_config->thumbview()); viewTextBesideIcons(m_config->isTextBesideIcons()); viewZoomRange(m_config->isZoomRange()); viewRepelOverlappingNodes(m_config->isRepelOverlappingNodes()); viewConnectThroughNodes(m_config->isConnectThroughNodes()); qjackctlJackGraph::resetPortTypeColors(m_ui.graphCanvas); #ifdef CONFIG_ALSA_SEQ qjackctlAlsaGraph::resetPortTypeColors(m_ui.graphCanvas); #endif m_ui.graphCanvas->restoreState(); updateViewColors(); stabilize(); // Make it ready :-) m_ui.StatusBar->showMessage(tr("Ready"), 3000); // Trigger refresh cycle... jack_changed(); alsa_changed(); } // Update the canvas palette. void qjackctlGraphForm::updatePalette (void) { m_ui.graphCanvas->updatePalette(); if (m_thumb) m_thumb->updatePalette(); viewRefresh(); } // Main menu slots. void qjackctlGraphForm::viewMenubar ( bool on ) { m_ui.MenuBar->setVisible(on); ++m_thumb_update; } void qjackctlGraphForm::viewToolbar ( bool on ) { m_ui.ToolBar->setVisible(on); ++m_thumb_update; } void qjackctlGraphForm::viewStatusbar ( bool on ) { m_ui.StatusBar->setVisible(on); ++m_thumb_update; } void qjackctlGraphForm::viewThumbviewAction (void) { QAction *action = qobject_cast (sender()); if (action) viewThumbview(action->data().toInt()); } void qjackctlGraphForm::viewThumbview ( int thumbview ) { const qjackctlGraphThumb::Position position = qjackctlGraphThumb::Position(thumbview); if (position == qjackctlGraphThumb::None) { if (m_thumb) { m_thumb->hide(); delete m_thumb; m_thumb = nullptr; m_thumb_update = 0; } } else { if (m_thumb) { m_thumb->setPosition(position); } else { m_thumb = new qjackctlGraphThumb(m_ui.graphCanvas, position); QObject::connect(m_thumb, SIGNAL(contextMenuRequested(const QPoint&)), SLOT(thumbviewContextMenu(const QPoint&)), Qt::QueuedConnection); QObject::connect(m_thumb, SIGNAL(positionRequested(int)), SLOT(viewThumbview(int)), Qt::QueuedConnection); ++m_thumb_update; } } switch (position) { case qjackctlGraphThumb::TopLeft: m_ui.viewThumbviewTopLeftAction->setChecked(true); break; case qjackctlGraphThumb::TopRight: m_ui.viewThumbviewTopRightAction->setChecked(true); break; case qjackctlGraphThumb::BottomLeft: m_ui.viewThumbviewBottomLeftAction->setChecked(true); break; case qjackctlGraphThumb::BottomRight: m_ui.viewThumbviewBottomRightAction->setChecked(true); break; case qjackctlGraphThumb::None: default: m_ui.viewThumbviewNoneAction->setChecked(true); break; } } void qjackctlGraphForm::viewTextBesideIcons ( bool on ) { if (on) { m_ui.ToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); } else { m_ui.ToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly); } ++m_thumb_update; } void qjackctlGraphForm::viewCenter (void) { const QRectF& scene_rect = m_ui.graphCanvas->scene()->itemsBoundingRect(); m_ui.graphCanvas->centerOn(scene_rect.center()); stabilize(); } void qjackctlGraphForm::viewRefresh (void) { if (m_jack) m_jack->clearItems(); #ifdef CONFIG_ALSA_SEQ if (m_alsa) m_alsa->clearItems(); #endif jack_changed(); alsa_changed(); if (m_ui.graphCanvas->isRepelOverlappingNodes()) ++m_repel_overlapping_nodes; // fake nodes added! ++m_thumb_update; refresh(); } void qjackctlGraphForm::viewZoomRange ( bool on ) { m_ui.graphCanvas->setZoomRange(on); } void qjackctlGraphForm::viewColorsAction (void) { QAction *action = qobject_cast (sender()); if (action == nullptr) return; const uint port_type = action->data().toUInt(); if (0 >= port_type) return; const QColor& color = QColorDialog::getColor( m_ui.graphCanvas->portTypeColor(port_type), this, tr("Colors - %1").arg(action->text().remove('&'))); if (color.isValid()) { m_ui.graphCanvas->setPortTypeColor(port_type, color); m_ui.graphCanvas->updatePortTypeColors(port_type); updateViewColorsAction(action); } ++m_thumb_update; } void qjackctlGraphForm::viewColorsReset (void) { m_ui.graphCanvas->clearPortTypeColors(); if (m_jack) qjackctlJackGraph::resetPortTypeColors(m_ui.graphCanvas); #ifdef CONFIG_ALSA_SEQ if (m_alsa) qjackctlAlsaGraph::resetPortTypeColors(m_ui.graphCanvas); #endif m_ui.graphCanvas->updatePortTypeColors(); updateViewColors(); } void qjackctlGraphForm::viewSortTypeAction (void) { QAction *action = qobject_cast (sender()); if (action == nullptr) return; const qjackctlGraphPort::SortType sort_type = qjackctlGraphPort::SortType(action->data().toInt()); qjackctlGraphPort::setSortType(sort_type); m_ui.graphCanvas->updateNodes(); } void qjackctlGraphForm::viewSortOrderAction (void) { QAction *action = qobject_cast (sender()); if (action == nullptr) return; const qjackctlGraphPort::SortOrder sort_order = qjackctlGraphPort::SortOrder(action->data().toInt()); qjackctlGraphPort::setSortOrder(sort_order); m_ui.graphCanvas->updateNodes(); } void qjackctlGraphForm::viewRepelOverlappingNodes ( bool on ) { m_ui.graphCanvas->setRepelOverlappingNodes(on); if (on) ++m_repel_overlapping_nodes; } void qjackctlGraphForm::viewConnectThroughNodes ( bool on ) { qjackctlGraphConnect::setConnectThroughNodes(on); m_ui.graphCanvas->updateConnects(); } void qjackctlGraphForm::helpAbout (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->showAboutForm(); } void qjackctlGraphForm::helpAboutQt (void) { QMessageBox::aboutQt(this); } void qjackctlGraphForm::thumbviewContextMenu ( const QPoint& pos ) { stabilize(); QMenu menu(this); menu.addMenu(m_ui.viewThumbviewMenu); menu.addSeparator(); menu.addAction(m_ui.viewCenterAction); menu.addMenu(m_ui.viewZoomMenu); menu.exec(pos); stabilize(); } void qjackctlGraphForm::zoomValueChanged ( int zoom_value ) { m_ui.graphCanvas->setZoom(0.01 * qreal(zoom_value)); } // Node life-cycle slots. void qjackctlGraphForm::added ( qjackctlGraphNode *node ) { const qjackctlGraphCanvas *canvas = m_ui.graphCanvas; const QRectF& rect = canvas->mapToScene(canvas->viewport()->rect()).boundingRect(); const QPointF& pos = rect.center(); const qreal w = 0.33 * qMax(rect.width(), 800.0); const qreal h = 0.33 * qMax(rect.height(), 600.0); qreal x = pos.x(); qreal y = pos.y(); switch (node->nodeMode()) { case qjackctlGraphItem::Input: ++m_ins &= 0x0f; x += w; y += 0.33 * h * (m_ins & 1 ? +m_ins : -m_ins); break; case qjackctlGraphItem::Output: ++m_outs &= 0x0f; x -= w; y += 0.33 * h * (m_outs & 1 ? +m_outs : -m_outs); break; default: { int dx = 0; int dy = 0; for (int i = 0; i < m_mids; ++i) { if ((qAbs(dx) > qAbs(dy)) || (dx == dy && dx < 0)) dy += (dx < 0 ? +1 : -1); else dx += (dy < 0 ? -1 : +1); } x += 0.33 * w * qreal(dx); y += 0.33 * h * qreal(dy); ++m_mids &= 0x1f; break; }} x -= qreal(::rand() & 0x1f); y -= qreal(::rand() & 0x1f); node->setPos(canvas->snapPos(QPointF(x, y))); updated(node); } void qjackctlGraphForm::updated ( qjackctlGraphNode */*node*/ ) { if (m_ui.graphCanvas->isRepelOverlappingNodes()) ++m_repel_overlapping_nodes; } void qjackctlGraphForm::removed ( qjackctlGraphNode */*node*/ ) { #if 0// FIXME: DANGEROUS! Node might have been deleted by now... if (node) { switch (node->nodeMode()) { case qjackctlGraphItem::Input: --m_ins; break; case qjackctlGraphItem::Output: --m_outs; break; default: --m_mids; break; } } #endif } // Port (dis)connection slots. void qjackctlGraphForm::connected ( qjackctlGraphPort *port1, qjackctlGraphPort *port2 ) { if (qjackctlJackGraph::isPortType(port1->portType())) { if (m_jack) m_jack->connectPorts(port1, port2, true); jack_changed(); } #ifdef CONFIG_ALSA_SEQ else if (qjackctlAlsaGraph::isPortType(port1->portType())) { if (m_alsa) m_alsa->connectPorts(port1, port2, true); alsa_changed(); } #endif stabilize(); } void qjackctlGraphForm::disconnected ( qjackctlGraphPort *port1, qjackctlGraphPort *port2 ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->queryDisconnect(port1, port2); if (qjackctlJackGraph::isPortType(port1->portType())) { if (m_jack) m_jack->connectPorts(port1, port2, false); jack_changed(); } #ifdef CONFIG_ALSA_SEQ else if (qjackctlAlsaGraph::isPortType(port1->portType())) { if (m_alsa) m_alsa->connectPorts(port1, port2, false); alsa_changed(); } #endif stabilize(); } void qjackctlGraphForm::connected ( qjackctlGraphConnect *connect ) { qjackctlGraphPort *port1 = connect->port1(); if (port1 == nullptr) return; if (qjackctlJackGraph::isPortType(port1->portType())) { if (m_jack) m_jack->addItem(connect, false); } #ifdef CONFIG_ALSA_SEQ else if (qjackctlAlsaGraph::isPortType(port1->portType())) { if (m_alsa) m_alsa->addItem(connect, false); } #endif } // Item renaming slot. void qjackctlGraphForm::renamed ( qjackctlGraphItem *item, const QString& name ) { qjackctlGraphSect *sect = item_sect(item); if (sect) sect->renameItem(item, name); } // Graph view change slot. void qjackctlGraphForm::changed (void) { ++m_thumb_update; stabilize(); } // Graph section slots. void qjackctlGraphForm::jack_shutdown (void) { m_ui.graphCanvas->clearSelection(); m_jack_changed = 0; if (m_jack) m_jack->clearItems(); stabilize(); } void qjackctlGraphForm::jack_changed (void) { ++m_jack_changed; } void qjackctlGraphForm::alsa_changed (void) { ++m_alsa_changed; } // Graph refreshner. void qjackctlGraphForm::refresh (void) { if (m_ui.graphCanvas->isBusy()) return; int nchanged = 0; if (m_jack_changed > 0) { m_jack_changed = 0; if (m_jack) m_jack->updateItems(); ++nchanged; } #ifdef CONFIG_ALSA_SEQ else if (m_alsa_changed > 0) { m_alsa_changed = 0; if (m_alsa) m_alsa->updateItems(); ++nchanged; } #endif if (nchanged > 0) stabilize(); else if (m_repel_overlapping_nodes > 0) { m_repel_overlapping_nodes = 0; m_ui.graphCanvas->repelOverlappingNodesAll(); stabilize(); ++nchanged; } if (m_thumb_update > 0 || nchanged > 0) { m_thumb_update = 0; if (m_thumb) m_thumb->updateView(); } } // Graph selection change slot. void qjackctlGraphForm::stabilize (void) { const qjackctlGraphCanvas *canvas = m_ui.graphCanvas; m_ui.graphConnectAction->setEnabled(canvas->canConnect()); m_ui.graphDisconnectAction->setEnabled(canvas->canDisconnect()); m_ui.editSelectNoneAction->setEnabled( !canvas->scene()->selectedItems().isEmpty()); m_ui.editRenameItemAction->setEnabled( canvas->canRenameItem()); m_ui.editSearchItemAction->setEnabled( canvas->canSearchItem()); #if 0 const QRectF& outter_rect = canvas->scene()->sceneRect().adjusted(-2.0, -2.0, +2.0, +2.0); const QRectF& inner_rect = canvas->mapToScene(canvas->viewport()->rect()).boundingRect(); const bool is_contained = outter_rect.contains(inner_rect) || canvas->horizontalScrollBar()->isVisible() || canvas->verticalScrollBar()->isVisible(); #else const bool is_contained = true; #endif const qreal zoom = canvas->zoom(); m_ui.viewCenterAction->setEnabled(is_contained); m_ui.viewZoomInAction->setEnabled(zoom < 1.9); m_ui.viewZoomOutAction->setEnabled(zoom > 0.1); m_ui.viewZoomFitAction->setEnabled(is_contained); m_ui.viewZoomResetAction->setEnabled(zoom != 1.0); const int zoom_value = int(100.0f * zoom); const bool is_spinbox_blocked = m_zoom_spinbox->blockSignals(true); const bool is_slider_blocked = m_zoom_slider->blockSignals(true); m_zoom_spinbox->setValue(zoom_value); m_zoom_slider->setValue(zoom_value); m_zoom_spinbox->blockSignals(is_spinbox_blocked); m_zoom_slider->blockSignals(is_slider_blocked); } // Tool-bar orientation change slot. void qjackctlGraphForm::orientationChanged ( Qt::Orientation orientation ) { if (m_config && m_config->isTextBesideIcons() && orientation == Qt::Horizontal) { m_ui.ToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); } else { m_ui.ToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly); } } // Context-menu event handler. void qjackctlGraphForm::contextMenuEvent ( QContextMenuEvent *pContextMenuEvent ) { m_ui.graphCanvas->clear(); stabilize(); QMenu menu(this); menu.addAction(m_ui.graphConnectAction); menu.addAction(m_ui.graphDisconnectAction); menu.addSeparator(); menu.addActions(m_ui.editMenu->actions()); menu.addSeparator(); menu.addMenu(m_ui.viewZoomMenu); menu.exec(pContextMenuEvent->globalPos()); stabilize(); } // Widget resize event handler. void qjackctlGraphForm::resizeEvent ( QResizeEvent *pResizeEvent ) { QMainWindow::resizeEvent(pResizeEvent); if (m_thumb) { m_thumb_update = 0; m_thumb->updateView(); } stabilize(); } // Notify our parent that we're emerging. void qjackctlGraphForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeFormEx(); ++m_thumb_update; QWidget::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlGraphForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeFormEx(); } // Widget close event handler. void qjackctlGraphForm::closeEvent ( QCloseEvent *pCloseEvent ) { m_ui.graphCanvas->saveState(); if (m_config && QMainWindow::isVisible()) { m_config->setThumbview(m_thumb ? m_thumb->position() : qjackctlGraphThumb::None); m_config->setConnectThroughNodes(m_ui.viewConnectThroughNodesAction->isChecked()); m_config->setRepelOverlappingNodes(m_ui.viewRepelOverlappingNodesAction->isChecked()); m_config->setSortOrder(int(qjackctlGraphPort::sortOrder())); m_config->setSortType(int(qjackctlGraphPort::sortType())); m_config->setTextBesideIcons(m_ui.viewTextBesideIconsAction->isChecked()); m_config->setZoomRange(m_ui.viewZoomRangeAction->isChecked()); m_config->setStatusbar(m_ui.StatusBar->isVisible()); m_config->setToolbar(m_ui.ToolBar->isVisible()); m_config->setMenubar(m_ui.MenuBar->isVisible()); m_config->saveState(this); } QMainWindow::closeEvent(pCloseEvent); } // Special port-type color methods. void qjackctlGraphForm::updateViewColorsAction ( QAction *action ) { const uint port_type = action->data().toUInt(); if (0 >= port_type) return; const QColor& color = m_ui.graphCanvas->portTypeColor(port_type); if (!color.isValid()) return; QPixmap pm(22, 22); QPainter(&pm).fillRect(0, 0, pm.width(), pm.height(), color); action->setIcon(QIcon(pm)); } void qjackctlGraphForm::updateViewColors (void) { updateViewColorsAction(m_ui.viewColorsJackAudioAction); updateViewColorsAction(m_ui.viewColorsJackMidiAction); #ifdef CONFIG_ALSA_SEQ updateViewColorsAction(m_ui.viewColorsAlsaMidiAction); #endif #ifdef CONFIG_JACK_CV updateViewColorsAction(m_ui.viewColorsJackCvAction); #endif #ifdef CONFIG_JACK_OSC updateViewColorsAction(m_ui.viewColorsJackOscAction); #endif } // Item sect predicate. qjackctlGraphSect *qjackctlGraphForm::item_sect ( qjackctlGraphItem *item ) const { if (item->type() == qjackctlGraphNode::Type) { qjackctlGraphNode *node = static_cast (item); if (node && qjackctlJackGraph::isNodeType(node->nodeType())) return m_jack; #ifdef CONFIG_ALSA_SEQ else if (node && qjackctlAlsaGraph::isNodeType(node->nodeType())) return m_alsa; #endif } else if (item->type() == qjackctlGraphPort::Type) { qjackctlGraphPort *port = static_cast (item); if (port && qjackctlJackGraph::isPortType(port->portType())) return m_jack; #ifdef CONFIG_ALSA_SEQ else if (port && qjackctlAlsaGraph::isPortType(port->portType())) return m_alsa; #endif } return nullptr; // No deal! } //---------------------------------------------------------------------------- // qjackctlGraphConfig -- Canvas state memento. // Local constants. static const char *GraphLayoutGroup = "/GraphLayout"; static const char *GraphViewGroup = "/GraphView"; static const char *ViewMenubarKey = "/Menubar"; static const char *ViewToolbarKey = "/Toolbar"; static const char *ViewStatusbarKey = "/Statusbar"; static const char *ViewThumbviewKey = "/Thumbview"; static const char *ViewTextBesideIconsKey = "/TextBesideIcons"; static const char *ViewZoomRangeKey = "/ZoomRange"; static const char *ViewSortTypeKey = "/SortType"; static const char *ViewSortOrderKey = "/SortOrder"; static const char *ViewRepelOverlappingNodesKey = "/RepelOverlappingNodes"; static const char *ViewConnectThroughNodesKey = "/ConnectThroughNodes"; // Constructors. qjackctlGraphConfig::qjackctlGraphConfig ( QSettings *settings ) : m_settings(settings), m_menubar(false), m_toolbar(false), m_statusbar(false), m_thumbview(0), m_texticons(false), m_zoomrange(false), m_sorttype(0), m_sortorder(0), m_repelnodes(false), m_cthrunodes(false) { } QSettings *qjackctlGraphConfig::settings (void) const { return m_settings; } void qjackctlGraphConfig::setMenubar ( bool menubar ) { m_menubar = menubar; } bool qjackctlGraphConfig::isMenubar (void) const { return m_menubar; } void qjackctlGraphConfig::setToolbar ( bool toolbar ) { m_toolbar = toolbar; } bool qjackctlGraphConfig::isToolbar (void) const { return m_toolbar; } void qjackctlGraphConfig::setStatusbar ( bool statusbar ) { m_statusbar = statusbar; } bool qjackctlGraphConfig::isStatusbar (void) const { return m_statusbar; } void qjackctlGraphConfig::setThumbview ( int thumbview ) { m_thumbview = thumbview; } int qjackctlGraphConfig::thumbview (void) const { return m_thumbview; } void qjackctlGraphConfig::setTextBesideIcons ( bool texticons ) { m_texticons = texticons; } bool qjackctlGraphConfig::isTextBesideIcons (void) const { return m_texticons; } void qjackctlGraphConfig::setZoomRange ( bool zoomrange ) { m_zoomrange = zoomrange; } bool qjackctlGraphConfig::isZoomRange (void) const { return m_zoomrange; } void qjackctlGraphConfig::setSortType ( int sorttype ) { m_sorttype = sorttype; } int qjackctlGraphConfig::sortType (void) const { return m_sorttype; } void qjackctlGraphConfig::setSortOrder ( int sortorder ) { m_sortorder = sortorder; } int qjackctlGraphConfig::sortOrder (void) const { return m_sortorder; } void qjackctlGraphConfig::setRepelOverlappingNodes ( bool repelnodes ) { m_repelnodes = repelnodes; } bool qjackctlGraphConfig::isRepelOverlappingNodes (void) const { return m_repelnodes; } void qjackctlGraphConfig::setConnectThroughNodes ( bool cthrunodes ) { m_cthrunodes = cthrunodes; } bool qjackctlGraphConfig::isConnectThroughNodes (void) const { return m_cthrunodes; } // Graph main-widget state methods. bool qjackctlGraphConfig::restoreState ( QMainWindow *widget ) { if (m_settings == nullptr || widget == nullptr) return false; m_settings->beginGroup(GraphViewGroup); m_menubar = m_settings->value(ViewMenubarKey, true).toBool(); m_toolbar = m_settings->value(ViewToolbarKey, true).toBool(); m_statusbar = m_settings->value(ViewStatusbarKey, true).toBool(); m_thumbview = m_settings->value(ViewThumbviewKey, 0).toInt(); m_texticons = m_settings->value(ViewTextBesideIconsKey, true).toBool(); m_zoomrange = m_settings->value(ViewZoomRangeKey, false).toBool(); m_sorttype = m_settings->value(ViewSortTypeKey, 0).toInt(); m_sortorder = m_settings->value(ViewSortOrderKey, 0).toInt(); m_repelnodes = m_settings->value(ViewRepelOverlappingNodesKey, false).toBool(); m_cthrunodes = m_settings->value(ViewConnectThroughNodesKey, false).toBool(); m_settings->endGroup(); m_settings->beginGroup(GraphLayoutGroup); const QByteArray& layout_state = m_settings->value('/' + widget->objectName()).toByteArray(); m_settings->endGroup(); if (!layout_state.isEmpty()) widget->restoreState(layout_state); return true; } bool qjackctlGraphConfig::saveState ( QMainWindow *widget ) const { if (m_settings == nullptr || widget == nullptr) return false; m_settings->beginGroup(GraphViewGroup); m_settings->setValue(ViewMenubarKey, m_menubar); m_settings->setValue(ViewToolbarKey, m_toolbar); m_settings->setValue(ViewStatusbarKey, m_statusbar); m_settings->setValue(ViewThumbviewKey, m_thumbview); m_settings->setValue(ViewTextBesideIconsKey, m_texticons); m_settings->setValue(ViewZoomRangeKey, m_zoomrange); m_settings->setValue(ViewSortTypeKey, m_sorttype); m_settings->setValue(ViewSortOrderKey, m_sortorder); m_settings->setValue(ViewRepelOverlappingNodesKey, m_repelnodes); m_settings->setValue(ViewConnectThroughNodesKey, m_cthrunodes); m_settings->endGroup(); m_settings->beginGroup(GraphLayoutGroup); const QByteArray& layout_state = widget->saveState(); m_settings->setValue('/' + widget->objectName(), layout_state); m_settings->endGroup(); return true; } // end of qjackctlGraphForm.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlSystemTray.cpp0000644000000000000000000000013215174607203017531 xustar0030 mtime=1777536643.517914276 30 atime=1777536643.517914276 30 ctime=1777536643.517914276 qjackctl-1.0.6/src/qjackctlSystemTray.cpp0000644000175000001440000000731515174607203017527 0ustar00rncbcusers// qjackctlSystemTray.cpp // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSystemTray.h" #include #include #if QT_VERSION < QT_VERSION_CHECK(4, 5, 0) namespace Qt { const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000); } #endif //---------------------------------------------------------------------------- // qjackctlSystemTray -- Custom system tray widget. // Constructor. qjackctlSystemTray::qjackctlSystemTray ( QWidget *pParent ) : QSystemTrayIcon(pParent) { // Set things inherited... if (pParent) { #if QT_VERSION < QT_VERSION_CHECK(6, 1, 0) m_icon = QIcon(":/images/qjackctl.png"); #else m_icon = pParent->windowIcon().pixmap(32, 32); #endif setBackground(Qt::transparent); // also updates pixmap. QSystemTrayIcon::setIcon(m_icon); QSystemTrayIcon::setToolTip(pParent->windowTitle()); } QObject::connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SLOT(activated(QSystemTrayIcon::ActivationReason))); QSystemTrayIcon::show(); } // Redirect to hide. void qjackctlSystemTray::close (void) { QSystemTrayIcon::hide(); } // Handle systeam tray activity. void qjackctlSystemTray::activated ( QSystemTrayIcon::ActivationReason reason ) { switch (reason) { case QSystemTrayIcon::Trigger: emit clicked(); break; case QSystemTrayIcon::MiddleClick: emit middleClicked(); break; case QSystemTrayIcon::DoubleClick: emit doubleClicked(); break; case QSystemTrayIcon::Unknown: default: break; } } // Default destructor. qjackctlSystemTray::~qjackctlSystemTray (void) { } // System tray icon/pixmaps update method. void qjackctlSystemTray::updatePixmap (void) { // Renitialize icon as fit... m_pixmap = m_icon.pixmap(32, 32); // Merge with the overlay pixmap... if (!m_pixmapOverlay.mask().isNull()) { const int y = m_pixmap.height() - m_pixmapOverlay.height(); QBitmap mask = m_pixmap.mask(); QPainter(&mask).drawPixmap(0, y, m_pixmapOverlay.mask()); m_pixmap.setMask(mask); QPainter(&m_pixmap).drawPixmap(0, y, m_pixmapOverlay); } if (m_background != Qt::transparent) { QPixmap pixmap(m_pixmap); m_pixmap.fill(m_background); QPainter(&m_pixmap).drawPixmap(0, 0, pixmap); } // Setup system tray icon directly... QSystemTrayIcon::setIcon(QIcon(m_pixmap)); } // Background mask methods. void qjackctlSystemTray::setBackground ( const QColor& background ) { // Set background color, now. m_background = background; updatePixmap(); } const QColor& qjackctlSystemTray::background (void) const { return m_background; } // Set system tray icon overlay. void qjackctlSystemTray::setPixmapOverlay ( const QPixmap& pmOverlay ) { m_pixmapOverlay = pmOverlay; updatePixmap(); } const QPixmap& qjackctlSystemTray::pixmapOverlay (void) const { return m_pixmapOverlay; } // end of qjackctlSystemTray.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlAlsaGraph.h0000644000000000000000000000013215174607203016714 xustar0030 mtime=1777536643.509914334 30 atime=1777536643.509914334 30 ctime=1777536643.509914334 qjackctl-1.0.6/src/qjackctlAlsaGraph.h0000644000175000001440000000466415174607203016716 0ustar00rncbcusers// qjackctlAlsaGraph.h // /**************************************************************************** Copyright (C) 2003-2026, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlAlsaGraph_h #define __qjackctlAlsaGraph_h #include "qjackctlAbout.h" #include "qjackctlGraph.h" #ifdef CONFIG_ALSA_SEQ #include #include //---------------------------------------------------------------------------- // qjackctlAlsaGraph -- ALSA graph driver class qjackctlAlsaGraph : public qjackctlGraphSect { public: // Constructor. qjackctlAlsaGraph(qjackctlGraphCanvas *canvas); // ALSA port (dis)connection. void connectPorts( qjackctlGraphPort *port1, qjackctlGraphPort *port2, bool is_connect); // ALSA graph updaters. void updateItems(); void clearItems(); // ALSA node type inquirer. static bool isNodeType(uint node_type); // ALSA node type. static uint nodeType(); // ALSA port type inquirer. static bool isPortType(uint port_type); // ALSA port type. static uint midiPortType(); // Special port-type colors defaults (static). static void resetPortTypeColors(qjackctlGraphCanvas *canvas); protected: // ALSA client:port finder and creator if not existing. bool findClientPort(snd_seq_client_info_t *client_info, snd_seq_port_info_t *port_info, qjackctlGraphItem::Mode port_mode, qjackctlGraphNode **node, qjackctlGraphPort **port, bool add_new); // Client/port item aliases accessor. QList item_aliases(qjackctlGraphItem *item) const; private: // Notifier sanity mutex. QMutex m_mutex; }; #endif // CONFIG_ALSA_SEQ #endif // __qjackctlAlsaGraph_h // end of qjackctlAlsaGraph.h qjackctl-1.0.6/src/PaxHeaders/qjackctlMainForm.cpp0000644000000000000000000000013115174607203017114 xustar0030 mtime=1777536643.512914312 29 atime=1777536643.51191432 30 ctime=1777536643.512914312 qjackctl-1.0.6/src/qjackctlMainForm.cpp0000644000175000001440000041730515174607203017117 0ustar00rncbcusers// qjackctlMainForm.cpp // /**************************************************************************** Copyright (C) 2003-2025, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlMainForm.h" #include "qjackctlStatus.h" #include "qjackctlPatchbay.h" #include "qjackctlPatchbayFile.h" #include "qjackctlMessagesStatusForm.h" #include "qjackctlSessionForm.h" #include "qjackctlConnectionsForm.h" #include "qjackctlPatchbayForm.h" #include "qjackctlGraphForm.h" #include "qjackctlSetupForm.h" #include "qjackctlAboutForm.h" #include "qjackctlJackGraph.h" #ifdef CONFIG_ALSA_SEQ #include "qjackctlAlsaGraph.h" #endif #ifdef CONFIG_SYSTEM_TRAY #include "qjackctlSystemTray.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION < QT_VERSION_CHECK(4, 5, 0) namespace Qt { const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000); } #endif // Deprecated QTextStreamFunctions/Qt namespaces workaround. #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) #define endl Qt::endl #endif #ifdef CONFIG_DBUS #include #include #include #endif #ifdef CONFIG_JACK_STATISTICS #include #endif #ifdef CONFIG_JACK_METADATA #include #endif // Timer constant stuff. #define QJACKCTL_TIMER_MSECS 200 // Status refresh cycle (~2 secs) #define QJACKCTL_STATUS_CYCLE 10 // Server display enumerated states. #define QJACKCTL_INACTIVE 0 #define QJACKCTL_ACTIVATING 1 #define QJACKCTL_ACTIVE 2 #define QJACKCTL_STARTING 3 #define QJACKCTL_STARTED 4 #define QJACKCTL_STOPPING 5 #define QJACKCTL_STOPPED 6 #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) #include #undef HAVE_POLL_H #undef HAVE_SIGNAL_H #else #include #include // Notification pipes descriptors #define QJACKCTL_FDNIL -1 #define QJACKCTL_FDREAD 0 #define QJACKCTL_FDWRITE 1 static int g_fdStdout[2] = { QJACKCTL_FDNIL, QJACKCTL_FDNIL }; #endif #ifdef HAVE_POLL_H #include #endif // Custom event types. #define QJACKCTL_PORT_EVENT QEvent::Type(QEvent::User + 1) #define QJACKCTL_XRUN_EVENT QEvent::Type(QEvent::User + 2) #define QJACKCTL_BUFF_EVENT QEvent::Type(QEvent::User + 3) #define QJACKCTL_FREE_EVENT QEvent::Type(QEvent::User + 4) #define QJACKCTL_SHUT_EVENT QEvent::Type(QEvent::User + 5) #define QJACKCTL_EXIT_EVENT QEvent::Type(QEvent::User + 6) #ifdef CONFIG_DBUS #define QJACKCTL_LINE_EVENT QEvent::Type(QEvent::User + 7) #endif #ifdef CONFIG_JACK_METADATA #define QJACKCTL_PROP_EVENT QEvent::Type(QEvent::User + 8) #endif // Time dashes format helper.^ static const char *c_szTimeDashes = "--:--:--.---"; //------------------------------------------------------------------------- // UNIX Signal handling support stuff. #ifdef HAVE_SIGNAL_H #include #include #include // File descriptor for SIGTERM notifier. static int g_fdSigterm[2] = { QJACKCTL_FDNIL, QJACKCTL_FDNIL }; // Unix SIGTERM signal handler. static void qjackctl_sigterm_handler ( int /* signo */ ) { char c = 1; (void) (::write(g_fdSigterm[0], &c, sizeof(c)) > 0); } #endif // HAVE_SIGNAL_H //---------------------------------------------------------------------------- // qjackctl -- Static callback posters. // To have clue about current buffer size (in frames). static jack_nframes_t g_buffsize = 0; // Current freewheel running state. static int g_freewheel = 0; // Current server error state. static QProcess::ProcessError g_error = QProcess::UnknownError; // Jack client registration callback funtion, called // whenever a jack client is registered or unregistered. static void qjackctl_client_registration_callback ( const char *, int, void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_PORT_EVENT)); } // Jack port registration callback funtion, called // whenever a jack port is registered or unregistered. static void qjackctl_port_registration_callback ( jack_port_id_t, int, void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_PORT_EVENT)); } // Jack port (dis)connection callback funtion, called // whenever a jack port is connected or disconnected. static void qjackctl_port_connect_callback ( jack_port_id_t, jack_port_id_t, int, void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_PORT_EVENT)); } // Jack graph order callback function, called // whenever the processing graph is reordered. static int qjackctl_graph_order_callback ( void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_PORT_EVENT)); return 0; } #ifdef CONFIG_JACK_PORT_RENAME // Jack port rename callback funtion, called // whenever a jack port is renamed. static void qjackctl_port_rename_callback ( jack_port_id_t, const char *, const char *, void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_PORT_EVENT)); } #endif // Jack XRUN callback function, called // whenever there is a xrun. static int qjackctl_xrun_callback ( void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_XRUN_EVENT)); return 0; } // Jack buffer size function, called // whenever the server changes buffer size. static int qjackctl_buffer_size_callback ( jack_nframes_t nframes, void * ) { // Update our global static variable. g_buffsize = nframes; QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_BUFF_EVENT)); return 0; } // Jack freewheel callback function, called // whenever the server enters/exits freewheel mode. static void qjackctl_freewheel_callback ( int starting, void * ) { // Update our global static variable. g_freewheel = starting; QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_FREE_EVENT)); } // Jack shutdown function, called // whenever the server terminates this client. static void qjackctl_on_shutdown ( void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_SHUT_EVENT)); } // Jack process exit function, called // whenever the server terminates abnormally. static void qjackctl_on_error ( QProcess::ProcessError error ) { g_error = error; QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_EXIT_EVENT)); } #ifdef CONFIG_DBUS //---------------------------------------------------------------------- // class qjackctlDBusLogWatcher -- Simple D-BUS log watcher thread. // class qjackctlDBusLogWatcher : public QThread { public: // Constructor. qjackctlDBusLogWatcher(const QString& sFilename) : QThread(), m_sFilename(sFilename), m_bRunState(false) {} // Destructor. ~qjackctlDBusLogWatcher() { if (isRunning()) do { m_bRunState = false; } while (!wait(1000)); } // Custom log event. class LineEvent : public QEvent { public: // Constructor. LineEvent(QEvent::Type eType, const QString& sLine) : QEvent(eType), m_sLine(sLine) { m_sLine.remove(QRegularExpression("\\x1B\\[[0-9|;]+m")); } // Accessor. const QString& line() const { return m_sLine; } private: // Custom event data. QString m_sLine; }; protected: // The main thread executive. void run() { QFile file(m_sFilename); m_bRunState = true; while (m_bRunState) { if (file.isOpen()) { char achBuffer[1024]; while (file.readLine(achBuffer, sizeof(achBuffer)) > 0) { QApplication::postEvent( qjackctlMainForm::getInstance(), new LineEvent(QJACKCTL_LINE_EVENT, achBuffer)); } if (file.size() == file.pos() && file.error() == QFile::NoError) { msleep(1000); } else { file.close(); } } else if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { file.seek(file.size()); } else msleep(1000); } } private: // The log filename to watch. QString m_sFilename; // Whether the thread is logically running. volatile bool m_bRunState; }; #endif // CONFIG_DBUS #ifdef CONFIG_JACK_METADATA // Jack property change function, called // whenever metadata is changed static void qjackctl_property_change_callback ( jack_uuid_t, const char *key, jack_property_change_t, void * ) { // PRETTY_NAME is the only metadata we are currently interested in... if (qjackctlJackClientList::isJackClientPortMetadata() && key && (strcmp(key, JACK_METADATA_PRETTY_NAME) == 0)) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_PROP_EVENT)); } } #endif //---------------------------------------------------------------------------- // qjackctlMainForm -- UI wrapper form. // Kind of singleton reference. qjackctlMainForm *qjackctlMainForm::g_pMainForm = nullptr; // Constructor. qjackctlMainForm::qjackctlMainForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags), m_menu(this) { // Setup UI struct... m_ui.setupUi(this); #if QT_VERSION < QT_VERSION_CHECK(6, 1, 0) QWidget::setWindowIcon(QIcon(":/images/qjackctl.png")); #endif // Pseudo-singleton reference setup. g_pMainForm = this; m_pSetup = nullptr; m_iServerState = QJACKCTL_INACTIVE; m_pJack = nullptr; m_pJackClient = nullptr; m_bJackDetach = false; m_bJackShutdown = false; m_bJackRestart = false; m_pAlsaSeq = nullptr; #ifdef CONFIG_DBUS m_pDBusControl = nullptr; m_pDBusConfig = nullptr; m_pDBusLogWatcher = nullptr; m_bDBusStarted = false; m_bDBusDetach = false; #endif #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) m_bJackKilled = false; #endif m_iStartDelay = 0; m_iTimerDelay = 0; m_iTimerRefresh = 0; m_iJackRefresh = 0; m_iAlsaRefresh = 0; m_iJackDirty = 0; m_iAlsaDirty = 0; m_iStatusRefresh = 0; m_iStatusBlink = 0; m_iPatchbayRefresh = 0; m_iJackRefreshClear = 0; m_iAlsaRefreshClear = 0; m_pStdoutNotifier = nullptr; m_pAlsaNotifier = nullptr; // All forms are to be created later on setup. m_pMessagesStatusForm = nullptr; m_pSessionForm = nullptr; m_pConnectionsForm = nullptr; m_pPatchbayForm = nullptr; m_pGraphForm = nullptr; m_pSetupForm = nullptr; // Patchbay rack can be readily created. m_pPatchbayRack = new qjackctlPatchbayRack(); #ifdef CONFIG_SYSTEM_TRAY // The eventual system tray widget. m_pSystemTray = nullptr; m_bQuitClose = false; #endif // We're not quitting so early :) m_bQuitForce = false; // Transport skip accelerate factor. m_fSkipAccel = 1.0; // Avoid extra transport toggles (play/stop) m_iTransportPlay = 0; // Whether to update context menu on next status refresh. m_iMenuRefresh = 0; // Whether we've Qt::Tool flag (from bKeepOnTop), // this is actually the main last application window... QWidget::setAttribute(Qt::WA_QuitOnClose); #ifdef HAVE_SIGNAL_H // Set to ignore any fatal "Broken pipe" signals. ::signal(SIGPIPE, SIG_IGN); // Initialize file descriptors for SIGTERM socket notifier. ::socketpair(AF_UNIX, SOCK_STREAM, 0, g_fdSigterm); m_pSigtermNotifier = new QSocketNotifier(g_fdSigterm[1], QSocketNotifier::Read, this); QObject::connect(m_pSigtermNotifier, SIGNAL(activated(int)), SLOT(sigtermNotifySlot(int))); // Install SIGTERM signal handler. struct sigaction sigterm; sigterm.sa_handler = qjackctl_sigterm_handler; sigemptyset(&sigterm.sa_mask); sigterm.sa_flags = 0; sigterm.sa_flags |= SA_RESTART; ::sigaction(SIGTERM, &sigterm, nullptr); ::sigaction(SIGQUIT, &sigterm, nullptr); // Ignore SIGHUP/SIGINT signals. ::signal(SIGHUP, SIG_IGN); ::signal(SIGINT, SIG_IGN); // Also ignore SIGUSR1 (LADISH Level 1). ::signal(SIGUSR1, SIG_IGN); #else // HAVE_SIGNAL_H m_pSigtermNotifier = nullptr; #endif // !HAVE_SIGNAL_H #if 0 // FIXME: Iterate for every child text label... m_ui.StatusDisplayFrame->setAutoFillBackground(true); QList labels = m_ui.StatusDisplayFrame->findChildren (); QListIterator iter(labels); while (iter.hasNext()) iter.next()->setAutoFillBackground(false); #endif // UI connections... QObject::connect(m_ui.StartToolButton, SIGNAL(clicked()), SLOT(startJack())); QObject::connect(m_ui.StopToolButton, SIGNAL(clicked()), SLOT(stopJack())); QObject::connect(m_ui.MessagesStatusToolButton, SIGNAL(clicked()), SLOT(toggleMessagesStatusForm())); QObject::connect(m_ui.SessionToolButton, SIGNAL(clicked()), SLOT(toggleSessionForm())); QObject::connect(m_ui.GraphToolButton, SIGNAL(clicked()), SLOT(toggleGraphForm())); QObject::connect(m_ui.ConnectionsToolButton, SIGNAL(clicked()), SLOT(toggleConnectionsForm())); QObject::connect(m_ui.PatchbayToolButton, SIGNAL(clicked()), SLOT(togglePatchbayForm())); QObject::connect(m_ui.QuitToolButton, SIGNAL(clicked()), SLOT(quitMainForm())); QObject::connect(m_ui.SetupToolButton, SIGNAL(clicked()), SLOT(showSetupForm())); QObject::connect(m_ui.AboutToolButton, SIGNAL(clicked()), SLOT(showAboutForm())); QObject::connect(m_ui.RewindToolButton, SIGNAL(clicked()), SLOT(transportRewind())); QObject::connect(m_ui.BackwardToolButton, SIGNAL(clicked()), SLOT(transportBackward())); QObject::connect(m_ui.PlayToolButton, SIGNAL(toggled(bool)), SLOT(transportPlay(bool))); QObject::connect(m_ui.PauseToolButton, SIGNAL(clicked()), SLOT(transportStop())); QObject::connect(m_ui.ForwardToolButton, SIGNAL(clicked()), SLOT(transportForward())); #ifdef __APPLE__ // Setup macOS menu bar QMenuBar* const menuBar = new QMenuBar(nullptr); menuBar->setNativeMenuBar(true); QMenu* const menu = menuBar->addMenu("QjackCtl"); QAction* const actQuit = menu->addAction(tr("&Quit")); actQuit->setMenuRole(QAction::QuitRole); QObject::connect(actQuit, SIGNAL(triggered()), SLOT(quitMainForm())); QAction* const actPreferences = menu->addAction(tr("Set&up...")); actPreferences->setMenuRole(QAction::PreferencesRole); QObject::connect(actPreferences, SIGNAL(triggered()), SLOT(showSetupForm())); QAction* const actAbout = menu->addAction(tr("Ab&out...")); actAbout->setMenuRole(QAction::AboutRole); QObject::connect(actAbout, SIGNAL(triggered()), SLOT(showAboutForm())); #endif } // Destructor. qjackctlMainForm::~qjackctlMainForm (void) { #ifdef HAVE_SIGNAL_H if (m_pSigtermNotifier) delete m_pSigtermNotifier; #endif // Stop server, if not already... #ifdef CONFIG_DBUS if (m_pSetup->bStopJack || !m_pSetup->bJackDBusEnabled) stopJackServer(); if (m_pDBusLogWatcher) delete m_pDBusLogWatcher; if (m_pDBusConfig) delete m_pDBusConfig; if (m_pDBusControl) delete m_pDBusControl; m_pDBusControl = nullptr; m_pDBusConfig = nullptr; m_pDBusLogWatcher = nullptr; m_bDBusStarted = false; m_bDBusDetach = false; #else stopJackServer(); #endif // Terminate local ALSA sequencer interface. if (m_pAlsaNotifier) delete m_pAlsaNotifier; #ifdef CONFIG_ALSA_SEQ if (m_pAlsaSeq) snd_seq_close(m_pAlsaSeq); #endif m_pAlsaNotifier = nullptr; m_pAlsaSeq = nullptr; // Finally drop any popup widgets around... if (m_pMessagesStatusForm) delete m_pMessagesStatusForm; if (m_pSessionForm) delete m_pSessionForm; if (m_pConnectionsForm) delete m_pConnectionsForm; if (m_pPatchbayForm) delete m_pPatchbayForm; if (m_pGraphForm) delete m_pGraphForm; if (m_pSetupForm) delete m_pSetupForm; #ifdef CONFIG_SYSTEM_TRAY // Quit off system tray widget. if (m_pSystemTray) delete m_pSystemTray; #endif // Patchbay rack is also dead. if (m_pPatchbayRack) delete m_pPatchbayRack; // Pseudo-singleton reference shut-down. g_pMainForm = nullptr; } // Kind of singleton reference. qjackctlMainForm *qjackctlMainForm::getInstance (void) { return g_pMainForm; } // Make and set a proper setup step. bool qjackctlMainForm::setup ( qjackctlSetup *pSetup ) { // Finally, fix settings descriptor // and stabilize the form. m_pSetup = pSetup; // To avoid any background flickering, // we'll hide the main display. m_ui.StatusDisplayFrame->hide(); updateButtons(); // What style do we create these forms? QWidget *pParent = nullptr; Qt::WindowFlags wflags = Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint; if (m_pSetup->bKeepOnTop) { pParent = this; wflags |= Qt::Tool; } // All forms are to be created right now. m_pMessagesStatusForm = new qjackctlMessagesStatusForm (pParent, wflags); m_pSessionForm = new qjackctlSessionForm (pParent, wflags); m_pConnectionsForm = new qjackctlConnectionsForm (pParent, wflags); m_pPatchbayForm = new qjackctlPatchbayForm (pParent, wflags); // Graph form should be a full-blown top-level window... m_pGraphForm = new qjackctlGraphForm(pParent, wflags); // Setup form is kind of special (modeless dialog). m_pSetupForm = new qjackctlSetupForm(this); // Setup appropriately... m_pMessagesStatusForm->setTabPage(m_pSetup->iMessagesStatusTabPage); m_pMessagesStatusForm->setLogging( m_pSetup->bMessagesLog, m_pSetup->sMessagesLogPath); m_pSessionForm->setup(m_pSetup); m_pConnectionsForm->setTabPage(m_pSetup->iConnectionsTabPage); m_pConnectionsForm->setup(m_pSetup); m_pPatchbayForm->setup(m_pSetup); m_pGraphForm->setup(m_pSetup); m_pSetupForm->setup(m_pSetup); // Maybe time to load default preset aliases? m_pSetup->loadAliases(); // Check out some initial nullities(tm)... if (m_pSetup->sMessagesFont.isEmpty() && m_pMessagesStatusForm) m_pSetup->sMessagesFont = m_pMessagesStatusForm->messagesFont().toString(); if (m_pSetup->sDisplayFont1.isEmpty()) m_pSetup->sDisplayFont1 = m_ui.TimeDisplayTextLabel->font().toString(); if (m_pSetup->sDisplayFont2.isEmpty()) m_pSetup->sDisplayFont2 = m_ui.ServerStateTextLabel->font().toString(); if (m_pSetup->sConnectionsFont.isEmpty() && m_pConnectionsForm) m_pSetup->sConnectionsFont = m_pConnectionsForm->connectionsFont().toString(); // Set the patchbay cable connection notification signal/slot. QObject::connect(m_pPatchbayRack, SIGNAL(cableConnected(const QString&, const QString&, unsigned int)), SLOT(cableConnectSlot(const QString&, const QString&, unsigned int))); // Try to restore old window positioning and appearence. m_pSetup->loadWidgetGeometry(this, true); // And for the whole widget gallore... m_pSetup->loadWidgetGeometry(m_pMessagesStatusForm); m_pSetup->loadWidgetGeometry(m_pSessionForm); m_pSetup->loadWidgetGeometry(m_pConnectionsForm); m_pSetup->loadWidgetGeometry(m_pPatchbayForm); m_pSetup->loadWidgetGeometry(m_pGraphForm); // m_pSetup->loadWidgetGeometry(m_pSetupForm); // Make it final show... m_ui.StatusDisplayFrame->show(); // Set other defaults... updateDisplayEffect(); updateTimeDisplayFonts(); updateTimeDisplayToolTips(); updateMessagesFont(); updateMessagesLimit(); updateConnectionsFont(); updateConnectionsIconSize(); updateJackClientPortAlias(); updateJackClientPortMetadata(); // updateActivePatchbay(); #ifdef CONFIG_SYSTEM_TRAY updateSystemTray(); #endif // Initial XRUN statistics reset. resetXrunStats(); // Check if we can redirect our own stdout/stderr... #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32) if (m_pSetup->bStdoutCapture && ::pipe(g_fdStdout) == 0) { ::dup2(g_fdStdout[QJACKCTL_FDWRITE], STDOUT_FILENO); ::dup2(g_fdStdout[QJACKCTL_FDWRITE], STDERR_FILENO); stdoutBlock(g_fdStdout[QJACKCTL_FDWRITE], false); m_pStdoutNotifier = new QSocketNotifier( g_fdStdout[QJACKCTL_FDREAD], QSocketNotifier::Read, this); QObject::connect(m_pStdoutNotifier, SIGNAL(activated(int)), SLOT(stdoutNotifySlot(int))); } #endif #ifdef CONFIG_ALSA_SEQ if (m_pSetup->bAlsaSeqEnabled) { // Start our ALSA sequencer interface. if (snd_seq_open(&m_pAlsaSeq, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) m_pAlsaSeq = nullptr; if (m_pAlsaSeq) { snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; struct pollfd pfd[1]; const int iPort = snd_seq_create_simple_port( m_pAlsaSeq, "qjackctl", SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE | SND_SEQ_PORT_CAP_NO_EXPORT, SND_SEQ_PORT_TYPE_APPLICATION ); if (iPort >= 0) { snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = SND_SEQ_CLIENT_SYSTEM; seq_addr.port = SND_SEQ_PORT_SYSTEM_ANNOUNCE; snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = snd_seq_client_id(m_pAlsaSeq); seq_addr.port = iPort; snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); snd_seq_subscribe_port(m_pAlsaSeq, pAlsaSubs); snd_seq_poll_descriptors(m_pAlsaSeq, pfd, 1, POLLIN); m_pAlsaNotifier = new QSocketNotifier(pfd[0].fd, QSocketNotifier::Read); QObject::connect(m_pAlsaNotifier, SIGNAL(activated(int)), SLOT(alsaNotifySlot(int))); } } // Could we start without it? if (m_pAlsaSeq) { // Rather obvious setup. if (m_pConnectionsForm) m_pConnectionsForm->stabilizeAlsa(true); if (m_pGraphForm) m_pGraphForm->alsa_changed(); } else { appendMessagesError( tr("Could not open ALSA sequencer as a client.\n\n" "ALSA MIDI patchbay will be not available.")); } } #endif #ifdef CONFIG_DBUS // Register D-Bus service... if (m_pSetup->bDBusEnabled) { const QString s; // Just an empty string. const QString sDBusName("org.rncbc.qjackctl"); QDBusConnection dbus = QDBusConnection::systemBus(); dbus.connect(s, s, sDBusName, "start", this, SLOT(startJack())); dbus.connect(s, s, sDBusName, "stop", this, SLOT(stopJack())); dbus.connect(s, s, sDBusName, "reset", this, SLOT(resetXrunStats())); dbus.connect(s, s, sDBusName, "main", this, SLOT(toggleMainForm())); dbus.connect(s, s, sDBusName, "messages", this, SLOT(toggleMessagesForm())); dbus.connect(s, s, sDBusName, "status", this, SLOT(toggleStatusForm())); dbus.connect(s, s, sDBusName, "session", this, SLOT(toggleSessionForm())); dbus.connect(s, s, sDBusName, "connections", this, SLOT(toggleConnectionsForm())); dbus.connect(s, s, sDBusName, "patchbay", this, SLOT(togglePatchbayForm())); dbus.connect(s, s, sDBusName, "graph", this, SLOT(toggleGraphForm())); dbus.connect(s, s, sDBusName, "rewind", this, SLOT(transportRewind())); dbus.connect(s, s, sDBusName, "backward", this, SLOT(transportBackward())); dbus.connect(s, s, sDBusName, "play", this, SLOT(transportStart())); dbus.connect(s, s, sDBusName, "pause", this, SLOT(transportStop())); dbus.connect(s, s, sDBusName, "forward", this, SLOT(transportForward())); dbus.connect(s, s, sDBusName, "setup", this, SLOT(showSetupForm())); dbus.connect(s, s, sDBusName, "about", this, SLOT(showAboutForm())); dbus.connect(s, s, sDBusName, "quit", this, SLOT(quitMainForm())); dbus.connect(s, s, sDBusName, "preset", this, SLOT(activatePreset(const QString&))); dbus.connect(s, s, sDBusName, "active-patchbay", this, SLOT(activatePatchbay(const QString&))); // Session related slots... if (m_pSessionForm) { dbus.connect(s, s, sDBusName, "load", m_pSessionForm, SLOT(loadSession())); dbus.connect(s, s, sDBusName, "save", m_pSessionForm, SLOT(saveSessionSave())); #ifdef CONFIG_JACK_SESSION dbus.connect(s, s, sDBusName, "savequit", m_pSessionForm, SLOT(saveSessionSaveAndQuit())); dbus.connect(s, s, sDBusName, "savetemplate", m_pSessionForm, SLOT(saveSessionSaveTemplate())); #endif } } // Register JACK D-Bus service... updateJackDBus(); #endif // Load patchbay form recent paths... if (m_pPatchbayForm) { m_pPatchbayForm->setRecentPatchbays(m_pSetup->patchbays); if (!m_pSetup->sPatchbayPath.isEmpty() && QFileInfo(m_pSetup->sPatchbayPath).exists()) m_pPatchbayForm->loadPatchbayFile(m_pSetup->sPatchbayPath); m_pPatchbayForm->updateRecentPatchbays(); m_pPatchbayForm->stabilizeForm(); } // Try to find if we can start in detached mode (client-only) // just in case there's a JACK server already running. startJackClient(true); // Final startup stabilization... stabilizeForm(); jackStabilize(); // Look for immediate server startup?... if (m_pSetup->bStartJack || !m_pSetup->cmdLine.isEmpty()) m_pSetup->bStartJackCmd = true; if (m_pSetup->bStartJackCmd) startJack(); // Register the first timer slot. QTimer::singleShot(QJACKCTL_TIMER_MSECS, this, SLOT(timerSlot())); // We're ready to go... return true; } // Setup accessor. qjackctlSetup *qjackctlMainForm::setup (void) const { return m_pSetup; } // Window close event handlers. bool qjackctlMainForm::queryClose (void) { bool bQueryClose = true; if (m_pSetup == nullptr) return bQueryClose; #ifdef CONFIG_SYSTEM_TRAY // If we're not quitting explicitly and there's an // active system tray icon, then just hide ourselves. if (!m_bQuitClose && !m_bQuitForce && isVisible() && m_pSetup->bSystemTray && m_pSystemTray) { m_pSetup->saveWidgetGeometry(this, true); if (m_pSetup->bSystemTrayQueryClose) { const QString& sTitle = tr("Information"); const QString& sText = tr("The program will keep running in the system tray.\n\n" "To terminate the program, please choose \"Quit\"\n" "in the context menu of the system tray icon."); #if 0//QJACKCTL_SYSTEM_TRAY_QUERY_CLOSE if (QSystemTrayIcon::supportsMessages()) { m_pSystemTray->showMessage( sTitle + " - " QJACKCTL_TITLE, sText, QSystemTrayIcon::Information); } else QMessageBox::information(this, sTitle, sText); #else QMessageBox mbox(this); mbox.setIcon(QMessageBox::Information); mbox.setWindowTitle(sTitle); mbox.setText(sText); mbox.setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel); QCheckBox cbox(tr("Don't show this message again")); cbox.setChecked(false); cbox.blockSignals(true); mbox.addButton(&cbox, QMessageBox::ActionRole); bQueryClose = (mbox.exec() == QMessageBox::Ok); if (cbox.isChecked()) m_pSetup->bSystemTrayQueryClose = false; #endif } if (bQueryClose) hide(); updateContextMenu(); bQueryClose = false; } #endif // Check if we really want to quit... if (bQueryClose && !m_bQuitForce && m_pSetup->bQueryClose) { show(); raise(); activateWindow(); updateContextMenu(); const QString& sTitle = tr("Warning"); QString sText; // Check if JACK daemon is currently running... if (((m_pJack && m_pJack->state() == QProcess::Running) #ifdef CONFIG_DBUS || (m_pDBusControl && m_bDBusStarted) #endif ) && m_pSetup->bQueryShutdown) { sText = tr("JACK is currently running.\n\n" "Do you want to terminate the JACK audio server?"); } else { sText = tr("%1 is about to terminate.\n\n" "Are you sure?").arg(QJACKCTL_TITLE); } #if 0//QJACKCTL_QUERY_CLOSE bQueryClose = (QMessageBox::warning(this, sTitle, sText, QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok); #else QMessageBox mbox(this); mbox.setIcon(QMessageBox::Warning); mbox.setWindowTitle(sTitle); mbox.setText(sText); mbox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); QCheckBox cbox(tr("Don't ask this again")); cbox.setChecked(false); cbox.blockSignals(true); mbox.addButton(&cbox, QMessageBox::ActionRole); bQueryClose = (mbox.exec() == QMessageBox::Ok); if (bQueryClose && cbox.isChecked()) m_pSetup->bQueryClose = false; #endif } // Try to save current aliases default settings. if (bQueryClose && !m_bQuitForce) bQueryClose = queryClosePreset(); // Try to save current setup settings. if (bQueryClose && !m_bQuitForce && m_pSetupForm) bQueryClose = m_pSetupForm->queryClose(); // Try to save current patchbay default settings. if (bQueryClose && !m_bQuitForce && m_pPatchbayForm) bQueryClose = m_pPatchbayForm->queryClose(); // Try to save current session directories list... if (bQueryClose && !m_bQuitForce && m_pSessionForm) bQueryClose = m_pSessionForm->queryClose(); // Some windows default fonts are here on demand too. if (bQueryClose && m_pMessagesStatusForm) { m_pSetup->sMessagesFont = m_pMessagesStatusForm->messagesFont().toString(); m_pSetup->iMessagesStatusTabPage = m_pMessagesStatusForm->tabPage(); } // Whether we're really quitting. #ifdef CONFIG_SYSTEM_TRAY m_bQuitClose = bQueryClose; #endif m_bQuitForce = bQueryClose; // Try to save current positioning. if (bQueryClose) { m_pSetup->saveWidgetGeometry(m_pMessagesStatusForm); m_pSetup->saveWidgetGeometry(m_pSessionForm); m_pSetup->saveWidgetGeometry(m_pConnectionsForm); m_pSetup->saveWidgetGeometry(m_pPatchbayForm); m_pSetup->saveWidgetGeometry(m_pGraphForm); // m_pSetup->saveWidgetGeometry(m_pSetupForm); m_pSetup->saveWidgetGeometry(this, true); // Close popup widgets. if (m_pMessagesStatusForm) m_pMessagesStatusForm->close(); if (m_pSessionForm) m_pSessionForm->close(); if (m_pConnectionsForm) m_pConnectionsForm->close(); if (m_pPatchbayForm) m_pPatchbayForm->close(); if (m_pGraphForm) m_pGraphForm->close(); if (m_pSetupForm) m_pSetupForm->close(); #if 0//CONFIG_SYSTEM_TRAY // And the system tray icon too. if (m_pSystemTray) m_pSystemTray->close(); #endif // Stop any service out there... if (m_pSetup->bStopJack) stopJackServer(); // Finally, save settings. m_pSetup->saveSetup(); } return bQueryClose; } // Query whether current preset can be closed. bool qjackctlMainForm::queryClosePreset (void) { bool bQueryClose = true; if (m_pSetup->aliases.dirty) { switch (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_TITLE, tr("The preset aliases have been changed:\n\n" "\"%1\"\n\nDo you want to save the changes?") .arg(m_pSetup->aliases.key), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Save: m_pSetup->saveAliases(); // Fall thru.... case QMessageBox::Discard: break; default: // Cancel. bQueryClose = false; break; } } return bQueryClose; } // Query whether to restart the JACK service. bool qjackctlMainForm::queryRestart (void) { bool bQueryRestart = (m_pJackClient && m_iServerState != QJACKCTL_ACTIVE); if (bQueryRestart) bQueryRestart = queryClosePreset(); // If client service is currently running, // prompt the effective warning... if (bQueryRestart && m_pSetup->bQueryRestart) { const QString& sTitle = tr("Warning"); const QString& sText = tr("Server settings will be only effective after\n" "restarting the JACK audio server."); // Should ask the user whether to // restart the JACK audio server... if (m_pSetup->bQueryShutdown) { const QString& sQueryText = sText + "\n\n" + tr("Do you want to restart the JACK audio server?"); #if 0//QJACKCTL_QUERY_RESTART bQueryRestart = (QMessageBox::warning(this, sTitle, sQueryText, QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok); #else QMessageBox mbox(this); mbox.setIcon(QMessageBox::Warning); mbox.setWindowTitle(sTitle); mbox.setText(sQueryText); mbox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); QCheckBox cbox(tr("Don't ask this again")); cbox.setChecked(false); cbox.blockSignals(true); mbox.addButton(&cbox, QMessageBox::ActionRole); bQueryRestart = (mbox.exec() == QMessageBox::Ok); if (cbox.isChecked()) { m_pSetup->bQueryRestart = bQueryRestart; m_pSetup->bQueryShutdown = false; } #endif } else { // Show the old warning message... #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray && QSystemTrayIcon::supportsMessages()) { m_pSystemTray->showMessage( sTitle + " - " QJACKCTL_TITLE, sText, QSystemTrayIcon::Warning); } else #endif QMessageBox::warning(this, sTitle, sText); } } return bQueryRestart; } // Query whether to stop the JACK service. bool qjackctlMainForm::queryShutdown (void) { bool bQueryShutdown = (m_pJackClient && queryClosePreset()); // Check if we're allowed to stop (shutdown)... if (bQueryShutdown && m_pSetup->bQueryShutdown && m_pConnectionsForm && (m_pConnectionsForm->isAudioConnected() || m_pConnectionsForm->isMidiConnected())) { const QString& sTitle = tr("Warning"); const QString& sText = tr("Some client audio applications\n" "are still active and connected.\n\n" "Do you want to stop the JACK audio server?"); #if 0//QJACKCTL_QUERY_SHUTDOWN bQueryShutdown = (QMessageBox::warning(this, sTitle, sText, QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok); #else QMessageBox mbox(this); mbox.setIcon(QMessageBox::Warning); mbox.setWindowTitle(sTitle); mbox.setText(sText); QCheckBox cbox(tr("Don't ask this again")); cbox.setChecked(false); cbox.blockSignals(true); mbox.addButton(&cbox, QMessageBox::ActionRole); mbox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); bQueryShutdown = (mbox.exec() == QMessageBox::Ok); if (bQueryShutdown && cbox.isChecked()) m_pSetup->bQueryShutdown = false; #endif } return bQueryShutdown; } void qjackctlMainForm::showEvent ( QShowEvent *pShowEvent ) { QWidget::showEvent(pShowEvent); updateContextMenu(); } void qjackctlMainForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); updateContextMenu(); } void qjackctlMainForm::closeEvent ( QCloseEvent *pCloseEvent ) { // Let's be sure about that... if (queryClose()) { pCloseEvent->accept(); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QApplication::exit(0); #else QApplication::quit(); #endif } else { pCloseEvent->ignore(); } } void qjackctlMainForm::resizeEvent ( QResizeEvent *pResizeEvent ) { updateDisplayEffect(); QWidget::resizeEvent(pResizeEvent); } void qjackctlMainForm::customEvent ( QEvent *pEvent ) { switch (int(pEvent->type())) { case QJACKCTL_PORT_EVENT: portNotifyEvent(); break; case QJACKCTL_XRUN_EVENT: xrunNotifyEvent(); break; case QJACKCTL_BUFF_EVENT: buffNotifyEvent(); break; case QJACKCTL_FREE_EVENT: freeNotifyEvent(); break; case QJACKCTL_SHUT_EVENT: shutNotifyEvent(); break; case QJACKCTL_EXIT_EVENT: exitNotifyEvent(); break; #ifdef CONFIG_DBUS case QJACKCTL_LINE_EVENT: appendStdoutBuffer( static_cast (pEvent)->line()); break; #endif #ifdef CONFIG_JACK_METADATA case QJACKCTL_PROP_EVENT: propNotifyEvent(); break; #endif default: QWidget::customEvent(pEvent); break; } } // Common exit status text formatter... QString qjackctlMainForm::formatExitStatus ( int iExitStatus ) const { QString sTemp = " "; if (iExitStatus == 0) sTemp += tr("successfully"); else sTemp += tr("with exit status=%1").arg(iExitStatus); return sTemp + "."; } // Common shell script executive, with placeholder substitution... void qjackctlMainForm::shellExecute ( const QString& sShellCommand, const QString& sStartMessage, const QString& sStopMessage ) { QString sTemp = sShellCommand; sTemp.replace("%P", m_pSetup->sDefPreset); sTemp.replace("%N", m_pSetup->sServerName); sTemp.replace("%s", m_preset.sServerPrefix); sTemp.replace("%d", m_preset.sDriver); sTemp.replace("%i", m_preset.sInterface); sTemp.replace("%r", QString::number(m_preset.iSampleRate)); sTemp.replace("%p", QString::number(m_preset.iFrames)); sTemp.replace("%n", QString::number(m_preset.iPeriods)); appendMessages(sStartMessage); appendMessagesColor(sTemp.trimmed(), Qt::darkMagenta); stabilize(QJACKCTL_TIMER_MSECS); // Execute and set exit status message... sTemp = sStopMessage + formatExitStatus( ::system(sTemp.toUtf8().constData())); // Wait a litle bit before continue... stabilize(QJACKCTL_TIMER_MSECS); // Final log message... appendMessages(sTemp); } // Start jack audio server... void qjackctlMainForm::startJack (void) { // If can't be already a client, are we? if (m_pJackClient) return; // Is the server process instance still here? if (m_pJack) { if (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_TITLE, tr("Could not start JACK.\n\n" "Maybe JACK audio server is already started."), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) { m_pJack->terminate(); #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) m_bJackKilled = true; #endif m_pJack->kill(); } return; } // Stabilize emerging server state... QPalette pal; pal.setColor(QPalette::WindowText, Qt::yellow); m_ui.ServerStateTextLabel->setPalette(pal); m_ui.StartToolButton->setEnabled(false); updateServerState(QJACKCTL_ACTIVATING); // Reset our timer counters... m_iStartDelay = 0; m_iTimerDelay = 0; m_iJackRefresh = 0; // Now we're sure it ain't detached. m_bJackShutdown = false; m_bJackDetach = false; #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) m_bJackKilled = false; #endif // Check whether we had any previous preset but default... if ((m_pSetup->sDefPreset.isEmpty() || qjackctlSetup::defName() == qjackctlSetup::defName()) && !m_pSetup->sOldPreset.isEmpty()) { m_pSetup->sDefPreset = m_pSetup->sOldPreset; m_pSetup->sOldPreset.clear(); if (m_pSetupForm) m_pSetupForm->updateCurrentPreset(); } // Load primary/default server preset... if (!m_pSetup->loadPreset(m_preset, m_pSetup->sDefPreset)) { appendMessagesError(tr("Could not load preset \"%1\".\n\nRetrying with default.").arg(m_pSetup->sDefPreset)); m_pSetup->sDefPreset = qjackctlSetup::defName(); if (!m_pSetup->loadPreset(m_preset, m_pSetup->sDefPreset)) { appendMessagesError(tr("Could not load default preset.\n\nSorry.")); jackCleanup(); return; } } // Override server name now... if (m_pSetup->sServerName.isEmpty()) m_pSetup->sServerName = m_preset.sServerName; // Take care for the environment as well... if (m_pSetup->sServerName.isEmpty()) { const char *pszServerName = ::getenv("JACK_DEFAULT_SERVER"); if (pszServerName && strcmp("default", pszServerName)) m_pSetup->sServerName = QString::fromUtf8(pszServerName); } // No JACK Classic command line to start with, yet... m_sJackCmdLine.clear(); // If we ain't to be the server master, maybe we'll start // detached as client only (jackd server already running?) if (startJackClient(true)) { m_ui.StopToolButton->setEnabled(true); return; } // Say that we're starting... updateServerState(QJACKCTL_STARTING); // Do we have any startup script?... if (m_pSetup->bStartupScript && !m_pSetup->sStartupScriptShell.isEmpty()) { shellExecute(m_pSetup->sStartupScriptShell, tr("Startup script..."), tr("Startup script terminated")); } #ifdef CONFIG_DBUS // Jack D-BUS server backend startup method... if (m_pDBusControl) { // Jack D-BUS server backend configuration... setDBusParameters(m_preset); QDBusMessage dbusm = m_pDBusControl->call("StartServer"); if (dbusm.type() == QDBusMessage::ReplyMessage) { m_bDBusDetach = true; appendMessages( tr("D-BUS: JACK server is starting...")); } else { appendMessagesError( tr("D-BUS: JACK server could not be started.\n\nSorry")); } // Delay our control client... startJackClientDelay(); // JACK D-BUS startup is done. return; } #endif // !CONFIG_DBUS // Split the server path into arguments... QStringList args = m_preset.sServerPrefix.split(' '); // Look for the executable in the search path; // this enforces the server command to be an // executable absolute path whenever possible. QString sCommand = args[0]; QFileInfo fi(sCommand); if (fi.isRelative()) { #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) const char chPathSep = ';'; if (fi.suffix().isEmpty()) sCommand += ".exe"; #else const char chPathSep = ':'; #endif const QString sPath = QString::fromUtf8(::getenv("PATH")); QStringList paths = sPath.split(chPathSep); #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) paths.append(QString("%1\\JACK2").arg(::getenv("PROGRAMFILES"))); paths.append(QString("%1\\JACK2").arg(::getenv("PROGRAMFILES(x86)"))); #elif defined(__APPLE__) paths.append("/usr/local/bin/"); #endif QStringListIterator iter(paths); while (iter.hasNext()) { const QString& sDirectory = iter.next(); fi.setFile(QDir(sDirectory), sCommand); if (fi.exists() && fi.isExecutable()) { sCommand = fi.filePath(); break; } } } // Now that we got a command, remove it from args list... args.removeAt(0); // Build process arguments... const bool bDummy = (m_preset.sDriver == "dummy"); const bool bSun = (m_preset.sDriver == "sun"); const bool bOss = (m_preset.sDriver == "oss"); const bool bAlsa = (m_preset.sDriver == "alsa"); const bool bPortaudio = (m_preset.sDriver == "portaudio"); const bool bCoreaudio = (m_preset.sDriver == "coreaudio"); const bool bFirewire = (m_preset.sDriver == "firewire"); const bool bNet = (m_preset.sDriver == "net" || m_preset.sDriver == "netone"); if (!m_pSetup->sServerName.isEmpty()) args.append("-n" + m_pSetup->sServerName); if (m_preset.bVerbose) args.append("-v"); if (m_preset.bRealtime) { // args.append("-R"); if (m_preset.iPriority > 5 && !bCoreaudio) args.append("-P" + QString::number(m_preset.iPriority)); } else args.append("-r"); if (m_preset.iPortMax > 0 && m_preset.iPortMax != 256) args.append("-p" + QString::number(m_preset.iPortMax)); if (m_preset.iTimeout > 0 && m_preset.iTimeout != 500) args.append("-t" + QString::number(m_preset.iTimeout)); if (m_preset.bNoMemLock) args.append("-m"); else if (m_preset.bUnlockMem) args.append("-u"); if (m_preset.bSync) args.append("-S"); if (m_preset.ucClockSource > 0 && m_preset.ucClockSource != ' ') args.append("-c" + QString(char(m_preset.ucClockSource))); if (m_preset.ucSelfConnectMode > 0 && m_preset.ucSelfConnectMode != ' ') args.append("-a" + QString(char(m_preset.ucSelfConnectMode))); args.append("-d" + m_preset.sDriver); if ((bAlsa || bPortaudio) && (m_preset.iAudio != QJACKCTL_DUPLEX || m_preset.sInDevice.isEmpty() || m_preset.sOutDevice.isEmpty())) { QString sInterface = m_preset.sInterface; if (bAlsa && sInterface.isEmpty()) sInterface = "hw:0"; if (!sInterface.isEmpty()) args.append("-d" + formatQuoted(sInterface)); } if (bPortaudio && m_preset.iChan > 0) args.append("-c" + QString::number(m_preset.iChan)); if ((bCoreaudio || bFirewire) && !m_preset.sInterface.isEmpty()) args.append("-d" + formatQuoted(m_preset.sInterface)); if (m_preset.iSampleRate > 0 && !bNet) args.append("-r" + QString::number(m_preset.iSampleRate)); if (m_preset.iFrames > 0 && !bNet) args.append("-p" + QString::number(m_preset.iFrames)); if (bAlsa || bSun || bOss || bFirewire) { if (m_preset.iPeriods > 1) args.append("-n" + QString::number(m_preset.iPeriods)); } if (bAlsa) { if (m_preset.bSoftMode) args.append("-s"); if (m_preset.bMonitor) args.append("-m"); if (m_preset.bShorts) args.append("-S"); if (m_preset.bHWMeter) args.append("-M"); #ifdef CONFIG_JACK_MIDI if (!m_preset.sMidiDriver.isEmpty()) args.append("-X" + formatQuoted(m_preset.sMidiDriver)); #endif } if (bAlsa || bCoreaudio || bPortaudio) { switch (m_preset.iAudio) { case QJACKCTL_DUPLEX: if (!m_preset.sInDevice.isEmpty() || !m_preset.sOutDevice.isEmpty()) args.append("-D"); if (!m_preset.sInDevice.isEmpty()) args.append("-C" + formatQuoted(m_preset.sInDevice)); if (!m_preset.sOutDevice.isEmpty()) args.append("-P" + formatQuoted(m_preset.sOutDevice)); break; case QJACKCTL_CAPTURE: args.append("-C" + formatQuoted(m_preset.sInDevice)); break; case QJACKCTL_PLAYBACK: args.append("-P" + formatQuoted(m_preset.sOutDevice)); break; } if (m_preset.iInChannels > 0 && m_preset.iAudio != QJACKCTL_PLAYBACK) args.append("-i" + QString::number(m_preset.iInChannels)); if (m_preset.iOutChannels > 0 && m_preset.iAudio != QJACKCTL_CAPTURE) args.append("-o" + QString::number(m_preset.iOutChannels)); switch (m_preset.iDither) { case 0: // args.append("-z-"); break; case 1: args.append("-zr"); break; case 2: args.append("-zs"); break; case 3: args.append("-zt"); break; } } else if (bOss || bSun) { if (m_preset.bIgnoreHW) args.append("-b"); if (m_preset.iWordLength > 0 && m_preset.iWordLength != 16) args.append("-w" + QString::number(m_preset.iWordLength)); if (!m_preset.sInDevice.isEmpty() && m_preset.iAudio != QJACKCTL_PLAYBACK) args.append("-C" + formatQuoted(m_preset.sInDevice)); if (!m_preset.sOutDevice.isEmpty() && m_preset.iAudio != QJACKCTL_CAPTURE) args.append("-P" + formatQuoted(m_preset.sOutDevice)); if (m_preset.iAudio == QJACKCTL_PLAYBACK) args.append("-i0"); else if (m_preset.iInChannels > 0) args.append("-i" + QString::number(m_preset.iInChannels)); if (m_preset.iAudio == QJACKCTL_CAPTURE) args.append("-o0"); else if (m_preset.iOutChannels > 0) args.append("-o" + QString::number(m_preset.iOutChannels)); } else if (bCoreaudio || bFirewire || bNet) { if (m_preset.iInChannels > 0 && m_preset.iAudio != QJACKCTL_PLAYBACK) args.append("-i" + QString::number(m_preset.iInChannels)); if (m_preset.iOutChannels > 0 && m_preset.iAudio != QJACKCTL_CAPTURE) args.append("-o" + QString::number(m_preset.iOutChannels)); } if (bDummy && m_preset.iWait > 0 && m_preset.iWait != 21333) args.append("-w" + QString::number(m_preset.iWait)); if (bAlsa || bSun || bOss || bCoreaudio || bPortaudio || bFirewire) { if (m_preset.iInLatency > 0) args.append("-I" + QString::number(m_preset.iInLatency)); if (m_preset.iOutLatency > 0) args.append("-O" + QString::number(m_preset.iOutLatency)); } // Split the server path into arguments... if (!m_preset.sServerSuffix.isEmpty()) args.append(m_preset.sServerSuffix.split(' ')); // This is emulated jackd command line, for future reference purposes... m_sJackCmdLine = sCommand + ' ' + args.join(" ").trimmed(); // JACK Classic server backend startup process... m_pJack = new QProcess(this); // Setup stdout/stderr capture... if (m_pSetup->bStdoutCapture) { #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) // QProcess::ForwardedChannels doesn't seem to work in windows. m_pJack->setProcessChannelMode(QProcess::MergedChannels); #else m_pJack->setProcessChannelMode(QProcess::ForwardedChannels); #endif QObject::connect(m_pJack, SIGNAL(readyReadStandardOutput()), SLOT(readStdout())); QObject::connect(m_pJack, SIGNAL(readyReadStandardError()), SLOT(readStdout())); } // The unforgiveable signal communication... QObject::connect(m_pJack, SIGNAL(started()), SLOT(jackStarted())); QObject::connect(m_pJack, #if QT_VERSION < QT_VERSION_CHECK(5, 6, 0) SIGNAL(error(QProcess::ProcessError)), #else SIGNAL(errorOccurred(QProcess::ProcessError)), #endif SLOT(jackError(QProcess::ProcessError))); QObject::connect(m_pJack, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(jackFinished())); appendMessages(tr("JACK is starting...")); appendMessagesColor(m_sJackCmdLine, Qt::darkMagenta); #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) const QString& sCurrentDir = QFileInfo(sCommand).dir().absolutePath(); m_pJack->setWorkingDirectory(sCurrentDir); // QDir::setCurrent(sCurrentDir); #endif // Unquote arguments as necessary... const QChar q = '"'; QStringList cmd_args; QStringListIterator iter(args); while (iter.hasNext()) { const QString& arg = iter.next(); if (arg.contains(q)) { cmd_args.append(arg.section(q, 0, 0)); cmd_args.append(arg.section(q, 1, 1)); } else { cmd_args.append(arg); } } // Go JACK, go... m_pJack->start(sCommand, cmd_args); } // Stop jack audio server... void qjackctlMainForm::stopJack (void) { // Stop the server conditionally... if (queryShutdown()) stopJackServer(); } // Restart jack audio service. void qjackctlMainForm::restartJack (void) { // Stop the server conditionally... if (queryRestart()) { stopJackServer(); m_bJackRestart = true; } updateTitleStatus(); updateContextMenu(); } // Stop jack audio server... void qjackctlMainForm::stopJackServer (void) { // Clear timer counters... m_iStartDelay = 0; m_iTimerDelay = 0; m_iJackRefresh = 0; // Stop client code. stopJackClient(); // And try to stop server. if ((m_pJack && m_pJack->state() == QProcess::Running) #ifdef CONFIG_DBUS || (m_pDBusControl && m_bDBusStarted) #endif ) { updateServerState(QJACKCTL_STOPPING); // Do we have any pre-shutdown script?... if (m_pSetup->bShutdownScript && !m_pSetup->sShutdownScriptShell.isEmpty()) { shellExecute(m_pSetup->sShutdownScriptShell, tr("Shutdown script..."), tr("Shutdown script terminated")); } // Now it's the time to real try stopping the server daemon... if (!m_bJackShutdown) { // Jack classic server backend... if (m_pJack) { appendMessages(tr("JACK is stopping...")); #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) // Try harder... m_bJackKilled = true; m_pJack->kill(); #else // Try softly... m_pJack->terminate(); #endif } #ifdef CONFIG_DBUS // Jack D-BUS server backend... if (m_pDBusControl) { QDBusMessage dbusm = m_pDBusControl->call("StopServer"); if (dbusm.type() == QDBusMessage::ReplyMessage) { appendMessages( tr("D-BUS: JACK server is stopping...")); } else { appendMessagesError( tr("D-BUS: JACK server could not be stopped.\n\nSorry")); } } #endif // Give it some time to terminate gracefully and stabilize... stabilize(QJACKCTL_TIMER_MSECS); // Keep on, if not exiting for good. if (!m_bQuitForce) return; } } // Do final processing anyway. jackCleanup(); } void qjackctlMainForm::toggleJack (void) { if (m_pJackClient) stopJack(); else startJack(); } // Stdout handler... void qjackctlMainForm::readStdout (void) { appendStdoutBuffer(m_pJack->readAllStandardOutput()); } // Stdout buffer handler -- now splitted by complete new-lines... void qjackctlMainForm::appendStdoutBuffer ( const QString& s ) { m_sStdoutBuffer.append(s); processStdoutBuffer(); } void qjackctlMainForm::processStdoutBuffer (void) { const int iLength = m_sStdoutBuffer.lastIndexOf('\n'); if (iLength > 0) { QStringListIterator iter(m_sStdoutBuffer.left(iLength).split('\n')); while (iter.hasNext()) { QString sTemp = iter.next(); if (!sTemp.isEmpty()) #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) appendMessagesText(detectXrun(sTemp).trimmed()); #else appendMessagesText(detectXrun(sTemp)); #endif } m_sStdoutBuffer.remove(0, iLength + 1); } } // Stdout flusher -- show up any unfinished line... void qjackctlMainForm::flushStdoutBuffer (void) { processStdoutBuffer(); if (!m_sStdoutBuffer.isEmpty()) { #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) appendMessagesText(detectXrun(m_sStdoutBuffer).trimmed()); #else appendMessagesText(detectXrun(m_sStdoutBuffer)); #endif m_sStdoutBuffer.clear(); } } // Jack audio server startup. void qjackctlMainForm::jackStarted (void) { // Sure we're over any previous shutdown... m_bJackShutdown = false; // We're still starting... updateServerState(QJACKCTL_STARTING); // Show startup results... if (m_pJack) { appendMessages(tr("JACK was started with PID=%1.") #if QT_VERSION < QT_VERSION_CHECK(5, 3, 0) .arg(quint64(m_pJack->pid()))); #else .arg(quint64(m_pJack->processId()))); #endif } #ifdef CONFIG_DBUS // Special for D-BUS control.... if (m_pDBusControl) { m_bDBusStarted = true; appendMessages(tr("D-BUS: JACK server was started (%1 aka jackdbus).") .arg(m_pDBusControl->service())); } #endif // Delay our control client... startJackClientDelay(); } // Jack audio server got an error. void qjackctlMainForm::jackError ( QProcess::ProcessError error ) { qjackctl_on_error(error); } // Jack audio server finish. void qjackctlMainForm::jackFinished (void) { // Force client code cleanup. if (!m_bJackShutdown) jackCleanup(); } // Jack audio server cleanup. void qjackctlMainForm::jackCleanup (void) { // Force client code cleanup. bool bPostShutdown = m_bJackDetach; if (!bPostShutdown) stopJackClient(); // Flush anything that maybe pending... flushStdoutBuffer(); // Classic server control... if (m_pJack) { if (m_pJack->state() != QProcess::NotRunning) { appendMessages(tr("JACK is being forced...")); #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) m_bJackKilled = true; #endif // Force final server shutdown... m_pJack->kill(); // Give it some time to terminate gracefully and stabilize... stabilize(QJACKCTL_TIMER_MSECS); } // Force final server shutdown... appendMessages(tr("JACK was stopped")); // Destroy it. delete m_pJack; m_pJack = nullptr; // Flag we need a post-shutdown script... bPostShutdown = true; } #ifdef CONFIG_DBUS // Special for D-BUS control... if (m_pDBusControl && m_bDBusStarted) { m_bDBusStarted = false; m_bDBusDetach = false; appendMessages(tr("D-BUS: JACK server was stopped (%1 aka jackdbus).") .arg(m_pDBusControl->service())); // Flag we need a post-shutdown script... bPostShutdown = true; } #endif // Cannot be detached anymore. m_bJackDetach = false; // Do we have any post-shutdown script?... // (this will be always called, despite we've started the server or not) if (bPostShutdown && m_pSetup->bPostShutdownScript && !m_pSetup->sPostShutdownScriptShell.isEmpty()) { shellExecute(m_pSetup->sPostShutdownScriptShell, tr("Post-shutdown script..."), tr("Post-shutdown script terminated")); } // Reset server name. m_pSetup->sServerName.clear(); // Stabilize final server state... jackStabilize(); } // Stabilize server state... void qjackctlMainForm::jackStabilize (void) { QPalette pal; pal.setColor(QPalette::WindowText, m_pJackClient == nullptr ? Qt::darkYellow : Qt::yellow); m_ui.ServerStateTextLabel->setPalette(pal); m_ui.StartToolButton->setEnabled(m_pJackClient == nullptr); m_ui.StopToolButton->setEnabled(m_pJackClient != nullptr); m_ui.RewindToolButton->setEnabled(false); m_ui.BackwardToolButton->setEnabled(false); m_ui.PlayToolButton->setEnabled(false); m_ui.PauseToolButton->setEnabled(false); m_ui.ForwardToolButton->setEnabled(false); transportPlayStatus(false); #ifdef CONFIG_DBUS if (m_pDBusConfig && m_bDBusStarted) updateServerState(m_pJackClient ? QJACKCTL_STARTED : QJACKCTL_STOPPED); else #endif if (m_bJackDetach) updateServerState(m_pJackClient ? QJACKCTL_ACTIVE : QJACKCTL_INACTIVE); else updateServerState(QJACKCTL_STOPPED); } // XRUN detection routine. QString& qjackctlMainForm::detectXrun ( QString& s ) { if (m_iXrunSkips > 1) return s; QRegularExpression rx(m_pSetup->sXrunRegex); QRegularExpressionMatch match(rx.match(s)); if (match.hasMatch()) { const int iPos = match.capturedStart(0); s.insert(iPos + match.capturedLength(0), ""); s.insert(iPos, ""); #ifndef CONFIG_JACK_XRUN_DELAY m_fXrunLast = 0.0f; updateXrunStats(match.captured(1).toFloat()); refreshXrunStats(); #endif } return s; } // Update the XRUN last delay and immediate statistical values (in msecs). void qjackctlMainForm::updateXrunStats ( float fXrunLast ) { if (m_iXrunStats > 0) { m_fXrunLast = fXrunLast; m_fXrunTotal += m_fXrunLast; if (m_fXrunLast < m_fXrunMin || m_iXrunCount == 0) m_fXrunMin = m_fXrunLast; if (m_fXrunLast > m_fXrunMax || m_iXrunCount == 0) m_fXrunMax = m_fXrunLast; ++m_iXrunCount; // refreshXrunStats(); } ++m_iXrunStats; } // SIGTERM signal handler... void qjackctlMainForm::sigtermNotifySlot ( int /* fd */ ) { #ifdef HAVE_SIGNAL_H char c; if (::read(g_fdSigterm[1], &c, sizeof(c)) > 0) quitMainForm(); #endif } #if defined(Q_CC_GNU) || defined(Q_CC_MINGW) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #endif // Set stdout/stderr blocking mode. bool qjackctlMainForm::stdoutBlock ( int fd, bool bBlock ) const { #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32) const int iFlags = ::fcntl(fd, F_GETFL, 0); const bool bNonBlock = bool(iFlags & O_NONBLOCK); if (bBlock && bNonBlock) bBlock = (::fcntl(fd, F_SETFL, iFlags & ~O_NONBLOCK) == 0); else if (!bBlock && !bNonBlock) bBlock = (::fcntl(fd, F_SETFL, iFlags | O_NONBLOCK) != 0); #endif return bBlock; } // Own stdout/stderr socket notifier slot. void qjackctlMainForm::stdoutNotifySlot ( int fd ) { #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32) // Set non-blocking reads, if not already... const bool bBlock = stdoutBlock(fd, false); // Read as much as is available... QString sTemp; char achBuffer[1024]; const int cchBuffer = sizeof(achBuffer) - 1; int cchRead = ::read(fd, achBuffer, cchBuffer); while (cchRead > 0) { achBuffer[cchRead] = (char) 0; sTemp.append(achBuffer); cchRead = (bBlock ? 0 : ::read(fd, achBuffer, cchBuffer)); } // Needs to be non-empty... if (!sTemp.isEmpty()) appendStdoutBuffer(sTemp); #endif } #if defined(Q_CC_GNU) || defined(Q_CC_MINGW) #pragma GCC diagnostic pop #endif // Messages output methods. void qjackctlMainForm::appendMessages ( const QString& s ) { if (m_pMessagesStatusForm) m_pMessagesStatusForm->appendMessages(s); } void qjackctlMainForm::appendMessagesColor ( const QString& s, const QColor& rgb ) { if (m_pMessagesStatusForm) m_pMessagesStatusForm->appendMessagesColor(s, rgb); } void qjackctlMainForm::appendMessagesText ( const QString& s ) { if (m_pMessagesStatusForm) m_pMessagesStatusForm->appendMessagesText(s); } void qjackctlMainForm::appendMessagesError ( const QString& s ) { if (m_pMessagesStatusForm) { m_pMessagesStatusForm->setTabPage( int(qjackctlMessagesStatusForm::MessagesTab)); m_pMessagesStatusForm->show(); } appendMessagesColor(s.simplified(), Qt::red); const QString& sTitle = tr("Error"); #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray && QSystemTrayIcon::supportsMessages()) m_pSystemTray->showMessage( sTitle + " - " QJACKCTL_TITLE, s, QSystemTrayIcon::Critical); else #endif QMessageBox::critical(this, sTitle, s, QMessageBox::Cancel); } // Force update of the messages font. void qjackctlMainForm::updateMessagesFont (void) { if (m_pSetup == nullptr) return; if (m_pMessagesStatusForm && !m_pSetup->sMessagesFont.isEmpty()) { QFont font; if (font.fromString(m_pSetup->sMessagesFont)) m_pMessagesStatusForm->setMessagesFont(font); } } // Update messages window line limit. void qjackctlMainForm::updateMessagesLimit (void) { if (m_pSetup == nullptr) return; if (m_pMessagesStatusForm) { if (m_pSetup->bMessagesLimit) m_pMessagesStatusForm->setMessagesLimit(m_pSetup->iMessagesLimitLines); else m_pMessagesStatusForm->setMessagesLimit(-1); } } // Update messages logging state. void qjackctlMainForm::updateMessagesLogging (void) { if (m_pSetup == nullptr) return; if (m_pMessagesStatusForm) { m_pMessagesStatusForm->setLogging( m_pSetup->bMessagesLog, m_pSetup->sMessagesLogPath); } } // Force update of the connections font. void qjackctlMainForm::updateConnectionsFont (void) { if (m_pSetup == nullptr) return; if (m_pConnectionsForm && !m_pSetup->sConnectionsFont.isEmpty()) { QFont font; if (font.fromString(m_pSetup->sConnectionsFont)) m_pConnectionsForm->setConnectionsFont(font); } } // Update of the connections view icon size. void qjackctlMainForm::updateConnectionsIconSize (void) { if (m_pSetup == nullptr) return; if (m_pConnectionsForm) m_pConnectionsForm->setConnectionsIconSize(m_pSetup->iConnectionsIconSize); } // Update of JACK client/port alias display mode. void qjackctlMainForm::updateJackClientPortAlias (void) { if (m_pSetup == nullptr) return; qjackctlJackClientList::setJackClientPortAlias(m_pSetup->iJackClientPortAlias); refreshJackConnections(); } // Update of JACK client/port pretty-name (metadata) display mode. void qjackctlMainForm::updateJackClientPortMetadata (void) { if (m_pSetup == nullptr) return; qjackctlJackClientList::setJackClientPortMetadata(m_pSetup->bJackClientPortMetadata); refreshJackConnections(); } // Update main display background effect. void qjackctlMainForm::updateDisplayEffect (void) { if (m_pSetup == nullptr) return; // Set the main background... QPalette pal; if (m_pSetup->bDisplayEffect) { const QImage img(":/images/displaybg1.png"); pal.setBrush(QPalette::Window, QBrush(img.scaled(m_ui.StatusDisplayFrame->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation))); } else { pal.setColor(QPalette::Window, Qt::black); } m_ui.StatusDisplayFrame->setPalette(pal); } // Force update of big time display related fonts. void qjackctlMainForm::updateTimeDisplayFonts (void) { QFont font; if (!m_pSetup->sDisplayFont1.isEmpty() && font.fromString(m_pSetup->sDisplayFont1)) m_ui.TimeDisplayTextLabel->setFont(font); if (!m_pSetup->sDisplayFont2.isEmpty() && font.fromString(m_pSetup->sDisplayFont2)) { m_ui.ServerStateTextLabel->setFont(font); m_ui.ServerModeTextLabel->setFont(font); m_ui.DspLoadTextLabel->setFont(font); m_ui.SampleRateTextLabel->setFont(font); m_ui.XrunCountTextLabel->setFont(font); m_ui.TransportStateTextLabel->setFont(font); m_ui.TransportBpmTextLabel->setFont(font); font.setBold(true); m_ui.TransportTimeTextLabel->setFont(font); } } // Force update of big time display related tooltips. void qjackctlMainForm::updateTimeDisplayToolTips (void) { QString sTimeDisplay = tr("Transport BBT (bar.beat.ticks)"); QString sTransportTime = tr("Transport time code"); switch (m_pSetup->iTimeDisplay) { case DISPLAY_TRANSPORT_TIME: { QString sTemp = sTimeDisplay; sTimeDisplay = sTransportTime; sTransportTime = sTemp; break; } case DISPLAY_RESET_TIME: sTimeDisplay = tr("Elapsed time since last reset"); break; case DISPLAY_XRUN_TIME: sTimeDisplay = tr("Elapsed time since last XRUN"); break; } m_ui.TimeDisplayTextLabel->setToolTip(sTimeDisplay); m_ui.TransportTimeTextLabel->setToolTip(sTransportTime); } // Update the connections client/port aliases. void qjackctlMainForm::updateAliases (void) { if (m_pConnectionsForm) m_pConnectionsForm->updateAliases(); } // Update the main form buttons display. void qjackctlMainForm::updateButtons (void) { updateTitleStatus(); if (m_pSetup->bLeftButtons) { m_ui.StartToolButton->show(); m_ui.StopToolButton->show(); m_ui.MessagesStatusToolButton->show(); m_ui.SessionToolButton->show(); m_ui.ConnectionsToolButton->setVisible(!m_pSetup->bGraphButton); m_ui.GraphToolButton->setVisible(m_pSetup->bGraphButton); m_ui.PatchbayToolButton->show(); } else { m_ui.StartToolButton->hide(); m_ui.StopToolButton->hide(); m_ui.MessagesStatusToolButton->hide(); m_ui.SessionToolButton->hide(); m_ui.GraphToolButton->hide(); m_ui.ConnectionsToolButton->hide(); m_ui.PatchbayToolButton->hide(); } if (m_pSetup->bRightButtons) { m_ui.QuitToolButton->show(); m_ui.SetupToolButton->show(); } else { m_ui.QuitToolButton->hide(); m_ui.SetupToolButton->hide(); } if (m_pSetup->bRightButtons && (m_pSetup->bLeftButtons || m_pSetup->bTransportButtons)) { m_ui.AboutToolButton->show(); } else { m_ui.AboutToolButton->hide(); } if (m_pSetup->bLeftButtons || m_pSetup->bTransportButtons) { m_ui.RewindToolButton->show(); m_ui.BackwardToolButton->show(); m_ui.PlayToolButton->show(); m_ui.PauseToolButton->show(); m_ui.ForwardToolButton->show(); } else { m_ui.RewindToolButton->hide(); m_ui.BackwardToolButton->hide(); m_ui.PlayToolButton->hide(); m_ui.PauseToolButton->hide(); m_ui.ForwardToolButton->hide(); } Qt::ToolButtonStyle toolButtonStyle = (m_pSetup->bTextLabels ? Qt::ToolButtonTextBesideIcon : Qt::ToolButtonIconOnly); m_ui.StartToolButton->setToolButtonStyle(toolButtonStyle); m_ui.StopToolButton->setToolButtonStyle(toolButtonStyle); m_ui.MessagesStatusToolButton->setToolButtonStyle(toolButtonStyle); m_ui.SessionToolButton->setToolButtonStyle(toolButtonStyle); m_ui.ConnectionsToolButton->setToolButtonStyle(toolButtonStyle); m_ui.GraphToolButton->setToolButtonStyle(toolButtonStyle); m_ui.PatchbayToolButton->setToolButtonStyle(toolButtonStyle); m_ui.QuitToolButton->setToolButtonStyle(toolButtonStyle); m_ui.SetupToolButton->setToolButtonStyle(toolButtonStyle); m_ui.AboutToolButton->setToolButtonStyle(toolButtonStyle); #if 0// Main-window fixed size (pre-adjustment...) const bool bVisible = isVisible(); if (bVisible) hide(); setMinimumSize(0, 0); setMaximumSize(640, 480); #endif adjustSize(); #if 0// Main-window fixed size (post-adjustmment...) setFixedSize(size()); if (bVisible) show(); #endif } // Update the Graph canvas palette. void qjackctlMainForm::updatePalette (void) { if (m_pGraphForm) m_pGraphForm->updatePalette(); } #ifdef CONFIG_DBUS void qjackctlMainForm::updateJackDBus (void) { // Unregister JACK D-Bus service controller... if (m_pDBusLogWatcher) { delete m_pDBusLogWatcher; m_pDBusLogWatcher = nullptr; } if (m_pDBusConfig) { delete m_pDBusConfig; m_pDBusConfig = nullptr; } if (m_pDBusControl) { delete m_pDBusControl; m_pDBusControl = nullptr; } // Register JACK D-Bus service... if (m_pSetup->bJackDBusEnabled) { // Detect whether jackdbus is avaliable... QDBusConnection dbusc = QDBusConnection::sessionBus(); m_pDBusControl = new QDBusInterface( "org.jackaudio.service", // Service "/org/jackaudio/Controller", // Path "org.jackaudio.JackControl", // Interface dbusc); // Connection QDBusMessage dbusm = m_pDBusControl->call("IsStarted"); if (dbusm.type() == QDBusMessage::ReplyMessage) { // Yes, jackdbus is available and/or already started // -- use jackdbus control interface... appendMessages(tr("D-BUS: Service is available (%1 aka jackdbus).") .arg(m_pDBusControl->service())); // Parse reply (should be boolean) m_bDBusStarted = dbusm.arguments().first().toBool(); // Register server start/stop notification slots... dbusc.connect( m_pDBusControl->service(), m_pDBusControl->path(), m_pDBusControl->interface(), "ServerStarted", this, SLOT(jackStarted())); dbusc.connect( m_pDBusControl->service(), m_pDBusControl->path(), m_pDBusControl->interface(), "ServerStopped", this, SLOT(jackFinished())); // -- use jackdbus configure interface... m_pDBusConfig = new QDBusInterface( m_pDBusControl->service(), // Service m_pDBusControl->path(), // Path "org.jackaudio.Configure", // Interface m_pDBusControl->connection()); // Connection // Start our log watcher thread... m_pDBusLogWatcher = new qjackctlDBusLogWatcher( QDir::homePath() + "/.log/jack/jackdbus.log"); m_pDBusLogWatcher->start(); // Ready now. } else { // No, jackdbus is not available, not started // or not even installed -- use classic jackd, BAU... appendMessages(tr("D-BUS: Service not available (%1 aka jackdbus).") .arg(m_pDBusControl->service())); // Destroy tentative jackdbus interface. delete m_pDBusControl; m_pDBusControl = nullptr; } } } #endif // Force update of active patchbay definition profile, if applicable. bool qjackctlMainForm::isActivePatchbay ( const QString& sPatchbayPath ) const { bool bActive = false; if (m_pSetup && m_pSetup->bActivePatchbay && !m_pSetup->sActivePatchbayPath.isEmpty()) bActive = (m_pSetup->sActivePatchbayPath == sPatchbayPath); return bActive; } // Force update of active patchbay definition profile, if applicable. void qjackctlMainForm::updateActivePatchbay (void) { if (m_pSetup == nullptr) return; // Time to load the active patchbay rack profiler? if (m_pSetup->bActivePatchbay && !m_pSetup->sActivePatchbayPath.isEmpty()) { // Check whether to reset/disconnect-all on patchbay activation... if (m_pSetup->bActivePatchbayReset) { if (m_pJackClient) { m_pPatchbayRack->disconnectAllJackPorts(m_pJackClient); m_iJackRefresh = 0; } if (m_pAlsaSeq) { m_pPatchbayRack->disconnectAllAlsaPorts(m_pAlsaSeq); m_iAlsaRefresh = 0; } appendMessages(tr("Patchbay reset.")); } // Load/activate patchbay-rack... const QFileInfo fi(m_pSetup->sActivePatchbayPath); if (fi.isRelative()) m_pSetup->sActivePatchbayPath = fi.absoluteFilePath(); if (!qjackctlPatchbayFile::load(m_pPatchbayRack, m_pSetup->sActivePatchbayPath)) { appendMessagesError( tr("Could not load active patchbay definition.\n\n\"%1\"\n\nDisabled.") .arg(m_pSetup->sActivePatchbayPath)); m_pSetup->bActivePatchbay = false; } else { appendMessages(tr("Patchbay activated.")); // If we're up and running, make it dirty :) if (m_pJackClient) ++m_iJackDirty; if (m_pAlsaSeq) ++m_iAlsaDirty; } } // We're sure there's no active patchbay... else appendMessages(tr("Patchbay deactivated.")); // Should refresh anyway. ++m_iPatchbayRefresh; } // Toggle active patchbay setting. void qjackctlMainForm::setActivePatchbay ( const QString& sPatchbayPath ) { if (m_pSetup == nullptr) return; if (sPatchbayPath.isEmpty()) { m_pSetup->bActivePatchbay = false; } else { m_pSetup->bActivePatchbay = true; m_pSetup->sActivePatchbayPath = sPatchbayPath; } updateActivePatchbay(); } // Reset the MRU patchbay list. void qjackctlMainForm::setRecentPatchbays ( const QStringList& patchbays ) { m_pSetup->patchbays = patchbays; } // Stabilize current form toggle buttons that may be astray. void qjackctlMainForm::stabilizeForm (void) { m_ui.MessagesStatusToolButton->setChecked( m_pMessagesStatusForm && m_pMessagesStatusForm->isVisible()); m_ui.SessionToolButton->setChecked( m_pSessionForm && m_pSessionForm->isVisible()); m_ui.GraphToolButton->setChecked( m_pGraphForm && m_pGraphForm->isVisible()); m_ui.ConnectionsToolButton->setChecked( m_pConnectionsForm && m_pConnectionsForm->isVisible()); m_ui.PatchbayToolButton->setChecked( m_pPatchbayForm && m_pPatchbayForm->isVisible()); m_ui.SetupToolButton->setChecked( m_pSetupForm && m_pSetupForm->isVisible()); } void qjackctlMainForm::stabilizeFormEx (void) { updateContextMenu(); stabilizeForm(); } // Stabilize current business over the application event loop. void qjackctlMainForm::stabilize ( int msecs ) { QElapsedTimer timer; timer.start(); while (timer.elapsed() < msecs) QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } // Reset XRUN cache items. void qjackctlMainForm::resetXrunStats (void) { m_timeResetLast = QTime::currentTime(); m_timerResetLast.start(); m_iXrunStats = 0; m_iXrunCount = 0; m_fXrunTotal = 0.0f; m_fXrunMin = 0.0f; m_fXrunMax = 0.0f; m_fXrunLast = 0.0f; m_timeXrunLast.setHMS(0, 0, 0); m_timerXrunLast.start(); m_iXrunCallbacks = 0; m_iXrunSkips = 0; #ifdef CONFIG_JACK_MAX_DELAY if (m_pJackClient) jack_reset_max_delayed_usecs(m_pJackClient); #endif refreshXrunStats(); appendMessages(tr("Statistics reset.")); // Make sure all status(es) will be updated ASAP. m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; } // Update the XRUN count/callbacks item. void qjackctlMainForm::updateXrunCount (void) { // We'll change XRUN status colors here! QColor color = (m_pJackClient ? Qt::green : Qt::darkGreen); if ((m_iXrunCount + m_iXrunCallbacks) > 0) { if (m_iXrunCallbacks > 0) color = (m_pJackClient ? Qt::red : Qt::darkRed); else color = (m_pJackClient ? Qt::yellow : Qt::darkYellow); #ifdef CONFIG_SYSTEM_TRAY // Change the system tray icon background color! if (m_pSystemTray) m_pSystemTray->setBackground(color); } // Reset the system tray icon background! else if (m_pSystemTray) m_pSystemTray->setBackground(Qt::transparent); #else } #endif QPalette pal; pal.setColor(QPalette::WindowText, color); m_ui.XrunCountTextLabel->setPalette(pal); QString sText = QString::number(m_iXrunCount); sText += " ("; sText += QString::number(m_iXrunCallbacks); sText += ")"; updateStatusItem(STATUS_XRUN_COUNT, sText); } // Convert whole elapsed seconds to hh:mm:ss time format. QString qjackctlMainForm::formatTime ( float secs ) const { unsigned int hh, mm, ss; hh = mm = ss = 0; if (secs >= 3600.0f) { hh = (unsigned int) (secs / 3600.0f); secs -= (float) hh * 3600.0f; } if (secs >= 60.0f) { mm = (unsigned int) (secs / 60.0f); secs -= (float) mm * 60.0f; } if (secs >= 0.0) { ss = (unsigned int) secs; secs -= (float) ss; } // Raw milliseconds #if QT_VERSION < QT_VERSION_CHECK(5, 5, 0) QString sTemp; sTemp.sprintf("%02u:%02u:%02u.%03u", hh, mm, ss, (unsigned int) (secs * 1000.0f)); return sTemp; #else return QString::asprintf("%02u:%02u:%02u.%03u", hh, mm, ss, (unsigned int) (secs * 1000.0f)); #endif } // Update the XRUN last/elapsed time item. QString qjackctlMainForm::formatElapsedTime ( int iStatusItem, const QTime& time, const QElapsedTimer& timer ) const { QString sTemp = c_szTimeDashes; QString sText; // Compute and format elapsed time. if (time.isNull() || time.msec() < 1) { sText = sTemp; } else { sText = time.toString(); if (m_pJackClient) { const float secs = float(timer.elapsed()) / 1000.0f; if (secs > 0) { sTemp = formatTime(secs); sText += " (" + sTemp + ")"; } } } // Display elapsed time as big time? if ((iStatusItem == STATUS_RESET_TIME && m_pSetup->iTimeDisplay == DISPLAY_RESET_TIME) || (iStatusItem == STATUS_XRUN_TIME && m_pSetup->iTimeDisplay == DISPLAY_XRUN_TIME)) { m_ui.TimeDisplayTextLabel->setText(sTemp); } return sText; } // Update the XRUN last/elapsed time item. void qjackctlMainForm::updateElapsedTimes (void) { // Display time remaining on start delay... if (m_iTimerDelay < m_iStartDelay) { m_ui.TimeDisplayTextLabel->setText(formatTime( float(m_iStartDelay - m_iTimerDelay) / 1000.0f)); } else { updateStatusItem(STATUS_RESET_TIME, formatElapsedTime(STATUS_RESET_TIME, m_timeResetLast, m_timerResetLast)); updateStatusItem(STATUS_XRUN_TIME, formatElapsedTime(STATUS_XRUN_TIME, m_timeXrunLast, m_timerXrunLast)); } } // Update the XRUN list view items. void qjackctlMainForm::refreshXrunStats (void) { updateXrunCount(); if (m_fXrunTotal < 0.001f) { const QString n = "--"; updateStatusItem(STATUS_XRUN_TOTAL, n); updateStatusItem(STATUS_XRUN_MIN, n); updateStatusItem(STATUS_XRUN_MAX, n); updateStatusItem(STATUS_XRUN_AVG, n); updateStatusItem(STATUS_XRUN_LAST, n); } else { float fXrunAverage = 0.0f; if (m_iXrunCount > 0) fXrunAverage = (m_fXrunTotal / m_iXrunCount); const QString s = " " + tr("msec"); updateStatusItem(STATUS_XRUN_TOTAL, QString::number(m_fXrunTotal) + s); updateStatusItem(STATUS_XRUN_MIN, QString::number(m_fXrunMin) + s); updateStatusItem(STATUS_XRUN_MAX, QString::number(m_fXrunMax) + s); updateStatusItem(STATUS_XRUN_AVG, QString::number(fXrunAverage) + s); updateStatusItem(STATUS_XRUN_LAST, QString::number(m_fXrunLast) + s); } updateElapsedTimes(); } // Jack port/graph change event notifier. void qjackctlMainForm::portNotifyEvent (void) { // Log some message here, if new. if (m_iJackRefresh == 0) appendMessagesColor(tr("JACK connection graph change."), "#cc9966"); // Do what has to be done. refreshJackConnections(); // We'll be dirty too... ++m_iJackDirty; } // Jack XRUN event notifier. void qjackctlMainForm::xrunNotifyEvent (void) { // Just increment callback counter. ++m_iXrunCallbacks; // Skip this one? Maybe we're under some kind of storm... ++m_iXrunSkips; // Report rate must be under one second... if (m_timerXrunLast.restart() < 1000) return; // Mark this one... m_timeXrunLast = QTime::currentTime(); #ifdef CONFIG_JACK_XRUN_DELAY // We have an official XRUN delay value (convert usecs to msecs)... updateXrunStats(0.001f * jack_get_xrun_delayed_usecs(m_pJackClient)); #endif // Just log this single event... appendMessagesColor(tr("XRUN callback (%1).") .arg(m_iXrunCallbacks), "#cc66cc"); } // Jack buffer size event notifier. void qjackctlMainForm::buffNotifyEvent (void) { // Don't need to nothing, it was handled on qjackctl_buffer_size_callback; // just log this event as routine. appendMessagesColor(tr("Buffer size change (%1).") .arg((int) g_buffsize), "#996633"); } // Jack shutdown event notifier. void qjackctlMainForm::shutNotifyEvent (void) { // Log this event. appendMessagesColor(tr("Shutdown notification."), "#cc6666"); // SHUTDOWN: JACK client handle might not be valid anymore... m_bJackShutdown = true; // m_pJackClient = nullptr; // Do what has to be done. stopJackServer(); } // Jack freewheel event notifier. void qjackctlMainForm::freeNotifyEvent (void) { // Log this event. appendMessagesColor(g_freewheel ? tr("Freewheel started...") : tr("Freewheel exited."), "#996633"); } // Process exit event notifier. void qjackctlMainForm::exitNotifyEvent (void) { // Poor-mans read, copy, update (RCU) QProcess::ProcessError error = g_error; g_error = QProcess::UnknownError; switch (error) { case QProcess::FailedToStart: appendMessagesError(tr("Could not start JACK.\n\nSorry.")); jackFinished(); break; case QProcess::Crashed: #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) if (!m_bJackKilled) #endif appendMessagesColor(tr("JACK has crashed."), "#cc3366"); break; case QProcess::Timedout: appendMessagesColor(tr("JACK timed out."), "#cc3366"); break; case QProcess::WriteError: appendMessagesColor(tr("JACK write error."), "#cc3366"); break; case QProcess::ReadError: appendMessagesColor(tr("JACK read error."), "#cc3366"); break; case QProcess::UnknownError: default: appendMessagesColor(tr("Unknown JACK error (%d).") .arg(int(error)), "#990099"); break; } } #ifdef CONFIG_JACK_METADATA // Jack property (metadata) event notifier. void qjackctlMainForm::propNotifyEvent (void) { // Log some message here, if new. if (m_iJackRefresh == 0) appendMessagesColor(tr("JACK property change."), "#993366"); // Do what has to be done. refreshJackConnections(true); // We'll be dirty too... ++m_iJackDirty; } #endif // ALSA announce slot. void qjackctlMainForm::alsaNotifySlot ( int /*fd*/ ) { #ifdef CONFIG_ALSA_SEQ do { snd_seq_event_t *pAlsaEvent; snd_seq_event_input(m_pAlsaSeq, &pAlsaEvent); snd_seq_free_event(pAlsaEvent); } while (snd_seq_event_input_pending(m_pAlsaSeq, 0) > 0); #endif // Log some message here, if new. if (m_iAlsaRefresh == 0) appendMessagesColor(tr("ALSA connection graph change."), "#66cc99"); // Do what has to be done. refreshAlsaConnections(); // We'll be dirty too... ++m_iAlsaDirty; } // Timer callback funtion. void qjackctlMainForm::timerSlot (void) { // Is it about to restart? if (m_bJackRestart && m_pJack == nullptr) { m_bJackRestart = false; startJack(); } // Is it the first shot on server start after a few delay? if (m_iTimerDelay < m_iStartDelay) { m_iTimerDelay += QJACKCTL_TIMER_MSECS; if (m_iTimerDelay >= m_iStartDelay) { // If we cannot start it now, // maybe we ought to cease & desist... if (!startJackClient(false)) stopJackServer(); } } // Is the connection patchbay dirty enough? if (m_pConnectionsForm && !g_freewheel) { const QString sEllipsis = "..."; // Are we about to enforce an audio connections persistence profile? if (m_iJackDirty > 0) { m_iJackDirty = 0; if (m_pSessionForm) m_pSessionForm->updateSession(); if (m_pSetup->bActivePatchbay) { appendMessagesColor( tr("JACK active patchbay scan") + sEllipsis, "#6699cc"); m_pPatchbayRack->connectJackScan(m_pJackClient); } refreshJackConnections(); } // Or is it from the MIDI field? if (m_iAlsaDirty > 0) { m_iAlsaDirty = 0; if (m_pSetup->bActivePatchbay) { appendMessagesColor( tr("ALSA active patchbay scan") + sEllipsis, "#99cc66"); m_pPatchbayRack->connectAlsaScan(m_pAlsaSeq); } refreshAlsaConnections(); } // Are we about to refresh it, really? if (m_iJackRefresh > 0 && m_pJackClient != nullptr) { const bool bClear = (m_iJackRefreshClear > 0); m_iJackRefreshClear = 0; m_iJackRefresh = 0; m_pConnectionsForm->refreshAudio(true, bClear); m_pConnectionsForm->refreshMidi(true, bClear); } if (m_iAlsaRefresh > 0 && m_pAlsaSeq != nullptr) { const bool bClear = (m_iAlsaRefreshClear > 0); m_iAlsaRefreshClear = 0; m_iAlsaRefresh = 0; m_pConnectionsForm->refreshAlsa(true, bClear); } } // Is the patchbay dirty enough? if (m_pPatchbayForm && m_iPatchbayRefresh > 0) { m_iPatchbayRefresh = 0; m_pPatchbayForm->refreshForm(); } // Is the graph dirty enough? if (m_pGraphForm) m_pGraphForm->refresh(); // Update some statistical fields, directly. refreshStatus(); // Register the next timer slot. QTimer::singleShot(QJACKCTL_TIMER_MSECS, this, SLOT(timerSlot())); } // JACK connection notification slot. void qjackctlMainForm::jackConnectChanged (void) { // Just shake the audio connections status quo. if (++m_iJackDirty == 1) appendMessagesColor(tr("JACK connection change."), "#9999cc"); } // ALSA connection notification slot. void qjackctlMainForm::alsaConnectChanged (void) { // Just shake the MIDI connections status quo. if (++m_iAlsaDirty == 1) appendMessagesColor(tr("ALSA connection change."), "#cccc99"); } // Cable connection notification slot. void qjackctlMainForm::cableConnectSlot ( const QString& sOutputPort, const QString& sInputPort, unsigned int ulCableFlags ) { QString sText = QFileInfo(m_pSetup->sActivePatchbayPath).baseName() + ": "; QString sColor; sText += sOutputPort; sText += " -> "; sText += sInputPort; sText += " "; switch (ulCableFlags) { case QJACKCTL_CABLE_CHECKED: sText += tr("checked"); sColor = "#99cccc"; break; case QJACKCTL_CABLE_CONNECTED: sText += tr("connected"); sColor = "#669999"; break; case QJACKCTL_CABLE_DISCONNECTED: sText += tr("disconnected"); sColor = "#cc9999"; break; case QJACKCTL_CABLE_FAILED: default: sText += tr("failed"); sColor = "#cc6699"; break; } appendMessagesColor(sText + '.', sColor); } // Patchbay (dis)connection slot. void qjackctlMainForm::queryDisconnect ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort, int iSocketType ) { queryDisconnect( pOPort->clientName(), pOPort->portName(), pIPort->clientName(), pIPort->portName(), iSocketType); } void qjackctlMainForm::queryDisconnect ( qjackctlGraphPort *port1, qjackctlGraphPort *port2 ) { qjackctlGraphNode *node1 = port1->portNode(); qjackctlGraphNode *node2 = port2->portNode(); if (node1 == nullptr || node2 == nullptr) return; int iSocketType = QJACKCTL_SOCKETTYPE_DEFAULT; if (qjackctlJackGraph::audioPortType() == port1->portType()) iSocketType = QJACKCTL_SOCKETTYPE_JACK_AUDIO; else if (qjackctlJackGraph::midiPortType() == port1->portType()) iSocketType = QJACKCTL_SOCKETTYPE_JACK_MIDI; #ifdef CONFIG_ALSA_SEQ else if (qjackctlAlsaGraph::midiPortType() == port1->portType()) iSocketType = QJACKCTL_SOCKETTYPE_ALSA_MIDI; #endif queryDisconnect( node1->nodeName(), port1->portName(), node2->nodeName(), port2->portName(), iSocketType); } void qjackctlMainForm::queryDisconnect ( const QString& sOClientName, const QString& sOPortName, const QString& sIClientName, const QString& sIPortName, int iSocketType ) { if (m_pSetup->bActivePatchbay && m_pSetup->bQueryDisconnect) { qjackctlPatchbayCable *pCable = m_pPatchbayRack->findCable( sOClientName, sOPortName, sIClientName, sIPortName, iSocketType); if (pCable) { bool bQueryDisconnect = true; const QString& sTitle = tr("Warning") + " - " QJACKCTL_TITLE; const QString& sText = tr("A patchbay definition is currently active,\n" "which is probable to redo this connection:\n\n" "%1 -> %2\n\n" "Do you want to remove the patchbay connection?") .arg(pCable->outputSocket()->name()) .arg(pCable->inputSocket()->name()); #if 0//QJACKCTL_QUERY_DISCONNECT bQueryDisconnect = (QMessageBox::warning(this, sTitle, Text, QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok); #else QMessageBox mbox(this); mbox.setIcon(QMessageBox::Warning); mbox.setWindowTitle(sTitle); mbox.setText(sText); mbox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); QCheckBox cbox(tr("Don't ask this again")); cbox.setChecked(false); cbox.blockSignals(true); mbox.addButton(&cbox, QMessageBox::ActionRole); bQueryDisconnect = (mbox.exec() == QMessageBox::Ok); if (bQueryDisconnect && cbox.isChecked()) m_pSetup->bQueryDisconnect = false; #endif if (bQueryDisconnect) m_pPatchbayRack->removeCable(pCable); } // Refresh patchbay form anyway... if (m_pPatchbayForm && isActivePatchbay(m_pPatchbayForm->patchbayPath())) m_pPatchbayForm->loadPatchbayRack(m_pPatchbayRack); } } // Delay jack control client start... void qjackctlMainForm::startJackClientDelay (void) { // Sloppy boy fix: may the serve be stopped, just in case // the client will nerver make it... m_ui.StopToolButton->setEnabled(true); // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; m_iStatusBlink = 0; // Reset (yet again) the timer counters... m_iStartDelay = 1 + (m_preset.iStartDelay * 1000); m_iTimerDelay = 0; m_iJackRefresh = 0; } // Start our jack audio control client... bool qjackctlMainForm::startJackClient ( bool bDetach ) { // If can't be already started, are we? if (m_pJackClient) return true; // Have it a setup? if (m_pSetup == nullptr) return false; // Make sure all status(es) will be updated ASAP. m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; m_iStatusBlink = 0; // Are we about to start detached? if (bDetach) { // To fool timed client initialization delay. m_iTimerDelay += (m_iStartDelay + 1); // Refresh status (with dashes?) refreshStatus(); } // Create the jack client handle, using a distinct identifier (PID?) const char *pszClientName = "qjackctl"; jack_status_t status = JackFailure; if (m_pSetup->sServerName.isEmpty()) { m_pJackClient = jack_client_open(pszClientName, JackNoStartServer, &status); } else { m_pJackClient = jack_client_open(pszClientName, jack_options_t(JackNoStartServer | JackServerName), &status, m_pSetup->sServerName.toUtf8().constData()); } if (m_pJackClient == nullptr) { if (!bDetach) { QStringList errs; if (status & JackFailure) errs << tr("Overall operation failed."); if (status & JackInvalidOption) errs << tr("Invalid or unsupported option."); if (status & JackNameNotUnique) errs << tr("Client name not unique."); if (status & JackServerStarted) errs << tr("Server is started."); if (status & JackServerFailed) errs << tr("Unable to connect to server."); if (status & JackServerError) errs << tr("Server communication error."); if (status & JackNoSuchClient) errs << tr("Client does not exist."); if (status & JackLoadFailure) errs << tr("Unable to load internal client."); if (status & JackInitFailure) errs << tr("Unable to initialize client."); if (status & JackShmFailure) errs << tr("Unable to access shared memory."); if (status & JackVersionError) errs << tr("Client protocol version mismatch."); appendMessagesError( tr("Could not connect to JACK server as client.\n" "- %1\nPlease check the messages window for more info.") .arg(errs.join("\n- "))); // To stop timed client initialization delay... m_iTimerDelay += (m_iStartDelay + 1); // Refresh status (with dashes?) refreshStatus(); } return false; } // Set notification callbacks. jack_set_graph_order_callback(m_pJackClient, qjackctl_graph_order_callback, this); jack_set_client_registration_callback(m_pJackClient, qjackctl_client_registration_callback, this); jack_set_port_registration_callback(m_pJackClient, qjackctl_port_registration_callback, this); jack_set_port_connect_callback(m_pJackClient, qjackctl_port_connect_callback, this); #ifdef CONFIG_JACK_PORT_RENAME jack_set_port_rename_callback(m_pJackClient, qjackctl_port_rename_callback, this); #endif jack_set_xrun_callback(m_pJackClient, qjackctl_xrun_callback, this); jack_set_buffer_size_callback(m_pJackClient, qjackctl_buffer_size_callback, this); jack_set_freewheel_callback(m_pJackClient, qjackctl_freewheel_callback, this); jack_on_shutdown(m_pJackClient, qjackctl_on_shutdown, this); #ifdef CONFIG_JACK_METADATA jack_set_property_change_callback(m_pJackClient, qjackctl_property_change_callback, this); #endif // First knowledge about buffer size. g_buffsize = jack_get_buffer_size(m_pJackClient); // Sure we're not freewheeling at this point... g_freewheel = 0; // Reconstruct our connections and session... if (m_pConnectionsForm) { m_pConnectionsForm->stabilizeAudio(true); m_pConnectionsForm->stabilizeMidi(true); } if (m_pSessionForm) m_pSessionForm->stabilizeForm(true); if (bDetach #ifdef CONFIG_DBUS // Current D-BUS configuration makes it the default preset always... || (m_pDBusConfig && !m_bDBusDetach) #endif ) { const QString& sPreset = qjackctlSetup::defName(); if (m_pSetup->loadPreset(m_preset, sPreset)) { #ifdef CONFIG_DBUS if (m_pDBusConfig && !m_bDBusDetach) getDBusParameters(m_preset); #endif // Save current preset if not the default already... if (!m_pSetup->sDefPreset.isEmpty() && m_pSetup->sDefPreset != qjackctlSetup::defName()) m_pSetup->sOldPreset = m_pSetup->sDefPreset; // Have current preset changed anyhow? m_pSetup->sDefPreset = sPreset; if (m_pSetupForm) m_pSetupForm->updateCurrentPreset(); } } // Save server configuration file. if (m_pSetup->bServerConfig && !m_sJackCmdLine.isEmpty()) { const QString sFilename = QString::fromUtf8(::getenv("HOME")) + '/' + m_pSetup->sServerConfigName; QFile file(sFilename); if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { QTextStream(&file) << m_sJackCmdLine << endl; file.close(); appendMessagesColor( tr("Server configuration saved to \"%1\".") .arg(sFilename), "#999933"); } } // Time to (re)load current preset aliases? m_pSetup->loadAliases(); // We'll flag that we've been detached! if (bDetach) m_bJackDetach = true; else // Do not forget to reset XRUN stats variables... resetXrunStats(); // Activate us as a client... jack_activate(m_pJackClient); // All displays are highlighted from now on. QPalette pal; pal.setColor(QPalette::WindowText, Qt::yellow); m_ui.ServerStateTextLabel->setPalette(pal); m_ui.DspLoadTextLabel->setPalette(pal); m_ui.ServerModeTextLabel->setPalette(pal); pal.setColor(QPalette::WindowText, Qt::darkYellow); m_ui.SampleRateTextLabel->setPalette(pal); pal.setColor(QPalette::WindowText, Qt::green); m_ui.TimeDisplayTextLabel->setPalette(pal); m_ui.TransportStateTextLabel->setPalette(pal); m_ui.TransportBpmTextLabel->setPalette(pal); m_ui.TransportTimeTextLabel->setPalette(pal); // Whether we've started detached, just change active status. updateServerState(m_bJackDetach #ifdef CONFIG_DBUS && !(m_pDBusConfig && m_bDBusStarted) #endif ? QJACKCTL_ACTIVE : QJACKCTL_STARTED); m_ui.StopToolButton->setEnabled(true); // Log success here. appendMessages(tr("Client activated.")); // Formal patchbay activation, if any, is in order... updateActivePatchbay(); // Do we have any post-startup scripting?... // (only if we're not a detached client) if (!bDetach && !m_bJackDetach) { if (m_pSetup->bPostStartupScript && !m_pSetup->sPostStartupScriptShell.isEmpty()) { shellExecute(m_pSetup->sPostStartupScriptShell, tr("Post-startup script..."), tr("Post-startup script terminated")); } } // Have we an initial command-line to start away? if (!m_pSetup->cmdLine.isEmpty()) { // Run it dettached... shellExecute(m_pSetup->cmdLine.join(' '), tr("Command line argument..."), tr("Command line argument started")); // And reset it forever more... m_pSetup->cmdLine.clear(); } // Remember to schedule an initial connection refreshment. refreshConnections(); // OK, we're at it! return true; } // Stop jack audio client... void qjackctlMainForm::stopJackClient (void) { // Deactivate and close us as a client... if (m_pJackClient) { jack_deactivate(m_pJackClient); jack_client_close(m_pJackClient); m_pJackClient = nullptr; // Log deactivation here. appendMessages(tr("Client deactivated.")); } // Reset command-line configuration info. m_sJackCmdLine.clear(); // Clear out the connections and session... if (m_pConnectionsForm) { m_pConnectionsForm->stabilizeAudio(false); m_pConnectionsForm->stabilizeMidi(false); } if (m_pSessionForm) m_pSessionForm->stabilizeForm(false); if (m_pGraphForm) m_pGraphForm->jack_shutdown(); // Displays are dimmed again. QPalette pal; pal.setColor(QPalette::WindowText, Qt::darkYellow); m_ui.ServerModeTextLabel->setPalette(pal); m_ui.DspLoadTextLabel->setPalette(pal); m_ui.SampleRateTextLabel->setPalette(pal); pal.setColor(QPalette::WindowText, Qt::darkGreen); m_ui.TimeDisplayTextLabel->setPalette(pal); m_ui.TransportStateTextLabel->setPalette(pal); m_ui.TransportBpmTextLabel->setPalette(pal); m_ui.TransportTimeTextLabel->setPalette(pal); // Refresh jack client statistics explicitly. refreshXrunStats(); } // JACK client accessor. jack_client_t *qjackctlMainForm::jackClient (void) const { return (m_bJackShutdown ? nullptr : m_pJackClient); } // ALSA sequencer client accessor. snd_seq_t *qjackctlMainForm::alsaSeq (void) const { return m_pAlsaSeq; } // Rebuild all patchbay items. void qjackctlMainForm::refreshConnections (void) { refreshJackConnections(); refreshAlsaConnections(); } void qjackctlMainForm::refreshJackConnections ( bool bClear ) { // Hack this as for a while... if (m_pGraphForm) m_pGraphForm->jack_changed(); #if 0 if (m_pConnectionsForm && m_iJackRefresh == 0) { m_pConnectionsForm->stabilizeAudio(false); m_pConnectionsForm->stabilizeMidi(false); } #endif // Just increment our intentions; it will be deferred // to be executed just on timer slot processing... ++m_iJackRefresh; if (bClear) ++m_iJackRefreshClear; } void qjackctlMainForm::refreshAlsaConnections ( bool bClear ) { // Hack this as for a while... if (m_pGraphForm) m_pGraphForm->alsa_changed(); #if 0 if (m_pConnectionsForm && m_iAlsaRefresh == 0) m_pConnectionsForm->stabilizeAlsa(false); #endif // Just increment our intentions; it will be deferred // to be executed just on timer slot processing... ++m_iAlsaRefresh; if (bClear) ++m_iAlsaRefreshClear; } void qjackctlMainForm::refreshPatchbay (void) { // Just increment our intentions; it will be deferred // to be executed just on timer slot processing... ++m_iPatchbayRefresh; } // Main form visibility requester slot. void qjackctlMainForm::toggleMainForm (void) { if (m_pSetup == nullptr) return; m_pSetup->saveWidgetGeometry(this, true); if (isVisible() && !isMinimized()) { #ifdef CONFIG_SYSTEM_TRAY // Hide away from sight, totally... if (m_pSetup->bSystemTray && m_pSystemTray) hide(); else #endif // Minimize (iconify) normally. showMinimized(); } else { // Show normally. showNormal(); raise(); activateWindow(); } // updateContextMenu(); } // Message log/status form requester slot. void qjackctlMainForm::toggleMessagesStatusForm (void) { if (m_pMessagesStatusForm) { m_pSetup->saveWidgetGeometry(m_pMessagesStatusForm); if (m_pMessagesStatusForm->isVisible()) { m_pMessagesStatusForm->hide(); } else { m_pMessagesStatusForm->show(); m_pMessagesStatusForm->raise(); m_pMessagesStatusForm->activateWindow(); } } updateContextMenu(); } void qjackctlMainForm::toggleMessagesForm (void) { if (m_pMessagesStatusForm) { const int iTabPage = m_pMessagesStatusForm->tabPage(); m_pMessagesStatusForm->setTabPage( int(qjackctlMessagesStatusForm::MessagesTab)); if (m_pMessagesStatusForm->isVisible() && iTabPage != m_pMessagesStatusForm->tabPage()) return; } toggleMessagesStatusForm(); } void qjackctlMainForm::toggleStatusForm (void) { if (m_pMessagesStatusForm) { const int iTabPage = m_pMessagesStatusForm->tabPage(); m_pMessagesStatusForm->setTabPage( int(qjackctlMessagesStatusForm::StatusTab)); if (m_pMessagesStatusForm->isVisible() && iTabPage != m_pMessagesStatusForm->tabPage()) return; } toggleMessagesStatusForm(); } // Session form requester slot. void qjackctlMainForm::toggleSessionForm (void) { if (m_pSessionForm) { m_pSetup->saveWidgetGeometry(m_pSessionForm); m_pSessionForm->stabilizeForm(m_pJackClient != nullptr); if (m_pSessionForm->isVisible()) { m_pSessionForm->hide(); } else { m_pSessionForm->show(); m_pSessionForm->raise(); m_pSessionForm->activateWindow(); } } updateContextMenu(); } // Connections form requester slot. void qjackctlMainForm::toggleConnectionsForm (void) { if (m_pConnectionsForm) { m_pSetup->saveWidgetGeometry(m_pConnectionsForm); m_pConnectionsForm->stabilizeAudio(m_pJackClient != nullptr); m_pConnectionsForm->stabilizeMidi(m_pJackClient != nullptr); m_pConnectionsForm->stabilizeAlsa(m_pAlsaSeq != nullptr); if (m_pConnectionsForm->isVisible()) { m_pConnectionsForm->hide(); } else { m_pConnectionsForm->show(); m_pConnectionsForm->raise(); m_pConnectionsForm->activateWindow(); } } updateContextMenu(); } // Patchbay form requester slot. void qjackctlMainForm::togglePatchbayForm (void) { if (m_pPatchbayForm) { m_pSetup->saveWidgetGeometry(m_pPatchbayForm); if (m_pPatchbayForm->isVisible()) { m_pPatchbayForm->hide(); } else { m_pPatchbayForm->show(); m_pPatchbayForm->raise(); m_pPatchbayForm->activateWindow(); } } updateContextMenu(); } // Graph form requester slot. void qjackctlMainForm::toggleGraphForm (void) { if (m_pGraphForm) { m_pSetup->saveWidgetGeometry(m_pGraphForm); if (m_pGraphForm->isVisible()) { m_pGraphForm->hide(); } else { m_pGraphForm->show(); m_pGraphForm->raise(); m_pGraphForm->activateWindow(); } } updateContextMenu(); } // Setup dialog requester slot. void qjackctlMainForm::showSetupForm (void) { if (m_pSetupForm) { // m_pSetup->saveWidgetGeometry(m_pSetupForm); if (m_pSetupForm->isVisible()) { m_pSetupForm->hide(); } else { m_pSetupForm->show(); m_pSetupForm->raise(); m_pSetupForm->activateWindow(); } } updateContextMenu(); } // About dialog requester slot. void qjackctlMainForm::showAboutForm (void) { qjackctlAboutForm(this).exec(); } // Transport rewind. void qjackctlMainForm::transportRewind (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_transport_locate(m_pJackClient, 0); // Log this here. appendMessages(tr("Transport rewind.")); // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; ++m_iMenuRefresh; } #endif } // Transport backward. void qjackctlMainForm::transportBackward (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_position_t tpos; jack_transport_query(m_pJackClient, &tpos); float rate = float(tpos.frame_rate); float tloc = ((float(tpos.frame) / rate) - m_fSkipAccel) * rate; if (tloc < 0.0f) tloc = 0.0f; jack_transport_locate(m_pJackClient, (jack_nframes_t) tloc); // Log this here (if on initial toggle). if (m_fSkipAccel < 1.1f) appendMessages(tr("Transport backward.")); // Take care of backward acceleration... if (m_ui.BackwardToolButton->isDown() && m_fSkipAccel < 60.0) m_fSkipAccel *= 1.1f; // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; ++m_iMenuRefresh; } #endif } // Transport toggle (start/stop) void qjackctlMainForm::transportPlay ( bool bOn ) { if (m_iTransportPlay > 0) return; if (bOn) transportStart(); else transportStop(); } // Transport start (play) void qjackctlMainForm::transportStart (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_transport_start(m_pJackClient); updateStatusItem(STATUS_TRANSPORT_STATE, tr("Starting")); // Log this here. appendMessages(tr("Transport start.")); // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; ++m_iMenuRefresh; } #endif } // Transport stop (pause). void qjackctlMainForm::transportStop (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_transport_stop(m_pJackClient); updateStatusItem(STATUS_TRANSPORT_STATE, tr("Stopping")); // Log this here. appendMessages(tr("Transport stop.")); // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; ++m_iMenuRefresh; } #endif } // Transport forward. void qjackctlMainForm::transportForward (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_position_t tpos; jack_transport_query(m_pJackClient, &tpos); float rate = float(tpos.frame_rate); float tloc = ((float(tpos.frame) / rate) + m_fSkipAccel) * rate; if (tloc < 0.0f) tloc = 0.0f; jack_transport_locate(m_pJackClient, (jack_nframes_t) tloc); // Log this here. if (m_fSkipAccel < 1.1f) appendMessages(tr("Transport forward.")); // Take care of forward acceleration... if (m_ui.ForwardToolButton->isDown() && m_fSkipAccel < 60.0f) m_fSkipAccel *= 1.1f; // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; ++m_iMenuRefresh; } #endif } // Almost-complete running status refresher. void qjackctlMainForm::refreshStatus (void) { const QString n = "--"; const QString b = "-.-.---"; const QString sStopped = tr("Stopped"); ++m_iStatusRefresh; if (m_pJackClient) { const QString s = " "; #ifdef CONFIG_JACK_TRANSPORT QString sText = n; jack_position_t tpos; jack_transport_state_t tstate = jack_transport_query(m_pJackClient, &tpos); const bool bPlaying = (tstate == JackTransportRolling || tstate == JackTransportLooping); // Transport timecode position. // if (bPlaying) updateStatusItem(STATUS_TRANSPORT_TIME, formatTime(float(tpos.frame) / float(tpos.frame_rate))); // else // updateStatusItem(STATUS_TRANSPORT_TIME, c_szTimeDashes); // Transport barcode position (bar:beat.tick) if (tpos.valid & JackPositionBBT) { #if QT_VERSION < QT_VERSION_CHECK(5, 5, 0) updateStatusItem(STATUS_TRANSPORT_BBT, QString().sprintf("%u.%u.%03u", tpos.bar, tpos.beat, tpos.tick)); #else updateStatusItem(STATUS_TRANSPORT_BBT, QString::asprintf("%u.%u.%03u", tpos.bar, tpos.beat, tpos.tick)); #endif updateStatusItem(STATUS_TRANSPORT_BPM, QString::number(tpos.beats_per_minute)); } else { updateStatusItem(STATUS_TRANSPORT_BBT, b); updateStatusItem(STATUS_TRANSPORT_BPM, n); } #endif // !CONFIG_JACK_TRANSPORT // Less frequent status items update... if (m_iStatusRefresh >= QJACKCTL_STATUS_CYCLE) { m_iStatusRefresh = 0; const float fDspLoad = jack_cpu_load(m_pJackClient); const char f = (fDspLoad > 0.1f ? 'f' : 'g'); // format const int p = (fDspLoad > 1.0f ? 1 : 2 ); // precision #ifdef CONFIG_SYSTEM_TRAY if (m_pSystemTray) { if (m_iXrunCount > 0) { m_pSystemTray->setToolTip(tr("%1 (%2%)") .arg(windowTitle()) .arg(fDspLoad, 0, f, p)); } else { m_pSystemTray->setToolTip(tr("%1 (%2%, %3 xruns)") .arg(windowTitle()) .arg(fDspLoad, 0, f, p) .arg(m_iXrunCount)); } } #endif // !CONFIG_SYSTEM_TRAY updateStatusItem(STATUS_DSP_LOAD, tr("%1 %").arg(fDspLoad, 0, f, p)); updateStatusItem(STATUS_SAMPLE_RATE, tr("%1 Hz").arg(jack_get_sample_rate(m_pJackClient))); updateStatusItem(STATUS_BUFFER_SIZE, tr("%1 frames").arg(g_buffsize)); // Blink server mode indicator?... if (m_pSetup && m_pSetup->bDisplayBlink) { QPalette pal; pal.setColor(QPalette::WindowText, (++m_iStatusBlink % 2) ? Qt::darkYellow: Qt::yellow); m_ui.ServerModeTextLabel->setPalette(pal); } #ifdef CONFIG_JACK_REALTIME const bool bRealtime = jack_is_realtime(m_pJackClient); updateStatusItem(STATUS_REALTIME, (bRealtime ? tr("Yes") : tr("No"))); #else updateStatusItem(STATUS_REALTIME, n); #endif // !CONFIG_JACK_REALTIME if (g_freewheel) m_ui.ServerModeTextLabel->setText(tr("FW")); else #ifdef CONFIG_JACK_REALTIME m_ui.ServerModeTextLabel->setText(bRealtime ? tr("RT") : n); #else m_ui.ServerModeTextLabel->setText(n); #endif // !CONFIG_JACK_REALTIME #ifdef CONFIG_JACK_TRANSPORT switch (tstate) { case JackTransportStarting: sText = tr("Starting"); break; case JackTransportRolling: sText = tr("Rolling"); break; case JackTransportLooping: sText = tr("Looping"); break; case JackTransportStopped: default: sText = sStopped; break; } updateStatusItem(STATUS_TRANSPORT_STATE, sText); m_ui.RewindToolButton->setEnabled(tpos.frame > 0); m_ui.BackwardToolButton->setEnabled(tpos.frame > 0); m_ui.PlayToolButton->setEnabled(true); m_ui.PauseToolButton->setEnabled(bPlaying); m_ui.ForwardToolButton->setEnabled(true); transportPlayStatus(bPlaying); if (!m_ui.BackwardToolButton->isDown() && !m_ui.ForwardToolButton->isDown()) m_fSkipAccel = 1.0; #else updateStatusItem(STATUS_TRANSPORT_STATE, n); m_ui.RewindToolButton->setEnabled(false); m_ui.BackwardToolButton->setEnabled(false); m_ui.PlayToolButton->setEnabled(false); m_ui.PauseToolButton->setEnabled(false); m_ui.ForwardToolButton->setEnabled(false); transportPlayStatus(false); updateStatusItem(STATUS_TRANSPORT_TIME, c_szTimeDashes); updateStatusItem(STATUS_TRANSPORT_BBT, b); updateStatusItem(STATUS_TRANSPORT_BPM, n); #endif // !CONFIG_JACK_TRANSPORT #ifdef CONFIG_JACK_MAX_DELAY updateStatusItem(STATUS_MAX_DELAY, tr("%1 msec") .arg(0.001f * jack_get_max_delayed_usecs(m_pJackClient))); #endif // !CONFIG_JACK_MAX_DELAY // Check if we're have some XRUNs to report... if (m_iXrunSkips > 0) { // Maybe we've skipped some... if (m_iXrunSkips > 1) { appendMessagesColor(tr("XRUN callback (%1 skipped).") .arg(m_iXrunSkips - 1), "#cc99cc"); } // Reset skip count. m_iXrunSkips = 0; // Highlight the (new) status... refreshXrunStats(); } } #ifdef CONFIG_SYSTEM_TRAY // XRUN: blink the system-tray icon backgroung... if (m_pSystemTray && m_iXrunCallbacks > 0 && m_pSetup && m_pSetup->bDisplayBlink) { const int iElapsed = m_timerXrunLast.elapsed(); if (iElapsed > 0x7ff) { // T=2048ms. QColor color(m_pSystemTray->background()); color.setAlpha(0x0ff - ((iElapsed >> 3) & 0x0ff)); m_pSystemTray->setBackground(color); } } #endif // !CONFIG_SYSTEM_TRAY } // No need to update often if we're just idle... else if (m_iStatusRefresh >= QJACKCTL_STATUS_CYCLE) { m_iStatusRefresh = 0; updateStatusItem(STATUS_DSP_LOAD, n); updateStatusItem(STATUS_SAMPLE_RATE, n); updateStatusItem(STATUS_BUFFER_SIZE, n); updateStatusItem(STATUS_REALTIME, n); m_ui.ServerModeTextLabel->setText(n); updateStatusItem(STATUS_TRANSPORT_STATE, n); updateStatusItem(STATUS_TRANSPORT_TIME, c_szTimeDashes); updateStatusItem(STATUS_TRANSPORT_BBT, b); updateStatusItem(STATUS_TRANSPORT_BPM, n); m_ui.RewindToolButton->setEnabled(false); m_ui.BackwardToolButton->setEnabled(false); m_ui.PlayToolButton->setEnabled(false); m_ui.PauseToolButton->setEnabled(false); m_ui.ForwardToolButton->setEnabled(false); transportPlayStatus(false); } // Elapsed times should be rigorous... updateElapsedTimes(); if (m_iMenuRefresh > 0) { m_iMenuRefresh = 0; updateContextMenu(); } } // Status item updater. void qjackctlMainForm::updateStatusItem( int iStatusItem, const QString& sText ) { switch (iStatusItem) { case STATUS_SERVER_STATE: m_ui.ServerStateTextLabel->setText(sText); break; case STATUS_DSP_LOAD: m_ui.DspLoadTextLabel->setText(sText); break; case STATUS_SAMPLE_RATE: m_ui.SampleRateTextLabel->setText(sText); break; case STATUS_XRUN_COUNT: m_ui.XrunCountTextLabel->setText(sText); break; case STATUS_TRANSPORT_STATE: m_ui.TransportStateTextLabel->setText(sText); break; case STATUS_TRANSPORT_TIME: if (m_pSetup->iTimeDisplay == DISPLAY_TRANSPORT_TIME) m_ui.TimeDisplayTextLabel->setText(sText); else m_ui.TransportTimeTextLabel->setText(sText); break; case STATUS_TRANSPORT_BBT: if (m_pSetup->iTimeDisplay == DISPLAY_TRANSPORT_BBT) m_ui.TimeDisplayTextLabel->setText(sText); else if (m_pSetup->iTimeDisplay == DISPLAY_TRANSPORT_TIME) m_ui.TransportTimeTextLabel->setText(sText); break; case STATUS_TRANSPORT_BPM: m_ui.TransportBpmTextLabel->setText(sText); break; } if (m_pMessagesStatusForm) m_pMessagesStatusForm->updateStatusItem(iStatusItem, sText); } // Main window caption title and system tray icon and tooltip update. void qjackctlMainForm::updateTitleStatus (void) { QString sTitle = m_pSetup->sDefPreset; QString sState; const QString sDots(3, '.'); switch (m_iServerState) { case QJACKCTL_STARTING: sState = tr("Starting"); sState += sDots; break; case QJACKCTL_STARTED: sState = tr("Started"); break; case QJACKCTL_STOPPING: sState = tr("Stopping"); sState += sDots; break; case QJACKCTL_STOPPED: sState = tr("Stopped"); break; case QJACKCTL_ACTIVE: sState = tr("Active"); break; case QJACKCTL_ACTIVATING: sState = tr("Activating"); sState += sDots; break; case QJACKCTL_INACTIVE: default: sState = tr("Inactive"); break; } sTitle += ' '; sTitle += sState; setWindowTitle(sTitle); updateStatusItem(STATUS_SERVER_STATE, sState); #ifdef CONFIG_SYSTEM_TRAY if (m_pSystemTray) { switch (m_iServerState) { case QJACKCTL_STARTING: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xstarting1.png")); break; case QJACKCTL_STARTED: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xstarted1.png")); break; case QJACKCTL_STOPPING: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xstopping1.png")); break; case QJACKCTL_STOPPED: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xstopped1.png")); break; case QJACKCTL_ACTIVE: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xactive1.png")); break; case QJACKCTL_ACTIVATING: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xactivating1.png")); break; case QJACKCTL_INACTIVE: default: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xinactive1.png")); break; } m_pSystemTray->setToolTip(sTitle); } #endif QString sServerName = m_pSetup->sServerName; if (sServerName.isEmpty()) sServerName = QString::fromUtf8(::getenv("JACK_DEFAULT_SERVER")); if (sServerName.isEmpty()) sServerName = qjackctlSetup::defName(); updateStatusItem(STATUS_SERVER_NAME, sServerName); } // Main server state status update helper. void qjackctlMainForm::updateServerState ( int iServerState ) { // Just set the new server state. m_iServerState = iServerState; // Now's time to update main window // caption title and status immediately. updateTitleStatus(); // Update context-menu for sure... updateContextMenu(); } #ifdef CONFIG_SYSTEM_TRAY // System tray master switcher. void qjackctlMainForm::updateSystemTray (void) { if (!QSystemTrayIcon::isSystemTrayAvailable()) return; if (!m_pSetup->bSystemTray && m_pSystemTray) { // Strange enough, this would close the application too. // m_pSystemTray->close(); delete m_pSystemTray; m_pSystemTray = nullptr; } if (m_pSetup->bSystemTray && m_pSystemTray == nullptr) { m_pSystemTray = new qjackctlSystemTray(this); m_pSystemTray->setContextMenu(&m_menu); QObject::connect(m_pSystemTray, SIGNAL(clicked()), SLOT(toggleMainForm())); QObject::connect(m_pSystemTray, SIGNAL(middleClicked()), SLOT(resetXrunStats())); QObject::connect(m_pSystemTray, SIGNAL(doubleClicked()), SLOT(toggleJack())); m_pSystemTray->show(); } else { // Make sure the main widget is visible. show(); raise(); activateWindow(); } updateContextMenu(); } #endif // Common context menu request slots. void qjackctlMainForm::updateContextMenu (void) { m_menu.clear(); QAction *pAction; QString sHideMinimize = tr("Mi&nimize"); QString sShowRestore = tr("Rest&ore"); #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray) { sHideMinimize = tr("&Hide"); sShowRestore = tr("S&how"); } #endif pAction = m_menu.addAction(isVisible() && !isMinimized() ? sHideMinimize : sShowRestore, this, SLOT(toggleMainForm())); m_menu.addSeparator(); if (m_pJackClient == nullptr) { pAction = m_menu.addAction(QIcon(":/images/start1.png"), tr("&Start"), this, SLOT(startJack())); } else { pAction = m_menu.addAction(QIcon(":/images/stop1.png"), tr("&Stop"), this, SLOT(stopJack())); } pAction = m_menu.addAction(QIcon(":/images/reset1.png"), tr("&Reset"), this, SLOT(resetXrunStats())); // pAction->setEnabled(m_pJackClient != nullptr); m_menu.addSeparator(); // Construct the actual presets menu, // overriding the last one, if any... QMenu *pPresetsMenu = m_menu.addMenu(tr("&Presets")); // Assume QStringList iteration follows item index order (0,1,2...) int iPreset = 0; QStringListIterator iter(m_pSetup->presets); while (iter.hasNext()) { const QString& sPreset = iter.next(); pAction = pPresetsMenu->addAction(sPreset); pAction->setCheckable(true); pAction->setChecked(sPreset == m_pSetup->sDefPreset); pAction->setData(iPreset); ++iPreset; } // Default preset always present, and has invalid index parameter (-1)... if (iPreset > 0) pPresetsMenu->addSeparator(); pAction = pPresetsMenu->addAction(qjackctlSetup::defName()); pAction->setCheckable(true); pAction->setChecked( m_pSetup->sDefPreset.isEmpty() || m_pSetup->sDefPreset == qjackctlSetup::defName()); pAction->setData(-1); QObject::connect(pPresetsMenu, SIGNAL(triggered(QAction*)), SLOT(activatePresetsMenu(QAction*))); m_menu.addSeparator(); if (m_pSessionForm) { const bool bEnabled = (m_pJackClient != nullptr); const QString sTitle = tr("S&ession"); const QIcon iconSession(":/images/session1.png"); QMenu *pSessionMenu = m_menu.addMenu(sTitle); pSessionMenu->setIcon(iconSession); pAction = pSessionMenu->addAction(m_pSessionForm->isVisible() ? tr("&Hide") : tr("S&how"), this, SLOT(toggleSessionForm())); pSessionMenu->addSeparator(); pAction = pSessionMenu->addAction(QIcon(":/images/open1.png"), tr("&Load..."), m_pSessionForm, SLOT(loadSession())); pAction->setEnabled(bEnabled); QMenu *pRecentMenu = m_pSessionForm->recentMenu(); pAction = pSessionMenu->addMenu(pRecentMenu); pAction->setEnabled(m_pJackClient != nullptr && !pRecentMenu->isEmpty()); pSessionMenu->addSeparator(); pAction = pSessionMenu->addAction(QIcon(":/images/save1.png"), tr("&Save..."), m_pSessionForm, SLOT(saveSessionSave())); pAction->setEnabled(bEnabled); #ifdef CONFIG_JACK_SESSION pAction = pSessionMenu->addAction( tr("Save and &Quit..."), m_pSessionForm, SLOT(saveSessionSaveAndQuit())); pAction->setEnabled(bEnabled); pAction = pSessionMenu->addAction( tr("Save &Template..."), m_pSessionForm, SLOT(saveSessionSaveTemplate())); pAction->setEnabled(bEnabled); #endif pSessionMenu->addSeparator(); pAction = pSessionMenu->addAction( tr("&Versioning"), m_pSessionForm, SLOT(saveSessionVersion(bool))); pAction->setCheckable(true); pAction->setChecked(m_pSessionForm->isSessionSaveVersion()); pAction->setEnabled(bEnabled); pSessionMenu->addSeparator(); pAction = pSessionMenu->addAction(QIcon(":/images/refresh1.png"), tr("Re&fresh"), m_pSessionForm, SLOT(updateSession())); pAction->setEnabled(bEnabled); } pAction = m_menu.addAction(QIcon(":/images/messages1.png"), tr("&Messages"), this, SLOT(toggleMessagesForm())); pAction->setCheckable(true); pAction->setChecked(m_pMessagesStatusForm && m_pMessagesStatusForm->isVisible() && m_pMessagesStatusForm->tabPage() == qjackctlMessagesStatusForm::MessagesTab); pAction = m_menu.addAction(QIcon(":/images/status1.png"), tr("St&atus"), this, SLOT(toggleStatusForm())); pAction->setCheckable(true); pAction->setChecked(m_pMessagesStatusForm && m_pMessagesStatusForm->isVisible() && m_pMessagesStatusForm->tabPage() == qjackctlMessagesStatusForm::StatusTab); pAction = m_menu.addAction(QIcon(":/images/graph1.png"), tr("&Graph"), this, SLOT(toggleGraphForm())); pAction->setCheckable(true); pAction->setChecked(m_pGraphForm && m_pGraphForm->isVisible()); pAction = m_menu.addAction(QIcon(":/images/connections1.png"), tr("&Connections"), this, SLOT(toggleConnectionsForm())); pAction->setCheckable(true); pAction->setChecked(m_pConnectionsForm && m_pConnectionsForm->isVisible()); pAction = m_menu.addAction(QIcon(":/images/patchbay1.png"), tr("Patch&bay"), this, SLOT(togglePatchbayForm())); pAction->setCheckable(true); pAction->setChecked(m_pPatchbayForm && m_pPatchbayForm->isVisible()); m_menu.addSeparator(); QMenu *pTransportMenu = m_menu.addMenu(tr("&Transport")); pAction = pTransportMenu->addAction(QIcon(":/images/rewind1.png"), tr("&Rewind"), this, SLOT(transportRewind())); pAction->setEnabled(m_ui.RewindToolButton->isEnabled()); // pAction = pTransportMenu->addAction(QIcon(":/images/backward1.png"), // tr("&Backward"), this, SLOT(transportBackward())); // pAction->setEnabled(m_ui.BackwardToolButton->isEnabled()); pAction = pTransportMenu->addAction(QIcon(":/images/play1.png"), tr("&Play"), this, SLOT(transportStart())); pAction->setEnabled(!m_ui.PlayToolButton->isChecked()); pAction = pTransportMenu->addAction(QIcon(":/images/pause1.png"), tr("Pa&use"), this, SLOT(transportStop())); pAction->setEnabled(m_ui.PauseToolButton->isEnabled()); // pAction = pTransportMenu->addAction(QIcon(":/images/forward1.png"), // tr("&Forward"), this, SLOT(transportForward())); // pAction->setEnabled(m_ui.ForwardToolButton->isEnabled()); m_menu.addSeparator(); pAction = m_menu.addAction(QIcon(":/images/setup1.png"), tr("Set&up..."), this, SLOT(showSetupForm())); pAction->setCheckable(true); pAction->setChecked(m_pSetupForm && m_pSetupForm->isVisible()); if (!m_pSetup->bRightButtons || !m_pSetup->bTransportButtons) { pAction = m_menu.addAction(QIcon(":/images/about1.png"), tr("Ab&out..."), this, SLOT(showAboutForm())); } m_menu.addSeparator(); pAction = m_menu.addAction(QIcon(":/images/quit1.png"), tr("&Quit"), this, SLOT(quitMainForm())); } // Setup otions change warning. void qjackctlMainForm::showDirtySetupWarning (void) { const QString& sTitle = tr("Information"); const QString& sText = tr("Some settings will be only effective\n" "the next time you start this program."); #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray && QSystemTrayIcon::supportsMessages()) { m_pSystemTray->showMessage( sTitle + " - " QJACKCTL_TITLE, sText, QSystemTrayIcon::Information); } else #endif QMessageBox::information(this, sTitle, sText); } // Select the current default preset (by name from context menu). void qjackctlMainForm::activatePresetsMenu ( QAction *pAction ) { activatePreset(pAction->data().toInt()); } // Select the current default preset (by name). void qjackctlMainForm::activatePreset ( const QString& sPreset ) { activatePreset(m_pSetup->presets.indexOf(sPreset)); } // Select the current default preset (by index). void qjackctlMainForm::activatePreset ( int iPreset ) { if (iPreset >= 0 && iPreset < m_pSetup->presets.count()) m_pSetup->sDefPreset = m_pSetup->presets.at(iPreset); else m_pSetup->sDefPreset = qjackctlSetup::defName(); // Have current preset changed anyhow? if (m_pSetupForm) m_pSetupForm->updateCurrentPreset(); restartJack(); } // Select the current active patchbay profile (by path). void qjackctlMainForm::activatePatchbay ( const QString& sPatchbayPath ) { if (QFileInfo(sPatchbayPath).exists() && !isActivePatchbay(sPatchbayPath)) { setActivePatchbay(sPatchbayPath); if (m_pPatchbayForm) { m_pPatchbayForm->loadPatchbayFile(sPatchbayPath); m_pPatchbayForm->updateRecentPatchbays(); m_pPatchbayForm->stabilizeForm(); } } } // Close main form slot. void qjackctlMainForm::quitMainForm (void) { #ifdef CONFIG_SYSTEM_TRAY // Flag that we're quitting explicitly. m_bQuitClose = true; #endif // And then, do the closing dance. close(); } // Context menu event handler. void qjackctlMainForm::contextMenuEvent ( QContextMenuEvent *pEvent ) { m_menu.exec(pEvent->globalPos()); } void qjackctlMainForm::mousePressEvent(QMouseEvent *pMouseEvent) { if (pMouseEvent->button() == Qt::MiddleButton && m_ui.StatusDisplayFrame->geometry().contains(pMouseEvent->pos())) { resetXrunStats(); } } #ifdef CONFIG_DBUS // D-BUS: Set/reset parameter values from current selected preset options. void qjackctlMainForm::setDBusParameters ( const qjackctlPreset& preset ) { if (m_pDBusConfig == nullptr) return; // Set configuration parameters... const bool bDummy = (preset.sDriver == "dummy"); const bool bSun = (preset.sDriver == "sun"); const bool bOss = (preset.sDriver == "oss"); const bool bAlsa = (preset.sDriver == "alsa"); const bool bPortaudio = (preset.sDriver == "portaudio"); const bool bCoreaudio = (preset.sDriver == "coreaudio"); const bool bFirewire = (preset.sDriver == "firewire"); const bool bNet = (preset.sDriver == "net" || m_preset.sDriver == "netone"); // setDBusEngineParameter("name", // m_pSetup->sServerName, // !m_pSetup->sServerName.isEmpty()); setDBusEngineParameter("sync", preset.bSync); setDBusEngineParameter("verbose", preset.bVerbose); setDBusEngineParameter("realtime", preset.bRealtime); setDBusEngineParameter("realtime-priority", preset.iPriority, preset.bRealtime && preset.iPriority > 5); setDBusEngineParameter("port-max", uint(preset.iPortMax), preset.iPortMax > 0 && preset.iPortMax != 256); setDBusEngineParameter("client-timeout", preset.iTimeout, preset.iTimeout > 0 && preset.iTimeout != 500); setDBusEngineParameter("clock-source", uint(preset.ucClockSource), preset.ucClockSource > 0 && preset.ucClockSource != ' '); setDBusEngineParameter("self-connect-mode", QVariant::fromValue (preset.ucSelfConnectMode), preset.ucSelfConnectMode > 0 && preset.ucSelfConnectMode != ' '); // setDBusEngineParameter("no-mem-lock", // preset.bNoMemLock, // !preset.bNoMemLock); // setDBusEngineParameter("libs-unlock", // preset.bUnlockMem, // !preset.bNoMemLock); setDBusEngineParameter("driver", preset.sDriver); if ((bAlsa || bPortaudio) && (preset.iAudio != QJACKCTL_DUPLEX || preset.sInDevice.isEmpty() || preset.sOutDevice.isEmpty())) { QString sInterface = preset.sInterface; if (bAlsa && sInterface.isEmpty()) sInterface = "hw:0"; setDBusDriverParameter("device", sInterface, !sInterface.isEmpty()); } if (bPortaudio) { setDBusDriverParameter("channel", uint(preset.iChan), preset.iChan > 0); } if (bCoreaudio || bFirewire) { setDBusDriverParameter("device", preset.sInterface, !preset.sInterface.isEmpty()); } if (!bNet) { setDBusDriverParameter("rate", uint(preset.iSampleRate), preset.iSampleRate > 0); setDBusDriverParameter("period", uint(preset.iFrames), preset.iFrames > 0); } if (bAlsa || bSun || bOss || bFirewire) { setDBusDriverParameter("nperiods", uint(preset.iPeriods), preset.iPeriods > 1); } if (bAlsa) { setDBusDriverParameter("softmode", preset.bSoftMode, !preset.bSoftMode); setDBusDriverParameter("monitor", preset.bMonitor, !preset.bMonitor); setDBusDriverParameter("shorts", preset.bShorts, !preset.bShorts); setDBusDriverParameter("hwmeter", preset.bHWMeter, !preset.bShorts); #ifdef CONFIG_JACK_MIDI setDBusDriverParameter("midi-driver", preset.sMidiDriver, !preset.sMidiDriver.isEmpty()); #endif } if (bAlsa || bPortaudio) { QString sInterface = preset.sInterface; if (bAlsa && sInterface.isEmpty()) sInterface = "hw:0"; QString sInDevice = preset.sInDevice; if (sInDevice.isEmpty()) sInDevice = sInterface; QString sOutDevice = preset.sOutDevice; if (sOutDevice.isEmpty()) sOutDevice = sInterface; switch (preset.iAudio) { case QJACKCTL_DUPLEX: setDBusDriverParameter("duplex", true); setDBusDriverParameter("capture", sInDevice); setDBusDriverParameter("playback", sOutDevice); break; case QJACKCTL_CAPTURE: resetDBusDriverParameter("duplex"); setDBusDriverParameter("capture", sInDevice); resetDBusDriverParameter("playback"); break; case QJACKCTL_PLAYBACK: resetDBusDriverParameter("duplex"); setDBusDriverParameter("playback", sOutDevice); resetDBusDriverParameter("capture"); break; } setDBusDriverParameter("inchannels", uint(preset.iInChannels), preset.iInChannels > 0 && preset.iAudio != QJACKCTL_PLAYBACK); setDBusDriverParameter("outchannels", uint(preset.iOutChannels), preset.iOutChannels > 0 && preset.iAudio != QJACKCTL_CAPTURE); uchar dither = 0; switch (preset.iDither) { case 0: dither = 'n'; break; case 1: dither = 'r'; break; case 2: dither = 's'; break; case 3: dither = 't'; break; } setDBusDriverParameter("dither", QVariant::fromValue(dither), dither > 0); } else if (bOss || bSun) { QString sInDevice = preset.sInDevice; if (sInDevice.isEmpty() && preset.iAudio == QJACKCTL_CAPTURE) sInDevice = preset.sInterface; setDBusDriverParameter("capture", sInDevice, !sInDevice.isEmpty() && preset.iAudio != QJACKCTL_PLAYBACK); QString sOutDevice = preset.sOutDevice; if (sOutDevice.isEmpty() && preset.iAudio == QJACKCTL_PLAYBACK) sOutDevice = preset.sInterface; setDBusDriverParameter("playback", sOutDevice, !sOutDevice.isEmpty() && preset.iAudio != QJACKCTL_CAPTURE); setDBusDriverParameter("inchannels", uint(preset.iInChannels), preset.iInChannels > 0 && preset.iAudio != QJACKCTL_PLAYBACK); setDBusDriverParameter("outchannels", uint(preset.iOutChannels), preset.iOutChannels > 0 && preset.iAudio != QJACKCTL_CAPTURE); } else if (bCoreaudio || bFirewire || bNet) { setDBusDriverParameter("inchannels", uint(preset.iInChannels), preset.iInChannels > 0 && preset.iAudio != QJACKCTL_PLAYBACK); setDBusDriverParameter("outchannels", uint(preset.iOutChannels), preset.iOutChannels > 0 && preset.iAudio != QJACKCTL_CAPTURE); } if (bDummy) { setDBusDriverParameter("wait", uint(preset.iWait), preset.iWait > 0 && preset.iWait != 21333); } else if (!bNet) { setDBusDriverParameter("input-latency", uint(preset.iInLatency), preset.iInLatency > 0); setDBusDriverParameter("output-latency", uint(preset.iOutLatency), preset.iOutLatency > 0); } } // D-BUS: Set parameter values (with reset option). bool qjackctlMainForm::setDBusEngineParameter ( const QString& param, const QVariant& value, bool bSet ) { return setDBusParameter(QStringList() << "engine" << param, value, bSet); } bool qjackctlMainForm::setDBusDriverParameter ( const QString& param, const QVariant& value, bool bSet ) { return setDBusParameter(QStringList() << "driver" << param, value, bSet); } bool qjackctlMainForm::setDBusParameter ( const QStringList& path, const QVariant& value, bool bSet ) { if (m_pDBusConfig == nullptr) return false; if (!bSet) return resetDBusParameter(path); // Reset option. QDBusMessage dbusm = m_pDBusConfig->call( "SetParameterValue", path, QVariant::fromValue(QDBusVariant(value))); if (dbusm.type() == QDBusMessage::ErrorMessage) { if (m_bDBusDetach) { appendMessagesError( tr("D-BUS: SetParameterValue('%1', '%2'):\n\n" "%3.\n(%4)").arg(path.join(":")).arg(value.toString()) .arg(dbusm.errorMessage()) .arg(dbusm.errorName())); } return false; } return true; } // D-BUS: Reset parameter (to default) values. bool qjackctlMainForm::resetDBusEngineParameter ( const QString& param ) { return resetDBusParameter(QStringList() << "engine" << param); } bool qjackctlMainForm::resetDBusDriverParameter ( const QString& param ) { return resetDBusParameter(QStringList() << "driver" << param); } bool qjackctlMainForm::resetDBusParameter ( const QStringList& path ) { if (m_pDBusConfig == nullptr) return false; QDBusMessage dbusm = m_pDBusConfig->call("ResetParameterValue", path); if (dbusm.type() == QDBusMessage::ErrorMessage) { if (m_bDBusDetach) { appendMessagesError( tr("D-BUS: ResetParameterValue('%1'):\n\n" "%2.\n(%3)").arg(path.join(":")) .arg(dbusm.errorMessage()) .arg(dbusm.errorName())); } return false; } return true; } // D-BUS: Get preset options from current parameter values. bool qjackctlMainForm::getDBusParameters ( qjackctlPreset& preset ) { if (m_pSetup == nullptr) return false; if (m_pDBusConfig == nullptr) return false; // Get configuration parameters... QVariant var; // m_pSetup->sServerName.clear(); // var = getDBusEngineParameter("name"); // if (var.isValid()) // m_pSetup->sServerName = var.toString(); preset.bSync = false; var = getDBusEngineParameter("sync"); if (var.isValid()) preset.bSync = var.toBool(); preset.bVerbose = false; var = getDBusEngineParameter("verbose"); if (var.isValid()) preset.bVerbose = var.toBool(); preset.bRealtime = true; var = getDBusEngineParameter("realtime"); if (var.isValid()) preset.bRealtime = var.toBool(); preset.iPriority = 0; var = getDBusEngineParameter("realtime-priority"); if (var.isValid()) preset.iPriority = var.toInt(); preset.iPortMax = 0; var = getDBusEngineParameter("port-max"); if (var.isValid()) preset.iPortMax = var.toInt(); preset.iTimeout = 0; var = getDBusEngineParameter("client-timeout"); if (var.isValid()) preset.iTimeout = var.toInt(); preset.bNoMemLock = false; // var = getDBusEngineParameter("no-mem-lock"); // if (var.isValid()) // preset.bNoMemLock = var.ToBool(); preset.bUnlockMem = false; // var = getDBusEngineParameter("libs-unlock", // preset.bUnlockMem = var.toBool(); preset.ucSelfConnectMode = 0; var = getDBusEngineParameter("self-connect-mode"); if (var.isValid()) preset.ucClockSource = var.value (); preset.ucSelfConnectMode = 0; var = getDBusEngineParameter("self-connect-mode"); if (var.isValid()) preset.ucSelfConnectMode = var.value (); preset.sDriver.clear(); var = getDBusEngineParameter("driver"); if (var.isValid()) preset.sDriver = var.toString(); const bool bDummy = (preset.sDriver == "dummy"); const bool bSun = (preset.sDriver == "sun"); const bool bOss = (preset.sDriver == "oss"); const bool bAlsa = (preset.sDriver == "alsa"); const bool bPortaudio = (preset.sDriver == "portaudio"); const bool bCoreaudio = (preset.sDriver == "coreaudio"); const bool bFirewire = (preset.sDriver == "firewire"); const bool bNet = (preset.sDriver == "net" || preset.sDriver == "netone"); preset.sInterface.clear(); if (bAlsa || bPortaudio || bCoreaudio || bFirewire) { var = getDBusDriverParameter("device"); if (var.isValid()) preset.sInterface = var.toString(); } preset.iChan = 0; if (bPortaudio) { var = getDBusDriverParameter("channel"); if (var.isValid()) preset.iChan = var.toInt(); } preset.iSampleRate = 0; preset.iFrames = 0; if (!bNet) { var = getDBusDriverParameter("rate"); if (var.isValid()) preset.iSampleRate = var.toInt(); var = getDBusDriverParameter("period"); if (var.isValid()) preset.iFrames = var.toInt(); } preset.iPeriods = 0; if (bAlsa || bSun || bOss || bFirewire) { var = getDBusDriverParameter("nperiods"); if (var.isValid()) preset.iPeriods = var.toInt(); } preset.bSoftMode = false; preset.bMonitor = false; preset.bShorts = false; preset.bHWMeter = false; preset.sMidiDriver.clear(); if (bAlsa) { var = getDBusDriverParameter("softmode"); if (var.isValid()) preset.bSoftMode = var.toBool(); var = getDBusDriverParameter("monitor"); if (var.isValid()) preset.bMonitor = var.toBool(); var = getDBusDriverParameter("shorts"); if (var.isValid()) preset.bShorts = var.toBool(); var = getDBusDriverParameter("hwmeter"); if (var.isValid()) preset.bHWMeter = var.toBool(); #ifdef CONFIG_JACK_MIDI var = getDBusDriverParameter("midi-driver"); if (var.isValid()) preset.sMidiDriver = var.toString(); #endif } preset.iAudio = QJACKCTL_DUPLEX; preset.sInDevice.clear(); preset.sOutDevice.clear(); if (bAlsa || bPortaudio || bOss || bSun) { bool bDuplex = false; var = getDBusDriverParameter("duplex"); if (var.isValid()) bDuplex = var.toBool(); if (!bDuplex) { var = getDBusDriverParameter("capture"); if (var.isValid()) preset.sInDevice = var.toString(); var = getDBusDriverParameter("playback"); if (var.isValid()) preset.sOutDevice = var.toString(); if (!preset.sInDevice.isEmpty()) preset.iAudio = QJACKCTL_CAPTURE; if (!preset.sOutDevice.isEmpty()) preset.iAudio = QJACKCTL_PLAYBACK; } } preset.iInChannels = 0; preset.iOutChannels = 0; if (bAlsa || bPortaudio || bOss || bSun || bCoreaudio || bFirewire || bNet) { if (preset.iAudio != QJACKCTL_PLAYBACK) { var = getDBusDriverParameter("inchannels"); if (var.isValid()) preset.iInChannels = var.toInt(); } if (preset.iAudio != QJACKCTL_CAPTURE) { var = getDBusDriverParameter("outchannels"); if (var.isValid()) preset.iOutChannels = var.toInt(); } } preset.iDither = 0; if (bAlsa || bPortaudio) { unsigned char dither = 'n'; var = getDBusDriverParameter("dither"); if (var.isValid()) dither = var.toChar().cell(); switch (dither) { case 'n': preset.iDither = 0; break; case 'r': preset.iDither = 1; break; case 's': preset.iDither = 2; break; case 't': preset.iDither = 3; break; } } preset.iWait = 0; preset.iInLatency = 0; preset.iOutLatency = 0; if (bDummy) { var = getDBusDriverParameter("wait"); if (var.isValid()) preset.iWait = var.toInt(); } else if (!bNet) { var = getDBusDriverParameter("input-latency"); if (var.isValid()) preset.iInLatency = var.toInt(); var = getDBusDriverParameter("output-latency"); if (var.isValid()) preset.iOutLatency = var.toInt(); } return true; } // D-BUS: Get parameter values. QVariant qjackctlMainForm::getDBusEngineParameter ( const QString& param ) { return getDBusParameter(QStringList() << "engine" << param); } QVariant qjackctlMainForm::getDBusDriverParameter ( const QString& param ) { return getDBusParameter(QStringList() << "driver" << param); } QVariant qjackctlMainForm::getDBusParameter ( const QStringList& path ) { if (m_pDBusConfig == nullptr) return QVariant(); QDBusMessage dbusm = m_pDBusConfig->call("GetParameterValue", path); if (dbusm.type() == QDBusMessage::ErrorMessage) { if (m_bDBusDetach) { appendMessagesError( tr("D-BUS: GetParameterValue('%1'):\n\n" "%2.\n(%3)").arg(path.join(":")) .arg(dbusm.errorMessage()) .arg(dbusm.errorName())); } return QVariant(); } const QDBusVariant& dbusv = qvariant_cast (dbusm.arguments().at(2)); return dbusv.variant(); } QStringList qjackctlMainForm::getDBusParameterValues ( const QStringList& path ) { if (m_pDBusConfig == nullptr) return QStringList(); QDBusMessage dbusm = m_pDBusConfig->call("GetParameterConstraint", path); if (dbusm.type() == QDBusMessage::ErrorMessage) { if (m_bDBusDetach) { appendMessagesError( tr("D-BUS: GetParameterConstraint('%1'):\n\n" "%2.\n(%3)").arg(path.join(":")) .arg(dbusm.errorMessage()) .arg(dbusm.errorName())); } return QStringList(); } const QDBusArgument& dbusa = qvariant_cast (dbusm.arguments().at(3)); // return qdbus_cast (dbusa); QStringList list; dbusa.beginArray(); while (!dbusa.atEnd()) { QVariant var; dbusa >> var; const QDBusVariant& dbusv = qvariant_cast (var); list.append(dbusv.variant().toString()); } dbusa.endArray(); return list; } // D-BUS: List all supported engine/drivers. QStringList qjackctlMainForm::getDBusEngineDrivers (void) { return getDBusParameterValues(QStringList() << "engine" << "driver"); } #endif // CONFIG_DBUS // Whether detached as client only. bool qjackctlMainForm::isJackDetach (void) const { return m_bJackDetach; } // Quotes string with embedded whitespace. QString qjackctlMainForm::formatQuoted ( const QString& s ) const { const QChar b = ' '; const QChar q = '"'; return (s.contains(b) && !s.contains(q) ? q + s + q : s); } // Guarded transport play/pause toggle. void qjackctlMainForm::transportPlayStatus ( bool bOn ) { ++m_iTransportPlay; m_ui.PlayToolButton->setChecked(bOn); --m_iTransportPlay; } void qjackctlMainForm::commitData ( QSessionManager& sm ) { #if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) QStringList args; args << QApplication::applicationName(); args << "-platform" << QApplication::platformName(); args << "-session" << sm.sessionId(); sm.setRestartCommand(args); #endif sm.release(); #ifdef CONFIG_SYSTEM_TRAY m_bQuitClose = true; #endif m_bQuitForce = true; } // Some settings that are special someway... bool qjackctlMainForm::resetBuffSize ( jack_nframes_t nframes ) { if (m_pJackClient == nullptr) return false; if (g_buffsize == nframes) return true; if (jack_set_buffer_size(m_pJackClient, nframes) != 0) return false; // May reset some stats... resetXrunStats(); return true; } // end of qjackctlMainForm.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlPatchbayRack.h0000644000000000000000000000013215174607203017406 xustar0030 mtime=1777536643.515914291 30 atime=1777536643.515914291 30 ctime=1777536643.515914291 qjackctl-1.0.6/src/qjackctlPatchbayRack.h0000644000175000001440000002367315174607203017411 0ustar00rncbcusers// qjackctlPatchbayRack.h // /**************************************************************************** Copyright (C) 2003-2021, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlPatchbayRack_h #define __qjackctlPatchbayRack_h #include "qjackctlAbout.h" #include #include #include #ifdef CONFIG_ALSA_SEQ #include #else typedef void snd_seq_t; #endif // Patchbay socket types. #define QJACKCTL_SOCKETTYPE_DEFAULT -1 #define QJACKCTL_SOCKETTYPE_JACK_AUDIO 0 #define QJACKCTL_SOCKETTYPE_JACK_MIDI 1 #define QJACKCTL_SOCKETTYPE_ALSA_MIDI 2 // Patchbay slot normalization modes. #define QJACKCTL_SLOTMODE_OPEN 0 #define QJACKCTL_SLOTMODE_HALF 1 #define QJACKCTL_SLOTMODE_FULL 2 // Patchbay change signal flags. #define QJACKCTL_CABLE_FAILED 0 #define QJACKCTL_CABLE_CHECKED 1 #define QJACKCTL_CABLE_CONNECTED 2 #define QJACKCTL_CABLE_DISCONNECTED 3 // Struct name says it all. struct qjackctlAlsaMidiPort { QString sClientName; QString sPortName; int iAlsaClient; int iAlsaPort; }; // Patchbay socket definition. class qjackctlPatchbaySocket { public: // Constructor. qjackctlPatchbaySocket(const QString& sSocketName, const QString& sClientName, int iSocketType); // Default destructor. ~qjackctlPatchbaySocket(); // Socket property accessors. const QString& name() const; const QString& clientName() const; int type() const; bool isExclusive() const; const QString& forward() const; // Socket property methods. void setName(const QString& sSocketName); void setClientName(const QString& sClientName); void setType(int iSocketType); void setExclusive(bool bExclusive); void setForward(const QString& sSocketForward); // Plug list primitive methods. void addPlug(const QString& sPlugName); void removePlug(const QString& sPlugName); // Plug list accessor. QStringList& pluglist(); // Simple socket type methods. static int typeFromText(const QString& sSocketType); static QString textFromType(int iSocketType); private: // Properties. QString m_sSocketName; QString m_sClientName; int m_iSocketType; bool m_bExclusive; QString m_sSocketForward; // Patchbay socket plug list. QStringList m_pluglist; }; // Patchbay socket slot definition. class qjackctlPatchbaySlot { public: // Constructor. qjackctlPatchbaySlot(const QString& sSlotName, int iSlotMode = QJACKCTL_SLOTMODE_OPEN); // Default destructor. ~qjackctlPatchbaySlot(); // Slot property accessors. const QString& name() const; int mode() const; // Slot property methods. void setName(const QString& sSlotName); void setMode(int iSlotMode); // Socket methods. void setOutputSocket(qjackctlPatchbaySocket *pSocket); void setInputSocket(qjackctlPatchbaySocket *pSocket); // Socket accessors. qjackctlPatchbaySocket *outputSocket() const; qjackctlPatchbaySocket *inputSocket() const; private: // Slot properties. QString m_sSlotName; int m_iSlotMode; // Socket references. qjackctlPatchbaySocket *m_pOutputSocket; qjackctlPatchbaySocket *m_pInputSocket; }; // Patchbay cable connection definition. class qjackctlPatchbayCable { public: // Constructor. qjackctlPatchbayCable(qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket); // Default destructor. ~qjackctlPatchbayCable(); // Socket methods. void setOutputSocket(qjackctlPatchbaySocket *pSocket); void setInputSocket(qjackctlPatchbaySocket *pSocket); // Socket accessors. qjackctlPatchbaySocket *outputSocket() const; qjackctlPatchbaySocket *inputSocket() const; private: // Socket references. qjackctlPatchbaySocket *m_pOutputSocket; qjackctlPatchbaySocket *m_pInputSocket; }; // Patchbay rack profile definition. class qjackctlPatchbayRack : public QObject { Q_OBJECT public: // Constructor. qjackctlPatchbayRack(); // Default destructor. ~qjackctlPatchbayRack(); // Common socket list primitive methods. void addSocket(QList& socketlist, qjackctlPatchbaySocket *pSocket); void removeSocket(QList& socketlist, qjackctlPatchbaySocket *pSocket); // Slot list primitive methods. void addSlot(qjackctlPatchbaySlot *pSlot); void removeSlot(qjackctlPatchbaySlot *pSlot); // Cable list primitive methods. void addCable(qjackctlPatchbayCable *pCable); void removeCable(qjackctlPatchbayCable *pCable); // Common socket finder. qjackctlPatchbaySocket *findSocket( QList& socketlist, const QString& sSocketName, int iSocketType = QJACKCTL_SOCKETTYPE_DEFAULT); // Slot finders. qjackctlPatchbaySlot *findSlot(const QString& sSlotName); // Cable finder. qjackctlPatchbayCable *findCable( const QString& sOutputSocket, const QString& sInputSocket); qjackctlPatchbayCable *findCable(qjackctlPatchbayCable *pCablePtr); // Cable finder (logical matching by client/port names). qjackctlPatchbayCable *findCable ( const QString& sOClientName, const QString& sOPortName, const QString& sIClientName, const QString& sIPortName, int iSocketType); // Patchbay cleaner. void clear(); // Patchbay rack socket list accessors. QList& osocketlist(); QList& isocketlist(); // Patchbay rack slots list accessor. QList& slotlist(); // Patchbay cable connections list accessor. QList& cablelist(); // Overloaded cable connection persistence scan cycle methods. void connectJackScan(jack_client_t *pJackClient); void connectAlsaScan(snd_seq_t *pAlsaSeq); // Patchbay snapshot methods. void connectJackSnapshot(jack_client_t *pJackClient); void connectAlsaSnapshot(snd_seq_t *pAlsaSeq); // Patchbay reset/disconnect-all methods. void disconnectAllJackPorts(jack_client_t *pJackClient); void disconnectAllAlsaPorts(snd_seq_t *pAlsaSeq); signals: // Cable connection change signal. void cableConnected(const QString& sOutputPort, const QString& sInputPort, unsigned int uiCableFlags); private: // Audio connection scan related private methods. const char *findJackPort(const char **ppszJackPorts, const QString& sClientName, const QString& sPortName, int n = 0); void connectJackPorts( const char *pszOutputPort, const char *pszInputPort); void disconnectJackPorts( const char *pszOutputPort, const char *pszInputPort); void checkJackPorts( const char *pszOutputPort, const char *pszInputPort); void connectJackSocketPorts( qjackctlPatchbaySocket *pOutputSocket, const char *pszOutputPort, qjackctlPatchbaySocket *pInputSocket, const char *pszInputPort); void connectJackCable( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket); // MIDI connection scan related private methods. void loadAlsaPorts(QList& midiports, bool bReadable); qjackctlAlsaMidiPort *findAlsaPort(QList& midiports, const QString& sClientName, const QString& sPortName, int n); QString getAlsaPortName(qjackctlAlsaMidiPort *pAlsaPort); void setAlsaPort(qjackctlAlsaMidiPort *pAlsaPort, int iAlsaClient, int iAlsaPort); void connectAlsaPorts( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort); void disconnectAlsaPorts( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort); void checkAlsaPorts( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort); void connectAlsaSocketPorts( qjackctlPatchbaySocket *pOutputSocket, qjackctlAlsaMidiPort *pOutputPort, qjackctlPatchbaySocket *pInputSocket, qjackctlAlsaMidiPort *pInputPort); void connectAlsaCable( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket); void loadAlsaConnections(QList& midiports, qjackctlAlsaMidiPort *pAlsaPort, bool bReadable); // Audio socket/ports forwarding executive methods. void connectJackForwardPorts( const char *pszPort, const char *pszPortForward); void connectJackForward( qjackctlPatchbaySocket *pSocket, qjackctlPatchbaySocket *pSocketForward); // MIDI socket/ports forwarding executive methods. void connectAlsaForwardPorts( qjackctlAlsaMidiPort *pPort, qjackctlAlsaMidiPort *pPortForward); void connectAlsaForward( qjackctlPatchbaySocket *pSocket, qjackctlPatchbaySocket *pSocketForward); // Common socket forwarding scan method. void connectForwardScan(int iSocketType); // JACK snapshot executive. void connectJackSnapshotEx(int iSocketType); // JACK reset/disconnect-all executive. void disconnectAllJackPortsEx(int iSocketType); // Patchbay sockets lists. QList m_osocketlist; QList m_isocketlist; // Patchbay rack slots list. QList m_slotlist; // Patchbay cable connections list. QList m_cablelist; // Audio connection persistence cache variables. jack_client_t *m_pJackClient; const char **m_ppszOAudioPorts; const char **m_ppszIAudioPorts; const char **m_ppszOMidiPorts; const char **m_ppszIMidiPorts; // MIDI connection persistence cache variables. snd_seq_t *m_pAlsaSeq; QList m_omidiports; QList m_imidiports; }; #endif // __qjackctlPatchbayRack_h // qjackctlPatchbayRack.h qjackctl-1.0.6/src/PaxHeaders/qjackctlSession.h0000644000000000000000000000013215174607203016475 xustar0030 mtime=1777536643.515914291 30 atime=1777536643.515914291 30 ctime=1777536643.515914291 qjackctl-1.0.6/src/qjackctlSession.h0000644000175000001440000000632515174607203016473 0ustar00rncbcusers// qjackctlSession.h // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSession_h #define __qjackctlSession_h #include #include #include // Forward decls. class QSettings; //---------------------------------------------------------------------------- // qjackctlSession -- JACK session container. class qjackctlSession { public: // Constructor. qjackctlSession(); // Destructor. ~qjackctlSession(); // Container structs. struct ConnectItem { ConnectItem() : connected(false) {} QString client_name; QString port_name; bool connected; }; typedef QList ConnectList; struct PortItem { PortItem() : connected(0) {} ~PortItem() { qDeleteAll(connects); } QString port_name; int port_type; int connected; ConnectList connects; }; typedef QList PortList; struct ClientItem { ClientItem() : connected(0) {} ~ClientItem() { qDeleteAll(ports); } QString client_name; QString client_uuid; QString client_command; int connected; PortList ports; }; typedef QHash ClientList; // Client list accessor (read-only) const ClientList& clients() const; // House-keeper. void clear(); // Critical methods. enum SaveType { Save = 0, SaveAndQuit, SaveTemplate }; bool save(const QString& sSessionDir, SaveType stype = SaveType::Save); bool load(const QString& sSessionDir); // Update (re)connections utility method. bool update(); // Infra-client table. struct InfraClientItem { QString client_name; QString client_command; }; typedef QHash InfraClientList; // Infra-client list accessor (read-write) InfraClientList& infra_clients(); // Load/save all infra-clients from/to configuration file. void loadInfraClients(QSettings& settings); void saveInfraClients(QSettings& settings); // Clear infra-client table. void clearInfraClients(); // Check whether a given JACK client name exists... bool isJackClient(const QString& sClientName) const; protected: // File methods. bool loadFile(const QString& sFilename); bool saveFile(const QString& sFilename); private: // Instance variables. ClientList m_clients; // Infra-clients table. InfraClientList m_infra_clients; }; #endif // __qjackctlSession_h // end of qjackctlSession.h qjackctl-1.0.6/src/PaxHeaders/qjackctlConnectionsForm.ui0000644000000000000000000000013215174607203020346 xustar0030 mtime=1777536643.510914327 30 atime=1777536643.510914327 30 ctime=1777536643.510914327 qjackctl-1.0.6/src/qjackctlConnectionsForm.ui0000644000175000001440000004032515174607203020342 0ustar00rncbcusers rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2021, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlConnectionsForm 0 0 480 320 1 1 0 0 Connections :/images/connections1.png 4 4 0 Audio 4 4 7 7 0 0 Qt::TabFocus 4 4 Connect currently selected ports &Connect :/images/connect1.png Disconnect currently selected ports &Disconnect :/images/disconnect1.png Disconnect all currently connected ports Disconnect &All :/images/disconnectall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Expand all client ports E&xpand All :/images/expandall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Refresh current connections view &Refresh :/images/refresh1.png MIDI 4 4 7 7 0 0 Qt::TabFocus 4 4 Connect currently selected ports &Connect :/images/connect1.png Disconnect currently selected ports &Disconnect :/images/disconnect1.png Disconnect all currently connected ports Disconnect &All :/images/disconnectall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Expand all client ports E&xpand All :/images/expandall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Refresh current connections view &Refresh :/images/refresh1.png ALSA 4 4 7 7 0 0 Qt::TabFocus 4 4 Connect currently selected ports &Connect :/images/connect1.png Disconnect currently selected ports &Disconnect :/images/disconnect1.png Disconnect all currently connected ports Disconnect &All :/images/disconnectall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Expand all client ports E&xpand All :/images/expandall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Refresh current connections view &Refresh :/images/refresh1.png qjackctlConnectView QWidget
qjackctlConnect.h
ConnectionsTabWidget AudioConnectView AudioConnectPushButton AudioDisconnectPushButton AudioDisconnectAllPushButton AudioExpandAllPushButton AudioRefreshPushButton MidiConnectView MidiConnectPushButton MidiDisconnectPushButton MidiDisconnectAllPushButton MidiExpandAllPushButton MidiRefreshPushButton AlsaConnectView AlsaConnectPushButton AlsaDisconnectPushButton AlsaDisconnectAllPushButton AlsaExpandAllPushButton AlsaRefreshPushButton
qjackctl-1.0.6/src/PaxHeaders/qjackctl.h0000644000000000000000000000013215174607203015131 xustar0030 mtime=1777536643.509768862 30 atime=1777536643.509768862 30 ctime=1777536643.509768862 qjackctl-1.0.6/src/qjackctl.h0000644000175000001440000000574215174607203015131 0ustar00rncbcusers// qjackctl.h // /**************************************************************************** Copyright (C) 2003-2026, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctl_h #define __qjackctl_h #include "qjackctlAbout.h" #include #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #if defined(Q_WS_X11) #define CONFIG_X11 #endif #endif // Forward decls. class QWidget; class QTranslator; #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #ifdef CONFIG_XUNIQUE #ifdef CONFIG_X11 #include typedef unsigned long Window; typedef unsigned long Atom; #endif // CONFIG_X11 #endif // CONFIG_XUNIQUE #else #ifdef CONFIG_XUNIQUE class QSharedMemory; class QLocalServer; #endif // CONFIG_XUNIQUE #endif //------------------------------------------------------------------------- // Singleton application instance stuff (Qt/X11 only atm.) // class qjackctlApplication : public QApplication { Q_OBJECT public: // Constructor. qjackctlApplication(int& argc, char **argv); // Destructor. ~qjackctlApplication(); // Main application widget accessors. void setMainWidget(QWidget *pWidget); QWidget *mainWidget() const { return m_pWidget; } // Check if another instance is running, // and raise its proper main widget... bool setup(const QString& sServerName); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #ifdef CONFIG_XUNIQUE #ifdef CONFIG_X11 void x11PropertyNotify(Window w); bool x11EventFilter(XEvent *pEv) #endif // CONFIG_X11 #endif // CONFIG_XUNIQUE #else #ifdef CONFIG_XUNIQUE protected slots: // Local server slots. void newConnectionSlot(); void readyReadSlot(); protected: // Local server/shmem setup/cleanup. bool setupServer(); void clearServer(); #endif // CONFIG_XUNIQUE #endif private: // Translation support. QTranslator *m_pQtTranslator; QTranslator *m_pMyTranslator; // Instance variables. QWidget *m_pWidget; #ifdef CONFIG_XUNIQUE QString m_sServerName; #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #ifdef CONFIG_X11 Display *m_pDisplay; Atom m_aUnique; Window m_wOwner; #endif // CONFIG_X11 #else QString m_sUnique; QSharedMemory *m_pMemory; QLocalServer *m_pServer; #endif #endif // CONFIG_XUNIQUE }; #endif // __qjackctl_h // end of qjackctl.h qjackctl-1.0.6/src/PaxHeaders/qjackctlSocketForm.cpp0000644000000000000000000000013215174607203017461 xustar0030 mtime=1777536643.517914276 30 atime=1777536643.517914276 30 ctime=1777536643.517914276 qjackctl-1.0.6/src/qjackctlSocketForm.cpp0000644000175000001440000006507715174607203017470 0ustar00rncbcusers// qjackctlSocketForm.cpp // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSocketForm.h" #include "qjackctlMainForm.h" #include "qjackctlPatchbay.h" #include "qjackctlAliases.h" #include #include #include #include #include #include // QRegularExpression exact match pattern wrapper. #if QT_VERSION < QT_VERSION_CHECK(5, 12, 0) #define EXACT_PATTERN(s) ('^' + s + '$') #else #define EXACT_PATTERN(s) QRegularExpression::anchoredPattern(s) #endif //---------------------------------------------------------------------------- // qjackctlSocketForm -- UI wrapper form. // Constructor. qjackctlSocketForm::qjackctlSocketForm ( QWidget *pParent ) : QDialog(pParent) { // Setup UI struct... m_ui.setupUi(this); m_pSocketList = nullptr; m_bSocketNew = false; m_iSocketNameChanged = 0; m_ppPixmaps = nullptr; m_iDirtyCount = 0; // Setup time-display radio-button group. m_pSocketTypeButtonGroup = new QButtonGroup(this); m_pSocketTypeButtonGroup->addButton(m_ui.AudioRadioButton, 0); m_pSocketTypeButtonGroup->addButton(m_ui.MidiRadioButton, 1); m_pSocketTypeButtonGroup->addButton(m_ui.AlsaRadioButton, 2); m_pSocketTypeButtonGroup->setExclusive(true); // Plug list is not sortable. //m_ui.PlugListView->setSorting(-1); // Plug list view... QHeaderView *pHeader = m_ui.PlugListView->header(); // pHeader->setDefaultAlignment(Qt::AlignLeft); // pHeader->setDefaultSectionSize(300); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) // pHeader->setSectionResizeMode(QHeaderView::Custom); pHeader->setSectionsMovable(false); #else // pHeader->setResizeMode(QHeaderView::Custom); pHeader->setMovable(false); #endif pHeader->setStretchLastSection(true); #ifndef CONFIG_JACK_MIDI m_ui.MidiRadioButton->setEnabled(false); #endif #ifndef CONFIG_ALSA_SEQ m_ui.AlsaRadioButton->setEnabled(false); #endif // UI connections... QObject::connect(m_ui.PlugAddPushButton, SIGNAL(clicked()), SLOT(addPlug())); QObject::connect(m_ui.PlugRemovePushButton, SIGNAL(clicked()), SLOT(removePlug())); QObject::connect(m_ui.PlugEditPushButton, SIGNAL(clicked()), SLOT(editPlug())); QObject::connect(m_ui.PlugUpPushButton, SIGNAL(clicked()), SLOT(moveUpPlug())); QObject::connect(m_ui.PlugDownPushButton, SIGNAL(clicked()), SLOT(moveDownPlug())); QObject::connect(m_ui.PlugListView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), SLOT(selectedPlug())); QObject::connect(m_ui.SocketNameLineEdit, SIGNAL(textChanged(const QString&)), SLOT(socketNameChanged())); QObject::connect(m_ui.AudioRadioButton, SIGNAL(toggled(bool)), SLOT(socketTypeChanged())); QObject::connect(m_ui.MidiRadioButton, SIGNAL(toggled(bool)), SLOT(socketTypeChanged())); QObject::connect(m_ui.AlsaRadioButton, SIGNAL(toggled(bool)), SLOT(socketTypeChanged())); QObject::connect(m_ui.ExclusiveCheckBox, SIGNAL(toggled(bool)), SLOT(socketTypeChanged())); QObject::connect(m_ui.ClientNameComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(clientNameChanged())); QObject::connect(m_ui.PlugNameComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(changed())); QObject::connect(m_ui.PlugListView, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(customContextMenu(const QPoint&))); QObject::connect(m_ui.PlugListView->itemDelegate(), SIGNAL(commitData(QWidget*)), SLOT(changed())); QObject::connect(m_ui.SocketForwardComboBox, SIGNAL(activated(int)), SLOT(changed())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(accepted()), SLOT(accept())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(rejected()), SLOT(reject())); } // Destructor. qjackctlSocketForm::~qjackctlSocketForm (void) { delete m_pSocketTypeButtonGroup; } // Socket caption utility method. void qjackctlSocketForm::setSocketCaption ( const QString& sSocketCaption ) { m_ui.SocketTabWidget->setTabText(0, sSocketCaption); (m_ui.PlugListView->headerItem())->setText(0, sSocketCaption + ' ' + tr("Plugs / Ports")); } // Socket list enablement. void qjackctlSocketForm::setSocketList ( qjackctlSocketList *pSocketList ) { m_pSocketList = pSocketList; } // Socket new flag. void qjackctlSocketForm::setSocketNew ( bool bSocketNew ) { m_bSocketNew = bSocketNew; } // Pixmap utility methods. void qjackctlSocketForm::setPixmaps ( QPixmap **ppPixmaps ) { m_ppPixmaps = ppPixmaps; } // Socket type and exclusiveness editing enablement. void qjackctlSocketForm::setConnectCount ( int iConnectCount ) { // m_ui.SocketTypeGroupBox->setEnabled(iConnectCount < 1); if (iConnectCount) { switch (m_pSocketTypeButtonGroup->checkedId()) { case 0: // QJACKCTL_SOCKETTYPE_JACK_AUDIO m_ui.MidiRadioButton->setEnabled(false); m_ui.AlsaRadioButton->setEnabled(false); break; case 1: // QJACKCTL_SOCKETTYPE_JACK_MIDI m_ui.AudioRadioButton->setEnabled(false); m_ui.AlsaRadioButton->setEnabled(false); break; case 2: // QJACKCTL_SOCKETTYPE_ALSA_MIDI m_ui.AudioRadioButton->setEnabled(false); m_ui.MidiRadioButton->setEnabled(false); break; } } m_ui.ExclusiveCheckBox->setEnabled(iConnectCount < 2); #ifndef CONFIG_JACK_MIDI m_ui.MidiRadioButton->setEnabled(false); #endif #ifndef CONFIG_ALSA_SEQ m_ui.AlsaRadioButton->setEnabled(false); #endif } // Load dialog controls from socket properties. void qjackctlSocketForm::load ( qjackctlPatchbaySocket *pSocket ) { m_ui.SocketNameLineEdit->setText(pSocket->name()); QRadioButton *pRadioButton = static_cast ( m_pSocketTypeButtonGroup->button(pSocket->type())); if (pRadioButton) pRadioButton->setChecked(true); m_ui.ClientNameComboBox->setEditText(pSocket->clientName()); m_ui.ExclusiveCheckBox->setChecked(pSocket->isExclusive()); m_ui.PlugListView->clear(); QTreeWidgetItem *pPlugItem = nullptr; QStringListIterator iter(pSocket->pluglist()); while (iter.hasNext()) { const QString& sPlugName = iter.next(); pPlugItem = new QTreeWidgetItem(m_ui.PlugListView, pPlugItem); if (pPlugItem) { pPlugItem->setText(0, sPlugName); pPlugItem->setFlags(pPlugItem->flags() | Qt::ItemIsEditable); } } socketTypeChanged(); int iItemIndex = 0; if (!pSocket->forward().isEmpty()) { const int iItem = m_ui.SocketForwardComboBox->findText(pSocket->forward()); if (iItem >= 0) iItemIndex = iItem; } m_ui.SocketForwardComboBox->setCurrentIndex(iItemIndex); if (m_bSocketNew) m_iSocketNameChanged = 0; m_iDirtyCount = 0; stabilizeForm(); } // Save dialog controls into socket properties. void qjackctlSocketForm::save ( qjackctlPatchbaySocket *pSocket ) { pSocket->setName(m_ui.SocketNameLineEdit->text()); pSocket->setType(m_pSocketTypeButtonGroup->checkedId()); pSocket->setClientName(m_ui.ClientNameComboBox->currentText()); pSocket->setExclusive(m_ui.ExclusiveCheckBox->isChecked()); pSocket->pluglist().clear(); const int iPlugCount = m_ui.PlugListView->topLevelItemCount(); for (int iPlug = 0; iPlug < iPlugCount; ++iPlug) { QTreeWidgetItem *pItem = m_ui.PlugListView->topLevelItem(iPlug); pSocket->addPlug(pItem->text(0)); } if (m_ui.SocketForwardComboBox->currentIndex() > 0) pSocket->setForward(m_ui.SocketForwardComboBox->currentText()); else pSocket->setForward(QString()); m_iDirtyCount = 0; } // Stabilize current state form. void qjackctlSocketForm::stabilizeForm (void) { m_ui.DialogButtonBox->button( QDialogButtonBox::Ok)->setEnabled(validateForm()); QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) { const int iItem = m_ui.PlugListView->indexOfTopLevelItem(pItem); const int iItemCount = m_ui.PlugListView->topLevelItemCount(); m_ui.PlugEditPushButton->setEnabled(true); m_ui.PlugRemovePushButton->setEnabled(true); m_ui.PlugUpPushButton->setEnabled(iItem > 0); m_ui.PlugDownPushButton->setEnabled(iItem < iItemCount - 1); } else { m_ui.PlugEditPushButton->setEnabled(false); m_ui.PlugRemovePushButton->setEnabled(false); m_ui.PlugUpPushButton->setEnabled(false); m_ui.PlugDownPushButton->setEnabled(false); } bool bEnabled = !m_ui.PlugNameComboBox->currentText().isEmpty(); if (bEnabled) { bEnabled = (m_ui.PlugListView->findItems( m_ui.PlugNameComboBox->currentText(), Qt::MatchExactly).isEmpty()); } m_ui.PlugAddPushButton->setEnabled(bEnabled); } // Validate form fields. bool qjackctlSocketForm::validateForm (void) { bool bValid = (m_iDirtyCount > 0); bValid = bValid && !m_ui.SocketNameLineEdit->text().isEmpty(); bValid = bValid && !m_ui.ClientNameComboBox->currentText().isEmpty(); bValid = bValid && (m_ui.PlugListView->topLevelItemCount() > 0); return bValid; } // Validate form fields and accept it valid. void qjackctlSocketForm::accept (void) { if (m_pSocketList == nullptr) return; if (!validateForm()) return; // Check if a socket with the same name already exists... if (m_bSocketNew) { QListIterator iter(m_pSocketList->sockets()); while (iter.hasNext()) { const QString& sSocketName = iter.next()->socketName(); if (m_ui.SocketNameLineEdit->text() == sSocketName) { QMessageBox::critical(this, tr("Error") + " - " QJACKCTL_TITLE, tr("A socket named \"%1\" already exists.") .arg(sSocketName), QMessageBox::Cancel); // Reject. return; } } } QDialog::accept(); } void qjackctlSocketForm::reject (void) { bool bReject = true; // Check if there's any pending changes... if (m_iDirtyCount > 0) { switch (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_TITLE, tr("Some settings have been changed.\n\n" "Do you want to apply the changes?"), QMessageBox::Apply | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Apply: accept(); return; case QMessageBox::Discard: break; default: // Cancel. bReject = false; } } if (bReject) QDialog::reject(); } // Dirty up the current form. void qjackctlSocketForm::changed (void) { ++m_iDirtyCount; stabilizeForm(); } // Add new Plug to socket list. void qjackctlSocketForm::addPlug (void) { if (m_ppPixmaps == nullptr) return; QString sPlugName = m_ui.PlugNameComboBox->currentText(); if (!sPlugName.isEmpty()) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) pItem->setSelected(false); pItem = new QTreeWidgetItem(m_ui.PlugListView, pItem); if (pItem) { pItem->setText(0, sPlugName); pItem->setFlags(pItem->flags() | Qt::ItemIsEditable); QPixmap *pXpmPlug = nullptr; switch (m_pSocketTypeButtonGroup->checkedId()) { case 0: // QJACKCTL_SOCKETTYPE_JACK_AUDIO pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_AUDIO_PLUG]; break; case 1: // QJACKCTL_SOCKETTYPE_JACK_MIDI case 2: // QJACKCTL_SOCKETTYPE_ALSA_MIDI pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_MIDI_PLUG]; break; } if (pXpmPlug) pItem->setIcon(0, QIcon(*pXpmPlug)); pItem->setSelected(true); m_ui.PlugListView->setCurrentItem(pItem); } m_ui.PlugNameComboBox->setEditText(QString()); } clientNameChanged(); } // Rename current selected Plug. void qjackctlSocketForm::editPlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) m_ui.PlugListView->editItem(pItem, 0); clientNameChanged(); } // Remove current selected Plug. void qjackctlSocketForm::removePlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) delete pItem; clientNameChanged(); } // Move current selected Plug one position up. void qjackctlSocketForm::moveUpPlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) { int iItem = m_ui.PlugListView->indexOfTopLevelItem(pItem); if (iItem > 0) { pItem->setSelected(false); pItem = m_ui.PlugListView->takeTopLevelItem(iItem); m_ui.PlugListView->insertTopLevelItem(iItem - 1, pItem); pItem->setSelected(true); m_ui.PlugListView->setCurrentItem(pItem); } } changed(); } // Move current selected Plug one position down void qjackctlSocketForm::moveDownPlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) { int iItem = m_ui.PlugListView->indexOfTopLevelItem(pItem); int iItemCount = m_ui.PlugListView->topLevelItemCount(); if (iItem < iItemCount - 1) { pItem->setSelected(false); pItem = m_ui.PlugListView->takeTopLevelItem(iItem); m_ui.PlugListView->insertTopLevelItem(iItem + 1, pItem); pItem->setSelected(true); m_ui.PlugListView->setCurrentItem(pItem); } } changed(); } // Update selected plug one position down void qjackctlSocketForm::selectedPlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) m_ui.PlugNameComboBox->setEditText(pItem->text(0)); stabilizeForm(); } // Add new Plug from context menu. void qjackctlSocketForm::activateAddPlugMenu ( QAction *pAction ) { const int iIndex = pAction->data().toInt(); if (iIndex >= 0 && iIndex < m_ui.PlugNameComboBox->count()) { m_ui.PlugNameComboBox->setCurrentIndex(iIndex); addPlug(); } } // Plug list context menu handler. void qjackctlSocketForm::customContextMenu ( const QPoint& pos ) { int iItem = 0; int iItemCount = 0; QTreeWidgetItem *pItem = m_ui.PlugListView->itemAt(pos); if (pItem == nullptr) pItem = m_ui.PlugListView->currentItem(); if (pItem) { iItem = m_ui.PlugListView->indexOfTopLevelItem(pItem); iItemCount = m_ui.PlugListView->topLevelItemCount(); } QMenu menu(this); QAction *pAction; // Build the add plug sub-menu... QMenu *pAddPlugMenu = menu.addMenu( QIcon(":/images/add1.png"), tr("Add Plug")); int iIndex = 0; for (iIndex = 0; iIndex < m_ui.PlugNameComboBox->count(); iIndex++) { pAction = pAddPlugMenu->addAction( m_ui.PlugNameComboBox->itemText(iIndex)); pAction->setData(iIndex); } QObject::connect(pAddPlugMenu, SIGNAL(triggered(QAction*)), SLOT(activateAddPlugMenu(QAction*))); pAddPlugMenu->setEnabled(iIndex > 0); // Build the plug context menu... const bool bEnabled = (pItem != nullptr); pAction = menu.addAction(QIcon(":/images/edit1.png"), tr("Edit"), this, SLOT(editPlug())); pAction->setEnabled(bEnabled); pAction = menu.addAction(QIcon(":/images/remove1.png"), tr("Remove"), this, SLOT(removePlug())); pAction->setEnabled(bEnabled); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/up1.png"), tr("Move Up"), this, SLOT(moveUpPlug())); pAction->setEnabled(bEnabled && iItem > 0); pAction = menu.addAction(QIcon(":/images/down1.png"), tr("Move Down"), this, SLOT(moveDownPlug())); pAction->setEnabled(bEnabled && iItem < iItemCount - 1); menu.exec((m_ui.PlugListView->viewport())->mapToGlobal(pos)); } void qjackctlSocketForm::updateJackClients ( int iSocketType ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == nullptr) return; const char *pszJackPortType = JACK_DEFAULT_AUDIO_TYPE; int iPixmap = QJACKCTL_XPM_AUDIO_CLIENT; #ifdef CONFIG_JACK_MIDI if (iSocketType == QJACKCTL_SOCKETTYPE_JACK_MIDI) { pszJackPortType = JACK_DEFAULT_MIDI_TYPE; iPixmap = QJACKCTL_XPM_MIDI_CLIENT; } #endif const bool bReadable = m_pSocketList->isReadable(); const QIcon icon(*m_ppPixmaps[iPixmap]); // Grab all client ports. const char **ppszClientPorts = jack_get_ports( pJackClient, nullptr, pszJackPortType, (bReadable ? JackPortIsOutput : JackPortIsInput)); if (ppszClientPorts) { int iClientPort = 0; while (ppszClientPorts[iClientPort]) { QString sClientPort = QString::fromUtf8(ppszClientPorts[iClientPort]); int iColon = sClientPort.indexOf(':'); if (iColon >= 0) { QString sClientName = qjackctlAliasItem::escapeRegExpDigits( sClientPort.left(iColon)); bool bExists = false; for (int i = 0; i < m_ui.ClientNameComboBox->count() && !bExists; i++) bExists = (sClientName == m_ui.ClientNameComboBox->itemText(i)); if (!bExists) { m_ui.ClientNameComboBox->addItem(icon, sClientName); } } iClientPort++; } jack_free(ppszClientPorts); } } // ALSA client names refreshner. void qjackctlSocketForm::updateAlsaClients ( int iSocketType ) { if (iSocketType != QJACKCTL_SOCKETTYPE_ALSA_MIDI) return; #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == nullptr) return; const bool bReadable = m_pSocketList->isReadable(); const QIcon icon(*m_ppPixmaps[QJACKCTL_XPM_MIDI_CLIENT]); // Readd all subscribers... snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; unsigned int uiAlsaFlags; if (bReadable) uiAlsaFlags = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ; else uiAlsaFlags = SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); snd_seq_client_info_set_client(pClientInfo, -1); while (snd_seq_query_next_client(pAlsaSeq, pClientInfo) >= 0) { const int iAlsaClient = snd_seq_client_info_get_client(pClientInfo); QString sClient = qjackctlAliasItem::escapeRegExpDigits( QString::fromUtf8(snd_seq_client_info_get_name(pClientInfo))); if (iAlsaClient > 0) { bool bExists = false; snd_seq_port_info_set_client(pPortInfo, iAlsaClient); snd_seq_port_info_set_port(pPortInfo, -1); while (!bExists && snd_seq_query_next_port(pAlsaSeq, pPortInfo) >= 0) { const unsigned int uiPortCapability = snd_seq_port_info_get_capability(pPortInfo); if (((uiPortCapability & uiAlsaFlags) == uiAlsaFlags) && ((uiPortCapability & SND_SEQ_PORT_CAP_NO_EXPORT) == 0)) { for (int i = 0; i < m_ui.ClientNameComboBox->count() && !bExists; i++) bExists = (sClient == m_ui.ClientNameComboBox->itemText(i)); if (!bExists) { m_ui.ClientNameComboBox->addItem(icon, sClient); bExists = true; } } } } } #endif // CONFIG_ALSA_SEQ } // Socket type change slot. void qjackctlSocketForm::socketTypeChanged (void) { if (m_ppPixmaps == nullptr) return; if (m_pSocketList == nullptr) return; const bool bBlockSignals = m_ui.ClientNameComboBox->blockSignals(true); const QString sOldClientName = m_ui.ClientNameComboBox->currentText(); m_ui.ClientNameComboBox->clear(); QPixmap *pXpmSocket = nullptr; QPixmap *pXpmPlug = nullptr; const bool bReadable = m_pSocketList->isReadable(); const int iSocketType = m_pSocketTypeButtonGroup->checkedId(); switch (iSocketType) { case 0: // QJACKCTL_SOCKETTYPE_JACK_AUDIO if (m_ui.ExclusiveCheckBox->isChecked()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_AUDIO_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_AUDIO_SOCKET]; m_ui.SocketTabWidget->setTabIcon(0, QIcon(*pXpmSocket)); pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_AUDIO_PLUG]; updateJackClients(QJACKCTL_SOCKETTYPE_JACK_AUDIO); break; case 1: // QJACKCTL_SOCKETTYPE_JACK_MIDI if (m_ui.ExclusiveCheckBox->isChecked()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET]; m_ui.SocketTabWidget->setTabIcon(0, QIcon(*pXpmSocket)); pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_MIDI_PLUG]; updateJackClients(QJACKCTL_SOCKETTYPE_JACK_MIDI); break; case 2: // QJACKCTL_SOCKETTYPE_ALSA_MIDI if (m_ui.ExclusiveCheckBox->isChecked()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET]; m_ui.SocketTabWidget->setTabIcon(0, QIcon(*pXpmSocket)); pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_MIDI_PLUG]; updateAlsaClients(QJACKCTL_SOCKETTYPE_ALSA_MIDI); break; } const int iOldSocketNameChanged = m_iSocketNameChanged++; m_ui.ClientNameComboBox->setEditText(sOldClientName); clientNameChanged(); m_iSocketNameChanged = iOldSocketNameChanged; if (pXpmPlug) { const int iItemCount = m_ui.PlugListView->topLevelItemCount(); for (int iItem = 0; iItem < iItemCount; ++iItem) { QTreeWidgetItem *pItem = m_ui.PlugListView->topLevelItem(iItem); pItem->setIcon(0, QIcon(*pXpmPlug)); } } // Now the socket forward list... m_ui.SocketForwardComboBox->clear(); m_ui.SocketForwardComboBox->addItem(tr("(None)")); if (!bReadable) { QListIterator iter(m_pSocketList->sockets()); while (iter.hasNext()) { qjackctlSocketItem *pSocketItem = iter.next(); if (pSocketItem->socketType() == iSocketType && pSocketItem->socketName() != m_ui.SocketNameLineEdit->text()) { switch (iSocketType) { case 0: // QJACKCTL_SOCKETTYPE_JACK_AUDIO if (pSocketItem->isExclusive()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_AUDIO_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_AUDIO_SOCKET]; break; case 1: // QJACKCTL_SOCKETTYPE_JACK_MIDI case 2: // QJACKCTL_SOCKETTYPE_ALSA_MIDI if (pSocketItem->isExclusive()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET]; break; } m_ui.SocketForwardComboBox->addItem( QIcon(*pXpmSocket), pSocketItem->socketName()); } } } const bool bEnabled = (m_ui.SocketForwardComboBox->count() > 1); m_ui.SocketForwardTextLabel->setEnabled(bEnabled); m_ui.SocketForwardComboBox->setEnabled(bEnabled); m_ui.ClientNameComboBox->blockSignals(bBlockSignals); } // Socket name change slot. void qjackctlSocketForm::socketNameChanged (void) { ++m_iSocketNameChanged; changed(); } // JACK client plugs refreshner. void qjackctlSocketForm::updateJackPlugs ( int iSocketType ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == nullptr) return; const char *pszJackPortType = JACK_DEFAULT_AUDIO_TYPE; int iPixmap = QJACKCTL_XPM_AUDIO_PLUG; #ifdef CONFIG_JACK_MIDI if (iSocketType == QJACKCTL_SOCKETTYPE_JACK_MIDI) { pszJackPortType = JACK_DEFAULT_MIDI_TYPE; iPixmap = QJACKCTL_XPM_MIDI_PLUG; } #endif const QString sClientName = m_ui.ClientNameComboBox->currentText(); if (sClientName.isEmpty()) return; QRegularExpression rxClientName(EXACT_PATTERN(sClientName)); const bool bReadable = m_pSocketList->isReadable(); const QIcon icon(*m_ppPixmaps[iPixmap]); const char **ppszClientPorts = jack_get_ports( pJackClient, nullptr, pszJackPortType, (bReadable ? JackPortIsOutput : JackPortIsInput)); if (ppszClientPorts) { int iClientPort = 0; while (ppszClientPorts[iClientPort]) { const QString sClientPort = QString::fromUtf8(ppszClientPorts[iClientPort]); const int iColon = sClientPort.indexOf(':'); if (iColon >= 0 && rxClientName.match(sClientPort.left(iColon)).hasMatch()) { const QString sPort = qjackctlAliasItem::escapeRegExpDigits( sClientPort.right(sClientPort.length() - iColon - 1)); if (m_ui.PlugListView->findItems(sPort, Qt::MatchExactly).isEmpty()) m_ui.PlugNameComboBox->addItem(icon, sPort); } ++iClientPort; } jack_free(ppszClientPorts); } } // ALSA client plugs refreshner. void qjackctlSocketForm::updateAlsaPlugs ( int iSocketType ) { if (iSocketType != QJACKCTL_SOCKETTYPE_ALSA_MIDI) return; #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == nullptr) return; const QString sClientName = m_ui.ClientNameComboBox->currentText(); if (sClientName.isEmpty()) return; QRegularExpression rxClientName(EXACT_PATTERN(sClientName)); const bool bReadable = m_pSocketList->isReadable(); const QIcon icon(*m_ppPixmaps[QJACKCTL_XPM_MIDI_PLUG]); // Fill sequencer plugs... snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; unsigned int uiAlsaFlags; if (bReadable) uiAlsaFlags = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ; else uiAlsaFlags = SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); snd_seq_client_info_set_client(pClientInfo, -1); while (snd_seq_query_next_client(pAlsaSeq, pClientInfo) >= 0) { const int iAlsaClient = snd_seq_client_info_get_client(pClientInfo); const QString sClient = QString::fromUtf8( snd_seq_client_info_get_name(pClientInfo)); if (iAlsaClient > 0 && rxClientName.match(sClient).hasMatch()) { snd_seq_port_info_set_client(pPortInfo, iAlsaClient); snd_seq_port_info_set_port(pPortInfo, -1); while (snd_seq_query_next_port(pAlsaSeq, pPortInfo) >= 0) { const unsigned int uiPortCapability = snd_seq_port_info_get_capability(pPortInfo); if (((uiPortCapability & uiAlsaFlags) == uiAlsaFlags) && ((uiPortCapability & SND_SEQ_PORT_CAP_NO_EXPORT) == 0)) { const QString sPort = qjackctlAliasItem::escapeRegExpDigits( QString::fromUtf8(snd_seq_port_info_get_name(pPortInfo))); if (m_ui.PlugListView->findItems(sPort, Qt::MatchExactly).isEmpty()) m_ui.PlugNameComboBox->addItem(icon, sPort); } } } } #endif // CONFIG_ALSA_SEQ } // Update client list if available. void qjackctlSocketForm::clientNameChanged (void) { if (m_ppPixmaps == nullptr) return; if (m_pSocketList == nullptr) return; m_ui.PlugNameComboBox->clear(); const int iSocketType = m_pSocketTypeButtonGroup->checkedId(); switch (iSocketType) { case 0: updateJackPlugs(QJACKCTL_SOCKETTYPE_JACK_AUDIO); break; case 1: updateJackPlugs(QJACKCTL_SOCKETTYPE_JACK_MIDI); break; case 2: updateAlsaPlugs(QJACKCTL_SOCKETTYPE_ALSA_MIDI); break; } if (m_iSocketNameChanged < 1) { // Find a new distinguishable socket name, please. QString sSocketName = m_ui.ClientNameComboBox->currentText(); if (!sSocketName.isEmpty()) { int iSocketNo = 0; QString sSocketMask = sSocketName; sSocketMask.remove(QRegularExpression("[ |0-9]+$")).append(" %1"); do { sSocketName = sSocketMask.arg(++iSocketNo); } while (m_pSocketList->findSocket(sSocketName, iSocketType)); m_ui.SocketNameLineEdit->setText(sSocketName); m_iSocketNameChanged = 0; } } changed(); } // end of qjackctlSocketForm.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlPaletteForm.h0000644000000000000000000000013215174607203017274 xustar0030 mtime=1777536643.512914312 30 atime=1777536643.512914312 30 ctime=1777536643.512914312 qjackctl-1.0.6/src/qjackctlPaletteForm.h0000644000175000001440000001703015174607203017265 0ustar00rncbcusers// qjackctlPaletteForm.h // /**************************************************************************** Copyright (C) 2005-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlPaletteForm_h #define __qjackctlPaletteForm_h #include #include #include #include #include #include // Forward decls. class QListView; class QLabel; class QToolButton; //------------------------------------------------------------------------- // qjackctlPaletteForm namespace Ui { class qjackctlPaletteForm; } class qjackctlPaletteForm: public QDialog { Q_OBJECT public: qjackctlPaletteForm(QWidget *parent = nullptr, const QPalette& pal = QPalette()); virtual ~qjackctlPaletteForm(); void setPalette(const QPalette& pal); const QPalette& palette() const; void setSettings(QSettings *settings, bool owner = false); QSettings *settings() const; void setPaletteName(const QString& name); QString paletteName() const; bool isDirty() const; static bool namedPalette(QSettings *settings, const QString& name, QPalette& pal, bool fixup = false); static QStringList namedPaletteList(QSettings *settings); static QString namedPaletteConf( QSettings *settings, const QString& name); static void addNamedPaletteConf( QSettings *settings, const QString& name, const QString& filename); static QPalette::ColorRole colorRole(const QString& name); class PaletteModel; class ColorDelegate; class ColorButton; class ColorEditor; class RoleEditor; protected slots: void nameComboChanged(const QString& name); void saveButtonClicked(); void deleteButtonClicked(); void generateButtonChanged(); void resetButtonClicked(); void detailsCheckClicked(); void importButtonClicked(); void exportButtonClicked(); void paletteChanged(const QPalette& pal); void accept(); void reject(); protected: void setPalette(const QPalette& pal, const QPalette& parentPal); bool namedPalette(const QString& name, QPalette& pal) const; QStringList namedPaletteList() const; QString namedPaletteConf(const QString& name) const; void addNamedPaletteConf(const QString& name, const QString& filename); void deleteNamedPaletteConf(const QString& name); static bool loadNamedPaletteConf( const QString& name, const QString& filename, QPalette& pal); static bool saveNamedPaletteConf( const QString& name, const QString& filename, const QPalette& pal); static bool loadNamedPalette( QSettings *settings, const QString& name, QPalette& pal); static bool saveNamedPalette( QSettings *settings, const QString& name, const QPalette& pal); void updateNamedPaletteList(); void updateGenerateButton(); void updateDialogButtons(); void setDefaultDir(const QString& dir); QString defaultDir() const; void setShowDetails(bool on); bool isShowDetails() const; void showEvent(QShowEvent *event); void resizeEvent(QResizeEvent *event); private: Ui::qjackctlPaletteForm *p_ui; Ui::qjackctlPaletteForm& m_ui; QSettings *m_settings; bool m_owner; QPalette m_palette; QPalette m_parentPalette; PaletteModel *m_paletteModel; bool m_modelUpdated; bool m_paletteUpdated; int m_dirtyCount; int m_dirtyTotal; }; //------------------------------------------------------------------------- // qjackctlPaletteForm::PaletteModel class qjackctlPaletteForm::PaletteModel : public QAbstractTableModel { Q_OBJECT Q_PROPERTY(QPalette::ColorRole colorRole READ colorRole) public: PaletteModel(QObject *parent = nullptr); int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; bool setData(const QModelIndex &index, const QVariant &value, int role); Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; void setPalette(const QPalette &palette, const QPalette &parentPalette); const QPalette& palette() const; void setGenerate(bool on) { m_generate = on; } QPalette::ColorRole colorRole() const { return QPalette::NoRole; } signals: void paletteChanged(const QPalette &palette); protected: QPalette::ColorGroup columnToGroup(int index) const; int groupToColumn(QPalette::ColorGroup group) const; private: QPalette m_palette; QPalette m_parentPalette; QMap m_roleNames; int m_nrows; bool m_generate; }; //------------------------------------------------------------------------- // qjackctlPaletteForm::ColorDelegate class qjackctlPaletteForm::ColorDelegate : public QItemDelegate { public: ColorDelegate(QObject *parent = nullptr) : QItemDelegate(parent) {} QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem& option, const QModelIndex& index) const; void setEditorData(QWidget *editor, const QModelIndex& index) const; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex& index) const; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem& option, const QModelIndex &index) const; virtual void paint(QPainter *painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; virtual QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; }; //------------------------------------------------------------------------- // qjackctlPaletteForm::ColorButton class qjackctlPaletteForm::ColorButton : public QPushButton { Q_OBJECT Q_PROPERTY(QBrush brush READ brush WRITE setBrush) public: ColorButton (QWidget *parent = nullptr); const QBrush& brush() const; void setBrush(const QBrush& b); signals: void changed(); protected slots: void chooseColor(); protected: void paintEvent(QPaintEvent *event); private: QBrush m_brush; }; //------------------------------------------------------------------------- // PaleteEditor::ColorEditor class qjackctlPaletteForm::ColorEditor : public QWidget { Q_OBJECT public: ColorEditor(QWidget *parent = nullptr); void setColor(const QColor &color); QColor color() const; bool changed() const; signals: void changed(QWidget *widget); protected slots: void colorChanged(); private: qjackctlPaletteForm::ColorButton *m_button; bool m_changed; }; //------------------------------------------------------------------------- // PaleteEditor::RoleEditor class qjackctlPaletteForm::RoleEditor : public QWidget { Q_OBJECT public: RoleEditor(QWidget *parent = nullptr); void setLabel(const QString &label); void setEdited(bool on); bool edited() const; signals: void changed(QWidget *widget); protected slots: void resetProperty(); private: QLabel *m_label; QToolButton *m_button; bool m_edited; }; #endif // __qjackctlPaletteForm_h // end of qjackctlPaletteForm.h qjackctl-1.0.6/src/PaxHeaders/qjackctlMainForm.h0000644000000000000000000000013215174607203016562 xustar0030 mtime=1777536643.512914312 30 atime=1777536643.512914312 30 ctime=1777536643.512914312 qjackctl-1.0.6/src/qjackctlMainForm.h0000644000175000001440000002334215174607203016556 0ustar00rncbcusers// qjackctlMainForm.h // /**************************************************************************** Copyright (C) 2003-2025, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlMainForm_h #define __qjackctlMainForm_h #include "ui_qjackctlMainForm.h" #include "qjackctlSetup.h" #include #include #include #include #include #include #ifdef CONFIG_ALSA_SEQ #include #else typedef void snd_seq_t; #endif // Forward declarations. class qjackctlSetup; class qjackctlSetupForm; class qjackctlMessagesStatusForm; class qjackctlSessionForm; class qjackctlConnectionsForm; class qjackctlPatchbayForm; class qjackctlPatchbayRack; class qjackctlGraphForm; class qjackctlGraphPort; class qjackctlPortItem; #ifdef CONFIG_SYSTEM_TRAY class qjackctlSystemTray; #endif class QSocketNotifier; class QSessionManager; #ifdef CONFIG_DBUS class QDBusInterface; class qjackctlDBusLogWatcher; #endif //---------------------------------------------------------------------------- // qjackctlMainForm -- UI wrapper form. class qjackctlMainForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlMainForm(QWidget *pParent = nullptr, Qt::WindowFlags wflags = Qt::WindowFlags()); // Destructor. ~qjackctlMainForm(); static qjackctlMainForm *getInstance(); bool setup(qjackctlSetup *pSetup); qjackctlSetup *setup() const; jack_client_t *jackClient() const; snd_seq_t *alsaSeq() const; void appendMessages(const QString& s); bool isActivePatchbay(const QString& sPatchbayPath) const; void updateActivePatchbay(); void setActivePatchbay(const QString& sPatchbayPath); void setRecentPatchbays(const QStringList& patchbays); void stabilizeForm(); void stabilizeFormEx(); void stabilize(int msecs); void refreshXrunStats(); void refreshJackConnections(bool bClear = false); void refreshAlsaConnections(bool bClear = false); void refreshPatchbay(); void queryDisconnect( qjackctlGraphPort *port1, qjackctlGraphPort *port2); void queryDisconnect( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort, int iSocketType); void updateMessagesFont(); void updateMessagesLimit(); void updateMessagesLogging(); void updateConnectionsFont(); void updateConnectionsIconSize(); void updateJackClientPortAlias(); void updateJackClientPortMetadata(); void updateDisplayEffect(); void updateTimeDisplayFonts(); void updateTimeDisplayToolTips(); void updateAliases(); void updateButtons(); void updatePalette(); #ifdef CONFIG_DBUS void updateJackDBus(); #endif #ifdef CONFIG_SYSTEM_TRAY void updateSystemTray(); #endif void showDirtySetupWarning(); // Some settings that are special someway... bool resetBuffSize(jack_nframes_t nframes); // Restart JACk audio service. void restartJack(); #ifdef CONFIG_DBUS QStringList getDBusEngineDrivers(); #endif // Whether detached as client only. bool isJackDetach() const; public slots: void startJack(); void stopJack(); void toggleJack(); void showSetupForm(); void showAboutForm(); void resetXrunStats(); void commitData(QSessionManager& sm); void activatePreset(const QString&); void activatePatchbay(const QString&); protected slots: void readStdout(); void jackStarted(); void jackError(QProcess::ProcessError); void jackFinished(); void jackCleanup(); void jackStabilize(); void stdoutNotifySlot(int); void sigtermNotifySlot(int); void alsaNotifySlot(int); void timerSlot(); void jackConnectChanged(); void alsaConnectChanged(); void cableConnectSlot(const QString&, const QString&, unsigned int); void toggleMainForm(); void toggleMessagesStatusForm(); void toggleMessagesForm(); void toggleStatusForm(); void toggleSessionForm(); void toggleConnectionsForm(); void togglePatchbayForm(); void toggleGraphForm(); void transportRewind(); void transportBackward(); void transportPlay(bool); void transportStart(); void transportStop(); void transportForward(); void activatePresetsMenu(QAction *); void activatePreset(int); void quitMainForm(); protected: bool queryClose(); bool queryClosePreset(); bool queryRestart(); bool queryShutdown(); void showEvent(QShowEvent *pShowEvent); void hideEvent(QHideEvent *pHideEvent); void closeEvent(QCloseEvent *pCloseEvent); void resizeEvent(QResizeEvent *pResizeEvent); void customEvent(QEvent *pEvent); void appendStdoutBuffer(const QString& s); void processStdoutBuffer(); void flushStdoutBuffer(); bool stdoutBlock(int fd, bool bBlock) const; QString formatExitStatus(int iExitStatus) const; void shellExecute(const QString& sShellCommand, const QString& sStartMessage, const QString& sStopMessage); void stopJackServer(); QString& detectXrun(QString& s); void updateXrunStats(float fXrunLast); void appendMessagesColor(const QString& s, const QColor& rgb); void appendMessagesText(const QString& s); void appendMessagesError(const QString& s); void updateXrunCount(); QString formatTime(float secs) const; QString formatElapsedTime(int iStatusItem, const QTime& time, const QElapsedTimer& timer) const; void updateElapsedTimes(); void updateContextMenu(); void portNotifyEvent(); void xrunNotifyEvent(); void buffNotifyEvent(); void shutNotifyEvent(); void freeNotifyEvent(); void exitNotifyEvent(); #ifdef CONFIG_JACK_METADATA void propNotifyEvent(); #endif void startJackClientDelay(); bool startJackClient(bool bDetach); void stopJackClient(); void refreshConnections(); void refreshStatus(); void updateStatusItem(int iStatusItem, const QString& sText); void updateTitleStatus(); void updateServerState(int iState); void contextMenuEvent(QContextMenuEvent *); void mousePressEvent(QMouseEvent *pMouseEvent); void queryDisconnect( const QString& sOClientName, const QString& sOPortName, const QString& sIClientName, const QString& sIPortName, int iSocketType); #ifdef CONFIG_DBUS // D-BUS: Set/reset parameter values // from current selected preset options. void setDBusParameters(const qjackctlPreset& preset); // D-BUS: Set parameter values (with reset option). bool setDBusEngineParameter( const QString& param, const QVariant& value, bool bSet = true); bool setDBusDriverParameter( const QString& param, const QVariant& value, bool bSet = true); bool setDBusParameter( const QStringList& path, const QVariant& value, bool bSet = true); // D-BUS: Reset parameter (to default) values. bool resetDBusEngineParameter(const QString& param); bool resetDBusDriverParameter(const QString& param); bool resetDBusParameter(const QStringList& path); // D-BUS: Get preset options // from current parameter values. bool getDBusParameters(qjackctlPreset& preset); // D-BUS: Get parameter values. QVariant getDBusEngineParameter(const QString& param); QVariant getDBusDriverParameter(const QString& param); QVariant getDBusParameter(const QStringList& path); QStringList getDBusParameterValues(const QStringList& path); #endif // Quotes string with embedded whitespace. QString formatQuoted(const QString& s) const; // Guarded transport play/pause toggle. void transportPlayStatus(bool bOn); private: // The Qt-designer UI struct... Ui::qjackctlMainForm m_ui; // Instance variables. qjackctlSetup *m_pSetup; QProcess *m_pJack; int m_iServerState; jack_client_t *m_pJackClient; bool m_bJackDetach; bool m_bJackShutdown; bool m_bJackRestart; snd_seq_t *m_pAlsaSeq; #ifdef CONFIG_DBUS QDBusInterface *m_pDBusControl; QDBusInterface *m_pDBusConfig; qjackctlDBusLogWatcher *m_pDBusLogWatcher; bool m_bDBusStarted; bool m_bDBusDetach; #endif #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) bool m_bJackKilled; #endif int m_iStartDelay; int m_iTimerDelay; int m_iTimerRefresh; int m_iJackRefresh; int m_iAlsaRefresh; int m_iJackDirty; int m_iAlsaDirty; int m_iStatusBlink; int m_iStatusRefresh; int m_iPatchbayRefresh; int m_iJackRefreshClear; int m_iAlsaRefreshClear; QSocketNotifier *m_pStdoutNotifier; QSocketNotifier *m_pSigtermNotifier; QSocketNotifier *m_pAlsaNotifier; int m_iXrunCallbacks; int m_iXrunSkips; int m_iXrunStats; int m_iXrunCount; float m_fXrunTotal; float m_fXrunMax; float m_fXrunMin; float m_fXrunLast; QTime m_timeXrunLast; QTime m_timeResetLast; QElapsedTimer m_timerXrunLast; QElapsedTimer m_timerResetLast; qjackctlMessagesStatusForm *m_pMessagesStatusForm; qjackctlSessionForm *m_pSessionForm; qjackctlConnectionsForm *m_pConnectionsForm; qjackctlPatchbayForm *m_pPatchbayForm; qjackctlGraphForm *m_pGraphForm; qjackctlSetupForm *m_pSetupForm; qjackctlPatchbayRack *m_pPatchbayRack; qjackctlPreset m_preset; QString m_sStdoutBuffer; QString m_sJackCmdLine; #ifdef CONFIG_SYSTEM_TRAY qjackctlSystemTray *m_pSystemTray; bool m_bQuitClose; #endif bool m_bQuitForce; float m_fSkipAccel; int m_iTransportPlay; // Common context menu. QMenu m_menu; int m_iMenuRefresh; // Kind-of singleton reference. static qjackctlMainForm *g_pMainForm; }; #endif // __qjackctlMainForm_h // end of qjackctlMainForm.h qjackctl-1.0.6/src/PaxHeaders/qjackctlPatchbay.h0000644000000000000000000000013215174607203016605 xustar0030 mtime=1777536643.514914298 30 atime=1777536643.514914298 30 ctime=1777536643.514914298 qjackctl-1.0.6/src/qjackctlPatchbay.h0000644000175000001440000002632515174607203016605 0ustar00rncbcusers// qjackctlPatchbay.h // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlPatchbay_h #define __qjackctlPatchbay_h #include #include // Our external patchbay models. #include "qjackctlPatchbayRack.h" // QListViewItem::rtti return values. #define QJACKCTL_SOCKETITEM 2001 #define QJACKCTL_PLUGITEM 2002 // Forward declarations. class qjackctlPlugItem; class qjackctlSocketItem; class qjackctlSocketList; class qjackctlSocketListView; class qjackctlPatchworkView; class qjackctlPatchbayView; class qjackctlPatchbay; // Pixmap-set indexes. #define QJACKCTL_XPM_AUDIO_SOCKET 0 #define QJACKCTL_XPM_AUDIO_SOCKET_X 1 #define QJACKCTL_XPM_AUDIO_CLIENT 2 #define QJACKCTL_XPM_AUDIO_PLUG 3 #define QJACKCTL_XPM_MIDI_SOCKET 4 #define QJACKCTL_XPM_MIDI_SOCKET_X 5 #define QJACKCTL_XPM_MIDI_CLIENT 6 #define QJACKCTL_XPM_MIDI_PLUG 7 #define QJACKCTL_XPM_PIXMAPS 8 // Patchbay plug (port) list item. class qjackctlPlugItem : public QTreeWidgetItem { public: // Constructor. qjackctlPlugItem(qjackctlSocketItem *pSocket, const QString& sPlugName, qjackctlPlugItem *pPlugAfter); // Default destructor. ~qjackctlPlugItem(); // Instance accessors. const QString& socketName() const; const QString& plugName() const; // Patchbay socket item accessor. qjackctlSocketItem *socket() const; private: // Instance variables. qjackctlSocketItem *m_pSocket; QString m_sPlugName; }; // Patchbay socket (client) list item. class qjackctlSocketItem : public QTreeWidgetItem { public: // Constructor. qjackctlSocketItem(qjackctlSocketList *pSocketList, const QString& sSocketName, const QString& sClientName, int iSocketType,qjackctlSocketItem *pSocketAfter); // Default destructor. ~qjackctlSocketItem(); // Instance accessors. const QString& socketName() const; const QString& clientName() const; int socketType() const; bool isExclusive() const; const QString& forward() const; void setSocketName (const QString& sSocketName); void setClientName (const QString& sClientName); void setSocketType (int iSocketType); void setExclusive (bool bExclusive); void setForward (const QString& sSocketForward); // Socket flags accessor. bool isReadable() const; // Connected plug list primitives. void addConnect(qjackctlSocketItem *pSocket); void removeConnect(qjackctlSocketItem *pSocket); // Connected plug finders. qjackctlSocketItem *findConnectPtr(qjackctlSocketItem *pSocketPtr); // Connection list accessor. const QList& connects() const; // Plug list primitive methods. void addPlug(qjackctlPlugItem *pPlug); void removePlug(qjackctlPlugItem *pPlug); // Plug finder. qjackctlPlugItem *findPlug(const QString& sPlugName); // Plug list accessor. QList& plugs(); // Plug list cleaner. void clear(); // Retrieve a context pixmap. const QPixmap& pixmap(int iPixmap) const; // Update pixmap to its proper context. void updatePixmap(); // Client item openness status. void setOpen(bool bOpen); bool isOpen() const; private: // Instance variables. qjackctlSocketList *m_pSocketList; QString m_sSocketName; QString m_sClientName; int m_iSocketType; bool m_bExclusive; QString m_sSocketForward; // Plug (port) list. QList m_plugs; // Connection cache list. QList m_connects; }; // Patchbay socket (client) list. class qjackctlSocketList : public QObject { Q_OBJECT public: // Constructor. qjackctlSocketList(qjackctlSocketListView *pListView, bool bReadable); // Default destructor. ~qjackctlSocketList(); // Socket list primitive methods. void addSocket(qjackctlSocketItem *pSocket); void removeSocket(qjackctlSocketItem *pSocket); // Socket finder. qjackctlSocketItem *findSocket(const QString& sSocketName, int iSocketType); // List view accessor. qjackctlSocketListView *listView() const; // Socket flags accessor. bool isReadable() const; // Socket aesthetics accessors. const QString& socketCaption() const; // Socket list cleaner. void clear(); // Socket list accessor. QList& sockets(); // Find the current selected socket item in list. qjackctlSocketItem *selectedSocketItem() const; // Retrieve a context pixmap. const QPixmap& pixmap(int iPixmap) const; public slots: // Socket item interactivity methods. bool addSocketItem(); bool removeSocketItem(); bool editSocketItem(); bool copySocketItem(); bool exclusiveSocketItem(); bool moveUpSocketItem(); bool moveDownSocketItem(); private: // Merge two pixmaps with union of respective masks. QPixmap *createPixmapMerge(const QPixmap& xpmDst, const QPixmap& xpmSrc); // Instance variables. qjackctlSocketListView *m_pListView; bool m_bReadable; QString m_sSocketCaption; QPixmap *m_apPixmaps[QJACKCTL_XPM_PIXMAPS]; QList m_sockets; }; //---------------------------------------------------------------------------- // qjackctlSocketListView -- Socket list view, supporting drag-n-drop. class qjackctlSocketListView : public QTreeWidget { Q_OBJECT public: // Constructor. qjackctlSocketListView(qjackctlPatchbayView *pPatchbayView, bool bReadable); // Default destructor. ~qjackctlSocketListView(); // Patchbay dirty flag accessors. void setDirty (bool bDirty); bool dirty() const; // Auto-open timer methods. void setAutoOpenTimeout(int iAutoOpenTimeout); int autoOpenTimeout() const; protected slots: // Auto-open timeout slot. void timeoutSlot(); protected: // Trap for help/tool-tip events. bool eventFilter(QObject *pObject, QEvent *pEvent); // Drag-n-drop stuff. QTreeWidgetItem *dragDropItem(const QPoint& pos); // Drag-n-drop stuff -- reimplemented virtual methods. void dragEnterEvent(QDragEnterEvent *pDragEnterEvent); void dragMoveEvent(QDragMoveEvent *pDragMoveEvent); void dragLeaveEvent(QDragLeaveEvent *); void dropEvent(QDropEvent *pDropEvent); // Handle mouse events for drag-and-drop stuff. void mousePressEvent(QMouseEvent *pMouseEvent); void mouseMoveEvent(QMouseEvent *pMouseEvent); // Context menu request event handler. void contextMenuEvent(QContextMenuEvent *); private: // Bindings. qjackctlPatchbayView *m_pPatchbayView; bool m_bReadable; // Auto-open timer. int m_iAutoOpenTimeout; QTimer *m_pAutoOpenTimer; // Items we'll eventually drop something. QTreeWidgetItem *m_pDragItem; QTreeWidgetItem *m_pDropItem; // The point from where drag started. QPoint m_posDrag; }; //---------------------------------------------------------------------------- // qjackctlPatchworkView -- Socket plugging connector widget. class qjackctlPatchworkView : public QWidget { Q_OBJECT public: // Constructor. qjackctlPatchworkView(qjackctlPatchbayView *pPatchbayView); // Default destructor. ~qjackctlPatchworkView(); protected slots: // Useful slots (should this be protected?). void contentsChanged(); protected: // Draw visible port connection relation arrows. void paintEvent(QPaintEvent *); // Context menu request event handler. void contextMenuEvent(QContextMenuEvent *); private: // Legal socket item position helper. int itemY(QTreeWidgetItem *pItem) const; // Drawing methods. void drawForwardLine(QPainter *pPainter, int x, int dx, int y1, int y2, int h); void drawConnectionLine(QPainter *pPainter, int x1, int y1, int x2, int y2, int h1, int h2); // Local instance variables. qjackctlPatchbayView *m_pPatchbayView; }; //---------------------------------------------------------------------------- // qjackctlPatchbayView -- Patchbay integrated widget. class qjackctlPatchbayView : public QSplitter { Q_OBJECT public: // Constructor. qjackctlPatchbayView(QWidget *pParent = 0); // Default destructor. ~qjackctlPatchbayView(); // Widget accesors. qjackctlSocketListView *OListView() { return m_pOListView; } qjackctlSocketListView *IListView() { return m_pIListView; } qjackctlPatchworkView *PatchworkView() { return m_pPatchworkView; } // Patchbay object binding methods. void setBinding(qjackctlPatchbay *pPatchbay); qjackctlPatchbay *binding() const; // Socket list accessors. qjackctlSocketList *OSocketList() const; qjackctlSocketList *ISocketList() const; // Patchbay dirty flag accessors. void setDirty (bool bDirty); bool dirty() const; signals: // Contents change signal. void contentsChanged(); public slots: // Common context menu slots. void contextMenu(const QPoint& pos, qjackctlSocketList *pSocketList); void activateForwardMenu(QAction *); private: // Child controls. qjackctlSocketListView *m_pOListView; qjackctlSocketListView *m_pIListView; qjackctlPatchworkView *m_pPatchworkView; // The main binding object. qjackctlPatchbay *m_pPatchbay; // The obnoxious dirty flag. bool m_bDirty; }; //---------------------------------------------------------------------------- // qjackctlPatchbay -- Patchbay integrated object. class qjackctlPatchbay : public QObject { Q_OBJECT public: // Constructor. qjackctlPatchbay(qjackctlPatchbayView *pPatchbayView); // Default destructor. ~qjackctlPatchbay(); // Explicit connection tests. bool canConnectSelected(); bool canDisconnectSelected(); bool canDisconnectAll(); // Socket list accessors. qjackctlSocketList *OSocketList() const; qjackctlSocketList *ISocketList() const; // External rack transfer methods. void loadRack(qjackctlPatchbayRack *pPatchbayRack); void saveRack(qjackctlPatchbayRack *pPatchbayRack); public slots: // Complete contents refreshner. void refresh(); // Explicit connection slots. bool connectSelected(); bool disconnectSelected(); bool disconnectAll(); // Expand all socket items. void expandAll(); // Complete patchbay clearer. void clear(); // Do actual and complete connections snapshot. void connectionsSnapshot(); private: // Internal rack transfer methods. void loadRackSockets (qjackctlSocketList *pSocketList, QList& socketlist); void saveRackSockets (qjackctlSocketList *pSocketList, QList& socketlist); // Connect/Disconnection primitives. void connectSockets(qjackctlSocketItem *pOSocket, qjackctlSocketItem *pISocket); void disconnectSockets(qjackctlSocketItem *pOSocket, qjackctlSocketItem *pISocket); // Instance variables. qjackctlPatchbayView *m_pPatchbayView; qjackctlSocketList *m_pOSocketList; qjackctlSocketList *m_pISocketList; }; #endif // __qjackctlPatchbay_h // end of qjackctlPatchbay.h qjackctl-1.0.6/src/PaxHeaders/qjackctlGraphCommand.h0000644000000000000000000000013215174607203017412 xustar0030 mtime=1777536643.510914327 30 atime=1777536643.510914327 30 ctime=1777536643.510914327 qjackctl-1.0.6/src/qjackctlGraphCommand.h0000644000175000001440000001172315174607203017406 0ustar00rncbcusers// qjackctlGraphCommand.h // /**************************************************************************** Copyright (C) 2003-2025, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlGraphCommand_h #define __qjackctlGraphCommand_h #include "qjackctlGraph.h" #include #include #include //---------------------------------------------------------------------------- // qgraph1_command -- Generic graph command pattern class qjackctlGraphCommand : public QUndoCommand { public: // Constructor. qjackctlGraphCommand(qjackctlGraphCanvas *canvas, QUndoCommand *parent = nullptr); // Accessors. qjackctlGraphCanvas *canvas() const { return m_canvas; } // Command methods. void undo(); void redo(); protected: // Command executive method. virtual bool execute(bool is_undo = false) = 0; private: // Command arguments. qjackctlGraphCanvas *m_canvas; }; //---------------------------------------------------------------------------- // qjackctlGraphConnectCommand -- Connect graph command class qjackctlGraphConnectCommand : public qjackctlGraphCommand { public: // Constructor. qjackctlGraphConnectCommand(qjackctlGraphCanvas *canvas, qjackctlGraphPort *port1, qjackctlGraphPort *port2, bool is_connect, qjackctlGraphCommand *parent = nullptr); protected: // Command item address struct Addr { // Constructors. Addr(qjackctlGraphPort *port) { qjackctlGraphNode *node = port->portNode(); node_name = node->nodeName(); node_type = node->nodeType(); port_name = port->portName(); port_type = port->portType(); } // Copy constructor. Addr(const Addr& addr) { node_name = addr.node_name; node_type = addr.node_type; port_name = addr.port_name; port_type = addr.port_type; } // Member fields. QString node_name; uint node_type; QString port_name; uint port_type; }; // Command item descriptor struct Item { // Constructor. Item(qjackctlGraphPort *port1, qjackctlGraphPort *port2, bool is_connect) : addr1(port1), addr2(port2), m_connect(is_connect) {} // Copy constructor. Item(const Item& item) : addr1(item.addr1), addr2(item.addr2), m_connect(item.is_connect()) {} // Accessors. bool is_connect() const { return m_connect; } // Public member fields. Addr addr1; Addr addr2; private: // Private member fields. bool m_connect; }; // Command executive method. bool execute(bool is_undo); private: // Command arguments. Item m_item; }; //---------------------------------------------------------------------------- // qjackctlGraphMoveCommand -- Move (node) graph command class qjackctlGraphMoveCommand : public qjackctlGraphCommand { public: // Constructor. qjackctlGraphMoveCommand(qjackctlGraphCanvas *canvas, const QList& nodes, const QPointF& pos1, const QPointF& pos2, qjackctlGraphCommand *parent = nullptr); // Destructor. ~qjackctlGraphMoveCommand(); // Add/replace (an already moved) node position for undo/redo... void addItem(qjackctlGraphNode *node, const QPointF& pos1, const QPointF& pos2); protected: // Command item descriptor struct Item { QString node_name; qjackctlGraphItem::Mode node_mode; uint node_type; QPointF node_pos1; QPointF node_pos2; }; // Command executive method. bool execute(bool is_undo); private: // Command arguments. QHash m_items; int m_nexec; }; //---------------------------------------------------------------------------- // qjackctlGraphRenameCommand -- Rename (item) graph command class qjackctlGraphRenameCommand : public qjackctlGraphCommand { public: // Constructor. qjackctlGraphRenameCommand(qjackctlGraphCanvas *canvas, qjackctlGraphItem *item, const QString& name, qjackctlGraphCommand *parent = nullptr); protected: // Command item descriptor struct Item { int item_type; QString node_name; qjackctlGraphItem::Mode node_mode; uint node_type; QString port_name; qjackctlGraphItem::Mode port_mode; uint port_type; }; // Command executive method. bool execute(bool is_undo); private: // Command arguments. Item m_item; QString m_name; }; #endif // __qjackctlGraphCommand_h // end of qjackctlGraphCommand.h qjackctl-1.0.6/src/PaxHeaders/qjackctlAboutForm.h0000644000000000000000000000013215174607203016750 xustar0030 mtime=1777536643.509768862 30 atime=1777536643.509768862 30 ctime=1777536643.509768862 qjackctl-1.0.6/src/qjackctlAboutForm.h0000644000175000001440000000277715174607203016755 0ustar00rncbcusers// qjackctlAboutForm.h // /**************************************************************************** Copyright (C) 2003-2025, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlAboutForm_h #define __qjackctlAboutForm_h #include "ui_qjackctlAboutForm.h" //---------------------------------------------------------------------------- // qjackctlAboutForm -- UI wrapper form. class qjackctlAboutForm : public QDialog { Q_OBJECT public: // Constructor. qjackctlAboutForm(QWidget *pParent = nullptr); // Destructor. ~qjackctlAboutForm(); public slots: void aboutQt(); private: // The Qt-designer UI struct... Ui::qjackctlAboutForm m_ui; }; #endif // __qjackctlAboutForm_h // end of qjackctlAboutForm.h qjackctl-1.0.6/src/PaxHeaders/qjackctlPatchbayRack.cpp0000644000000000000000000000013215174607203017741 xustar0030 mtime=1777536643.515914291 30 atime=1777536643.515914291 30 ctime=1777536643.515914291 qjackctl-1.0.6/src/qjackctlPatchbayRack.cpp0000644000175000001440000013510015174607203017731 0ustar00rncbcusers// qjackctlPatchbayRack.cpp // /**************************************************************************** Copyright (C) 2003-2021, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlPatchbayRack.h" // Aliases accessors. #include "qjackctlAliases.h" #include // QRegularExpression exact match pattern wrapper. #if QT_VERSION < QT_VERSION_CHECK(5, 12, 0) #define EXACT_PATTERN(s) ('^' + s + '$') #else #define EXACT_PATTERN(s) QRegularExpression::anchoredPattern(s) #endif //---------------------------------------------------------------------- // class qjackctlPatchbaySnapshot -- Patchbay snapshot infrastructure. // #include class qjackctlPatchbaySnapshot { public: // Constructor. qjackctlPatchbaySnapshot() {} // Cleanup. void clear() { m_hash.clear(); } // Prepare/add snapshot connection item. void append ( const QString& sOClientName, const QString& sOPortName, const QString& sIClientName, const QString& sIPortName ) { Ports& ports = m_hash[sOClientName + ':' + sIClientName]; ports.outs.append(sOPortName); ports.ins.append(sIPortName); } // Commit snapshot into patchbay rack. void commit ( qjackctlPatchbayRack *pRack, int iSocketType ) { QHash::Iterator iter = m_hash.begin(); for ( ; iter != m_hash.end(); ++iter) { const QString& sKey = iter.key(); const QString& sOClient = sKey.section(':', 0, 0); const QString& sIClient = sKey.section(':', 1); Ports& ports = iter.value(); qjackctlPatchbaySocket *pOSocket = get_socket( pRack->osocketlist(), sOClient, ports.outs, iSocketType); qjackctlPatchbaySocket *pISocket = get_socket( pRack->isocketlist(), sIClient, ports.ins, iSocketType); pRack->addCable(new qjackctlPatchbayCable(pOSocket, pISocket)); } m_hash.clear(); } // Find first existing socket. static qjackctlPatchbaySocket *find_socket ( QList& socketlist, const QString& sClientName, int iSocketType ) { QListIterator iter(socketlist); while (iter.hasNext()) { qjackctlPatchbaySocket *pSocket = iter.next(); QRegularExpression rxSocket(EXACT_PATTERN(pSocket->clientName())); if (rxSocket.match(sClientName).hasMatch() && pSocket->type() == iSocketType) { return pSocket; } } return nullptr; } // Add socket plug. static void add_socket ( QList& socketlist, const QString& sClientName, const QString& sPortName, int iSocketType ) { qjackctlPatchbaySocket *pSocket = find_socket(socketlist, sClientName, iSocketType); if (pSocket == nullptr) { pSocket = new qjackctlPatchbaySocket(sClientName, qjackctlAliasItem::escapeRegExpDigits(sClientName), iSocketType); socketlist.append(pSocket); } pSocket->addPlug( qjackctlAliasItem::escapeRegExpDigits(sPortName)); } // Get client socket into rack (socket list). static qjackctlPatchbaySocket *get_socket ( QList& socketlist, const QString& sClientName, const QStringList& ports, int iSocketType ) { int iSocket = 0; qjackctlPatchbaySocket *pSocket = nullptr; QListIterator iter(socketlist); while (iter.hasNext()) { pSocket = iter.next(); QRegularExpression rxSocket(EXACT_PATTERN(pSocket->clientName())); if (rxSocket.match(sClientName).hasMatch() && pSocket->type() == iSocketType) { QStringListIterator plug_iter(pSocket->pluglist()); QStringListIterator port_iter(ports); bool bMatch = true; while (bMatch && plug_iter.hasNext() && port_iter.hasNext()) { const QString& sPlug = plug_iter.next(); const QString& sPort = port_iter.next(); QRegularExpression rxPlug(EXACT_PATTERN(sPlug)); bMatch = (rxPlug.match(sPort).hasMatch()); } if (bMatch) return pSocket; iSocket++; } } QString sSocketName = sClientName; if (iSocket > 0) sSocketName += ' ' + QString::number(iSocket + 1); pSocket = new qjackctlPatchbaySocket(sSocketName, qjackctlAliasItem::escapeRegExpDigits(sClientName), iSocketType); QStringListIterator port_iter(ports); while (port_iter.hasNext()) { pSocket->addPlug( qjackctlAliasItem::escapeRegExpDigits(port_iter.next())); } socketlist.append(pSocket); return pSocket; } private: // Snapshot instance variables. struct Ports { QStringList outs; QStringList ins; }; QHash m_hash; }; //---------------------------------------------------------------------- // class qjackctlPatchbaySocket -- Patchbay socket implementation. // // Constructor. qjackctlPatchbaySocket::qjackctlPatchbaySocket ( const QString& sSocketName, const QString& sClientName, int iSocketType ) { m_sSocketName = sSocketName; m_sClientName = sClientName; m_iSocketType = iSocketType; m_bExclusive = false; m_sSocketForward.clear(); } // Default destructor. qjackctlPatchbaySocket::~qjackctlPatchbaySocket (void) { m_pluglist.clear(); } // Socket property accessors. const QString& qjackctlPatchbaySocket::name (void) const { return m_sSocketName; } const QString& qjackctlPatchbaySocket::clientName (void) const { return m_sClientName; } int qjackctlPatchbaySocket::type (void) const { return m_iSocketType; } bool qjackctlPatchbaySocket::isExclusive (void) const { return m_bExclusive; } const QString& qjackctlPatchbaySocket::forward (void) const { return m_sSocketForward; } // Slot property methods. void qjackctlPatchbaySocket::setName ( const QString& sSocketName ) { m_sSocketName = sSocketName; } void qjackctlPatchbaySocket::setClientName ( const QString& sClientName ) { m_sClientName = sClientName; } void qjackctlPatchbaySocket::setType ( int iSocketType ) { m_iSocketType = iSocketType; } void qjackctlPatchbaySocket::setExclusive ( bool bExclusive ) { m_bExclusive = bExclusive; } void qjackctlPatchbaySocket::setForward ( const QString& sSocketForward ) { m_sSocketForward = sSocketForward; } // Plug list primitive methods. void qjackctlPatchbaySocket::addPlug ( const QString& sPlugName ) { m_pluglist.append(sPlugName); } void qjackctlPatchbaySocket::removePlug ( const QString& sPlugName ) { int iPlug = m_pluglist.indexOf(sPlugName); if (iPlug >= 0) m_pluglist.removeAt(iPlug); } // Plug list accessor. QStringList& qjackctlPatchbaySocket::pluglist (void) { return m_pluglist; } // Simple socket type methods. int qjackctlPatchbaySocket::typeFromText ( const QString& sSocketType ) { int iSocketType = QJACKCTL_SOCKETTYPE_DEFAULT; if (sSocketType == "jack-audio" || sSocketType == "audio") iSocketType = QJACKCTL_SOCKETTYPE_JACK_AUDIO; else if (sSocketType == "jack-midi") iSocketType = QJACKCTL_SOCKETTYPE_JACK_MIDI; else if (sSocketType == "alsa-midi" || sSocketType == "midi") iSocketType = QJACKCTL_SOCKETTYPE_ALSA_MIDI; return iSocketType; } QString qjackctlPatchbaySocket::textFromType ( int iSocketType ) { QString sSocketType; switch (iSocketType) { case QJACKCTL_SOCKETTYPE_JACK_AUDIO: sSocketType = "jack-audio"; break; case QJACKCTL_SOCKETTYPE_JACK_MIDI: sSocketType = "jack-midi"; break; case QJACKCTL_SOCKETTYPE_ALSA_MIDI: sSocketType = "alsa-midi"; break; default: break; } return sSocketType; } //---------------------------------------------------------------------- // class qjackctlPatchbaySlot -- Patchbay socket slot implementation. // // Constructor. qjackctlPatchbaySlot::qjackctlPatchbaySlot ( const QString& sSlotName, int iSlotMode ) { m_pOutputSocket = nullptr; m_pInputSocket = nullptr; m_sSlotName = sSlotName; m_iSlotMode = iSlotMode; } // Default destructor. qjackctlPatchbaySlot::~qjackctlPatchbaySlot (void) { setOutputSocket(nullptr); setInputSocket(nullptr); } // Slot property accessors. const QString& qjackctlPatchbaySlot::name (void) const { return m_sSlotName; } int qjackctlPatchbaySlot::mode (void) const { return m_iSlotMode; } // Slot property methods. void qjackctlPatchbaySlot::setName ( const QString& sSlotName ) { m_sSlotName = sSlotName; } void qjackctlPatchbaySlot::setMode ( int iSlotMode ) { m_iSlotMode = iSlotMode; } // Socket methods. void qjackctlPatchbaySlot::setOutputSocket ( qjackctlPatchbaySocket *pSocket ) { m_pOutputSocket = pSocket; } void qjackctlPatchbaySlot::setInputSocket ( qjackctlPatchbaySocket *pSocket ) { m_pInputSocket = pSocket; } // Socket accessors. qjackctlPatchbaySocket *qjackctlPatchbaySlot::outputSocket (void) const { return m_pOutputSocket; } qjackctlPatchbaySocket *qjackctlPatchbaySlot::inputSocket (void) const { return m_pInputSocket; } //---------------------------------------------------------------------- // class qjackctlPatchbayCable -- Patchbay cable connection implementation. // // Constructor. qjackctlPatchbayCable::qjackctlPatchbayCable ( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket ) { m_pOutputSocket = pOutputSocket; m_pInputSocket = pInputSocket; } // Default destructor. qjackctlPatchbayCable::~qjackctlPatchbayCable (void) { setOutputSocket(nullptr); setInputSocket(nullptr); } // Socket methods. void qjackctlPatchbayCable::setOutputSocket ( qjackctlPatchbaySocket *pSocket ) { m_pOutputSocket = pSocket; } void qjackctlPatchbayCable::setInputSocket ( qjackctlPatchbaySocket *pSocket ) { m_pInputSocket = pSocket; } // Socket accessors. qjackctlPatchbaySocket *qjackctlPatchbayCable::outputSocket (void) const { return m_pOutputSocket; } qjackctlPatchbaySocket *qjackctlPatchbayCable::inputSocket (void) const { return m_pInputSocket; } //---------------------------------------------------------------------- // class qjackctlPatchbayRack -- Patchbay rack profile implementation. // // Constructor. qjackctlPatchbayRack::qjackctlPatchbayRack (void) { m_pJackClient = nullptr; m_ppszOAudioPorts = nullptr; m_ppszIAudioPorts = nullptr; m_ppszOMidiPorts = nullptr; m_ppszIMidiPorts = nullptr; // MIDI connection persistence cache variables. m_pAlsaSeq = nullptr; } // Default destructor. qjackctlPatchbayRack::~qjackctlPatchbayRack (void) { clear(); } // Common socket list primitive methods. void qjackctlPatchbayRack::addSocket ( QList& socketlist, qjackctlPatchbaySocket *pSocket ) { qjackctlPatchbaySocket *pSocketPtr = findSocket(socketlist, pSocket->name()); if (pSocketPtr) removeSocket(socketlist, pSocketPtr); socketlist.append(pSocket); } void qjackctlPatchbayRack::removeSocket ( QList& socketlist, qjackctlPatchbaySocket *pSocket ) { int iSocket = socketlist.indexOf(pSocket); if (iSocket >= 0) { socketlist.removeAt(iSocket); delete pSocket; } } // Slot list primitive methods. void qjackctlPatchbayRack::addSlot ( qjackctlPatchbaySlot *pSlot ) { qjackctlPatchbaySlot *pSlotPtr = findSlot(pSlot->name()); if (pSlotPtr) removeSlot(pSlotPtr); m_slotlist.append(pSlot); } void qjackctlPatchbayRack::removeSlot ( qjackctlPatchbaySlot *pSlot ) { int iSlot = m_slotlist.indexOf(pSlot); if (iSlot >= 0) { m_slotlist.removeAt(iSlot); delete pSlot; } } // Cable list primitive methods. void qjackctlPatchbayRack::addCable ( qjackctlPatchbayCable *pCable ) { qjackctlPatchbayCable *pCablePtr = findCable(pCable); if (pCablePtr) removeCable(pCablePtr); m_cablelist.append(pCable); } void qjackctlPatchbayRack::removeCable ( qjackctlPatchbayCable *pCable ) { int iCable = m_cablelist.indexOf(pCable); if (iCable >= 0) { m_cablelist.removeAt(iCable); delete pCable; } } // Common socket finders. qjackctlPatchbaySocket *qjackctlPatchbayRack::findSocket ( QList& socketlist, const QString& sSocketName, int iSocketType ) { QListIterator iter(socketlist); while (iter.hasNext()) { qjackctlPatchbaySocket *pSocket = iter.next(); if (sSocketName == pSocket->name() && (iSocketType == QJACKCTL_SOCKETTYPE_DEFAULT || iSocketType == pSocket->type())) return pSocket; } return nullptr; } // Patchbay socket slot finders. qjackctlPatchbaySlot *qjackctlPatchbayRack::findSlot ( const QString& sSlotName ) { QListIterator iter(m_slotlist); while (iter.hasNext()) { qjackctlPatchbaySlot *pSlot = iter.next(); if (sSlotName == pSlot->name()) return pSlot; } return nullptr; } // Cable finders. qjackctlPatchbayCable *qjackctlPatchbayRack::findCable ( const QString& sOutputSocket, const QString& sInputSocket ) { qjackctlPatchbaySocket *pSocket; QListIterator iter(m_cablelist); while (iter.hasNext()) { qjackctlPatchbayCable *pCable = iter.next(); pSocket = pCable->outputSocket(); if (pSocket && sOutputSocket == pSocket->name()) { pSocket = pCable->inputSocket(); if (pSocket && sInputSocket == pSocket->name()) return pCable; } } return nullptr; } qjackctlPatchbayCable *qjackctlPatchbayRack::findCable ( qjackctlPatchbayCable *pCablePtr ) { QString sOutputSocket; if (pCablePtr->outputSocket()) sOutputSocket = pCablePtr->outputSocket()->name(); QString sInputSocket; if (pCablePtr->inputSocket()) sInputSocket = pCablePtr->inputSocket()->name(); return findCable(sOutputSocket, sInputSocket); } // Cable finder (logical matching by client/port names). qjackctlPatchbayCable *qjackctlPatchbayRack::findCable ( const QString& sOClientName, const QString& sOPortName, const QString& sIClientName, const QString& sIPortName, int iSocketType ) { // This is a regex prefix needed for ALSA MDII // as client and port names include id-number+colon... QString sPrefix; if (iSocketType == QJACKCTL_SOCKETTYPE_ALSA_MIDI) sPrefix = "[0-9]+:"; // Scan from output-socket list... QListIterator osocket(m_osocketlist); while (osocket.hasNext()) { qjackctlPatchbaySocket *pOSocket = osocket.next(); if (pOSocket->type() != iSocketType) continue; // Output socket client name match? QRegularExpression rxOSocket(EXACT_PATTERN(sPrefix + pOSocket->clientName())); if (!rxOSocket.match(sOClientName).hasMatch()) continue; // Output plug port names match? QStringListIterator oplug(pOSocket->pluglist()); while (oplug.hasNext()) { QRegularExpression rxOPlug(EXACT_PATTERN(sPrefix + oplug.next())); if (!rxOPlug.match(sOPortName).hasMatch()) continue; // Scan for output-socket cable... QListIterator cable(m_cablelist); while (cable.hasNext()) { qjackctlPatchbayCable *pCable = cable.next(); if (pCable->outputSocket() != pOSocket) continue; qjackctlPatchbaySocket *pISocket = pCable->inputSocket(); // Input socket client name match? QRegularExpression rxISocket(EXACT_PATTERN(sPrefix + pISocket->clientName())); if (!rxISocket.match(sIClientName).hasMatch()) continue; // Input plug port names match? QStringListIterator iplug(pISocket->pluglist()); while (iplug.hasNext()) { // Found it? QRegularExpression rxIPlug(EXACT_PATTERN(sPrefix + iplug.next())); if (rxIPlug.match(sIPortName).hasMatch()) return pCable; } } } } // No matching cable was found. return nullptr; } // Patckbay cleaners. void qjackctlPatchbayRack::clear (void) { qDeleteAll(m_cablelist); m_cablelist.clear(); qDeleteAll(m_slotlist); m_slotlist.clear(); qDeleteAll(m_isocketlist); m_isocketlist.clear(); qDeleteAll(m_osocketlist); m_osocketlist.clear(); } // Patchbay rack output sockets list accessor. QList& qjackctlPatchbayRack::osocketlist (void) { return m_osocketlist; } // Patchbay rack input sockets list accessor. QList& qjackctlPatchbayRack::isocketlist (void) { return m_isocketlist; } // Patchbay rack slots list accessor. QList& qjackctlPatchbayRack::slotlist (void) { return m_slotlist; } // Patchbay cable connections list accessor. QList& qjackctlPatchbayRack::cablelist (void) { return m_cablelist; } // Lookup for the n-th JACK client port // that matches the given regular expression... const char *qjackctlPatchbayRack::findJackPort ( const char **ppszJackPorts, const QString& sClientName, const QString& sPortName, int n ) { QRegularExpression rxClientName(EXACT_PATTERN(sClientName)); QRegularExpression rxPortName(EXACT_PATTERN(sPortName)); int i = 0; int iClientPort = 0; while (ppszJackPorts[iClientPort]) { const QString sClientPort = QString::fromUtf8(ppszJackPorts[iClientPort]); const int iColon = sClientPort.indexOf(':'); if (iColon >= 0) { if (rxClientName.match(sClientPort.left(iColon)).hasMatch() && rxPortName.match(sClientPort.right( sClientPort.length() - iColon - 1)).hasMatch()) { if (++i > n) return ppszJackPorts[iClientPort]; } } ++iClientPort; } return nullptr; } // JACK port-pair connection executive IS DEPRECATED! void qjackctlPatchbayRack::connectJackPorts ( const char *pszOutputPort, const char *pszInputPort ) { unsigned int uiCableFlags = QJACKCTL_CABLE_FAILED; if (jack_connect(m_pJackClient, pszOutputPort, pszInputPort) == 0) uiCableFlags = QJACKCTL_CABLE_CONNECTED; emit cableConnected( pszOutputPort, pszInputPort, uiCableFlags); } // JACK port-pair disconnection executive. void qjackctlPatchbayRack::disconnectJackPorts ( const char *pszOutputPort, const char *pszInputPort ) { unsigned int uiCableFlags = QJACKCTL_CABLE_FAILED; if (jack_disconnect(m_pJackClient, pszOutputPort, pszInputPort) == 0) uiCableFlags = QJACKCTL_CABLE_DISCONNECTED; emit cableConnected( pszOutputPort, pszInputPort, uiCableFlags); } // JACK port-pair connection notifier. void qjackctlPatchbayRack::checkJackPorts ( const char *pszOutputPort, const char *pszInputPort ) { emit cableConnected( pszOutputPort, pszInputPort, QJACKCTL_CABLE_CHECKED); } // Check and enforce if an audio output client:port is connected to one input. void qjackctlPatchbayRack::connectJackSocketPorts ( qjackctlPatchbaySocket *pOutputSocket, const char *pszOutputPort, qjackctlPatchbaySocket *pInputSocket, const char *pszInputPort ) { bool bConnected = false; // Check for inputs from output... const char **ppszInputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszOutputPort)); if (ppszInputPorts) { for (int i = 0 ; ppszInputPorts[i]; i++) { if (strcmp(ppszInputPorts[i], pszInputPort) == 0) bConnected = true; else if (pOutputSocket->isExclusive()) disconnectJackPorts(pszOutputPort, ppszInputPorts[i]); } jack_free(ppszInputPorts); } // Check for outputs from input, if the input socket is on exclusive mode... if (pInputSocket->isExclusive()) { const char **ppszOutputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszInputPort)); if (ppszOutputPorts) { for (int i = 0 ; ppszOutputPorts[i]; i++) { if (strcmp(ppszOutputPorts[i], pszOutputPort) == 0) bConnected = true; else disconnectJackPorts(ppszOutputPorts[i], pszInputPort); } jack_free(ppszOutputPorts); } } // Finally do the connection?... if (!bConnected) { connectJackPorts(pszOutputPort, pszInputPort); } else { emit cableConnected( pszOutputPort, pszInputPort, QJACKCTL_CABLE_CHECKED); } } // Check and maint whether an JACK socket pair is fully connected. void qjackctlPatchbayRack::connectJackCable ( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket ) { if (pOutputSocket == nullptr || pInputSocket == nullptr) return; if (pOutputSocket->type() != pInputSocket->type()) return; const char **ppszOutputPorts = nullptr; const char **ppszInputPorts = nullptr; if (pOutputSocket->type() == QJACKCTL_SOCKETTYPE_JACK_AUDIO) { ppszOutputPorts = m_ppszOAudioPorts; ppszInputPorts = m_ppszIAudioPorts; } else if (pOutputSocket->type() == QJACKCTL_SOCKETTYPE_JACK_MIDI) { ppszOutputPorts = m_ppszOMidiPorts; ppszInputPorts = m_ppszIMidiPorts; } if (ppszOutputPorts == nullptr || ppszInputPorts == nullptr) return; // Iterate on each corresponding plug... QStringListIterator iterOutputPlug(pOutputSocket->pluglist()); QStringListIterator iterInputPlug(pInputSocket->pluglist()); while (iterOutputPlug.hasNext() && iterInputPlug.hasNext()) { const QString& sOutputPlug = iterOutputPlug.next(); const QString& sInputPlug = iterInputPlug.next(); // Check audio port connection sequentially... int iOPort = 0; const char *pszOutputPort; while ((pszOutputPort = findJackPort(ppszOutputPorts, pOutputSocket->clientName(), sOutputPlug, iOPort)) != nullptr) { int iIPort = 0; const char *pszInputPort; while ((pszInputPort = findJackPort(ppszInputPorts, pInputSocket->clientName(), sInputPlug, iIPort)) != nullptr) { connectJackSocketPorts( pOutputSocket, pszOutputPort, pInputSocket, pszInputPort); iIPort++; } iOPort++; } } } // Main JACK cable connect persistance scan cycle. void qjackctlPatchbayRack::connectJackScan ( jack_client_t *pJackClient ) { if (pJackClient == nullptr || m_pJackClient) return; // Cache client descriptor. m_pJackClient = pJackClient; // Cache all current audio client-ports... m_ppszOAudioPorts = jack_get_ports(m_pJackClient, 0, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput); m_ppszIAudioPorts = jack_get_ports(m_pJackClient, 0, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput); #ifdef CONFIG_JACK_MIDI // Cache all current MIDI client-ports... m_ppszOMidiPorts = jack_get_ports(m_pJackClient, 0, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput); m_ppszIMidiPorts = jack_get_ports(m_pJackClient, 0, JACK_DEFAULT_MIDI_TYPE, JackPortIsInput); #else m_ppszOMidiPorts = nullptr; m_ppszIMidiPorts = nullptr; #endif // Start looking for connections... QListIterator iter(m_cablelist); while (iter.hasNext()) { qjackctlPatchbayCable *pCable = iter.next(); connectJackCable( pCable->outputSocket(), pCable->inputSocket()); } // Forward sockets... connectForwardScan(QJACKCTL_SOCKETTYPE_JACK_AUDIO); #ifdef CONFIG_JACK_MIDI connectForwardScan(QJACKCTL_SOCKETTYPE_JACK_MIDI); #endif // Free client-ports caches... if (m_ppszOAudioPorts) jack_free(m_ppszOAudioPorts); if (m_ppszIAudioPorts) jack_free(m_ppszIAudioPorts); #ifdef CONFIG_JACK_MIDI if (m_ppszOMidiPorts) jack_free(m_ppszOMidiPorts); if (m_ppszIMidiPorts) jack_free(m_ppszIMidiPorts); #endif // Reset cached pointers. m_ppszOAudioPorts = nullptr; m_ppszIAudioPorts = nullptr; m_ppszOMidiPorts = nullptr; m_ppszIMidiPorts = nullptr; m_pJackClient = nullptr; } // JACK socket/ports forwarding scan... void qjackctlPatchbayRack::connectJackForwardPorts ( const char *pszPort, const char *pszPortForward ) { // Check for outputs from forwarded input... const char **ppszOutputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszPortForward)); if (ppszOutputPorts) { // Grab current connections of target port... const char **ppszPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszPort)); for (int i = 0 ; ppszOutputPorts[i]; i++) { // Need to lookup if already connected... bool bConnected = false; for (int j = 0; ppszPorts && ppszPorts[j]; j++) { if (strcmp(ppszOutputPorts[i], ppszPorts[j]) == 0) { bConnected = true; break; } } // Make or just report the connection... if (bConnected) { checkJackPorts(ppszOutputPorts[i], pszPort); } else { connectJackPorts(ppszOutputPorts[i], pszPort); } } // Free provided arrays... if (ppszPorts) jack_free(ppszPorts); jack_free(ppszOutputPorts); } } void qjackctlPatchbayRack::connectJackForward ( qjackctlPatchbaySocket *pSocket, qjackctlPatchbaySocket *pSocketForward ) { if (pSocket == nullptr || pSocketForward == nullptr) return; if (pSocket->type() != pSocketForward->type()) return; const char **ppszOutputPorts = nullptr; const char **ppszInputPorts = nullptr; if (pSocket->type() == QJACKCTL_SOCKETTYPE_JACK_AUDIO) { ppszOutputPorts = m_ppszOAudioPorts; ppszInputPorts = m_ppszIAudioPorts; } else if (pSocket->type() == QJACKCTL_SOCKETTYPE_JACK_MIDI) { ppszOutputPorts = m_ppszOMidiPorts; ppszInputPorts = m_ppszIMidiPorts; } if (ppszOutputPorts == nullptr || ppszInputPorts == nullptr) return; QStringListIterator iterPlug(pSocket->pluglist()); QStringListIterator iterPlugForward(pSocketForward->pluglist()); while (iterPlug.hasNext() && iterPlugForward.hasNext()) { // Check audio port connection sequentially... const QString& sPlug = iterPlug.next(); const QString& sPlugForward = iterPlugForward.next(); const char *pszPortForward = findJackPort(ppszInputPorts, pSocketForward->clientName(), sPlugForward, 0); if (pszPortForward) { const char *pszPort = findJackPort(ppszInputPorts, pSocket->clientName(), sPlug, 0); if (pszPort) connectJackForwardPorts(pszPort, pszPortForward); } } } #ifndef CONFIG_ALSA_SEQ #if defined(Q_CC_GNU) || defined(Q_CC_MINGW) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #endif #endif // Load all midi available midi ports of a given type. void qjackctlPatchbayRack::loadAlsaPorts ( QList& midiports, bool bReadable ) { if (m_pAlsaSeq == nullptr) return; qDeleteAll(midiports); midiports.clear(); #ifdef CONFIG_ALSA_SEQ unsigned int uiAlsaFlags; if (bReadable) uiAlsaFlags = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ; else uiAlsaFlags = SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE; snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); snd_seq_client_info_set_client(pClientInfo, -1); while (snd_seq_query_next_client(m_pAlsaSeq, pClientInfo) >= 0) { int iAlsaClient = snd_seq_client_info_get_client(pClientInfo); if (iAlsaClient > 0) { QString sClientName = snd_seq_client_info_get_name(pClientInfo); snd_seq_port_info_set_client(pPortInfo, iAlsaClient); snd_seq_port_info_set_port(pPortInfo, -1); while (snd_seq_query_next_port(m_pAlsaSeq, pPortInfo) >= 0) { unsigned int uiPortCapability = snd_seq_port_info_get_capability(pPortInfo); if (((uiPortCapability & uiAlsaFlags) == uiAlsaFlags) && ((uiPortCapability & SND_SEQ_PORT_CAP_NO_EXPORT) == 0)) { qjackctlAlsaMidiPort *pMidiPort = new qjackctlAlsaMidiPort; pMidiPort->sClientName = sClientName; pMidiPort->iAlsaClient = iAlsaClient; pMidiPort->sPortName = snd_seq_port_info_get_name(pPortInfo); pMidiPort->iAlsaPort = snd_seq_port_info_get_port(pPortInfo); midiports.append(pMidiPort); } } } } #endif // CONFIG_ALSA_SEQ } // Get current connections from given MIDI port. void qjackctlPatchbayRack::loadAlsaConnections ( QList& midiports, qjackctlAlsaMidiPort *pMidiPort, bool bReadable ) { qDeleteAll(midiports); midiports.clear(); #ifdef CONFIG_ALSA_SEQ snd_seq_query_subs_type_t snd_subs_type; if (bReadable) snd_subs_type = SND_SEQ_QUERY_SUBS_READ; else snd_subs_type = SND_SEQ_QUERY_SUBS_WRITE; snd_seq_query_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_query_subscribe_alloca(&pAlsaSubs); snd_seq_query_subscribe_set_type(pAlsaSubs, snd_subs_type); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pMidiPort->iAlsaClient; seq_addr.port = pMidiPort->iAlsaPort; snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(m_pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); qjackctlAlsaMidiPort *pPort = new qjackctlAlsaMidiPort; setAlsaPort(pPort, seq_addr.client, seq_addr.port); midiports.append(pPort); snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } #endif // CONFIG_ALSA_SEQ } // Lookup for the n-th MIDI client port that matches the given regular expression... qjackctlAlsaMidiPort *qjackctlPatchbayRack::findAlsaPort ( QList& midiports, const QString& sClientName, const QString& sPortName, int n ) { QRegularExpression rxClientName(EXACT_PATTERN(sClientName)); QRegularExpression rxPortName(EXACT_PATTERN(sPortName)); int i = 0; // For each port... QListIterator iter(midiports); while (iter.hasNext()) { qjackctlAlsaMidiPort *pMidiPort = iter.next(); if (rxClientName.match(pMidiPort->sClientName).hasMatch() && rxPortName.match(pMidiPort->sPortName).hasMatch()) { if (++i > n) return pMidiPort; } } return nullptr; } // MIDI port-pair name string. QString qjackctlPatchbayRack::getAlsaPortName ( qjackctlAlsaMidiPort *pMidiPort ) { return QString::number(pMidiPort->iAlsaClient) + ':' + QString::number(pMidiPort->iAlsaPort) + ' ' + pMidiPort->sClientName; } // MIDI port-pair name string. void qjackctlPatchbayRack::setAlsaPort ( qjackctlAlsaMidiPort *pMidiPort, int iAlsaClient, int iAlsaPort ) { #ifdef CONFIG_ALSA_SEQ snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); pMidiPort->iAlsaClient = iAlsaClient; pMidiPort->iAlsaPort = iAlsaPort; if (snd_seq_get_any_client_info(m_pAlsaSeq, iAlsaClient, pClientInfo) == 0) pMidiPort->sClientName = snd_seq_client_info_get_name(pClientInfo); if (snd_seq_get_any_port_info(m_pAlsaSeq, iAlsaClient, iAlsaPort, pPortInfo) == 0) pMidiPort->sPortName = snd_seq_port_info_get_name(pPortInfo); #endif // CONFIG_ALSA_SEQ } // MIDI port-pair connection executive. void qjackctlPatchbayRack::connectAlsaPorts ( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort ) { #ifdef CONFIG_ALSA_SEQ unsigned int uiCableFlags = QJACKCTL_CABLE_FAILED; snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOutputPort->iAlsaClient; seq_addr.port = pOutputPort->iAlsaPort; snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pInputPort->iAlsaClient; seq_addr.port = pInputPort->iAlsaPort; snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); if (snd_seq_subscribe_port(m_pAlsaSeq, pAlsaSubs) == 0) uiCableFlags = QJACKCTL_CABLE_CONNECTED; emit cableConnected( getAlsaPortName(pOutputPort), getAlsaPortName(pInputPort), uiCableFlags); #endif // CONFIG_ALSA_SEQ } // MIDI port-pair disconnection executive. void qjackctlPatchbayRack::disconnectAlsaPorts ( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort ) { #ifdef CONFIG_ALSA_SEQ unsigned int uiCableFlags = QJACKCTL_CABLE_FAILED; snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOutputPort->iAlsaClient; seq_addr.port = pOutputPort->iAlsaPort; snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pInputPort->iAlsaClient; seq_addr.port = pInputPort->iAlsaPort; snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); if (snd_seq_unsubscribe_port(m_pAlsaSeq, pAlsaSubs) == 0) uiCableFlags = QJACKCTL_CABLE_DISCONNECTED; emit cableConnected( getAlsaPortName(pOutputPort), getAlsaPortName(pInputPort), uiCableFlags); #endif // CONFIG_ALSA_SEQ } // MIDI port-pair disconnection notifier. void qjackctlPatchbayRack::checkAlsaPorts ( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort ) { emit cableConnected( getAlsaPortName(pOutputPort), getAlsaPortName(pInputPort), QJACKCTL_CABLE_CHECKED); } // Check and enforce if a midi output client:port is connected to one input. void qjackctlPatchbayRack::connectAlsaSocketPorts ( qjackctlPatchbaySocket *pOutputSocket, qjackctlAlsaMidiPort *pOutputPort, qjackctlPatchbaySocket *pInputSocket, qjackctlAlsaMidiPort *pInputPort ) { #ifdef CONFIG_ALSA_SEQ bool bConnected = false; snd_seq_query_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_query_subscribe_alloca(&pAlsaSubs); // Check for inputs from output... snd_seq_query_subscribe_set_type(pAlsaSubs, SND_SEQ_QUERY_SUBS_READ); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pOutputPort->iAlsaClient; seq_addr.port = pOutputPort->iAlsaPort; snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(m_pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); if (seq_addr.client == pInputPort->iAlsaClient && seq_addr.port == pInputPort->iAlsaPort) bConnected = true; else if (pOutputSocket->isExclusive()) { qjackctlAlsaMidiPort iport; setAlsaPort(&iport, seq_addr.client, seq_addr.port); disconnectAlsaPorts(pOutputPort, &iport); } snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } // Check for outputs from input, if the input socket is on exclusive mode... if (pInputSocket->isExclusive()) { snd_seq_query_subscribe_set_type(pAlsaSubs, SND_SEQ_QUERY_SUBS_WRITE); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pInputPort->iAlsaClient; seq_addr.port = pInputPort->iAlsaPort; snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(m_pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); if (seq_addr.client == pOutputPort->iAlsaClient && seq_addr.port == pOutputPort->iAlsaPort) bConnected = true; else if (pInputSocket->isExclusive()) { qjackctlAlsaMidiPort oport; setAlsaPort(&oport, seq_addr.client, seq_addr.port); disconnectAlsaPorts(&oport, pInputPort); } snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } } // Finally do the connection?... if (!bConnected) { connectAlsaPorts(pOutputPort, pInputPort); } else { emit cableConnected( getAlsaPortName(pOutputPort), getAlsaPortName(pInputPort), QJACKCTL_CABLE_CHECKED); } #endif // CONFIG_ALSA_SEQ } // Check and maint whether a MIDI socket pair is fully connected. void qjackctlPatchbayRack::connectAlsaCable ( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket ) { if (pOutputSocket == nullptr || pInputSocket == nullptr) return; if (pOutputSocket->type() != pInputSocket->type() || pOutputSocket->type() != QJACKCTL_SOCKETTYPE_ALSA_MIDI) return; // Iterate on each corresponding plug... QStringListIterator iterOutputPlug(pOutputSocket->pluglist()); QStringListIterator iterInputPlug(pInputSocket->pluglist()); while (iterOutputPlug.hasNext() && iterInputPlug.hasNext()) { const QString& sOutputPlug = iterOutputPlug.next(); const QString& sInputPlug = iterInputPlug.next(); // Check MIDI port connection sequentially... int iOPort = 0; qjackctlAlsaMidiPort *pOutputPort; while ((pOutputPort = findAlsaPort(m_omidiports, pOutputSocket->clientName(), sOutputPlug, iOPort)) != nullptr) { int iIPort = 0; qjackctlAlsaMidiPort *pInputPort; while ((pInputPort = findAlsaPort(m_imidiports, pInputSocket->clientName(), sInputPlug, iIPort)) != nullptr) { connectAlsaSocketPorts( pOutputSocket, pOutputPort, pInputSocket, pInputPort); iIPort++; } iOPort++; } } } // Overloaded MIDI cable connect persistance scan cycle. void qjackctlPatchbayRack::connectAlsaScan ( snd_seq_t *pAlsaSeq ) { if (pAlsaSeq == nullptr || m_pAlsaSeq) return; // Cache sequencer descriptor. m_pAlsaSeq = pAlsaSeq; // Cache all current output client-ports... loadAlsaPorts(m_omidiports, true); loadAlsaPorts(m_imidiports, false); // Run the MIDI cable scan... QListIterator iter(m_cablelist); while (iter.hasNext()) { qjackctlPatchbayCable *pCable = iter.next(); connectAlsaCable( pCable->outputSocket(), pCable->inputSocket()); } // Forward MIDI sockets... connectForwardScan(QJACKCTL_SOCKETTYPE_ALSA_MIDI); // Free client-ports caches... qDeleteAll(m_omidiports); m_omidiports.clear(); qDeleteAll(m_imidiports); m_imidiports.clear(); m_pAlsaSeq = nullptr; } // ALSA socket/ports forwarding scan... void qjackctlPatchbayRack::connectAlsaForwardPorts ( qjackctlAlsaMidiPort *pPort, qjackctlAlsaMidiPort *pPortForward ) { #ifdef CONFIG_ALSA_SEQ // Grab current connections of target port... QList midiports; loadAlsaConnections(midiports, pPort, false); snd_seq_query_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_query_subscribe_alloca(&pAlsaSubs); // Check for inputs from output... snd_seq_query_subscribe_set_type(pAlsaSubs, SND_SEQ_QUERY_SUBS_WRITE); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pPortForward->iAlsaClient; seq_addr.port = pPortForward->iAlsaPort; snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(m_pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); // Need to lookup if already connected... bool bConnected = false; QListIterator iter(midiports); while (iter.hasNext()) { qjackctlAlsaMidiPort *pMidiPort = iter.next(); if (pMidiPort->iAlsaClient == seq_addr.client && pMidiPort->iAlsaPort == seq_addr.port) { bConnected = true; break; } } // Make and/or just report the connection... qjackctlAlsaMidiPort oport; setAlsaPort(&oport, seq_addr.client, seq_addr.port); if (bConnected) { checkAlsaPorts(&oport, pPort); } else { connectAlsaPorts(&oport, pPort); } snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } qDeleteAll(midiports); midiports.clear(); #endif // CONFIG_ALSA_SEQ } void qjackctlPatchbayRack::connectAlsaForward ( qjackctlPatchbaySocket *pSocket, qjackctlPatchbaySocket *pSocketForward ) { if (pSocket == nullptr || pSocketForward == nullptr) return; if (pSocket->type() != pSocketForward->type() || pSocket->type() != QJACKCTL_SOCKETTYPE_ALSA_MIDI) return; QStringListIterator iterPlug(pSocket->pluglist()); QStringListIterator iterPlugForward(pSocketForward->pluglist()); while (iterPlug.hasNext() && iterPlugForward.hasNext()) { // Check MIDI port connection sequentially... const QString& sPlug = iterPlug.next(); const QString& sPlugForward = iterPlugForward.next(); qjackctlAlsaMidiPort *pPortForward = findAlsaPort(m_imidiports, pSocketForward->clientName(), sPlugForward, 0); if (pPortForward) { qjackctlAlsaMidiPort *pPort = findAlsaPort(m_imidiports, pSocket->clientName(), sPlug, 0); if (pPort) connectAlsaForwardPorts(pPort, pPortForward); } } } #ifndef CONFIG_ALSA_SEQ #if defined(Q_CC_GNU) || defined(Q_CC_MINGW) #pragma GCC diagnostic pop #endif #endif // Common socket forwrading scan... void qjackctlPatchbayRack::connectForwardScan ( int iSocketType ) { // First, make a copy of a seriously forwarded socket list... QList socketlist; QListIterator isocket(m_isocketlist); while (isocket.hasNext()) { qjackctlPatchbaySocket *pSocket = isocket.next(); if (pSocket->type() != iSocketType) continue; if (pSocket->forward().isEmpty()) continue; socketlist.append(pSocket); } // Second, scan for input forwarded sockets... QListIterator iter(socketlist); while (iter.hasNext()) { qjackctlPatchbaySocket *pSocket = iter.next(); qjackctlPatchbaySocket *pSocketForward = findSocket(m_isocketlist, pSocket->forward()); if (pSocketForward == nullptr) continue; switch (iSocketType) { case QJACKCTL_SOCKETTYPE_JACK_AUDIO: case QJACKCTL_SOCKETTYPE_JACK_MIDI: connectJackForward(pSocket, pSocketForward); break; case QJACKCTL_SOCKETTYPE_ALSA_MIDI: connectAlsaForward(pSocket, pSocketForward); break; } } } //---------------------------------------------------------------------- // JACK snapshot. void qjackctlPatchbayRack::connectJackSnapshotEx ( int iSocketType ) { if (m_pJackClient == nullptr) return; const char *pszJackPortType = JACK_DEFAULT_AUDIO_TYPE; #ifdef CONFIG_JACK_MIDI if (iSocketType == QJACKCTL_SOCKETTYPE_JACK_MIDI) pszJackPortType = JACK_DEFAULT_MIDI_TYPE; #endif const char **ppszInputPorts = jack_get_ports(m_pJackClient, 0, pszJackPortType, JackPortIsInput); if (ppszInputPorts) { for (int i = 0; ppszInputPorts[i]; ++i) { const char *pszInputPort = ppszInputPorts[i]; const QString sInputPort = QString::fromUtf8(pszInputPort); const QString& sIClient = sInputPort.section(':', 0, 0); const QString& sIPort = sInputPort.section(':', 1); qjackctlPatchbaySnapshot::add_socket( isocketlist(), sIClient, sIPort, iSocketType); } jack_free(ppszInputPorts); } const char **ppszOutputPorts = jack_get_ports(m_pJackClient, 0, pszJackPortType, JackPortIsOutput); if (ppszOutputPorts == nullptr) return; qjackctlPatchbaySnapshot snapshot; for (int i = 0; ppszOutputPorts[i]; ++i) { const char *pszOutputPort = ppszOutputPorts[i]; const QString sOutputPort = QString::fromUtf8(pszOutputPort); const QString& sOClient = sOutputPort.section(':', 0, 0); const QString& sOPort = sOutputPort.section(':', 1); qjackctlPatchbaySnapshot::add_socket( osocketlist(), sOClient, sOPort, iSocketType); // Check for inputs from output... ppszInputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszOutputPort)); if (ppszInputPorts == nullptr) continue; for (int j = 0 ; ppszInputPorts[j]; ++j) { const char *pszInputPort = ppszInputPorts[j]; const QString sInputPort = QString::fromUtf8(pszInputPort); const QString& sIClient = sInputPort.section(':', 0, 0); const QString& sIPort = sInputPort.section(':', 1); snapshot.append(sOClient, sOPort, sIClient, sIPort); } jack_free(ppszInputPorts); } jack_free(ppszOutputPorts); snapshot.commit(this, iSocketType); } void qjackctlPatchbayRack::connectJackSnapshot ( jack_client_t *pJackClient ) { if (pJackClient == nullptr || m_pJackClient) return; // Cache JACK client descriptor. m_pJackClient = pJackClient; connectJackSnapshotEx(QJACKCTL_SOCKETTYPE_JACK_AUDIO); connectJackSnapshotEx(QJACKCTL_SOCKETTYPE_JACK_MIDI); // Done. m_pJackClient = nullptr; } //---------------------------------------------------------------------- // ALSA snapshot. void qjackctlPatchbayRack::connectAlsaSnapshot ( snd_seq_t *pAlsaSeq ) { if (pAlsaSeq == nullptr || m_pAlsaSeq) return; // Cache sequencer descriptor. m_pAlsaSeq = pAlsaSeq; #ifdef CONFIG_ALSA_SEQ QList imidiports; loadAlsaPorts(imidiports, false); QListIterator iport(imidiports); while (iport.hasNext()) { qjackctlAlsaMidiPort *pIPort = iport.next(); qjackctlPatchbaySnapshot::add_socket( isocketlist(), pIPort->sClientName, pIPort->sPortName, QJACKCTL_SOCKETTYPE_ALSA_MIDI); } qDeleteAll(imidiports); imidiports.clear(); qjackctlPatchbaySnapshot snapshot; QList omidiports; loadAlsaPorts(omidiports, true); QListIterator oport(omidiports); while (oport.hasNext()) { qjackctlAlsaMidiPort *pOPort = oport.next(); qjackctlPatchbaySnapshot::add_socket( osocketlist(), pOPort->sClientName, pOPort->sPortName, QJACKCTL_SOCKETTYPE_ALSA_MIDI); loadAlsaConnections(imidiports, pOPort, true); QListIterator iport(imidiports); while (iport.hasNext()) { qjackctlAlsaMidiPort *pIPort = iport.next(); snapshot.append( pOPort->sClientName, pOPort->sPortName, pIPort->sClientName, pIPort->sPortName); } qDeleteAll(imidiports); imidiports.clear(); } qDeleteAll(omidiports); omidiports.clear(); snapshot.commit(this, QJACKCTL_SOCKETTYPE_ALSA_MIDI); #endif // Done. m_pAlsaSeq = nullptr; } //---------------------------------------------------------------------- // JACK reset/disconnect-all. void qjackctlPatchbayRack::disconnectAllJackPortsEx ( int iSocketType ) { if (m_pJackClient == nullptr) return; const char *pszJackPortType = JACK_DEFAULT_AUDIO_TYPE; #ifdef CONFIG_JACK_MIDI if (iSocketType == QJACKCTL_SOCKETTYPE_JACK_MIDI) pszJackPortType = JACK_DEFAULT_MIDI_TYPE; #endif const char **ppszOutputPorts = jack_get_ports(m_pJackClient, 0, pszJackPortType, JackPortIsOutput); if (ppszOutputPorts) { for (int i = 0; ppszOutputPorts[i]; ++i) { const char *pszOutputPort = ppszOutputPorts[i]; const char **ppszInputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszOutputPort)); if (ppszInputPorts == nullptr) continue; for (int j = 0 ; ppszInputPorts[j]; ++j) { const char *pszInputPort = ppszInputPorts[j]; jack_disconnect(m_pJackClient, pszOutputPort, pszInputPort); } jack_free(ppszInputPorts); } jack_free(ppszOutputPorts); } } void qjackctlPatchbayRack::disconnectAllJackPorts ( jack_client_t *pJackClient ) { if (pJackClient == nullptr || m_pJackClient) return; // Cache JACK client descriptor. m_pJackClient = pJackClient; disconnectAllJackPortsEx(QJACKCTL_SOCKETTYPE_JACK_AUDIO); disconnectAllJackPortsEx(QJACKCTL_SOCKETTYPE_JACK_MIDI); // Done. m_pJackClient = nullptr; } //---------------------------------------------------------------------- // ALSA reset/disconnect-all. void qjackctlPatchbayRack::disconnectAllAlsaPorts ( snd_seq_t *pAlsaSeq ) { if (pAlsaSeq == nullptr || m_pAlsaSeq) return; // Cache sequencer descriptor. m_pAlsaSeq = pAlsaSeq; #ifdef CONFIG_ALSA_SEQ QList omidiports; loadAlsaPorts(omidiports, true); QListIterator oport(omidiports); while (oport.hasNext()) { qjackctlAlsaMidiPort *pOPort = oport.next(); QList imidiports; loadAlsaConnections(imidiports, pOPort, true); QListIterator iport(imidiports); while (iport.hasNext()) { qjackctlAlsaMidiPort *pIPort = iport.next(); snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOPort->iAlsaClient; seq_addr.port = pOPort->iAlsaPort; snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pIPort->iAlsaClient; seq_addr.port = pIPort->iAlsaPort; snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); snd_seq_unsubscribe_port(m_pAlsaSeq, pAlsaSubs); } qDeleteAll(imidiports); imidiports.clear(); } qDeleteAll(omidiports); omidiports.clear(); #endif // Done. m_pAlsaSeq = nullptr; } // qjackctlPatchbayRack.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlConnect.h0000644000000000000000000000013215174607203016443 xustar0030 mtime=1777536643.509914334 30 atime=1777536643.509914334 30 ctime=1777536643.509914334 qjackctl-1.0.6/src/qjackctlConnect.h0000644000175000001440000003200215174607203016430 0ustar00rncbcusers// qjackctlConnect.h // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlConnect_h #define __qjackctlConnect_h #include "qjackctlAliases.h" #include #include // QListViewItem::rtti return values. #define QJACKCTL_CLIENTITEM 1001 #define QJACKCTL_PORTITEM 1002 // Forward declarations. class qjackctlPortItem; class qjackctlClientItem; class qjackctlClientList; class qjackctlClientListView; class qjackctlConnectorView; class qjackctlConnectView; class qjackctlConnect; // Port list item. class qjackctlPortItem : public QTreeWidgetItem { public: // Constructor. qjackctlPortItem(qjackctlClientItem *pClient); // Default destructor. virtual ~qjackctlPortItem(); // Instance accessors. void setPortName(const QString& sPortName); const QString& clientName() const; const QString& portName() const; // Port name alias accessors. void setPortNameAlias(const QString& sPortNameAlias); QString portNameAlias(bool *pbRenameEnabled) const; // Proto-pretty/display name accessors. virtual void updatePortName(bool bRename = false); // Tooltip text building. virtual QString tooltip() const; // Complete client:port name helper. QString clientPortName() const; // Connections client item method. qjackctlClientItem *client() const; // Client port cleanup marker. void markPort(int iMark); void markClientPort(int iMark); int portMark() const; // Connected port list primitives. void addConnect(qjackctlPortItem *pPort); void removeConnect(qjackctlPortItem *pPort); // Connected port finders. qjackctlPortItem *findConnect(const QString& sClientPortName); qjackctlPortItem *findConnectPtr(qjackctlPortItem *pPortPtr); // Connection list accessor. const QList& connects() const; // Connectiopn highlight methods. bool isHilite() const; void setHilite (bool bHilite); // Proxy sort override method. // - Natural decimal sorting comparator. bool operator< (const QTreeWidgetItem& other) const; protected: // Port name display name accessors. void setPortText(const QString& sPortText, bool bRenameEnabled); QString portText() const; private: // Instance variables. qjackctlClientItem *m_pClient; QString m_sPortName; int m_iPortMark; bool m_bHilite; // Connection cache list. QList m_connects; }; // Client list item. class qjackctlClientItem : public QTreeWidgetItem { public: // Constructor. qjackctlClientItem(qjackctlClientList *pClientList); // Default destructor. virtual ~qjackctlClientItem(); // Port list primitive methods. void addPort(qjackctlPortItem *pPort); void removePort(qjackctlPortItem *pPort); // Port finder. qjackctlPortItem *findPort(const QString& sPortName); // Instance accessors. void setClientName(const QString& sClientName); const QString& clientName() const; // Client name alias accessors. void setClientNameAlias(const QString& sClientNameAlias); QString clientNameAlias(bool *pbRenameEnabled) const; // Proto-pretty/display name method. virtual void updateClientName(bool bRename = false); // Readable flag accessor. bool isReadable() const; // Client list accessor. qjackctlClientList *clientList() const; // Port list accessor. QList& ports(); // Client port cleanup marker. void markClient(int iMark); void markClientPorts(int iMark); int cleanClientPorts(int iMark); int clientMark() const; // Connectiopn highlight methods. bool isHilite() const; void setHilite (bool bHilite); // Client item openness status. void setOpen(bool bOpen); bool isOpen() const; // Proxy sort override method. // - Natural decimal sorting comparator. bool operator< (const QTreeWidgetItem& other) const; protected: // Client name display name accessors. void setClientText(const QString& sClientText, bool bRenameEnabled); QString clientText() const; private: // Instance variables. qjackctlClientList *m_pClientList; QString m_sClientName; int m_iClientMark; int m_iHilite; QList m_ports; }; // Jack client list. class qjackctlClientList : public QObject { public: // Constructor. qjackctlClientList(qjackctlClientListView *pListView, bool bReadable); // Default destructor. ~qjackctlClientList(); // Do proper contents cleanup. void clear(); // Client list primitive methods. void addClient(qjackctlClientItem *pClient); void removeClient(qjackctlClientItem *pClient); // Client finder. qjackctlClientItem *findClient(const QString& sClientName); // Client:port finder. qjackctlPortItem *findClientPort(const QString& sClientPort); // List view accessor. qjackctlClientListView *listView() const; // Readable flag accessor. bool isReadable() const; // Client list accessor. QList& clients(); // Client ports cleanup marker. void markClientPorts(int iMark); int cleanClientPorts(int iMark); // Client:port refreshner (return newest item count). virtual int updateClientPorts() = 0; // Client:port hilite update stabilization. void hiliteClientPorts (void); // Do proper contents refresh/update. void refresh(); // Natural decimal sorting comparator. static bool lessThan( const QTreeWidgetItem& item1, const QTreeWidgetItem& item2); private: // Instance variables. qjackctlClientListView *m_pListView; bool m_bReadable; QList m_clients; QTreeWidgetItem *m_pHiliteItem; }; //---------------------------------------------------------------------------- // qjackctlClientListView -- Client list view, supporting drag-n-drop. class qjackctlClientListView : public QTreeWidget { Q_OBJECT public: // Constructor. qjackctlClientListView(qjackctlConnectView *pConnectView, bool bReadable); // Default destructor. ~qjackctlClientListView(); // Auto-open timer methods. void setAutoOpenTimeout(int iAutoOpenTimeout); int autoOpenTimeout() const; // Aliasing support methods. void setAliasList(qjackctlAliasList *pAliasList, bool bRenameEnabled); qjackctlAliasList *aliasList() const; bool isRenameEnabled() const; // Binding indirect accessor. qjackctlConnect *binding() const; // Dirty aliases notification. void emitAliasesChanged(); protected slots: // In-place aliasing slots. void startRenameSlot(); void renamedSlot(); // Auto-open timeout slot. void timeoutSlot(); protected: // Trap for help/tool-tip events. bool eventFilter(QObject *pObject, QEvent *pEvent); // Drag-n-drop stuff. QTreeWidgetItem *dragDropItem(const QPoint& pos); // Drag-n-drop stuff -- reimplemented virtual methods. void dragEnterEvent(QDragEnterEvent *pDragEnterEvent); void dragMoveEvent(QDragMoveEvent *pDragMoveEvent); void dragLeaveEvent(QDragLeaveEvent *); void dropEvent(QDropEvent *pDropEvent); // Handle mouse events for drag-and-drop stuff. void mousePressEvent(QMouseEvent *pMouseEvent); void mouseMoveEvent(QMouseEvent *pMouseEvent); // Context menu request event handler. void contextMenuEvent(QContextMenuEvent *); private: // Bindings. qjackctlConnectView *m_pConnectView; // Auto-open timer. int m_iAutoOpenTimeout; QTimer *m_pAutoOpenTimer; // Items we'll eventually drop something. QTreeWidgetItem *m_pDragItem; QTreeWidgetItem *m_pDropItem; // The point from where drag started. QPoint m_posDrag; // Aliasing support. qjackctlAliasList *m_pAliasList; bool m_bRenameEnabled; }; //---------------------------------------------------------------------------- // qjackctlConnectorView -- Jack port connector widget. class qjackctlConnectorView : public QWidget { Q_OBJECT public: // Constructor. qjackctlConnectorView(qjackctlConnectView *pConnectView); // Default destructor. ~qjackctlConnectorView(); protected slots: // Useful slots (should this be protected?). void contentsChanged(); protected: // Draw visible port connection relation arrows. void paintEvent(QPaintEvent *); // Context menu request event handler. virtual void contextMenuEvent(QContextMenuEvent *); private: // Legal client/port item position helper. int itemY(QTreeWidgetItem *pItem) const; // Drawing methods. void drawConnectionLine(QPainter *pPainter, int x1, int y1, int x2, int y2, int h1, int h2, const QPen& pen); // Local instance variables. qjackctlConnectView *m_pConnectView; // Connector line color map/persistence. QHash m_colorMap; }; //---------------------------------------------------------------------------- // qjackctlConnectView -- Connections view integrated widget. class qjackctlConnectView : public QSplitter { Q_OBJECT public: // Constructor. qjackctlConnectView(QWidget *pParent = 0); // Default destructor. ~qjackctlConnectView(); // Widget accesors. qjackctlClientListView *OListView() const { return m_pOListView; } qjackctlClientListView *IListView() const { return m_pIListView; } qjackctlConnectorView *connectorView() const { return m_pConnectorView; } // Connections object binding methods. void setBinding(qjackctlConnect *pConnect); qjackctlConnect *binding() const; // Client list accessors. qjackctlClientList *OClientList() const; qjackctlClientList *IClientList() const; // Common icon size pixmap accessors. void setIconSize (int iIconSize); int iconSize (void) const; // Dirty aliases notification. void emitAliasesChanged(); signals: // Contents change signal. void aliasesChanged(); private: // Child controls. qjackctlClientListView *m_pOListView; qjackctlClientListView *m_pIListView; qjackctlConnectorView *m_pConnectorView; // The main binding object. qjackctlConnect *m_pConnect; // How large will be those icons. // 0 = 16x16 (default), 1 = 32x32, 2 = 64x64. int m_iIconSize; // The obnoxious dirty flag. bool m_bDirty; }; //---------------------------------------------------------------------------- // qjackctlConnect -- Connections model integrated object. class qjackctlConnect : public QObject { Q_OBJECT public: // Constructor. qjackctlConnect(qjackctlConnectView *pConnectView); // Default destructor. ~qjackctlConnect(); // Explicit connection tests. bool canConnectSelected(); bool canDisconnectSelected(); bool canDisconnectAll(); // Client list accessors. qjackctlClientList *OClientList() const; qjackctlClientList *IClientList() const; public slots: // Incremental contents refreshner; check dirty status. void refresh(); // Explicit connection slots. bool connectSelected(); bool disconnectSelected(); bool disconnectAll(); // Expand all client ports. void expandAll(); // Complete/incremental contents rebuilder; check dirty status if incremental. void updateContents(bool bClear); signals: // Connection change signal. void connectChanged(); // Pre-notification of (dis)connection. void connecting(qjackctlPortItem *, qjackctlPortItem *); void disconnecting(qjackctlPortItem *, qjackctlPortItem *); protected: // Connect/Disconnection primitives. virtual bool connectPorts( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort) = 0; virtual bool disconnectPorts( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort) = 0; // Update port connection references. virtual void updateConnections() = 0; // These must be accessed by the descendant constructor. qjackctlConnectView *connectView() const; void setOClientList(qjackctlClientList *pOClientList); void setIClientList(qjackctlClientList *pIClientList); // Common pixmap factory helper-method. QPixmap *createIconPixmap (const QString& sIconName); // Update icon size implementation. virtual void updateIconPixmaps() = 0; private: // Dunno. But this may avoid some conflicts. bool startMutex(); void endMutex(); // Connection methods (unguarded). bool canConnectSelectedEx(); bool canDisconnectSelectedEx(); bool canDisconnectAllEx(); bool connectSelectedEx(); bool disconnectSelectedEx(); bool disconnectAllEx(); // Connect/Disconnection local primitives. bool connectPortsEx(qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); bool disconnectPortsEx(qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); // Instance variables. qjackctlConnectView *m_pConnectView; // These must be created on the descendant constructor. qjackctlClientList *m_pOClientList; qjackctlClientList *m_pIClientList; int m_iMutex; }; #endif // __qjackctlConnect_h // end of qjackctlConnect.h qjackctl-1.0.6/src/PaxHeaders/qjackctlSessionSaveForm.ui0000644000000000000000000000013215174607203020326 xustar0030 mtime=1777536643.516914284 30 atime=1777536643.516914284 30 ctime=1777536643.516914284 qjackctl-1.0.6/src/qjackctlSessionSaveForm.ui0000644000175000001440000001243615174607203020324 0ustar00rncbcusers rncbc aka Rui Nuno Capela qjackctl - An Audio/MIDI multi-track sequencer. Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlSessionSaveForm 0 0 360 180 Qt::StrongFocus Session :/images/session1.png &Name: SessionNameLineEdit 320 0 Session name 0 &Directory: SessionDirComboBox Qt::Horizontal 20 8 0 320 0 Session directory true 22 22 24 24 Qt::TabFocus Browse for session directory ... Qt::Vertical 20 8 0 Save session versioning &Versioning Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok SessionNameLineEdit SessionDirComboBox SessionDirToolButton SessionVersioningCheckBox DialogButtonBox qjackctl-1.0.6/src/PaxHeaders/qjackctlPatchbayFile.cpp0000644000000000000000000000013215174607203017740 xustar0030 mtime=1777536643.514914298 30 atime=1777536643.514914298 30 ctime=1777536643.514914298 qjackctl-1.0.6/src/qjackctlPatchbayFile.cpp0000644000175000001440000002254015174607203017733 0ustar00rncbcusers// qjackctlPatchbayFile.cpp // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlPatchbayFile.h" #include #include #include // Deprecated QTextStreamFunctions/Qt namespaces workaround. #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) #define endl Qt::endl #endif //---------------------------------------------------------------------- // Specific patchbay socket list save (write) subroutine. static void load_socketlist ( QList& socketlist, QDomElement& eSockets ) { for (QDomNode nSocket = eSockets.firstChild(); !nSocket.isNull(); nSocket = nSocket.nextSibling()) { // Convert slot node to element... QDomElement eSocket = nSocket.toElement(); if (eSocket.isNull()) continue; if (eSocket.tagName() == "socket") { QString sSocketName = eSocket.attribute("name"); QString sClientName = eSocket.attribute("client"); QString sSocketType = eSocket.attribute("type"); QString sExclusive = eSocket.attribute("exclusive"); QString sSocketForward = eSocket.attribute("forward"); int iSocketType = qjackctlPatchbaySocket::typeFromText(sSocketType); bool bExclusive = (sExclusive == "on" || sExclusive == "yes" || sExclusive == "1"); qjackctlPatchbaySocket *pSocket = new qjackctlPatchbaySocket(sSocketName, sClientName, iSocketType); if (pSocket) { pSocket->setExclusive(bExclusive); pSocket->setForward(sSocketForward); // Now's time to handle pluglist... for (QDomNode nPlug = eSocket.firstChild(); !nPlug.isNull(); nPlug = nPlug.nextSibling()) { // Convert plug node to element... QDomElement ePlug = nPlug.toElement(); if (ePlug.isNull()) continue; if (ePlug.tagName() == "plug") pSocket->addPlug(ePlug.text()); } socketlist.append(pSocket); } } } } //---------------------------------------------------------------------- // Specific patchbay socket list save (write) subroutine. static void save_socketlist ( QList& socketlist, QDomElement& eSockets, QDomDocument& doc ) { QListIterator sockit(socketlist); while (sockit.hasNext()) { qjackctlPatchbaySocket *pSocket = sockit.next(); QDomElement eSocket = doc.createElement("socket"); eSocket.setAttribute("name", pSocket->name()); eSocket.setAttribute("client", pSocket->clientName()); eSocket.setAttribute("type", qjackctlPatchbaySocket::textFromType(pSocket->type())); eSocket.setAttribute("exclusive", (pSocket->isExclusive() ? "on" : "off")); if (!pSocket->forward().isEmpty()) eSocket.setAttribute("forward", pSocket->forward()); QDomElement ePlug; QStringListIterator iter(pSocket->pluglist()); while (iter.hasNext()) { const QString& sPlug = iter.next(); QDomElement ePlug = doc.createElement("plug"); QDomText text = doc.createTextNode(sPlug); ePlug.appendChild(text); eSocket.appendChild(ePlug); } eSockets.appendChild(eSocket); } } //---------------------------------------------------------------------- // class qjackctlPatchbayFile -- Patchbay file helper implementation. // // Specific patchbay load (read) method. bool qjackctlPatchbayFile::load ( qjackctlPatchbayRack *pPatchbay, const QString& sFilename ) { // Open file... QFile file(sFilename); if (!file.open(QIODevice::ReadOnly)) return false; // Parse it a-la-DOM :-) QDomDocument doc("patchbay"); if (!doc.setContent(&file)) { file.close(); return false; } file.close(); // Now e're better reset any old patchbay settings. pPatchbay->clear(); // Get root element. QDomElement eDoc = doc.documentElement(); // Now parse for slots, sockets and cables... for (QDomNode nRoot = eDoc.firstChild(); !nRoot.isNull(); nRoot = nRoot.nextSibling()) { // Convert node to element, if any. QDomElement eRoot = nRoot.toElement(); if (eRoot.isNull()) continue; // Check for output-socket spec lists... if (eRoot.tagName() == "output-sockets") load_socketlist(pPatchbay->osocketlist(), eRoot); else // Check for input-socket spec lists... if (eRoot.tagName() == "input-sockets") load_socketlist(pPatchbay->isocketlist(), eRoot); else // Check for slots spec list... if (eRoot.tagName() == "slots") { for (QDomNode nSlot = eRoot.firstChild(); !nSlot.isNull(); nSlot = nSlot.nextSibling()) { // Convert slot node to element... QDomElement eSlot = nSlot.toElement(); if (eSlot.isNull()) continue; if (eSlot.tagName() == "slot") { QString sSlotName = eSlot.attribute("name"); QString sSlotMode = eSlot.attribute("mode"); int iSlotMode = QJACKCTL_SLOTMODE_OPEN; if (sSlotMode == "half") iSlotMode = QJACKCTL_SLOTMODE_HALF; else if (sSlotMode == "full") iSlotMode = QJACKCTL_SLOTMODE_FULL; qjackctlPatchbaySlot *pSlot = new qjackctlPatchbaySlot(sSlotName, iSlotMode); pSlot->setOutputSocket( pPatchbay->findSocket(pPatchbay->osocketlist(), eSlot.attribute("output"))); pSlot->setInputSocket( pPatchbay->findSocket(pPatchbay->isocketlist(), eSlot.attribute("input"))); pPatchbay->addSlot(pSlot); } } } else // Check for cable spec list... if (eRoot.tagName() == "cables") { for (QDomNode nCable = eRoot.firstChild(); !nCable.isNull(); nCable = nCable.nextSibling()) { // Convert cable node to element... QDomElement eCable = nCable.toElement(); if (eCable.isNull()) continue; if (eCable.tagName() == "cable") { int iSocketType = qjackctlPatchbaySocket::typeFromText( eCable.attribute("type")); qjackctlPatchbaySocket *pOutputSocket = pPatchbay->findSocket(pPatchbay->osocketlist(), eCable.attribute("output"), iSocketType); qjackctlPatchbaySocket *pIntputSocket = pPatchbay->findSocket(pPatchbay->isocketlist(), eCable.attribute("input"), iSocketType); if (pOutputSocket && pIntputSocket) { pPatchbay->addCable( new qjackctlPatchbayCable( pOutputSocket, pIntputSocket)); } } } } } return true; } // Specific patchbay save (write) method. bool qjackctlPatchbayFile::save ( qjackctlPatchbayRack *pPatchbay, const QString& sFilename ) { QFileInfo fi(sFilename); QDomDocument doc("patchbay"); QDomElement eRoot = doc.createElement("patchbay"); eRoot.setAttribute("name", fi.baseName()); eRoot.setAttribute("version", PROJECT_VERSION); doc.appendChild(eRoot); // Save output-sockets spec... QDomElement eOutputSockets = doc.createElement("output-sockets"); save_socketlist(pPatchbay->osocketlist(), eOutputSockets, doc); eRoot.appendChild(eOutputSockets); // Save input-sockets spec... QDomElement eInputSockets = doc.createElement("input-sockets"); save_socketlist(pPatchbay->isocketlist(), eInputSockets, doc); eRoot.appendChild(eInputSockets); // Save slots spec... QDomElement eSlots = doc.createElement("slots"); QListIterator slotit(pPatchbay->slotlist()); while (slotit.hasNext()) { qjackctlPatchbaySlot *pSlot = slotit.next(); QDomElement eSlot = doc.createElement("slot"); eSlot.setAttribute("name", pSlot->name()); QString sSlotMode = "open"; switch (pSlot->mode()) { case QJACKCTL_SLOTMODE_HALF: sSlotMode = "half"; break; case QJACKCTL_SLOTMODE_FULL: sSlotMode = "full"; break; } eSlot.setAttribute("mode", sSlotMode); if (pSlot->outputSocket()) eSlot.setAttribute("output", pSlot->outputSocket()->name()); if (pSlot->inputSocket()) eSlot.setAttribute("input", pSlot->inputSocket()->name()); // Add this slot... eSlots.appendChild(eSlot); } eRoot.appendChild(eSlots); // Save cables spec... QDomElement eCables = doc.createElement("cables"); QListIterator cablit(pPatchbay->cablelist()); while (cablit.hasNext()) { qjackctlPatchbayCable *pCable = cablit.next(); if (pCable->outputSocket() && pCable->inputSocket()) { QDomElement eCable = doc.createElement("cable"); eCable.setAttribute("type", qjackctlPatchbaySocket::textFromType( pCable->outputSocket()->type())); eCable.setAttribute("output", pCable->outputSocket()->name()); eCable.setAttribute("input", pCable->inputSocket()->name()); eCables.appendChild(eCable); } } eRoot.appendChild(eCables); // Finally, we're ready to save to external file. QFile file(sFilename); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return false; QTextStream ts(&file); ts << doc.toString() << endl; file.close(); return true; } // qjackctlPatchbayFile.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlPatchbayFile.h0000644000000000000000000000013215174607203017405 xustar0030 mtime=1777536643.514914298 30 atime=1777536643.514914298 30 ctime=1777536643.514914298 qjackctl-1.0.6/src/qjackctlPatchbayFile.h0000644000175000001440000000260215174607203017375 0ustar00rncbcusers// qjackctlPatchbayFile.h // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlPatchbayFile_h #define __qjackctlPatchbayFile_h #include "qjackctlPatchbayRack.h" // Patchbay XML definition. class qjackctlPatchbayFile { public: // Simple patchbay I/O methods. static bool load (qjackctlPatchbayRack *pPatchbay, const QString& sFilename); static bool save (qjackctlPatchbayRack *pPatchbay, const QString& sFilename); }; #endif // __qjackctlPatchbayFile_h // qjackctlPatchbayFile.h qjackctl-1.0.6/src/PaxHeaders/qjackctlAboutForm.ui0000644000000000000000000000013215174607203017136 xustar0030 mtime=1777536643.509768862 30 atime=1777536643.509768862 30 ctime=1777536643.509768862 qjackctl-1.0.6/src/qjackctlAboutForm.ui0000644000175000001440000001071415174607203017131 0ustar00rncbcusers rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2025, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlAboutForm 0 0 520 280 About :/images/about1.png true 4 4 4 4 4 Qt::Horizontal 8 8 &Close Qt::TabFocus About Qt :/images/qtlogo1.png Qt::Vertical 8 8 1 false true true 32 32 QFrame::NoFrame :/images/qjackctl.svg true Qt::AlignCenter false 2 AboutTextView AboutQtButton ClosePushButton qjackctl-1.0.6/src/PaxHeaders/qjackctlSetupForm.h0000644000000000000000000000013215174607203016776 xustar0030 mtime=1777536643.516914284 30 atime=1777536643.516914284 30 ctime=1777536643.516914284 qjackctl-1.0.6/src/qjackctlSetupForm.h0000644000175000001440000000745615174607203017002 0ustar00rncbcusers// qjackctlSetupForm.h // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSetupForm_h #define __qjackctlSetupForm_h #include "ui_qjackctlSetupForm.h" // Forward declarations. class qjackctlSetup; class qjackctlPreset; class QButtonGroup; class QAbstractButton; //---------------------------------------------------------------------------- // qjackctlSetupForm -- UI wrapper form. class qjackctlSetupForm : public QDialog { Q_OBJECT public: // Constructor. qjackctlSetupForm(QWidget *pParent = nullptr); // Destructor. ~qjackctlSetupForm(); void setup(qjackctlSetup *pSetup); void updateCurrentPreset(); bool queryClose(); protected slots: void changeCurrentPreset(const QString&); void clearCurrentPreset(); void saveCurrentPreset(); void deleteCurrentPreset(); void changeDrivers(); void changeAudio(int); void changeDriver(int); void symbolStartupScript(); void symbolPostStartupScript(); void symbolShutdownScript(); void symbolPostShutdownScript(); void browseStartupScript(); void browsePostStartupScript(); void browseShutdownScript(); void browsePostShutdownScript(); void browseActivePatchbayPath(); void browseMessagesLogPath(); void chooseDisplayFont1(); void chooseDisplayFont2(); void toggleDisplayEffect(bool); void chooseMessagesFont(); void chooseConnectionsFont(); void editCustomColorThemes(); void buffSizeChanged(); void settingsChanged(); void optionsChanged(); void apply(); void discard(); void accept(); void reject(); void buttonClicked(QAbstractButton *); protected: // A combo-box text/data item setter helper. void setComboBoxCurrentText ( QComboBox *pComboBox, const QString& sText ) const; void setComboBoxCurrentData ( QComboBox *pComboBox, const QVariant& data ) const; void setCurrentPreset(const qjackctlPreset& preset); bool getCurrentPreset(qjackctlPreset& preset); void changePreset(const QString& sPreset); bool savePreset(const QString& sPreset); bool deletePreset(const QString& sPreset); void resetPresets(); void updateDrivers(); void updateBuffSize(); void computeLatency(); void changeDriverAudio(const QString& sDriver, int iAudio); void changeDriverUpdate(const QString& sDriver, bool bUpdate); void symbolMenu(QLineEdit * pLineEdit, QToolButton * pToolButton); // Custom color/style themes settlers. void resetCustomColorThemes(const QString& sCustomColorTheme); void resetCustomStyleThemes(const QString& sCustomStyleTheme); void updatePalette(); void stabilizeForm(); void showEvent(QShowEvent *); void hideEvent(QHideEvent *); private: // The Qt-designer UI struct... Ui::qjackctlSetupForm m_ui; // Instance variables. qjackctlSetup *m_pSetup; QButtonGroup *m_pTimeDisplayButtonGroup; int m_iDirtySetup; int m_iDirtyPreset; int m_iDirtyBuffSize; int m_iDirtySettings; int m_iDirtyOptions; QString m_sPreset; QStringList m_drivers; }; #endif // __qjackctlSetupForm_h // end of qjackctlSetupForm.h qjackctl-1.0.6/src/PaxHeaders/qjackctlPatchbayForm.ui0000644000000000000000000000013215174607203017617 xustar0030 mtime=1777536643.515914291 30 atime=1777536643.514914298 30 ctime=1777536643.515914291 qjackctl-1.0.6/src/qjackctlPatchbayForm.ui0000644000175000001440000004147715174607203017624 0ustar00rncbcusers rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlPatchbayForm 0 0 520 320 1 1 0 0 Patchbay :/images/patchbay1.png 4 4 Qt::Horizontal Qt::Horizontal QSizePolicy::Fixed 80 8 4 4 7 7 0 0 Qt::TabFocus Move currently selected output socket down one position Down :/images/down1.png Create a new output socket Add... :/images/add1.png Qt::Vertical QSizePolicy::Expanding 8 42 Edit currently selected input socket properties Edit... :/images/edit1.png Qt::Vertical QSizePolicy::Expanding 8 42 Move currently selected output socket up one position Up :/images/up1.png Remove currently selected output socket Remove :/images/remove1.png Duplicate (copy) currently selected output socket Copy... :/images/copy1.png Move currently selected output socket down one position Down :/images/down1.png Remove currently selected input socket Remove :/images/remove1.png Duplicate (copy) currently selected input socket Copy... :/images/copy1.png Create a new input socket Add... :/images/add1.png Edit currently selected output socket properties Edit... :/images/edit1.png Move currently selected output socket up one position Up :/images/up1.png Qt::Horizontal QSizePolicy::Fixed 80 8 4 4 Connect currently selected sockets &Connect :/images/connect1.png Disconnect currently selected sockets &Disconnect :/images/disconnect1.png Disconnect all currently connected sockets Disconnect &All :/images/disconnect1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Expand all items E&xpand All :/images/expandall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Refresh current patchbay view &Refresh :/images/refresh1.png true 4 4 Create a new patchbay profile &New :/images/new1.png false Load patchbay profile &Load... :/images/open1.png false Save current patchbay profile &Save... :/images/save1.png false 7 5 0 0 75 true Current (recent) patchbay profile(s) Toggle activation of current patchbay profile Acti&vate :/images/apply1.png true false qjackctlPatchbayView QWidget
qjackctlPatchbay.h
NewPatchbayPushButton LoadPatchbayPushButton SavePatchbayPushButton PatchbayComboBox ActivatePatchbayPushButton OSocketAddPushButton OSocketEditPushButton OSocketCopyPushButton OSocketRemovePushButton OSocketMoveUpPushButton OSocketMoveDownPushButton PatchbayView ISocketAddPushButton ISocketEditPushButton ISocketCopyPushButton ISocketRemovePushButton ISocketMoveUpPushButton ISocketMoveDownPushButton ConnectPushButton DisconnectPushButton DisconnectAllPushButton ExpandAllPushButton RefreshPushButton
qjackctl-1.0.6/src/PaxHeaders/qjackctlJackGraph.cpp0000644000000000000000000000012715174607203017243 xustar0029 mtime=1777536643.51191432 29 atime=1777536643.51191432 29 ctime=1777536643.51191432 qjackctl-1.0.6/src/qjackctlJackGraph.cpp0000644000175000001440000004211515174607203017232 0ustar00rncbcusers// qjackctlJackGraph.cpp // /**************************************************************************** Copyright (C) 2003-2026, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlJackGraph.h" #include "qjackctlMainForm.h" #include //---------------------------------------------------------------------------- // qjackctlJackGraph -- JACK graph driver #ifdef CONFIG_JACK_METADATA // JACK client/port meta-data property helpers. // #include #include static QString qjackctlJackGraph_get_property ( jack_uuid_t uuid, const char *key, const QString& name ) { QString property = name; char *value = nullptr; char *type = nullptr; if (::jack_get_property(uuid, key, &value, &type) == 0) { if (value) { property = QString::fromUtf8(value); ::jack_free(value); } if (type) ::jack_free(type); } return property; } static void qjackctlJackGraph_set_property ( jack_client_t *client, jack_uuid_t uuid, const char *key, const QString& property ) { const QByteArray aValue = property.toUtf8(); const char *value = aValue.constData(); ::jack_set_property(client, uuid, key, value, NULL); } static void qjackctlJackGraph_remove_property ( jack_client_t *client, jack_uuid_t uuid, const char *key ) { ::jack_remove_property(client, uuid, key); } // Pretty-name property accessors. // static QString qjackctlJackGraph_pretty_name ( jack_uuid_t uuid, const QString& pretty_name ) { return qjackctlJackGraph_get_property(uuid, JACK_METADATA_PRETTY_NAME, pretty_name); } static void qjackctlJackGraph_set_pretty_name ( jack_client_t *client, jack_uuid_t uuid, const QString& pretty_name ) { qjackctlJackGraph_set_property(client, uuid, JACK_METADATA_PRETTY_NAME, pretty_name); } static void qjackctlJackGraph_remove_pretty_name ( jack_client_t *client, jack_uuid_t uuid ) { qjackctlJackGraph_remove_property(client, uuid, JACK_METADATA_PRETTY_NAME); } // Port-index property accessors. // #ifndef JACKEY_ORDER #define JACKEY_ORDER "http://jackaudio.org/metadata/order" #endif static int qjackctlJackGraph_port_index ( jack_uuid_t uuid, int index ) { return qjackctlJackGraph_get_property(uuid, JACKEY_ORDER, QString::number(index)).toInt(); } #ifdef CONFIG_JACK_CV // Signal-type property accessors (audio|"cv"). // #ifndef JACKEY_SIGNAL_TYPE #define JACKEY_SIGNAL_TYPE "http://jackaudio.org/metadata/signal-type" #endif static QString qjackctlJackGraph_signal_type ( jack_uuid_t uuid ) { return qjackctlJackGraph_get_property(uuid, JACKEY_SIGNAL_TYPE, QString()).toLower(); } static bool qjackctlJackGraph_port_is_cv ( jack_uuid_t uuid ) { return qjackctlJackGraph_signal_type(uuid) == "cv"; } #endif // CONFIG_JACK_CV #ifdef CONFIG_JACK_OSC // Event-types property accessors (MIDI|"osc"). // #ifndef JACKEY_EVENT_TYPES #define JACKEY_EVENT_TYPES "http://jackaudio.org/metadata/event-types" #endif static QStringList qjackctlJackGraph_event_types ( jack_uuid_t uuid ) { return qjackctlJackGraph_get_property(uuid, JACKEY_EVENT_TYPES, QString("midi")).toLower().split(','); } static bool qjackctlJackGraph_port_is_osc ( jack_uuid_t uuid ) { return qjackctlJackGraph_event_types(uuid).contains("osc"); } #endif // CONFIG_JACK_OSC #endif // CONFIG_JACK_METADATA // Constructor. qjackctlJackGraph::qjackctlJackGraph ( qjackctlGraphCanvas *canvas ) : qjackctlGraphSect(canvas) { } // JACK port (dis)connection. void qjackctlJackGraph::connectPorts ( qjackctlGraphPort *port1, qjackctlGraphPort *port2, bool is_connect ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; jack_client_t *client = pMainForm->jackClient(); if (client == nullptr) return; if (port1 == nullptr || port2 == nullptr) return; const qjackctlGraphNode *node1 = port1->portNode(); const qjackctlGraphNode *node2 = port2->portNode(); if (node1 == nullptr || node2 == nullptr) return; QMutexLocker locker(&m_mutex); const QByteArray client_port1 = QString(node1->nodeName() + ':' + port1->portName()).toUtf8(); const QByteArray client_port2 = QString(node2->nodeName() + ':' + port2->portName()).toUtf8(); const char *client_port_name1 = client_port1.constData(); const char *client_port_name2 = client_port2.constData(); #ifdef CONFIG_DEBUG qDebug("qjackctlJackGraph::connectPorts(\"%s\", \"%s\", %d)", client_port_name1, client_port_name2, is_connect); #endif if (is_connect) { ::jack_connect(client, client_port_name1, client_port_name2); } else { ::jack_disconnect(client, client_port_name1, client_port_name2); } } // JACK node type inquirer. (static) bool qjackctlJackGraph::isNodeType ( uint node_type ) { return (node_type == qjackctlJackGraph::nodeType()); } // JACK node type. uint qjackctlJackGraph::nodeType (void) { static const uint JackNodeType = qjackctlGraphItem::itemType("JACK_NODE_TYPE"); return JackNodeType; } // JACK port type(s) inquirer. (static) bool qjackctlJackGraph::isPortType ( uint port_type ) { return port_type == audioPortType() || port_type == midiPortType() #ifdef CONFIG_JACK_CV || port_type == cvPortType() #endif #ifdef CONFIG_JACK_OSC || port_type == oscPortType() #endif ; } uint qjackctlJackGraph::audioPortType (void) { return qjackctlGraphItem::itemType(JACK_DEFAULT_AUDIO_TYPE); } uint qjackctlJackGraph::midiPortType (void) { return qjackctlGraphItem::itemType(JACK_DEFAULT_MIDI_TYPE); } uint qjackctlJackGraph::cvPortType (void) { return qjackctlGraphItem::itemType("JACK_SIGNAL_TYPE_CV"); } uint qjackctlJackGraph::oscPortType (void) { return qjackctlGraphItem::itemType("JACK_EVENT_TYPE_OSC"); } // JACK client:port finder and creator if not existing. bool qjackctlJackGraph::findClientPort ( jack_client_t *client, const char *client_port, qjackctlGraphItem::Mode port_mode, qjackctlGraphNode **node, qjackctlGraphPort **port, bool add_new ) { jack_port_t *jack_port = ::jack_port_by_name(client, client_port); if (jack_port == nullptr) return false; const QString& client_port_name = QString::fromUtf8(client_port); const int colon = client_port_name.indexOf(':'); if (colon < 0) return false; const QString& client_name = client_port_name.left(colon); const QString& port_name = client_port_name.right(client_port_name.length() - colon - 1); const uint node_type = qjackctlJackGraph::nodeType(); const char *port_type_name = ::jack_port_type(jack_port); uint port_type = qjackctlGraphItem::itemType(port_type_name); #ifdef CONFIG_JACK_METADATA const jack_uuid_t port_uuid = ::jack_port_uuid(jack_port); #ifdef CONFIG_JACK_CV if (port_type == audioPortType() && qjackctlJackGraph_port_is_cv(port_uuid)) port_type = cvPortType(); #endif #ifdef CONFIG_JACK_OSC if (port_type == midiPortType() && qjackctlJackGraph_port_is_osc(port_uuid)) port_type = oscPortType(); #endif #endif // CONFIG_JACK_METADATA qjackctlGraphItem::Mode node_mode = port_mode; *node = qjackctlGraphSect::findNode(client_name, node_mode, node_type); *port = nullptr; if (*node == nullptr) { const unsigned long port_flags = ::jack_port_flags(jack_port); const unsigned long port_flags_mask = (JackPortIsPhysical | JackPortIsTerminal); if ((port_flags & port_flags_mask) != port_flags_mask) { node_mode = qjackctlGraphItem::Duplex; *node = qjackctlGraphSect::findNode(client_name, node_mode, node_type); } } if (*node) *port = (*node)->findPort(port_name, port_mode, port_type); if (add_new && *node == nullptr) { *node = new qjackctlGraphNode(client_name, node_mode, node_type); (*node)->setNodeIcon(QIcon(":/images/graphJack.png")); qjackctlGraphSect::addItem(*node); } if (add_new && *port == nullptr && *node) { *port = (*node)->addPort(port_name, port_mode, port_type); (*port)->updatePortTypeColors(qjackctlGraphSect::canvas()); } if (add_new && *node) { int nchanged = 0; QString node_title = (*node)->nodeTitle(); #ifdef CONFIG_JACK_METADATA const char *client_uuid_name = ::jack_get_uuid_for_client_name(client, client_name.toUtf8().constData()); if (client_uuid_name) { jack_uuid_t client_uuid = 0; ::jack_uuid_parse(client_uuid_name, &client_uuid); const QString& pretty_name = qjackctlJackGraph_pretty_name(client_uuid, client_name); if (!pretty_name.isEmpty()) node_title = pretty_name; ::jack_free((void *) client_uuid_name); } #endif // CONFIG_JACK_METADATA foreach (qjackctlAliasList *node_aliases, item_aliases(*node)) node_title = node_aliases->clientAlias(client_name); if ((*node)->nodeTitle() != node_title) { (*node)->setNodeTitle(node_title); ++nchanged; } if (*port) { QString port_title = (*port)->portTitle(); #ifdef CONFIG_JACK_METADATA const QString& pretty_name = qjackctlJackGraph_pretty_name(port_uuid, port_name); if (!pretty_name.isEmpty()) port_title = pretty_name; const int port_index = qjackctlJackGraph_port_index(port_uuid, 0); if ((*port)->portIndex() != port_index) { (*port)->setPortIndex(port_index); ++nchanged; } #endif // CONFIG_JACK_METADATA foreach (qjackctlAliasList *port_aliases, item_aliases(*port)) port_title = port_aliases->portAlias(client_name, port_name); if ((*port)->portTitle() != port_title) { (*port)->setPortTitle(port_title); ++nchanged; } } if (nchanged > 0) (*node)->updatePath(); } return (*node && *port); } // JACK graph updaters. void qjackctlJackGraph::updateItems (void) { QMutexLocker locker(&m_mutex); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; jack_client_t *client = pMainForm->jackClient(); if (client == nullptr) return; #ifdef CONFIG_DEBUG_0 qDebug("qjackctlJackGraph::updateItems()"); #endif // 1. Client/ports inventory... // const char **client_ports1 = ::jack_get_ports(client, nullptr, nullptr, 0); if (client_ports1 == nullptr) return; for (int i = 0; client_ports1[i]; ++i) { const char *client_port1 = client_ports1[i]; jack_port_t *jack_port1 = ::jack_port_by_name(client, client_port1); if (jack_port1 == nullptr) continue; const unsigned long port_flags1 = ::jack_port_flags(jack_port1); qjackctlGraphItem::Mode port_mode1 = qjackctlGraphItem::None; if (port_flags1 & JackPortIsInput) port_mode1 = qjackctlGraphItem::Input; else if (port_flags1 & JackPortIsOutput) port_mode1 = qjackctlGraphItem::Output; qjackctlGraphNode *node1 = nullptr; qjackctlGraphPort *port1 = nullptr; if (findClientPort(client, client_port1, port_mode1, &node1, &port1, true)) { node1->setMarked(true); port1->setMarked(true); } } // 2. Connections inventory... // for (int i = 0; client_ports1[i]; ++i) { const char *client_port1 = client_ports1[i]; jack_port_t *jack_port1 = ::jack_port_by_name(client, client_port1); if (jack_port1 == nullptr) continue; const unsigned long port_flags1 = ::jack_port_flags(jack_port1); if (port_flags1 & JackPortIsOutput) { const qjackctlGraphItem::Mode port_mode1 = qjackctlGraphItem::Output; const char **client_ports2 = ::jack_port_get_all_connections(client, jack_port1); if (client_ports2 == nullptr) continue; qjackctlGraphNode *node1 = nullptr; qjackctlGraphPort *port1 = nullptr; if (findClientPort(client, client_port1, port_mode1, &node1, &port1, false)) { for (int j = 0; client_ports2[j]; ++j) { const char *client_port2 = client_ports2[j]; const qjackctlGraphItem::Mode port_mode2 = qjackctlGraphItem::Input; qjackctlGraphNode *node2 = nullptr; qjackctlGraphPort *port2 = nullptr; if (findClientPort(client, client_port2, port_mode2, &node2, &port2, false)) { qjackctlGraphConnect *connect = port1->findConnect(port2); if (connect == nullptr) { connect = new qjackctlGraphConnect(); connect->setPort1(port1); connect->setPort2(port2); connect->updatePortTypeColors(); connect->updatePath(); qjackctlGraphSect::addItem(connect); } if (connect) connect->setMarked(true); } } } jack_free(client_ports2); } } jack_free(client_ports1); // 3. Clean-up all un-marked items... // qjackctlGraphSect::resetItems(qjackctlJackGraph::nodeType()); } void qjackctlJackGraph::clearItems (void) { QMutexLocker locker(&m_mutex); #ifdef CONFIG_DEBUG_0 qDebug("qjackctlJackGraph::clearItems()"); #endif qjackctlGraphSect::clearItems(qjackctlJackGraph::nodeType()); } // Special port-type colors defaults (static). void qjackctlJackGraph::resetPortTypeColors ( qjackctlGraphCanvas *canvas ) { if (canvas) { canvas->setPortTypeColor( qjackctlJackGraph::audioPortType(), QColor(Qt::darkGreen).darker(120)); canvas->setPortTypeColor( qjackctlJackGraph::midiPortType(), QColor(Qt::darkRed).darker(120)); #ifdef CONFIG_JACK_CV canvas->setPortTypeColor( qjackctlJackGraph::cvPortType(), QColor(Qt::darkCyan).darker(120)); #endif #ifdef CONFIG_JACK_OSC canvas->setPortTypeColor( qjackctlJackGraph::oscPortType(), QColor(Qt::darkYellow).darker(120)); #endif } } // Client/port item aliases accessor. QList qjackctlJackGraph::item_aliases ( qjackctlGraphItem *item ) const { QList alist; qjackctlAliases *aliases = nullptr; qjackctlGraphCanvas *canvas = qjackctlGraphSect::canvas(); if (canvas) aliases = canvas->aliases(); if (aliases == nullptr) return alist; // empty! uint item_type = 0; qjackctlGraphItem::Mode item_mode = qjackctlGraphItem::None; bool is_node = false; if (item->type() == qjackctlGraphNode::Type) { qjackctlGraphNode *node = static_cast (item); if (node && qjackctlJackGraph::isNodeType(node->nodeType())) { item_type = node->nodeType(); item_mode = node->nodeMode(); is_node = true; } } else if (item->type() == qjackctlGraphPort::Type) { qjackctlGraphPort *port = static_cast (item); if (port) { item_type = port->portType(); item_mode = port->portMode(); } } if (!item_type || !item_mode) return alist; // empty again! if (is_node || item_type == qjackctlJackGraph::audioPortType()) { // JACK audio type... if (item_mode & qjackctlGraphItem::Input) alist.append(&(aliases->audioInputs)); if (item_mode & qjackctlGraphItem::Output) alist.append(&(aliases->audioOutputs)); } if (is_node || item_type == qjackctlJackGraph::midiPortType()) { // JACK MIDI type... if (item_mode & qjackctlGraphItem::Input) alist.append(&(aliases->midiInputs)); if (item_mode & qjackctlGraphItem::Output) alist.append(&(aliases->midiOutputs)); } return alist; // hopefully non empty! } // Client/port renaming method (virtual override). void qjackctlJackGraph::renameItem ( qjackctlGraphItem *item, const QString& name ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; jack_client_t *client = pMainForm->jackClient(); if (client == nullptr) return; #ifdef CONFIG_JACK_METADATA qjackctlGraphNode *node = nullptr; if (item->type() == qjackctlGraphNode::Type) { qjackctlGraphNode *node = static_cast (item); if (node) { const QString& node_name = node->nodeName(); const QByteArray client_name = node_name.toUtf8(); const char *client_uuid_name = ::jack_get_uuid_for_client_name(client, client_name.constData()); if (client_uuid_name) { jack_uuid_t client_uuid = 0; ::jack_uuid_parse(client_uuid_name, &client_uuid); if (name.isEmpty()) qjackctlJackGraph_remove_pretty_name(client, client_uuid); else qjackctlJackGraph_set_pretty_name(client, client_uuid, name); ::jack_free((void *) client_uuid_name); } } } else if (item->type() == qjackctlGraphPort::Type) { qjackctlGraphPort *port = static_cast (item); if (port) node = port->portNode(); if (port && node) { const QString& port_name = port->portName(); const QString& client_port = node->nodeName() + ':' + port_name; const QByteArray client_port_name = client_port.toUtf8(); jack_port_t *jack_port = ::jack_port_by_name(client, client_port_name.constData()); if (jack_port) { jack_uuid_t port_uuid = ::jack_port_uuid(jack_port); if (name.isEmpty()) qjackctlJackGraph_remove_pretty_name(client, port_uuid); else qjackctlJackGraph_set_pretty_name(client, port_uuid, name); } } } #endif // CONFIG_JACK_METADATA qjackctlGraphSect::renameItem(item, name); } // end of qjackctlJackGraph.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlAlsaConnect.cpp0000644000000000000000000000013215174607203017577 xustar0030 mtime=1777536643.509914334 30 atime=1777536643.509768862 30 ctime=1777536643.509914334 qjackctl-1.0.6/src/qjackctlAlsaConnect.cpp0000644000175000001440000002777215174607203017606 0ustar00rncbcusers// qjackctlAlsaConnect.cpp // /**************************************************************************** Copyright (C) 2003-2021, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAlsaConnect.h" #include "qjackctlMainForm.h" #include //---------------------------------------------------------------------- // class qjackctlAlsaPort -- Alsa port list item. // // Constructor. qjackctlAlsaPort::qjackctlAlsaPort ( qjackctlAlsaClient *pClient ) : qjackctlPortItem(pClient) { qjackctlAlsaConnect *pAlsaConnect = static_cast ( ((pClient->clientList())->listView())->binding()); if (pAlsaConnect) { if (pClient->isReadable()) { QTreeWidgetItem::setIcon(0, QIcon(pAlsaConnect->pixmap(QJACKCTL_ALSA_PORTO))); } else { QTreeWidgetItem::setIcon(0, QIcon(pAlsaConnect->pixmap(QJACKCTL_ALSA_PORTI))); } } } // Default destructor. qjackctlAlsaPort::~qjackctlAlsaPort (void) { } // Alsa handles accessors. int qjackctlAlsaPort::alsaClient (void) const { return (static_cast (client()))->alsaClient(); } int qjackctlAlsaPort::alsaPort (void) const { return portName().section(':', 0, 0).toInt(); } //---------------------------------------------------------------------- // class qjackctlAlsaClient -- Alsa client list item. // // Constructor. qjackctlAlsaClient::qjackctlAlsaClient ( qjackctlAlsaClientList *pClientList ) : qjackctlClientItem(pClientList) { qjackctlAlsaConnect *pAlsaConnect = static_cast ( (pClientList->listView())->binding()); if (pAlsaConnect) { if (pClientList->isReadable()) { QTreeWidgetItem::setIcon(0, QIcon(pAlsaConnect->pixmap(QJACKCTL_ALSA_CLIENTO))); } else { QTreeWidgetItem::setIcon(0, QIcon(pAlsaConnect->pixmap(QJACKCTL_ALSA_CLIENTI))); } } } // Default destructor. qjackctlAlsaClient::~qjackctlAlsaClient (void) { } // Jack client accessor. int qjackctlAlsaClient::alsaClient (void) const { return clientName().section(':', 0, 0).toInt(); } // Derived port finder. qjackctlAlsaPort *qjackctlAlsaClient::findPort ( int iAlsaPort ) { QListIterator iter(ports()); while (iter.hasNext()) { qjackctlAlsaPort *pPort = static_cast (iter.next()); if (iAlsaPort == pPort->alsaPort()) return pPort; } return nullptr; } //---------------------------------------------------------------------- // qjackctlAlsaClientList -- Jack client list. // // Constructor. qjackctlAlsaClientList::qjackctlAlsaClientList ( qjackctlClientListView *pListView, bool bReadable ) : qjackctlClientList(pListView, bReadable) { } // Default destructor. qjackctlAlsaClientList::~qjackctlAlsaClientList (void) { } // Client finder by id. qjackctlAlsaClient *qjackctlAlsaClientList::findClient ( int iAlsaClient ) { QListIterator iter(clients()); while (iter.hasNext()) { qjackctlAlsaClient *pClient = static_cast (iter.next()); if (iAlsaClient == pClient->alsaClient()) return pClient; } return nullptr; } // Client port finder by id. qjackctlAlsaPort *qjackctlAlsaClientList::findClientPort ( int iAlsaClient, int iAlsaPort ) { qjackctlAlsaClient *pClient = findClient(iAlsaClient); if (pClient == nullptr) return nullptr; return pClient->findPort(iAlsaPort); } // Client:port refreshner. int qjackctlAlsaClientList::updateClientPorts (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return 0; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == nullptr) return 0; int iDirtyCount = 0; markClientPorts(0); #ifdef CONFIG_ALSA_SEQ unsigned int uiAlsaFlags; if (isReadable()) uiAlsaFlags = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ; else uiAlsaFlags = SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE; snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); snd_seq_client_info_set_client(pClientInfo, -1); while (snd_seq_query_next_client(pAlsaSeq, pClientInfo) >= 0) { const int iAlsaClient = snd_seq_client_info_get_client(pClientInfo); if (iAlsaClient > 0) { qjackctlAlsaClient *pClient = findClient(iAlsaClient); snd_seq_port_info_set_client(pPortInfo, iAlsaClient); snd_seq_port_info_set_port(pPortInfo, -1); while (snd_seq_query_next_port(pAlsaSeq, pPortInfo) >= 0) { const unsigned int uiPortCapability = snd_seq_port_info_get_capability(pPortInfo); if (((uiPortCapability & uiAlsaFlags) == uiAlsaFlags) && ((uiPortCapability & SND_SEQ_PORT_CAP_NO_EXPORT) == 0)) { QString sClientName = QString::number(iAlsaClient) + ':'; sClientName += QString::fromUtf8( snd_seq_client_info_get_name(pClientInfo)); qjackctlAlsaPort *pPort = 0; const int iAlsaPort = snd_seq_port_info_get_port(pPortInfo); if (pClient == 0) { pClient = new qjackctlAlsaClient(this); pClient->setClientName(sClientName); iDirtyCount++; } else { pPort = pClient->findPort(iAlsaPort); if (sClientName != pClient->clientName()) { pClient->setClientName(sClientName); iDirtyCount++; } } if (pClient) { QString sPortName = QString::number(iAlsaPort) + ':'; sPortName += QString::fromUtf8( snd_seq_port_info_get_name(pPortInfo)); if (pPort == 0) { pPort = new qjackctlAlsaPort(pClient); pPort->setPortName(sPortName); iDirtyCount++; } else if (sPortName != pPort->portName()) { pPort->setPortName(sPortName); iDirtyCount++; } } if (pPort) pPort->markClientPort(1); } } } } #endif // CONFIG_ALSA_SEQ iDirtyCount += cleanClientPorts(0); return iDirtyCount; } //---------------------------------------------------------------------- // qjackctlAlsaConnect -- Output-to-Input client/ports connection object. // // Constructor. qjackctlAlsaConnect::qjackctlAlsaConnect ( qjackctlConnectView *pConnectView ) : qjackctlConnect(pConnectView) { createIconPixmaps(); setOClientList(new qjackctlAlsaClientList( connectView()->OListView(), true)); setIClientList(new qjackctlAlsaClientList( connectView()->IListView(), false)); } // Default destructor. qjackctlAlsaConnect::~qjackctlAlsaConnect (void) { deleteIconPixmaps(); } // Common pixmap accessor (static). const QPixmap& qjackctlAlsaConnect::pixmap ( int iPixmap ) const { return *m_apPixmaps[iPixmap]; } // Local pixmap-set janitor methods. void qjackctlAlsaConnect::createIconPixmaps (void) { m_apPixmaps[QJACKCTL_ALSA_CLIENTI] = createIconPixmap("mclienti"); m_apPixmaps[QJACKCTL_ALSA_CLIENTO] = createIconPixmap("mcliento"); m_apPixmaps[QJACKCTL_ALSA_PORTI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_ALSA_PORTO] = createIconPixmap("mporto"); } void qjackctlAlsaConnect::deleteIconPixmaps (void) { for (int i = 0; i < QJACKCTL_ALSA_PIXMAPS; i++) { if (m_apPixmaps[i]) delete m_apPixmaps[i]; m_apPixmaps[i] = nullptr; } } #ifndef CONFIG_ALSA_SEQ #if defined(Q_CC_GNU) || defined(Q_CC_MINGW) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #endif #endif // Connection primitive. bool qjackctlAlsaConnect::connectPorts ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return false; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == nullptr) return false; qjackctlAlsaPort *pOAlsa = static_cast (pOPort); qjackctlAlsaPort *pIAlsa = static_cast (pIPort); snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOAlsa->alsaClient(); seq_addr.port = pOAlsa->alsaPort(); snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pIAlsa->alsaClient(); seq_addr.port = pIAlsa->alsaPort(); snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); return (snd_seq_subscribe_port(pAlsaSeq, pAlsaSubs) >= 0); #else return false; #endif // CONFIG_ALSA_SEQ } // Disconnection primitive. bool qjackctlAlsaConnect::disconnectPorts ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return false; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == nullptr) return false; qjackctlAlsaPort *pOAlsa = static_cast (pOPort); qjackctlAlsaPort *pIAlsa = static_cast (pIPort); snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOAlsa->alsaClient(); seq_addr.port = pOAlsa->alsaPort(); snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pIAlsa->alsaClient(); seq_addr.port = pIAlsa->alsaPort(); snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); return (snd_seq_unsubscribe_port(pAlsaSeq, pAlsaSubs) >= 0); #else return false; #endif // CONFIG_ALSA_SEQ } // Update port connection references. void qjackctlAlsaConnect::updateConnections (void) { #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == nullptr) return; snd_seq_query_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_query_subscribe_alloca(&pAlsaSubs); // Proper type casts. qjackctlAlsaClientList *pOClientList = static_cast (OClientList()); qjackctlAlsaClientList *pIClientList = static_cast (IClientList()); // For each output client item... QListIterator oclient(pOClientList->clients()); while (oclient.hasNext()) { qjackctlClientItem *pOClient = oclient.next(); // For each output port item... QListIterator oport(pOClient->ports()); while (oport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); // Are there already any connections? if (pOPort->connects().count() > 0) continue; // Hava a proper type cast. qjackctlAlsaPort *pOAlsa = static_cast (pOPort); // Get port connections... snd_seq_query_subscribe_set_type(pAlsaSubs, SND_SEQ_QUERY_SUBS_READ); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pOAlsa->alsaClient(); seq_addr.port = pOAlsa->alsaPort(); snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); qjackctlPortItem *pIPort = pIClientList->findClientPort( seq_addr.client, seq_addr.port); if (pIPort) { pOPort->addConnect(pIPort); pIPort->addConnect(pOPort); } snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } } } #endif // CONFIG_ALSA_SEQ } #ifndef CONFIG_ALSA_SEQ #if defined(Q_CC_GNU) || defined(Q_CC_MINGW) #pragma GCC diagnostic pop #endif #endif // Update icon size implementation. void qjackctlAlsaConnect::updateIconPixmaps (void) { deleteIconPixmaps(); createIconPixmaps(); } // end of qjackctlAlsaConnect.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlAliases.h0000644000000000000000000000013215174607203016433 xustar0030 mtime=1777536643.509768862 30 atime=1777536643.509768862 30 ctime=1777536643.509768862 qjackctl-1.0.6/src/qjackctlAliases.h0000644000175000001440000000660515174607203016432 0ustar00rncbcusers// qjackctlAliases.h // /**************************************************************************** Copyright (C) 2003-2020, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlAliases_h #define __qjackctlAliases_h #include #include #include // Client/port item alias map. class qjackctlAliasItem { public: // Constructor. qjackctlAliasItem(const QString& sClientName, const QString& sClientAlias = QString()); // Default destructor. ~qjackctlAliasItem(); // Client name accessor. QString clientName() const; // Client name matcher. bool matchClientName(const QString& sClientName) const; // Client aliasing methods. const QString& clientAlias() const; void setClientAlias(const QString& sClientAlias); // Port aliasing methods. QString portAlias(const QString& sPortName) const; void setPortAlias(const QString& sPortName, const QString& sPortAlias); // Save client/port aliases definitions. void saveSettings(QSettings& settings, const QString& sClientKey); // Need for generic sort. bool operator< (const qjackctlAliasItem& other); // Escape and format a string as a regular expresion. static QString escapeRegExpDigits(const QString& s, int iThreshold = 3); private: // Client name regexp. QRegularExpression m_rxClientName; // Client alias. QString m_sClientAlias; // Port aliases map. QMap m_ports; }; // Client/port list alias map. class qjackctlAliasList : public QList { public: // Constructor. qjackctlAliasList(); // Default destructor. ~qjackctlAliasList(); // Client aliasing methods. QString clientAlias(const QString& sClientName); void setClientAlias(const QString& sClientName, const QString& sClientAlias); // Port aliasing methods. QString portAlias(const QString& sClientName, const QString& sPortName); void setPortAlias(const QString& sClientName, const QString& sPortName,const QString& sPortAlias); // Load/save aliases definitions. void loadSettings(QSettings& settings, const QString& sAliasesKey); void saveSettings(QSettings& settings, const QString& sAliasesKey); private: // Client item finder. qjackctlAliasItem *findClientName (const QString& sClientName); }; // Client/port alias map. class qjackctlAliases { public: // Constructor. qjackctlAliases() : dirty(false) {} qjackctlAliasList audioOutputs; qjackctlAliasList audioInputs; qjackctlAliasList midiOutputs; qjackctlAliasList midiInputs; qjackctlAliasList alsaOutputs; qjackctlAliasList alsaInputs; QString key; bool dirty; }; #endif // __qjackctlAliases_h // end of qjackctlAliases.h qjackctl-1.0.6/src/PaxHeaders/qjackctl.cpp0000644000000000000000000000013215174607203015464 xustar0030 mtime=1777536643.509768862 30 atime=1777536643.509768862 30 ctime=1777536643.509768862 qjackctl-1.0.6/src/qjackctl.cpp0000644000175000001440000004434515174607203015466 0ustar00rncbcusers// qjackctl.cpp // /**************************************************************************** Copyright (C) 2003-2026, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctl.h" #include "qjackctlMainForm.h" #include "qjackctlPaletteForm.h" #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0) #ifdef CONFIG_JACK_VERSION #include #endif #endif #if QT_VERSION < QT_VERSION_CHECK(4, 5, 0) namespace Qt { const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000); } #endif #ifndef CONFIG_PREFIX #define CONFIG_PREFIX "/usr/local" #endif #ifndef CONFIG_BINDIR #define CONFIG_BINDIR CONFIG_PREFIX "/bin" #endif #ifndef CONFIG_DATADIR #define CONFIG_DATADIR CONFIG_PREFIX "/share" #endif #ifndef CONFIG_LIBDIR #if defined(__x86_64__) #define CONFIG_LIBDIR CONFIG_PREFIX "/lib64" #else #define CONFIG_LIBDIR CONFIG_PREFIX "/lib" #endif #endif #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #define CONFIG_PLUGINSDIR CONFIG_LIBDIR "/qt4/plugins" #elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0) #define CONFIG_PLUGINSDIR CONFIG_LIBDIR "/qt5/plugins" #else #define CONFIG_PLUGINSDIR CONFIG_LIBDIR "/qt6/plugins" #endif //------------------------------------------------------------------------- // Singleton application instance stuff (Qt/X11 only atm.) // #ifdef CONFIG_XUNIQUE #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #ifdef CONFIG_X11 #define QJACKCTL_XUNIQUE "qjackctlApplication" #include /* for gethostname() */ #include #include #endif // CONFIG_X11 #else #include #if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0) #include #endif #include #include #include #endif #endif // CONFIG_XUNIQUE // Constructor. qjackctlApplication::qjackctlApplication ( int& argc, char **argv ) : QApplication(argc, argv), m_pQtTranslator(nullptr), m_pMyTranslator(nullptr), m_pWidget(nullptr) #ifdef CONFIG_XUNIQUE #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #ifdef CONFIG_X11 , m_pDisplay(nullptr) , m_aUnique(0) , m_wOwner(0) #endif // CONFIG_X11 #else , m_pMemory(nullptr) , m_pServer(nullptr) #endif #endif // CONFIG_XUNIQUE { #if QT_VERSION >= QT_VERSION_CHECK(5, 1, 0) QApplication::setApplicationName(QJACKCTL_TITLE); QApplication::setApplicationDisplayName(QJACKCTL_TITLE); // QJACKCTL_TITLE " - " + QObject::tr(QJACKCTL_SUBTITLE)); #if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0) QApplication::setDesktopFileName( QString("org.rncbc.%1").arg(PROJECT_NAME)); #endif QApplication::setApplicationVersion(PROJECT_VERSION); #endif // Load translation support. QLocale loc; if (loc.language() != QLocale::C) { // Try own Qt translation... m_pQtTranslator = new QTranslator(this); QString sLocName = "qt_" + loc.name(); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QString sLocPath = QLibraryInfo::path(QLibraryInfo::TranslationsPath); #else QString sLocPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath); #endif if (m_pQtTranslator->load(sLocName, sLocPath)) { QApplication::installTranslator(m_pQtTranslator); } else { delete m_pQtTranslator; m_pQtTranslator = nullptr; #ifdef CONFIG_DEBUG qWarning("Warning: no translation found for '%s' locale: %s/%s.qm", loc.name().toUtf8().constData(), sLocPath.toUtf8().constData(), sLocName.toUtf8().constData()); #endif } // Try own application translation... m_pMyTranslator = new QTranslator(this); sLocName = "qjackctl_" + loc.name(); if (m_pMyTranslator->load(sLocName, sLocPath)) { QApplication::installTranslator(m_pMyTranslator); } else { sLocPath = QApplication::applicationDirPath(); #ifndef _WIN32 sLocPath.remove(CONFIG_BINDIR); sLocPath.append(CONFIG_DATADIR "/qjackctl/translations"); #else sLocPath.append("/translations"); #endif if (m_pMyTranslator->load(sLocName, sLocPath)) { QApplication::installTranslator(m_pMyTranslator); } else { delete m_pMyTranslator; m_pMyTranslator = nullptr; #ifdef CONFIG_DEBUG qWarning("Warning: no translation found for '%s' locale: %s/%s.qm", loc.name().toUtf8().constData(), sLocPath.toUtf8().constData(), sLocName.toUtf8().constData()); #endif } } } } // Destructor. qjackctlApplication::~qjackctlApplication (void) { #ifdef CONFIG_XUNIQUE #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) clearServer(); #endif #endif // CONFIG_XUNIQUE if (m_pMyTranslator) delete m_pMyTranslator; if (m_pQtTranslator) delete m_pQtTranslator; } // Main application widget accessors. void qjackctlApplication::setMainWidget ( QWidget *pWidget ) { m_pWidget = pWidget; #ifdef CONFIG_XUNIQUE #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #ifdef CONFIG_X11 m_wOwner = m_pWidget->winId(); if (m_pDisplay && m_wOwner) { XGrabServer(m_pDisplay); XSetSelectionOwner(m_pDisplay, m_aUnique, m_wOwner, CurrentTime); XUngrabServer(m_pDisplay); } #endif // CONFIG_X11 #endif #endif // CONFIG_XUNIQUE } // Check if another instance is running, // and raise its proper main widget... bool qjackctlApplication::setup ( const QString& sServerName ) { #ifdef CONFIG_XUNIQUE m_sServerName = sServerName; #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #ifdef CONFIG_X11 m_pDisplay = QX11Info::display(); if (m_pDisplay) { QString sUnique = QJACKCTL_XUNIQUE; QString sUserName = QString::fromUtf8(::getenv("USER")); if (sUserName.isEmpty()) sUserName = QString::fromUtf8(::getenv("USERNAME")); if (!sUserName.isEmpty()) { sUnique += ':'; sUnique += sUserName; } if (sServerName.isEmpty()) { const char *pszServerName = ::getenv("JACK_DEFAULT_SERVER"); if (pszServerName && ::strcmp("default", pszServerName)) { sUnique += '_'; sUnique += QString::fromUtf8(pszServerName); } } else { sUnique += '_'; sUnique += sServerName; } char szHostName[255]; if (::gethostname(szHostName, sizeof(szHostName)) == 0) { sUnique += '@'; sUnique += szHostName; } m_aUnique = XInternAtom(m_pDisplay, sUnique.toUtf8().constData(), false); XGrabServer(m_pDisplay); m_wOwner = XGetSelectionOwner(m_pDisplay, m_aUnique); XUngrabServer(m_pDisplay); if (m_wOwner != None) { // First, notify any freedesktop.org WM // that we're about to show the main widget... Screen *pScreen = XDefaultScreenOfDisplay(m_pDisplay); int iScreen = XScreenNumberOfScreen(pScreen); XEvent ev; memset(&ev, 0, sizeof(ev)); ev.xclient.type = ClientMessage; ev.xclient.display = m_pDisplay; ev.xclient.window = m_wOwner; ev.xclient.message_type = XInternAtom(m_pDisplay, "_NET_ACTIVE_WINDOW", false); ev.xclient.format = 32; ev.xclient.data.l[0] = 0; // Source indication. ev.xclient.data.l[1] = 0; // Timestamp. ev.xclient.data.l[2] = 0; // Requestor's currently active window (none) ev.xclient.data.l[3] = 0; ev.xclient.data.l[4] = 0; XSelectInput(m_pDisplay, m_wOwner, StructureNotifyMask); XSendEvent(m_pDisplay, RootWindow(m_pDisplay, iScreen), false, (SubstructureNotifyMask | SubstructureRedirectMask), &ev); XSync(m_pDisplay, false); XRaiseWindow(m_pDisplay, m_wOwner); // And then, let it get caught on destination // by QApplication::native/x11EventFilter... const QByteArray value = QJACKCTL_XUNIQUE; XChangeProperty( m_pDisplay, m_wOwner, m_aUnique, m_aUnique, 8, PropModeReplace, (unsigned char *) value.data(), value.length()); // Done. return true; } } #endif // CONFIG_X11 return false; #else return setupServer(); #endif #else return false; #endif // !CONFIG_XUNIQUE } #ifdef CONFIG_XUNIQUE #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #ifdef CONFIG_X11 void qjackctlApplication::x11PropertyNotify ( Window w ) { if (m_pDisplay && m_pWidget && m_wOwner == w) { // Always check whether our property-flag is still around... Atom aType; int iFormat = 0; unsigned long iItems = 0; unsigned long iAfter = 0; unsigned char *pData = 0; if (XGetWindowProperty( m_pDisplay, m_wOwner, m_aUnique, 0, 1024, false, m_aUnique, &aType, &iFormat, &iItems, &iAfter, &pData) == Success && aType == m_aUnique && iItems > 0 && iAfter == 0) { // Avoid repeating it-self... XDeleteProperty(m_pDisplay, m_wOwner, m_aUnique); // Just make it always shows up fine... m_pWidget->showNormal(); m_pWidget->raise(); m_pWidget->activateWindow(); // FIXME: Do our best speciality, although it should be // done iif configuration says so, we'll do it anyway! qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->startJack(); } // Free any left-overs... if (iItems > 0 && pData) XFree(pData); } } bool qjackctlApplication::x11EventFilter ( XEvent *pEv ) { if (pEv->type == PropertyNotify && pEv->xproperty.state == PropertyNewValue) x11PropertyNotify(pEv->xproperty.window); return QApplication::x11EventFilter(pEv); } #endif // CONFIG_X11 #else // Local server/shmem setup. bool qjackctlApplication::setupServer (void) { clearServer(); m_sUnique = QCoreApplication::applicationName(); if (!m_sServerName.isEmpty()) { m_sUnique += '-'; m_sUnique += m_sServerName; } QString sUserName = QString::fromUtf8(::getenv("USER")); if (sUserName.isEmpty()) sUserName = QString::fromUtf8(::getenv("USERNAME")); if (!sUserName.isEmpty()) { m_sUnique += ':'; m_sUnique += sUserName; } m_sUnique += '@'; m_sUnique += QHostInfo::localHostName(); #if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0) const QNativeIpcKey nativeKey = QSharedMemory::legacyNativeKey(m_sUnique); #if defined(Q_OS_UNIX) m_pMemory = new QSharedMemory(nativeKey); m_pMemory->attach(); delete m_pMemory; #endif m_pMemory = new QSharedMemory(nativeKey); #else #if defined(Q_OS_UNIX) m_pMemory = new QSharedMemory(m_sUnique); m_pMemory->attach(); delete m_pMemory; #endif m_pMemory = new QSharedMemory(m_sUnique); #endif bool bServer = false; const qint64 pid = QCoreApplication::applicationPid(); struct Data { qint64 pid; }; if (m_pMemory->create(sizeof(Data))) { m_pMemory->lock(); Data *pData = static_cast (m_pMemory->data()); if (pData) { pData->pid = pid; bServer = true; } m_pMemory->unlock(); } else if (m_pMemory->attach()) { m_pMemory->lock(); // maybe not necessary? Data *pData = static_cast (m_pMemory->data()); if (pData) bServer = (pData->pid == pid); m_pMemory->unlock(); } if (bServer) { QLocalServer::removeServer(m_sUnique); m_pServer = new QLocalServer(); m_pServer->setSocketOptions(QLocalServer::UserAccessOption); m_pServer->listen(m_sUnique); QObject::connect(m_pServer, SIGNAL(newConnection()), SLOT(newConnectionSlot())); } else { QLocalSocket socket; socket.connectToServer(m_sUnique); if (socket.state() == QLocalSocket::ConnectingState) socket.waitForConnected(200); if (socket.state() == QLocalSocket::ConnectedState) { socket.write(QCoreApplication::arguments().join(' ').toUtf8()); socket.flush(); socket.waitForBytesWritten(200); } } return !bServer; } // Local server/shmem cleanup. void qjackctlApplication::clearServer (void) { if (m_pServer) { m_pServer->close(); delete m_pServer; m_pServer = nullptr; } if (m_pMemory) { delete m_pMemory; m_pMemory = nullptr; } m_sUnique.clear(); } // Local server conection slot. void qjackctlApplication::newConnectionSlot (void) { QLocalSocket *pSocket = m_pServer->nextPendingConnection(); QObject::connect(pSocket, SIGNAL(readyRead()), SLOT(readyReadSlot())); } // Local server data-ready slot. void qjackctlApplication::readyReadSlot (void) { QLocalSocket *pSocket = qobject_cast (sender()); if (pSocket) { const qint64 nread = pSocket->bytesAvailable(); if (nread > 0) { const QByteArray data = pSocket->read(nread); // Just make it always shows up fine... if (m_pWidget) { m_pWidget->showNormal(); m_pWidget->raise(); m_pWidget->activateWindow(); } // FIXME: Do our best speciality, although it should be // done iif configuration says so, we'll do it anyway! qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) { // Parse the pass-through command line arguments... const QStringList& args = QString::fromUtf8(data).split(' '); const int argc = args.count(); for (int i = 1; i < argc; ++i) { QString sArg = args.at(i); QString sVal; const int iEqual = sArg.indexOf('='); if (iEqual >= 0) { sVal = sArg.right(sArg.length() - iEqual - 1); sArg = sArg.left(iEqual); } else if (i < argc - 1) sVal = args.at(i + 1); if (sArg == "-s" || sArg == "--start") { pMainForm->startJack(); } else if (sArg == "-p" || sArg == "--preset") { if (!sVal.isEmpty()) pMainForm->activatePreset(sVal); if (iEqual < 0) ++i; } else if (sArg == "-a" || sArg == "--active-patchbay") { if (!sVal.isEmpty()) pMainForm->activatePatchbay(sVal); if (iEqual < 0) ++i; } } } // Reset the server... setupServer(); } } } #endif #endif // CONFIG_XUNIQUE //------------------------------------------------------------------------- // stacktrace - Signal crash handler. // #ifdef CONFIG_STACKTRACE #if defined(__GNUC__) && defined(Q_OS_LINUX) #include #include #include #include #include void stacktrace ( int signo ) { pid_t pid; int rc; int status = 0; char cmd[80]; // Reinstall default handler; prevent race conditions... ::signal(signo, SIG_DFL); static const char *shell = "/bin/sh"; static const char *format = "gdb -q --batch --pid=%d" " --eval-command='thread apply all bt'"; snprintf(cmd, sizeof(cmd), format, (int) getpid()); pid = fork(); // Fork failure! if (pid < 0) return; // Fork child... if (pid == 0) { execl(shell, shell, "-c", cmd, nullptr); _exit(1); return; } // Parent here: wait for child to terminate... do { rc = waitpid(pid, &status, 0); } while ((rc < 0) && (errno == EINTR)); // Dispatch any logging, if any... QApplication::processEvents(QEventLoop::AllEvents, 3000); // Make sure everyone terminates... kill(pid, SIGTERM); _exit(1); } #endif #endif //------------------------------------------------------------------------- // main - The main program trunk. // int main ( int argc, char **argv ) { Q_INIT_RESOURCE(qjackctl); #ifdef CONFIG_STACKTRACE #if defined(__GNUC__) && defined(Q_OS_LINUX) ::signal(SIGILL, stacktrace); ::signal(SIGFPE, stacktrace); ::signal(SIGSEGV, stacktrace); ::signal(SIGABRT, stacktrace); ::signal(SIGBUS, stacktrace); #endif #endif #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #endif #endif qjackctlApplication app(argc, argv); // Construct default settings; override with command line arguments. qjackctlSetup setup; if (!setup.parse_args(app.arguments())) { app.quit(); return 1; } // Check if we'll just start an external program... if (!setup.cmdLine.isEmpty()) { jack_client_t *pJackClient = jack_client_open("qjackctl-start", JackNoStartServer, nullptr); if (pJackClient) { jack_client_close(pJackClient); const int iExitStatus = ::system(setup.cmdLine.join(' ').toUtf8().constData()); app.quit(); return iExitStatus; } } // Have another instance running? if (setup.bSingleton) { if (app.setup(setup.sServerName)) { app.quit(); return 2; } } // Special custom styles... if (QDir(CONFIG_PLUGINSDIR).exists()) app.addLibraryPath(CONFIG_PLUGINSDIR); if (!setup.sCustomStyleTheme.isEmpty()) app.setStyle(QStyleFactory::create(setup.sCustomStyleTheme)); // Custom color theme (eg. "KXStudio")... const QChar sep = QDir::separator(); QString sPalettePath = QApplication::applicationDirPath(); sPalettePath.remove(CONFIG_BINDIR); sPalettePath.append(CONFIG_DATADIR); sPalettePath.append(sep); sPalettePath.append(PROJECT_NAME); sPalettePath.append(sep); sPalettePath.append("palette"); if (QDir(sPalettePath).exists()) { QStringList names; names.append("KXStudio"); names.append("Wonton Soup"); QStringListIterator name_iter(names); while (name_iter.hasNext()) { const QString& name = name_iter.next(); const QFileInfo fi(sPalettePath, name + ".conf"); if (fi.isReadable()) { qjackctlPaletteForm::addNamedPaletteConf( &setup.settings(), name, fi.absoluteFilePath()); } } } QPalette pal(app.palette()); if (qjackctlPaletteForm::namedPalette( &setup.settings(), setup.sCustomColorTheme, pal)) app.setPalette(pal); // Set default base font... if (setup.iBaseFontSize > 0) app.setFont(QFont(app.font().family(), setup.iBaseFontSize)); // What style do we create these forms? Qt::WindowFlags wflags = Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint; if (setup.bKeepOnTop) wflags |= Qt::Tool; // Construct the main form, and show it to the world. qjackctlMainForm w(0, wflags); w.setup(&setup); // If we have a systray icon, we'll skip this. if (!setup.bSystemTray) { w.show(); w.adjustSize(); } // Settle this one as application main widget... app.setMainWidget(&w); // Settle session manager shutdown (eg. logoff)... QObject::connect( &app, SIGNAL(commitDataRequest(QSessionManager&)), &w, SLOT(commitData(QSessionManager&)), Qt::DirectConnection); // Register the quit signal/slot. app.setQuitOnLastWindowClosed(false); return app.exec(); } // end of qjackctl.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlGraphForm.h0000644000000000000000000000013015174607203016735 xustar0029 mtime=1777536643.51191432 30 atime=1777536643.510914327 29 ctime=1777536643.51191432 qjackctl-1.0.6/src/qjackctlGraphForm.h0000644000175000001440000001330215174607203016726 0ustar00rncbcusers// qjackctlGraphForm.h // /**************************************************************************** Copyright (C) 2003-2025, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlGraphForm_h #define __qjackctlGraphForm_h #include "ui_qjackctlGraphForm.h" // Forward decls. class qjackctlGraphConfig; class qjackctlGraphSect; class qjackctlAlsaGraph; class qjackctlJackGraph; class qjackctlGraphPort; class qjackctlGraphConnect; class qjackctlGraphThumb; class qjackctlSetup; class QResizeEvent; class QCloseEvent; class QSlider; class QSpinBox; class QActionGroup; // Forwards decls. class QSettings; class QMainWindow; //---------------------------------------------------------------------------- // qjackctlGraphForm -- UI wrapper form. class qjackctlGraphForm : public QMainWindow { Q_OBJECT public: // Constructor. qjackctlGraphForm(QWidget *parent = nullptr, Qt::WindowFlags wflags = Qt::WindowFlags()); // Destructor. ~qjackctlGraphForm(); // Initializer. void setup(qjackctlSetup *pSetup); // Update the canvas palette. void updatePalette(); public slots: // Graph view change slot. void changed(); // Graph section slots. void jack_shutdown(); void jack_changed(); void alsa_changed(); // Graph refreshner. void refresh(); protected slots: // Node life-cycle slots void added(qjackctlGraphNode *node); void updated(qjackctlGraphNode *node); void removed(qjackctlGraphNode *node); // Port (dis)connection slots. void connected(qjackctlGraphPort *port1, qjackctlGraphPort *port2); void disconnected(qjackctlGraphPort *port1, qjackctlGraphPort *port2); void connected(qjackctlGraphConnect *connect); // Item renaming slot. void renamed(qjackctlGraphItem *item, const QString& name); // Graph selection change slot. void stabilize(); // Tool-bar orientation change slot. void orientationChanged(Qt::Orientation orientation); // Main menu slots. void viewMenubar(bool on); void viewToolbar(bool on); void viewStatusbar(bool on); void viewThumbviewAction(); void viewThumbview(int thumbview); void viewTextBesideIcons(bool on); void viewCenter(); void viewRefresh(); void viewZoomRange(bool on); void viewSortTypeAction(); void viewSortOrderAction(); void viewColorsAction(); void viewColorsReset(); void viewRepelOverlappingNodes(bool on); void viewConnectThroughNodes(bool on); void helpAbout(); void helpAboutQt(); void thumbviewContextMenu(const QPoint& pos); void zoomValueChanged(int zoom_value); protected: // Context-menu event handler. void contextMenuEvent(QContextMenuEvent *pContextMenuEvent); // Widget resize event handler. void resizeEvent(QResizeEvent *pResizeEvent); // Widget show/hide/close event handlers. void showEvent(QShowEvent *pShowEvent); void hideEvent(QHideEvent *pHideEvent); void closeEvent(QCloseEvent *pCloseEvent); // Special port-type color method. void updateViewColorsAction(QAction *action); void updateViewColors(); // Item sect predicate. qjackctlGraphSect *item_sect(qjackctlGraphItem *item) const; private: // The Qt-designer UI struct... Ui::qjackctlGraphForm m_ui; // Instance variables. qjackctlGraphConfig *m_config; // Instance variables. qjackctlJackGraph *m_jack; qjackctlAlsaGraph *m_alsa; int m_jack_changed; int m_alsa_changed; int m_ins, m_mids, m_outs; int m_repel_overlapping_nodes; QSlider *m_zoom_slider; QSpinBox *m_zoom_spinbox; QActionGroup *m_sort_type; QActionGroup *m_sort_order; QActionGroup *m_thumb_mode; qjackctlGraphThumb *m_thumb; int m_thumb_update; }; //---------------------------------------------------------------------------- // qjackctlGraphConfig -- Canvas state memento. class qjackctlGraphConfig { public: // Constructor. qjackctlGraphConfig(QSettings *settings); // Accessors. QSettings *settings() const; void setMenubar(bool menubar); bool isMenubar() const; void setToolbar(bool toolbar); bool isToolbar() const; void setStatusbar(bool statusbar); bool isStatusbar() const; void setThumbview(int thumbview); int thumbview() const; void setTextBesideIcons(bool texticons); bool isTextBesideIcons() const; void setZoomRange(bool zoomrange); bool isZoomRange() const; void setSortType(int sorttype); int sortType() const; void setSortOrder(int sortorder); int sortOrder() const; void setRepelOverlappingNodes(bool repelnodes); bool isRepelOverlappingNodes() const; void setConnectThroughNodes(bool repelnodes); bool isConnectThroughNodes() const; // Graph main-widget state methods. bool restoreState(QMainWindow *widget); bool saveState(QMainWindow *widget) const; private: // Instance variables. QSettings *m_settings; bool m_menubar; bool m_toolbar; bool m_statusbar; int m_thumbview; bool m_texticons; bool m_zoomrange; int m_sorttype; int m_sortorder; bool m_repelnodes; bool m_cthrunodes; }; #endif // __qjackctlGraphForm_h // end of qjackctlGraphForm.h qjackctl-1.0.6/src/PaxHeaders/qjackctlGraphCommand.cpp0000644000000000000000000000013215174607203017745 xustar0030 mtime=1777536643.510914327 30 atime=1777536643.510914327 30 ctime=1777536643.510914327 qjackctl-1.0.6/src/qjackctlGraphCommand.cpp0000644000175000001440000001647015174607203017745 0ustar00rncbcusers// qjackctlGraphCommand.cpp // /**************************************************************************** Copyright (C) 2003-2025, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlGraphCommand.h" //---------------------------------------------------------------------------- // qjackctlGraphCommand -- Generic graph command pattern // Constructor. qjackctlGraphCommand::qjackctlGraphCommand ( qjackctlGraphCanvas *canvas, QUndoCommand *parent ) : QUndoCommand(parent), m_canvas(canvas) { } // Command methods. void qjackctlGraphCommand::undo (void) { execute(true); } void qjackctlGraphCommand::redo (void) { execute(false); } //---------------------------------------------------------------------------- // qjackctlGraphConnectCommand -- Connect graph command pattern // Constructor. qjackctlGraphConnectCommand::qjackctlGraphConnectCommand ( qjackctlGraphCanvas *canvas, qjackctlGraphPort *port1, qjackctlGraphPort *port2, bool is_connect, qjackctlGraphCommand *parent ) : qjackctlGraphCommand(canvas, parent), m_item(port1, port2, is_connect) { } // Command executive bool qjackctlGraphConnectCommand::execute ( bool is_undo ) { qjackctlGraphCanvas *canvas = qjackctlGraphCommand::canvas(); if (canvas == nullptr) return false; qjackctlGraphNode *node1 = canvas->findNode( m_item.addr1.node_name, qjackctlGraphItem::Output, m_item.addr1.node_type); if (node1 == nullptr) node1 = canvas->findNode( m_item.addr1.node_name, qjackctlGraphItem::Duplex, m_item.addr1.node_type); if (node1 == nullptr) return false; qjackctlGraphPort *port1 = node1->findPort( m_item.addr1.port_name, qjackctlGraphItem::Output, m_item.addr1.port_type); if (port1 == nullptr) return false; qjackctlGraphNode *node2 = canvas->findNode( m_item.addr2.node_name, qjackctlGraphItem::Input, m_item.addr2.node_type); if (node2 == nullptr) node2 = canvas->findNode( m_item.addr2.node_name, qjackctlGraphItem::Duplex, m_item.addr2.node_type); if (node2 == nullptr) return false; qjackctlGraphPort *port2 = node2->findPort( m_item.addr2.port_name, qjackctlGraphItem::Input, m_item.addr2.port_type); if (port2 == nullptr) return false; const bool is_connect = (m_item.is_connect() && !is_undo) || (!m_item.is_connect() && is_undo); if (is_connect) canvas->emitConnected(port1, port2); else canvas->emitDisconnected(port1, port2); return true; } //---------------------------------------------------------------------------- // qjackctlGraphMoveCommand -- Move (node) graph command // Constructor. qjackctlGraphMoveCommand::qjackctlGraphMoveCommand ( qjackctlGraphCanvas *canvas, const QList& nodes, const QPointF& pos1, const QPointF& pos2, qjackctlGraphCommand *parent ) : qjackctlGraphCommand(canvas, parent), m_nexec(0) { qjackctlGraphCommand::setText(QObject::tr("Move")); const QPointF delta = (pos1 - pos2); foreach (qjackctlGraphNode *node, nodes) { Item *item = new Item; item->node_name = node->nodeName(); item->node_mode = node->nodeMode(); item->node_type = node->nodeType(); const QPointF& pos = node->pos(); item->node_pos1 = pos + delta; item->node_pos2 = pos; m_items.insert(node, item); } if (canvas && canvas->isRepelOverlappingNodes()) { foreach (qjackctlGraphNode *node, nodes) canvas->repelOverlappingNodes(node, this); } } // Destructor. qjackctlGraphMoveCommand::~qjackctlGraphMoveCommand (void) { qDeleteAll(m_items); m_items.clear(); } // Add/replace (an already moved) node position for undo/redo... void qjackctlGraphMoveCommand::addItem ( qjackctlGraphNode *node, const QPointF& pos1, const QPointF& pos2 ) { Item *item = m_items.value(node, nullptr); if (item) { // item->node_pos1 = pos1; item->node_pos2 = pos2;//node->pos(); } else { item = new Item; item->node_name = node->nodeName(); item->node_mode = node->nodeMode(); item->node_type = node->nodeType(); item->node_pos1 = pos1; item->node_pos2 = pos2;//node->pos(); m_items.insert(node, item); } } // Command executive method. bool qjackctlGraphMoveCommand::execute ( bool /* is_undo */ ) { qjackctlGraphCanvas *canvas = qjackctlGraphCommand::canvas(); if (canvas == nullptr) return false; if (++m_nexec > 1) { foreach (qjackctlGraphNode *key, m_items.keys()) { Item *item = m_items.value(key, nullptr); if (item) { qjackctlGraphNode *node = canvas->findNode( item->node_name, item->node_mode, item->node_type); if (node) { const QPointF pos1 = item->node_pos1; node->setPos(pos1); item->node_pos1 = item->node_pos2; item->node_pos2 = pos1; canvas->saveNode(node); } } } } canvas->emitChanged(); return true; } //---------------------------------------------------------------------------- // qjackctlGraphRenameCommand -- Rename (item) graph command // Constructor. qjackctlGraphRenameCommand::qjackctlGraphRenameCommand ( qjackctlGraphCanvas *canvas, qjackctlGraphItem *item, const QString& name, qjackctlGraphCommand *parent ) : qjackctlGraphCommand(canvas, parent), m_name(name) { qjackctlGraphCommand::setText(QObject::tr("Rename")); m_item.item_type = item->type(); qjackctlGraphNode *node = nullptr; qjackctlGraphPort *port = nullptr; if (m_item.item_type == qjackctlGraphNode::Type) node = static_cast (item); else if (m_item.item_type == qjackctlGraphPort::Type) port = static_cast (item); if (port) node = port->portNode(); if (node) { m_item.node_name = node->nodeName(); m_item.node_mode = node->nodeMode(); m_item.node_type = node->nodeType(); } if (port) { m_item.port_name = port->portName(); m_item.port_mode = port->portMode(); m_item.port_type = port->portType(); } } // Command executive method. bool qjackctlGraphRenameCommand::execute ( bool /*is_undo*/ ) { qjackctlGraphCanvas *canvas = qjackctlGraphCommand::canvas(); if (canvas == nullptr) return false; QString name = m_name; qjackctlGraphItem *item = nullptr; qjackctlGraphNode *node = canvas->findNode( m_item.node_name, m_item.node_mode, m_item.node_type); if (m_item.item_type == qjackctlGraphNode::Type && node) { m_name = node->nodeTitle(); item = node; } else if (m_item.item_type == qjackctlGraphPort::Type && node) { qjackctlGraphPort *port = node->findPort( m_item.port_name, m_item.port_mode, m_item.port_type); if (port) { m_name = port->portTitle(); item = port; } } if (item == nullptr) return false; canvas->emitRenamed(item, name); return true; } // end of qjackctlGraphCommand.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlJackConnect.cpp0000644000000000000000000000012715174607203017573 xustar0029 mtime=1777536643.51191432 29 atime=1777536643.51191432 29 ctime=1777536643.51191432 qjackctl-1.0.6/src/qjackctlJackConnect.cpp0000644000175000001440000004577215174607203017576 0ustar00rncbcusers// qjackctlJackConnect.cpp // /**************************************************************************** Copyright (C) 2003-2026, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlJackConnect.h" #include "qjackctlMainForm.h" #include #ifdef CONFIG_JACK_METADATA #include #include static QString prettyName ( jack_uuid_t uuid ) { QString sPrettyName; char *pszValue = nullptr; char *pszType = nullptr; if (::jack_get_property(uuid, JACK_METADATA_PRETTY_NAME, &pszValue, &pszType) == 0) { if (pszValue) { sPrettyName = QString::fromUtf8(pszValue); ::jack_free(pszValue); } if (pszType) ::jack_free(pszType); } return sPrettyName; } static void setPrettyName ( jack_client_t *pJackClient, jack_uuid_t uuid, const QString& sPrettyName ) { const QByteArray aPrettyName = sPrettyName.toUtf8(); ::jack_set_property(pJackClient, uuid, JACK_METADATA_PRETTY_NAME, aPrettyName.constData(), nullptr); } static void removePrettyName ( jack_client_t *pJackClient, jack_uuid_t uuid ) { ::jack_remove_property(pJackClient, uuid, JACK_METADATA_PRETTY_NAME); } #endif //---------------------------------------------------------------------- // class qjackctlJackPort -- Jack port list item. // // Constructor. qjackctlJackPort::qjackctlJackPort ( qjackctlJackClient *pClient, unsigned long ulPortFlags ) : qjackctlPortItem(pClient) { qjackctlJackConnect *pJackConnect = static_cast ( ((pClient->clientList())->listView())->binding()); if (pJackConnect) { if (ulPortFlags & JackPortIsInput) { if (ulPortFlags & JackPortIsTerminal) { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap( ulPortFlags & JackPortIsPhysical ? QJACKCTL_JACK_PORTPTI : QJACKCTL_JACK_PORTLTI))); } else { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap( ulPortFlags & JackPortIsPhysical ? QJACKCTL_JACK_PORTPNI : QJACKCTL_JACK_PORTLNI))); } } else if (ulPortFlags & JackPortIsOutput) { if (ulPortFlags & JackPortIsTerminal) { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap( ulPortFlags & JackPortIsPhysical ? QJACKCTL_JACK_PORTPTO : QJACKCTL_JACK_PORTLTO))); } else { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap( ulPortFlags & JackPortIsPhysical ? QJACKCTL_JACK_PORTPNO : QJACKCTL_JACK_PORTLNO))); } } } } // Default destructor. qjackctlJackPort::~qjackctlJackPort (void) { } // Pretty/display name method (virtual override). void qjackctlJackPort::updatePortName ( bool bRename ) { #ifdef CONFIG_JACK_METADATA jack_client_t *pJackClient = nullptr; qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pJackClient = pMainForm->jackClient(); if (pJackClient && qjackctlJackClientList::isJackClientPortMetadata()) { bool bRenameEnabled = false; QString sPortNameEx = portNameAlias(&bRenameEnabled); const QString& sPortName = portName(); const QString& sClientPort = clientName() + ':' + sPortName; const QByteArray aClientPort = sClientPort.toUtf8(); const char *pszClientPort = aClientPort.constData(); jack_port_t *pJackPort = jack_port_by_name(pJackClient, pszClientPort); if (pJackPort) { jack_uuid_t port_uuid = ::jack_port_uuid(pJackPort); const QString& sPrettyName = prettyName(port_uuid); if (sPortNameEx == sPortName && sPortNameEx != sPrettyName) { if (sPrettyName.isEmpty() || bRename) { setPrettyName(pJackClient, port_uuid, sPortNameEx); } else { sPortNameEx = sPrettyName; setPortNameAlias(sPortNameEx); } } else if (sPortNameEx == sPortName && !sPrettyName.isEmpty() && bRename) { removePrettyName(pJackClient, port_uuid); } setPortText(sPortNameEx, bRenameEnabled); } } else #endif qjackctlPortItem::updatePortName(bRename); } // Tooltip text builder (virtual override). QString qjackctlJackPort::tooltip (void) const { jack_client_t *pJackClient = nullptr; qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pJackClient = pMainForm->jackClient(); if (pJackClient) { const QString& sPortName = portName(); const QString& sClientPort = clientName() + ':' + sPortName; const QByteArray aClientPort = sClientPort.toUtf8(); const char *pszClientPort = aClientPort.constData(); jack_port_t *pJackPort = jack_port_by_name(pJackClient, pszClientPort); if (pJackPort) { jack_latency_range_t latency_range; jack_port_get_latency_range(pJackPort, client()->isReadable() ? JackCaptureLatency : JackPlaybackLatency, &latency_range); QString sLatency = QString::number(latency_range.min); if (latency_range.max > latency_range.min) sLatency += '-' + QString::number(latency_range.max); return QObject::tr("%1 (%2 frames)").arg(portName()).arg(sLatency); } } return portName(); } //---------------------------------------------------------------------- // class qjackctlJackClient -- Jack client list item. // // Constructor. qjackctlJackClient::qjackctlJackClient ( qjackctlJackClientList *pClientList ) : qjackctlClientItem(pClientList) { qjackctlJackConnect *pJackConnect = static_cast ( (pClientList->listView())->binding()); if (pJackConnect) { if (pClientList->isReadable()) { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap(QJACKCTL_JACK_CLIENTO))); } else { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap(QJACKCTL_JACK_CLIENTI))); } } } // Default destructor. qjackctlJackClient::~qjackctlJackClient (void) { } // Jack port lookup. qjackctlJackPort *qjackctlJackClient::findJackPort ( const QString& sPortName ) { QListIterator iter(ports()); while (iter.hasNext()) { qjackctlJackPort *pPort = static_cast (iter.next()); if (pPort && pPort->portName() == sPortName) return pPort; } return nullptr; } // Pretty/display name method (virtual override). void qjackctlJackClient::updateClientName ( bool bRename ) { #ifdef CONFIG_JACK_METADATA jack_client_t *pJackClient = nullptr; qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pJackClient = pMainForm->jackClient(); if (pJackClient && qjackctlJackClientList::isJackClientPortMetadata()) { bool bRenameEnabled = false; QString sClientNameEx = clientNameAlias(&bRenameEnabled); const QString& sClientName = clientName(); const QByteArray aClientName = sClientName.toUtf8(); const char *pszClientUuid = ::jack_get_uuid_for_client_name(pJackClient, aClientName.constData()); if (pszClientUuid) { jack_uuid_t client_uuid = 0; ::jack_uuid_parse(pszClientUuid, &client_uuid); const QString& sPrettyName = prettyName(client_uuid); if (sClientNameEx == sClientName && sClientNameEx != sPrettyName) { if (sPrettyName.isEmpty() || bRename) { setPrettyName(pJackClient, client_uuid, sClientNameEx); } else { sClientNameEx = sPrettyName; setClientNameAlias(sClientNameEx); } } else if (sClientNameEx == sClientName && !sPrettyName.isEmpty() && bRename) { removePrettyName(pJackClient, client_uuid); } ::jack_free((void *) pszClientUuid); } setClientText(sClientNameEx, bRenameEnabled); } else #endif qjackctlClientItem::updateClientName(bRename); } //---------------------------------------------------------------------- // qjackctlJackClientList -- Jack client list. // // Constructor. qjackctlJackClientList::qjackctlJackClientList ( qjackctlClientListView *pListView, bool bReadable ) : qjackctlClientList(pListView, bReadable) { } // Default destructor. qjackctlJackClientList::~qjackctlJackClientList (void) { } // Jack port lookup. qjackctlJackPort *qjackctlJackClientList::findJackClientPort ( const QString& sClientPort ) { const int iColon = sClientPort.indexOf(':'); if (iColon < 0) return nullptr; const QString& sClientName = sClientPort.left(iColon); const QString& sPortName = sClientPort.right(sClientPort.length() - iColon - 1); QListIterator iter(clients()); while (iter.hasNext()) { qjackctlJackClient *pClient = static_cast (iter.next()); if (pClient && pClient->clientName() == sClientName) { qjackctlJackPort *pPort = pClient->findJackPort(sPortName); if (pPort) return pPort; } } return nullptr; } // Client:port refreshner. int qjackctlJackClientList::updateClientPorts (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return 0; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == nullptr) return 0; qjackctlJackConnect *pJackConnect = static_cast (listView()->binding()); if (pJackConnect == nullptr) return 0; const char *pszJackType = JACK_DEFAULT_AUDIO_TYPE; #ifdef CONFIG_JACK_MIDI if (pJackConnect->jackType() == QJACKCTL_JACK_MIDI) pszJackType = JACK_DEFAULT_MIDI_TYPE; #endif #ifdef CONFIG_JACK_PORT_ALIASES char *aliases[2]; if (g_iJackClientPortAlias > 0) { const unsigned short alias_size = jack_port_name_size() + 1; aliases[0] = new char [alias_size]; aliases[1] = new char [alias_size]; } #endif int iDirtyCount = 0; markClientPorts(0); const char **ppszClientPorts = jack_get_ports(pJackClient, 0, pszJackType, isReadable() ? JackPortIsOutput : JackPortIsInput); if (ppszClientPorts) { for (int iClientPort = 0; ppszClientPorts[iClientPort]; ++iClientPort) { QString sClientPort = QString::fromUtf8(ppszClientPorts[iClientPort]); qjackctlJackClient *pClient = nullptr; qjackctlJackPort *pPort = nullptr; jack_port_t *pJackPort = jack_port_by_name(pJackClient, ppszClientPorts[iClientPort]); #ifdef CONFIG_JACK_PORT_ALIASES if (g_iJackClientPortAlias > 0 && jack_port_get_aliases(pJackPort, aliases) >= g_iJackClientPortAlias) sClientPort = QString::fromUtf8(aliases[g_iJackClientPortAlias - 1]); #endif const int iColon = sClientPort.indexOf(':'); if (pJackPort && iColon >= 0) { QString sClientName = sClientPort.left(iColon); QString sPortName = sClientPort.right(sClientPort.length() - iColon - 1); pClient = static_cast (findClient(sClientName)); if (pClient) pPort = static_cast (pClient->findPort(sPortName)); if (pClient == nullptr) { pClient = new qjackctlJackClient(this); pClient->setClientName(sClientName); ++iDirtyCount; } if (pClient && pPort == nullptr) { pPort = new qjackctlJackPort(pClient, jack_port_flags(pJackPort)); pPort->setPortName(sPortName); ++iDirtyCount; } if (pPort) pPort->markClientPort(1); } } jack_free(ppszClientPorts); } iDirtyCount += cleanClientPorts(0); #ifdef CONFIG_JACK_PORT_ALIASES if (g_iJackClientPortAlias > 0) { delete [] aliases[0]; delete [] aliases[1]; } #endif return iDirtyCount; } // Jack client port aliases mode. int qjackctlJackClientList::g_iJackClientPortAlias = 0; void qjackctlJackClientList::setJackClientPortAlias ( int iJackClientPortAlias ) { g_iJackClientPortAlias = iJackClientPortAlias; if (g_iJackClientPortAlias > 0) g_bJackClientPortMetadata = false; } int qjackctlJackClientList::jackClientPortAlias (void) { return g_iJackClientPortAlias; } // Jack client port pretty-names (metadata) mode. bool qjackctlJackClientList::g_bJackClientPortMetadata = false; void qjackctlJackClientList::setJackClientPortMetadata ( bool bJackClientPortMetadata ) { g_bJackClientPortMetadata = bJackClientPortMetadata; if (g_bJackClientPortMetadata) g_iJackClientPortAlias = 0; } bool qjackctlJackClientList::isJackClientPortMetadata (void) { return g_bJackClientPortMetadata; } //---------------------------------------------------------------------- // qjackctlJackConnect -- Output-to-Input client/ports connection object. // // Constructor. qjackctlJackConnect::qjackctlJackConnect ( qjackctlConnectView *pConnectView, int iJackType ) : qjackctlConnect(pConnectView) { m_iJackType = iJackType; createIconPixmaps(); setOClientList(new qjackctlJackClientList( connectView()->OListView(), true)); setIClientList(new qjackctlJackClientList( connectView()->IListView(), false)); } // Default destructor. qjackctlJackConnect::~qjackctlJackConnect (void) { deleteIconPixmaps(); } // Connection type accessors. int qjackctlJackConnect::jackType (void) const { return m_iJackType; } // Local pixmap-set janitor methods. void qjackctlJackConnect::createIconPixmaps (void) { switch (m_iJackType) { case QJACKCTL_JACK_MIDI: m_apPixmaps[QJACKCTL_JACK_CLIENTI] = createIconPixmap("mclienti"); m_apPixmaps[QJACKCTL_JACK_CLIENTO] = createIconPixmap("mcliento"); m_apPixmaps[QJACKCTL_JACK_PORTPTI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_JACK_PORTPTO] = createIconPixmap("mporto"); m_apPixmaps[QJACKCTL_JACK_PORTPNI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_JACK_PORTPNO] = createIconPixmap("mporto"); m_apPixmaps[QJACKCTL_JACK_PORTLTI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_JACK_PORTLTO] = createIconPixmap("mporto"); m_apPixmaps[QJACKCTL_JACK_PORTLNI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_JACK_PORTLNO] = createIconPixmap("mporto"); break; case QJACKCTL_JACK_AUDIO: default: m_apPixmaps[QJACKCTL_JACK_CLIENTI] = createIconPixmap("aclienti"); m_apPixmaps[QJACKCTL_JACK_CLIENTO] = createIconPixmap("acliento"); m_apPixmaps[QJACKCTL_JACK_PORTPTI] = createIconPixmap("aportpti"); m_apPixmaps[QJACKCTL_JACK_PORTPTO] = createIconPixmap("aportpto"); m_apPixmaps[QJACKCTL_JACK_PORTPNI] = createIconPixmap("aportpni"); m_apPixmaps[QJACKCTL_JACK_PORTPNO] = createIconPixmap("aportpno"); m_apPixmaps[QJACKCTL_JACK_PORTLTI] = createIconPixmap("aportlti"); m_apPixmaps[QJACKCTL_JACK_PORTLTO] = createIconPixmap("aportlto"); m_apPixmaps[QJACKCTL_JACK_PORTLNI] = createIconPixmap("aportlni"); m_apPixmaps[QJACKCTL_JACK_PORTLNO] = createIconPixmap("aportlno"); break; } } void qjackctlJackConnect::deleteIconPixmaps (void) { for (int i = 0; i < QJACKCTL_JACK_PIXMAPS; i++) { if (m_apPixmaps[i]) delete m_apPixmaps[i]; m_apPixmaps[i] = nullptr; } } // Common pixmap accessor (static). const QPixmap& qjackctlJackConnect::pixmap ( int iPixmap ) const { return *m_apPixmaps[iPixmap]; } // Connection primitive. bool qjackctlJackConnect::connectPorts ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == nullptr) return false; qjackctlJackPort *pOJack = static_cast (pOPort); qjackctlJackPort *pIJack = static_cast (pIPort); return (jack_connect(pJackClient, pOJack->clientPortName().toUtf8().constData(), pIJack->clientPortName().toUtf8().constData()) == 0); } // Disconnection primitive. bool qjackctlJackConnect::disconnectPorts ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == nullptr) return false; qjackctlJackPort *pOJack = static_cast (pOPort); qjackctlJackPort *pIJack = static_cast (pIPort); return (jack_disconnect(pJackClient, pOJack->clientPortName().toUtf8().constData(), pIJack->clientPortName().toUtf8().constData()) == 0); } // Update port connection references. void qjackctlJackConnect::updateConnections (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == nullptr) return; qjackctlJackClientList *pIClientList = static_cast (IClientList()); if (pIClientList == nullptr) return; #ifdef CONFIG_JACK_PORT_ALIASES const int iJackClientPortAlias = qjackctlJackClientList::jackClientPortAlias(); #endif // For each output client item... QListIterator oclient(OClientList()->clients()); while (oclient.hasNext()) { qjackctlClientItem *pOClient = oclient.next(); // For each output port item... QListIterator oport(pOClient->ports()); while (oport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); // Are there already any connections? if (pOPort->connects().count() > 0) continue; // Hava a proper type cast. qjackctlJackPort *pOJack = static_cast (pOPort); // Get port connections... const QString& sClientPort = pOJack->clientName() + ':' + pOJack->portName(); const QByteArray aClientPort = sClientPort.toUtf8(); const char *pszClientPort = aClientPort.constData(); jack_port_t *pJackPort = jack_port_by_name(pJackClient, pszClientPort); if (pJackPort) { const char **ppszClientPorts = jack_port_get_all_connections(pJackClient, pJackPort); if (ppszClientPorts) { // Now, for each input client port... for (int iClientPort = 0; ppszClientPorts[iClientPort]; ++iClientPort) { qjackctlPortItem *pIPort = nullptr; #ifdef CONFIG_JACK_PORT_ALIASES if (iJackClientPortAlias > 0) { // If Jack aliases are in effect, look for those if present -ag jack_port_t *pIJackPort = jack_port_by_name(pJackClient, ppszClientPorts[iClientPort]); if (pIJackPort) { char *aliases[2]; const unsigned short alias_size = jack_port_name_size() + 1; aliases[0] = new char [alias_size]; aliases[1] = new char [alias_size]; if (jack_port_get_aliases(pIJackPort, aliases) >= iJackClientPortAlias) { pIPort = pIClientList->findJackClientPort(aliases[iJackClientPortAlias - 1]); } delete [] aliases[0]; delete [] aliases[1]; } // Otherwise we fall through to the default case below // which looks for the port under its real name } #endif if (!pIPort) { pIPort = pIClientList->findJackClientPort( ppszClientPorts[iClientPort]); } if (pIPort) { pOPort->addConnect(pIPort); pIPort->addConnect(pOPort); } } jack_free(ppszClientPorts); } } } } } // Update icon size implementation. void qjackctlJackConnect::updateIconPixmaps (void) { deleteIconPixmaps(); createIconPixmaps(); } // end of qjackctlJackConnect.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlAboutForm.cpp0000644000000000000000000000013215174607203017303 xustar0030 mtime=1777536643.509768862 30 atime=1777536643.509768862 30 ctime=1777536643.509768862 qjackctl-1.0.6/src/qjackctlAboutForm.cpp0000644000175000001440000001030515174607203017272 0ustar00rncbcusers// qjackctlAboutForm.cpp // /**************************************************************************** Copyright (C) 2003-2025, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlAboutForm.h" #include #ifdef CONFIG_JACK_VERSION #include #endif //---------------------------------------------------------------------------- // qjackctlAboutForm -- UI wrapper form. // Constructor. qjackctlAboutForm::qjackctlAboutForm ( QWidget *pParent ) : QDialog(pParent) { // Setup UI struct... m_ui.setupUi(this); #if QT_VERSION < QT_VERSION_CHECK(6, 1, 0) QDialog::setWindowIcon(QIcon(":/images/qjackctl.png")); #endif QStringList list; #ifdef CONFIG_DEBUG list << tr("Debugging option enabled."); #endif #ifndef CONFIG_SYSTEM_TRAY list << tr("System tray disabled."); #endif #ifndef CONFIG_JACK_TRANSPORT list << tr("Transport status control disabled."); #endif #ifndef CONFIG_JACK_REALTIME list << tr("Realtime status disabled."); #endif #ifndef CONFIG_JACK_XRUN_DELAY list << tr("XRUN delay status disabled."); #endif #ifndef CONFIG_JACK_MAX_DELAY list << tr("Maximum delay status disabled."); #endif #ifndef CONFIG_JACK_PORT_ALIASES list << tr("JACK Port aliases support disabled."); #endif #ifndef CONFIG_JACK_MIDI list << tr("JACK MIDI support disabled."); #endif #ifndef CONFIG_JACK_SESSION list << tr("JACK Session support disabled."); #endif #ifndef CONFIG_ALSA_SEQ #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32) && !defined(__APPLE__) list << tr("ALSA/MIDI sequencer support disabled."); #endif #endif #ifndef CONFIG_DBUS #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32) && !defined(__APPLE__) list << tr("D-Bus interface support disabled."); #endif #endif // Stuff the about box... QString sText = "


\n"; sText += "" QJACKCTL_TITLE " - " + tr(QJACKCTL_SUBTITLE) + "
\n"; sText += "
\n"; sText += tr("Version") + ": " PROJECT_VERSION "
\n"; // sText += "" + tr("Build") + ": " CONFIG_BUILD_DATE "
\n"; if (!list.isEmpty()) { sText += ""; sText += list.join("
\n"); sText += "
"; } sText += "
\n"; sText += tr("Using: Qt %1").arg(qVersion()); #if defined(QT_STATIC) sText += "-static"; #endif #if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) sText += ' '; sText += '('; sText += QApplication::platformName(); sText += ')'; #endif #ifdef CONFIG_JACK_VERSION sText += ", "; sText += tr("JACK %1").arg(jack_get_version_string()); #endif sText += "
\n"; sText += "
\n"; sText += tr("Website") + ": " QJACKCTL_WEBSITE "
\n"; sText += "
\n"; sText += ""; sText += QJACKCTL_COPYRIGHT "
\n"; sText += "
\n"; sText += tr("This program is free software; you can redistribute it and/or modify it") + "
\n"; sText += tr("under the terms of the GNU General Public License version 2 or later."); sText += "
"; sText += "

\n"; m_ui.AboutTextView->setText(sText); // UI connections... QObject::connect(m_ui.AboutQtButton, SIGNAL(clicked()), SLOT(aboutQt())); QObject::connect(m_ui.ClosePushButton, SIGNAL(clicked()), SLOT(close())); } // Destructor. qjackctlAboutForm::~qjackctlAboutForm (void) { } // About Qt request. void qjackctlAboutForm::aboutQt() { QMessageBox::aboutQt(this); } // end of qjackctlAboutForm.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlAbout.h0000644000000000000000000000013215174607203016124 xustar0030 mtime=1777536643.509768862 30 atime=1777536643.509768862 30 ctime=1777536643.509768862 qjackctl-1.0.6/src/qjackctlAbout.h0000644000175000001440000000246415174607203016122 0ustar00rncbcusers// qjackctlAbout.h // /**************************************************************************** Copyright (C) 2003-2025, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlAbout_h #define __qjackctlAbout_h #include "config.h" #define QJACKCTL_TITLE PROJECT_TITLE #define QJACKCTL_SUBTITLE PROJECT_DESCRIPTION #define QJACKCTL_WEBSITE PROJECT_HOMEPAGE_URL #define QJACKCTL_COPYRIGHT PROJECT_COPYRIGHT #define QJACKCTL_DOMAIN PROJECT_DOMAIN #endif // __qjackctlAbout_h // end of qjackctlAbout.h qjackctl-1.0.6/src/PaxHeaders/qjackctlConnectionsForm.cpp0000644000000000000000000000013215174607203020513 xustar0030 mtime=1777536643.510914327 30 atime=1777536643.509914334 30 ctime=1777536643.510914327 qjackctl-1.0.6/src/qjackctlConnectionsForm.cpp0000644000175000001440000005065115174607203020512 0ustar00rncbcusers// qjackctlConnectionsForm.cpp // /**************************************************************************** Copyright (C) 2003-2021, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlConnectionsForm.h" #include "qjackctlMainForm.h" #include "qjackctlPatchbay.h" #include #include #include //---------------------------------------------------------------------------- // qjackctlConnectionsForm -- UI wrapper form. // Constructor. qjackctlConnectionsForm::qjackctlConnectionsForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); m_pAudioConnect = new qjackctlJackConnect( m_ui.AudioConnectView, QJACKCTL_JACK_AUDIO); #ifdef CONFIG_JACK_MIDI m_pMidiConnect = new qjackctlJackConnect( m_ui.MidiConnectView, QJACKCTL_JACK_MIDI); #else m_pMidiConnect = nullptr; #endif #ifdef CONFIG_ALSA_SEQ m_pAlsaConnect = new qjackctlAlsaConnect(m_ui.AlsaConnectView); #else m_pAlsaConnect = nullptr; #endif m_pSetup = nullptr; // UI connections... QObject::connect(m_ui.AudioConnectPushButton, SIGNAL(clicked()), SLOT(audioConnectSelected())); QObject::connect(m_ui.AudioDisconnectPushButton, SIGNAL(clicked()), SLOT(audioDisconnectSelected())); QObject::connect(m_ui.AudioDisconnectAllPushButton, SIGNAL(clicked()), SLOT(audioDisconnectAll())); QObject::connect(m_ui.AudioExpandAllPushButton, SIGNAL(clicked()), SLOT(audioExpandAll())); QObject::connect(m_ui.AudioRefreshPushButton, SIGNAL(clicked()), SLOT(audioRefresh())); QObject::connect(m_ui.MidiConnectPushButton, SIGNAL(clicked()), SLOT(midiConnectSelected())); QObject::connect(m_ui.MidiDisconnectPushButton, SIGNAL(clicked()), SLOT(midiDisconnectSelected())); QObject::connect(m_ui.MidiDisconnectAllPushButton, SIGNAL(clicked()), SLOT(midiDisconnectAll())); QObject::connect(m_ui.MidiExpandAllPushButton, SIGNAL(clicked()), SLOT(midiExpandAll())); QObject::connect(m_ui.MidiRefreshPushButton, SIGNAL(clicked()), SLOT(midiRefresh())); QObject::connect(m_ui.AlsaConnectPushButton, SIGNAL(clicked()), SLOT(alsaConnectSelected())); QObject::connect(m_ui.AlsaDisconnectPushButton, SIGNAL(clicked()), SLOT(alsaDisconnectSelected())); QObject::connect(m_ui.AlsaDisconnectAllPushButton, SIGNAL(clicked()), SLOT(alsaDisconnectAll())); QObject::connect(m_ui.AlsaExpandAllPushButton, SIGNAL(clicked()), SLOT(alsaExpandAll())); QObject::connect(m_ui.AlsaRefreshPushButton, SIGNAL(clicked()), SLOT(alsaRefresh())); // Connect it to some UI feedback slots. QObject::connect(m_ui.AudioConnectView->OListView(), SIGNAL(itemSelectionChanged()), SLOT(audioStabilize())); QObject::connect(m_ui.AudioConnectView->IListView(), SIGNAL(itemSelectionChanged()), SLOT(audioStabilize())); QObject::connect(m_ui.MidiConnectView->OListView(), SIGNAL(itemSelectionChanged()), SLOT(midiStabilize())); QObject::connect(m_ui.MidiConnectView->IListView(), SIGNAL(itemSelectionChanged()), SLOT(midiStabilize())); QObject::connect(m_ui.AlsaConnectView->OListView(), SIGNAL(itemSelectionChanged()), SLOT(alsaStabilize())); QObject::connect(m_ui.AlsaConnectView->IListView(), SIGNAL(itemSelectionChanged()), SLOT(alsaStabilize())); QObject::connect(m_ui.AudioConnectView->OListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(audioStabilize())); QObject::connect(m_ui.AudioConnectView->IListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(audioStabilize())); QObject::connect(m_ui.MidiConnectView->OListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(midiStabilize())); QObject::connect(m_ui.MidiConnectView->IListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(midiStabilize())); QObject::connect(m_ui.AlsaConnectView->OListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(alsaStabilize())); QObject::connect(m_ui.AlsaConnectView->IListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(alsaStabilize())); // Dirty dispatcher (refresh deferral). QObject::connect(m_ui.AudioConnectView, SIGNAL(aliasesChanged()), SLOT(audioAliasesChanged())); QObject::connect(m_ui.MidiConnectView, SIGNAL(aliasesChanged()), SLOT(midiAliasesChanged())); QObject::connect(m_ui.AlsaConnectView, SIGNAL(aliasesChanged()), SLOT(alsaAliasesChanged())); // Actual connections... QObject::connect(m_pAudioConnect, SIGNAL(disconnecting(qjackctlPortItem *, qjackctlPortItem *)), SLOT(audioDisconnecting(qjackctlPortItem *, qjackctlPortItem *))); #ifdef CONFIG_JACK_MIDI QObject::connect(m_pMidiConnect, SIGNAL(disconnecting(qjackctlPortItem *, qjackctlPortItem *)), SLOT(midiDisconnecting(qjackctlPortItem *, qjackctlPortItem *))); #endif #ifdef CONFIG_ALSA_SEQ QObject::connect(m_pAlsaConnect, SIGNAL(disconnecting(qjackctlPortItem *, qjackctlPortItem *)), SLOT(alsaDisconnecting(qjackctlPortItem *, qjackctlPortItem *))); #endif #ifndef CONFIG_JACK_MIDI m_ui.ConnectionsTabWidget->setTabEnabled(1, false); #endif #ifndef CONFIG_ALSA_SEQ // m_ui.ConnectionsTabWidget->setTabEnabled(2, false); m_ui.ConnectionsTabWidget->removeTab(2); #endif // Start disabled. stabilizeAudio(false); stabilizeMidi(false); stabilizeAlsa(false); } // Destructor. qjackctlConnectionsForm::~qjackctlConnectionsForm (void) { // Destroy our connections view... if (m_pAudioConnect) delete m_pAudioConnect; #ifdef CONFIG_JACK_MIDI if (m_pMidiConnect) delete m_pMidiConnect; #endif #ifdef CONFIG_ALSA_SEQ if (m_pAlsaConnect) delete m_pAlsaConnect; #endif } // Notify our parent that we're emerging. void qjackctlConnectionsForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeFormEx(); audioRefresh(); midiRefresh(); alsaRefresh(); QWidget::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlConnectionsForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeFormEx(); } // Just about to notify main-window that we're closing. void qjackctlConnectionsForm::closeEvent ( QCloseEvent *pCloseEvent ) { // Save current tab page and splitter sizes... if (m_pSetup) { m_pSetup->iConnectionsTabPage = tabPage(); m_pSetup->saveSplitterSizes(m_ui.AudioConnectView); m_pSetup->saveSplitterSizes(m_ui.MidiConnectView); m_pSetup->saveSplitterSizes(m_ui.AlsaConnectView); } QWidget::closeEvent(pCloseEvent); } // Set reference to global options, mostly needed for the // initial sizes of the main splitter views and those // client/port aliasing feature. void qjackctlConnectionsForm::setup ( qjackctlSetup *pSetup ) { m_pSetup = pSetup; qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) { QObject::connect(m_pAudioConnect, SIGNAL(connectChanged()), pMainForm, SLOT(jackConnectChanged())); #ifdef CONFIG_JACK_MIDI QObject::connect(m_pMidiConnect, SIGNAL(connectChanged()), pMainForm, SLOT(jackConnectChanged())); #endif #ifdef CONFIG_ALSA_SEQ QObject::connect(m_pAlsaConnect, SIGNAL(connectChanged()), pMainForm, SLOT(alsaConnectChanged())); #endif } // Load some splitter sizes... if (m_pSetup) { QList sizes; sizes.append(180); sizes.append(60); sizes.append(180); m_pSetup->loadSplitterSizes(m_ui.AudioConnectView, sizes); m_pSetup->loadSplitterSizes(m_ui.MidiConnectView, sizes); m_pSetup->loadSplitterSizes(m_ui.AlsaConnectView, sizes); #ifdef CONFIG_ALSA_SEQ if (!m_pSetup->bAlsaSeqEnabled) { // m_ui.ConnectionsTabWidget->setTabEnabled(2, false); m_ui.ConnectionsTabWidget->removeTab(2); } #endif } // Update initial client/port aliases... updateAliases(); } // Connector view accessors. qjackctlConnectView *qjackctlConnectionsForm::audioConnectView (void) const { return m_ui.AudioConnectView; } qjackctlConnectView *qjackctlConnectionsForm::midiConnectView (void) const { return m_ui.MidiConnectView; } qjackctlConnectView *qjackctlConnectionsForm::alsaConnectView (void) const { return m_ui.AlsaConnectView; } // Tab page accessors. void qjackctlConnectionsForm::setTabPage ( int iTabPage ) { m_ui.ConnectionsTabWidget->setCurrentIndex(iTabPage); } int qjackctlConnectionsForm::tabPage (void) const { return m_ui.ConnectionsTabWidget->currentIndex(); } // Connections view font accessors. QFont qjackctlConnectionsForm::connectionsFont (void) const { // Elect one list view to retrieve current font. return m_ui.AudioConnectView->OListView()->font(); } void qjackctlConnectionsForm::setConnectionsFont ( const QFont & font ) { // Set fonts of all listviews... m_ui.AudioConnectView->OListView()->setFont(font); m_ui.AudioConnectView->IListView()->setFont(font); m_ui.MidiConnectView->OListView()->setFont(font); m_ui.MidiConnectView->IListView()->setFont(font); m_ui.AlsaConnectView->OListView()->setFont(font); m_ui.AlsaConnectView->IListView()->setFont(font); } // Connections view icon size accessor. void qjackctlConnectionsForm::setConnectionsIconSize ( int iIconSize ) { // Set icon sizes of all views... m_ui.AudioConnectView->setIconSize(iIconSize); m_ui.MidiConnectView->setIconSize(iIconSize); m_ui.AlsaConnectView->setIconSize(iIconSize); } // Check if there's JACK audio connections. bool qjackctlConnectionsForm::isAudioConnected (void) const { bool bIsAudioConnected = false; if (m_pAudioConnect) bIsAudioConnected = m_pAudioConnect->canDisconnectAll(); return bIsAudioConnected; } // Connect current selected JACK audio ports. void qjackctlConnectionsForm::audioConnectSelected (void) { if (m_pAudioConnect) { if (m_pAudioConnect->connectSelected()) refreshAudio(false); } } // Disconnect current selected JACK audio ports. void qjackctlConnectionsForm::audioDisconnectSelected (void) { if (m_pAudioConnect) { if (m_pAudioConnect->disconnectSelected()) refreshAudio(false); } } // Disconnect all connected JACK audio ports. void qjackctlConnectionsForm::audioDisconnectAll (void) { if (m_pAudioConnect) { if (m_pAudioConnect->disconnectAll()) refreshAudio(false); } } // Expand all JACK audio client ports. void qjackctlConnectionsForm::audioExpandAll (void) { if (m_pAudioConnect) { m_pAudioConnect->expandAll(); stabilizeAudio(true); } } // JACK audio ports disconnecting. void qjackctlConnectionsForm::audioDisconnecting ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->queryDisconnect(pOPort, pIPort, QJACKCTL_SOCKETTYPE_JACK_AUDIO); } // JACK audio client/port aliases have changed. void qjackctlConnectionsForm::audioAliasesChanged (void) { if (m_pSetup) m_pSetup->aliases.dirty = true; audioRefresh(); } // Refresh JACK audio form by notifying the parent form. void qjackctlConnectionsForm::audioRefresh (void) { refreshAudio(false); } // A JACK audio helper stabilization slot. void qjackctlConnectionsForm::audioStabilize (void) { stabilizeAudio(true); } // Connect current selected JACK MIDI ports. void qjackctlConnectionsForm::midiConnectSelected (void) { if (m_pMidiConnect) { if (m_pMidiConnect->connectSelected()) refreshMidi(false); } } // Check if there's JACK MIDI connections. bool qjackctlConnectionsForm::isMidiConnected (void) const { bool bIsMidiConnected = false; if (m_pMidiConnect) bIsMidiConnected = m_pMidiConnect->canDisconnectAll(); return bIsMidiConnected; } // Disconnect current selected JACK MIDI ports. void qjackctlConnectionsForm::midiDisconnectSelected (void) { if (m_pMidiConnect) { if (m_pMidiConnect->disconnectSelected()) refreshMidi(false); } } // Disconnect all connected JACK MIDI ports. void qjackctlConnectionsForm::midiDisconnectAll (void) { if (m_pMidiConnect) { if (m_pMidiConnect->disconnectAll()) refreshMidi(false); } } // Expand all JACK MIDI client ports. void qjackctlConnectionsForm::midiExpandAll (void) { if (m_pMidiConnect) { m_pMidiConnect->expandAll(); stabilizeMidi(true); } } // JACK MIDI ports disconnecting. void qjackctlConnectionsForm::midiDisconnecting ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->queryDisconnect(pOPort, pIPort, QJACKCTL_SOCKETTYPE_JACK_MIDI); } // JACK MIDI client/port aliases have changed. void qjackctlConnectionsForm::midiAliasesChanged (void) { if (m_pSetup) m_pSetup->aliases.dirty = true; midiRefresh(); } // Refresh JACK MIDI form by notifying the parent form. void qjackctlConnectionsForm::midiRefresh (void) { refreshMidi(false); } // A JACK MIDI helper stabilization slot. void qjackctlConnectionsForm::midiStabilize (void) { stabilizeMidi(true); } // Check if there's ALSA MIDI connections. bool qjackctlConnectionsForm::isAlsaConnected (void) const { bool bIsAlsaConnected = false; if (m_pAlsaConnect) bIsAlsaConnected = m_pAlsaConnect->canDisconnectAll(); return bIsAlsaConnected; } // Connect current selected ALSA MIDI ports. void qjackctlConnectionsForm::alsaConnectSelected (void) { if (m_pAlsaConnect) { if (m_pAlsaConnect->connectSelected()) refreshAlsa(false); } } // Disconnect current selected ALSA MIDI ports. void qjackctlConnectionsForm::alsaDisconnectSelected (void) { if (m_pAlsaConnect) { if (m_pAlsaConnect->disconnectSelected()) refreshAlsa(false); } } // Disconnect all connected ALSA MIDI ports. void qjackctlConnectionsForm::alsaDisconnectAll (void) { if (m_pAlsaConnect) { if (m_pAlsaConnect->disconnectAll()) refreshAlsa(false); } } // Expand all ALSA MIDI client ports. void qjackctlConnectionsForm::alsaExpandAll (void) { if (m_pAlsaConnect) { m_pAlsaConnect->expandAll(); stabilizeAlsa(true); } } // ALSA MIDI ports disconnecting. void qjackctlConnectionsForm::alsaDisconnecting ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->queryDisconnect(pOPort, pIPort, QJACKCTL_SOCKETTYPE_ALSA_MIDI); } // ALSA MIDI client/port aliases have changed. void qjackctlConnectionsForm::alsaAliasesChanged (void) { if (m_pSetup) m_pSetup->aliases.dirty = true; alsaRefresh(); } // Refresh complete form by notifying the parent form. void qjackctlConnectionsForm::alsaRefresh (void) { refreshAlsa(false); } // A helper stabilization slot. void qjackctlConnectionsForm::alsaStabilize (void) { stabilizeAlsa(true); } // Either rebuild all connections now // or notify main form for doing that later. void qjackctlConnectionsForm::refreshAudio ( bool bEnabled, bool bClear ) { if (m_pAudioConnect == nullptr) return; if (bEnabled) { // m_pAudioConnect->refresh(); stabilizeAudio(bEnabled, bClear); } else { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshJackConnections(); } } void qjackctlConnectionsForm::refreshMidi ( bool bEnabled, bool bClear ) { if (m_pMidiConnect == nullptr) return; if (bEnabled) { // m_pMidiConnect->refresh(); stabilizeMidi(bEnabled, bClear); } else { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshJackConnections(); } } void qjackctlConnectionsForm::refreshAlsa ( bool bEnabled, bool bClear ) { if (m_pAlsaConnect == nullptr) return; if (bEnabled) { // m_pAlsaConnect->refresh(); stabilizeAlsa(bEnabled, bClear); } else { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshAlsaConnections(); } } // Proper enablement of connections command controls. void qjackctlConnectionsForm::stabilizeAudio ( bool bEnabled, bool bClear ) { if (m_pAudioConnect) m_pAudioConnect->updateContents(!bEnabled || bClear); if (m_pAudioConnect && bEnabled) { m_ui.AudioConnectPushButton->setEnabled( m_pAudioConnect->canConnectSelected()); m_ui.AudioDisconnectPushButton->setEnabled( m_pAudioConnect->canDisconnectSelected()); m_ui.AudioDisconnectAllPushButton->setEnabled( m_pAudioConnect->canDisconnectAll()); m_ui.AudioExpandAllPushButton->setEnabled(true); m_ui.AudioRefreshPushButton->setEnabled(true); } else { m_ui.AudioConnectPushButton->setEnabled(false); m_ui.AudioDisconnectPushButton->setEnabled(false); m_ui.AudioDisconnectAllPushButton->setEnabled(false); m_ui.AudioExpandAllPushButton->setEnabled(false); m_ui.AudioRefreshPushButton->setEnabled(false); } } void qjackctlConnectionsForm::stabilizeMidi ( bool bEnabled, bool bClear ) { if (m_pMidiConnect) m_pMidiConnect->updateContents(!bEnabled || bClear); if (m_pMidiConnect && bEnabled) { m_ui.MidiConnectPushButton->setEnabled( m_pMidiConnect->canConnectSelected()); m_ui.MidiDisconnectPushButton->setEnabled( m_pMidiConnect->canDisconnectSelected()); m_ui.MidiDisconnectAllPushButton->setEnabled( m_pMidiConnect->canDisconnectAll()); m_ui.MidiExpandAllPushButton->setEnabled(true); m_ui.MidiRefreshPushButton->setEnabled(true); } else { m_ui.MidiConnectPushButton->setEnabled(false); m_ui.MidiDisconnectPushButton->setEnabled(false); m_ui.MidiDisconnectAllPushButton->setEnabled(false); m_ui.MidiExpandAllPushButton->setEnabled(false); m_ui.MidiRefreshPushButton->setEnabled(false); } } void qjackctlConnectionsForm::stabilizeAlsa ( bool bEnabled, bool bClear ) { if (m_pAlsaConnect) m_pAlsaConnect->updateContents(!bEnabled || bClear); if (m_pAlsaConnect && bEnabled) { m_ui.AlsaConnectPushButton->setEnabled( m_pAlsaConnect->canConnectSelected()); m_ui.AlsaDisconnectPushButton->setEnabled( m_pAlsaConnect->canDisconnectSelected()); m_ui.AlsaDisconnectAllPushButton->setEnabled( m_pAlsaConnect->canDisconnectAll()); m_ui.AlsaExpandAllPushButton->setEnabled(true); m_ui.AlsaRefreshPushButton->setEnabled(true); } else { m_ui.AlsaConnectPushButton->setEnabled(false); m_ui.AlsaDisconnectPushButton->setEnabled(false); m_ui.AlsaDisconnectAllPushButton->setEnabled(false); m_ui.AlsaExpandAllPushButton->setEnabled(false); m_ui.AlsaRefreshPushButton->setEnabled(false); } } // Client/port aliasing feature update. void qjackctlConnectionsForm::updateAliases (void) { // Set alias maps for all listviews... if (m_pSetup && m_pSetup->bAliasesEnabled) { const bool bRenameEnabled = m_pSetup->bAliasesEditing; m_ui.AudioConnectView->OListView()->setAliasList( &(m_pSetup->aliases.audioOutputs), bRenameEnabled); m_ui.AudioConnectView->IListView()->setAliasList( &(m_pSetup->aliases.audioInputs), bRenameEnabled); m_ui.MidiConnectView->OListView()->setAliasList( &(m_pSetup->aliases.midiOutputs), bRenameEnabled); m_ui.MidiConnectView->IListView()->setAliasList( &(m_pSetup->aliases.midiInputs), bRenameEnabled); m_ui.AlsaConnectView->OListView()->setAliasList( &(m_pSetup->aliases.alsaOutputs), bRenameEnabled); m_ui.AlsaConnectView->IListView()->setAliasList( &(m_pSetup->aliases.alsaInputs), bRenameEnabled); } else { m_ui.AudioConnectView->OListView()->setAliasList(nullptr, false); m_ui.AudioConnectView->IListView()->setAliasList(nullptr, false); m_ui.MidiConnectView->OListView()->setAliasList(nullptr, false); m_ui.MidiConnectView->IListView()->setAliasList(nullptr, false); m_ui.AlsaConnectView->OListView()->setAliasList(nullptr, false); m_ui.AlsaConnectView->IListView()->setAliasList(nullptr, false); } } // Keyboard event handler. void qjackctlConnectionsForm::keyPressEvent ( QKeyEvent *pKeyEvent ) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlConnectionsForm::keyPressEvent(%d)", pKeyEvent->key()); #endif int iKey = pKeyEvent->key(); switch (iKey) { case Qt::Key_Escape: close(); break; default: QWidget::keyPressEvent(pKeyEvent); break; } } // end of qjackctlConnectionsForm.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlJackGraph.h0000644000000000000000000000012715174607203016710 xustar0029 mtime=1777536643.51191432 29 atime=1777536643.51191432 29 ctime=1777536643.51191432 qjackctl-1.0.6/src/qjackctlJackGraph.h0000644000175000001440000000513615174607203016701 0ustar00rncbcusers// qjackctlJackGraph.h // /**************************************************************************** Copyright (C) 2003-2026, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlJackGraph_h #define __qjackctlJackGraph_h #include "qjackctlAbout.h" #include "qjackctlGraph.h" #include #include //---------------------------------------------------------------------------- // qjackctlJackGraph -- JACK graph driver class qjackctlJackGraph : public qjackctlGraphSect { public: // Constructor. qjackctlJackGraph(qjackctlGraphCanvas *canvas); // JACK port (dis)connection. void connectPorts( qjackctlGraphPort *port1, qjackctlGraphPort *port2, bool is_connect); // JACK graph updaters. void updateItems(); void clearItems(); // JACK node type inquirer. static bool isNodeType(uint node_type); // JACK node type. static uint nodeType(); // JACK port type(s) inquirer. static bool isPortType(uint port_type); // JACK port types. static uint audioPortType(); static uint midiPortType(); // JACK port (meta-data provided) types. static uint cvPortType(); static uint oscPortType(); // Client/port renaming method (virtual override). void renameItem(qjackctlGraphItem *item, const QString& name); // Special port-type colors defaults (static). static void resetPortTypeColors(qjackctlGraphCanvas *canvas); protected: // JACK client:port finder and creator if not existing. bool findClientPort(jack_client_t *client, const char *client_port, qjackctlGraphItem::Mode port_mode, qjackctlGraphNode **node, qjackctlGraphPort **port, bool add_new); // Client/port item aliases accessor. QList item_aliases(qjackctlGraphItem *item) const; private: // Callback sanity mutex. QMutex m_mutex; }; #endif // __qjackctlJackGraph_h // end of qjackctlJackGraph.h qjackctl-1.0.6/src/PaxHeaders/qjackctlAlsaGraph.cpp0000644000000000000000000000013215174607203017247 xustar0030 mtime=1777536643.509914334 30 atime=1777536643.509914334 30 ctime=1777536643.509914334 qjackctl-1.0.6/src/qjackctlAlsaGraph.cpp0000644000175000001440000002777215174607203017256 0ustar00rncbcusers// qjackctlAlsaGraph.cpp // /**************************************************************************** Copyright (C) 2003-2026, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAlsaGraph.h" #include "qjackctlMainForm.h" #ifdef CONFIG_ALSA_SEQ #include //---------------------------------------------------------------------------- // qjackctlAlsaGraph -- ALSA graph driver // Constructor. qjackctlAlsaGraph::qjackctlAlsaGraph ( qjackctlGraphCanvas *canvas ) : qjackctlGraphSect(canvas) { } // ALSA port (dis)connection. void qjackctlAlsaGraph::connectPorts ( qjackctlGraphPort *port1, qjackctlGraphPort *port2, bool is_connect ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; snd_seq_t *seq = pMainForm->alsaSeq(); if (seq == nullptr) return; if (port1 == nullptr || port2 == nullptr) return; const qjackctlGraphNode *node1 = port1->portNode(); const qjackctlGraphNode *node2 = port2->portNode(); if (node1 == nullptr || node2 == nullptr) return; QMutexLocker locker(&m_mutex); const int client_id1 = node1->nodeName().section(':', 0, 0).toInt(); const int port_id1 = port1->portName().section(':', 0, 0).toInt(); const int client_id2 = node2->nodeName().section(':', 0, 0).toInt(); const int port_id2 = port2->portName().section(':', 0, 0).toInt(); #ifdef CONFIG_DEBUG qDebug("qjackctlAlsaGraph::connectPorts(%d:%d, %d:%d, %d)", client_id1, port_id1, client_id2, port_id2, is_connect); #endif snd_seq_port_subscribe_t *seq_subs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&seq_subs); seq_addr.client = client_id1; seq_addr.port = port_id1; snd_seq_port_subscribe_set_sender(seq_subs, &seq_addr); seq_addr.client = client_id2; seq_addr.port = port_id2; snd_seq_port_subscribe_set_dest(seq_subs, &seq_addr); if (is_connect) { snd_seq_subscribe_port(seq, seq_subs); } else { snd_seq_unsubscribe_port(seq, seq_subs); } } // ALSA node type inquirer. (static) bool qjackctlAlsaGraph::isNodeType ( uint node_type ) { return (node_type == qjackctlAlsaGraph::nodeType()); } // ALSA node type. uint qjackctlAlsaGraph::nodeType (void) { static const uint AlsaNodeType = qjackctlGraphItem::itemType("ALSA_NODE_TYPE"); return AlsaNodeType; } // ALSA port type inquirer. (static) bool qjackctlAlsaGraph::isPortType ( uint port_type ) { return (port_type == qjackctlAlsaGraph::midiPortType()); } // ALSA port type. uint qjackctlAlsaGraph::midiPortType (void) { static const uint AlsaMidiPortType = qjackctlGraphItem::itemType("ALSA_PORT_TYPE"); return AlsaMidiPortType; } // ALSA client:port finder and creator if not existing. bool qjackctlAlsaGraph::findClientPort ( snd_seq_client_info_t *client_info, snd_seq_port_info_t *port_info, qjackctlGraphItem::Mode port_mode, qjackctlGraphNode **node, qjackctlGraphPort **port, bool add_new ) { const int client_id = snd_seq_client_info_get_client(client_info); const int port_id = snd_seq_port_info_get_port(port_info); const QString& client_name = QString::number(client_id) + ':' + QString::fromUtf8(snd_seq_client_info_get_name(client_info)); const QString& port_name = QString::number(port_id) + ':' + QString::fromUtf8(snd_seq_port_info_get_name(port_info)); const uint node_type = qjackctlAlsaGraph::nodeType(); const uint port_type = qjackctlAlsaGraph::midiPortType(); qjackctlGraphItem::Mode node_mode = port_mode; *node = qjackctlGraphSect::findNode(client_name, node_mode, node_type); *port = nullptr; if (*node == nullptr && client_id >= 128) { node_mode = qjackctlGraphItem::Duplex; *node = qjackctlGraphSect::findNode(client_name, node_mode, node_type); } if (*node) *port = (*node)->findPort(port_name, port_mode, port_type); if (add_new && *node == nullptr) { *node = new qjackctlGraphNode(client_name, node_mode, node_type); (*node)->setNodeIcon(QIcon(":/images/graphAlsa.png")); qjackctlGraphSect::addItem(*node); } if (add_new && *port == nullptr && *node) { *port = (*node)->addPort(port_name, port_mode, port_type); (*port)->updatePortTypeColors(qjackctlGraphSect::canvas()); } if (add_new && *node) { int nchanged = 0; QString node_title = (*node)->nodeTitle(); foreach (qjackctlAliasList *node_aliases, item_aliases(*node)) node_title = node_aliases->clientAlias(client_name); if ((*node)->nodeTitle() != node_title) { (*node)->setNodeTitle(node_title); ++nchanged; } if (*port) { QString port_title = (*port)->portTitle(); foreach (qjackctlAliasList *port_aliases, item_aliases(*port)) port_title = port_aliases->portAlias(client_name, port_name); if ((*port)->portTitle() != port_title) { (*port)->setPortTitle(port_title); ++nchanged; } } if (nchanged > 0) (*node)->updatePath(); } return (*node && *port); } // ALSA graph updater. void qjackctlAlsaGraph::updateItems (void) { QMutexLocker locker(&m_mutex); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; snd_seq_t *seq = pMainForm->alsaSeq(); if (seq == nullptr) return; #ifdef CONFIG_DEBUG_0 qDebug("qjackctlAlsaGraph::updateItems()"); #endif // 1. Client/ports inventory... // snd_seq_client_info_t *client_info1; snd_seq_port_info_t *port_info1; snd_seq_client_info_alloca(&client_info1); snd_seq_port_info_alloca(&port_info1); snd_seq_client_info_set_client(client_info1, -1); while (snd_seq_query_next_client(seq, client_info1) >= 0) { const int client_id = snd_seq_client_info_get_client(client_info1); if (0 >= client_id) // Skip 0:System client... continue; snd_seq_port_info_set_client(port_info1, client_id); snd_seq_port_info_set_port(port_info1, -1); while (snd_seq_query_next_port(seq, port_info1) >= 0) { const unsigned int port_caps1 = snd_seq_port_info_get_capability(port_info1); if (port_caps1 & SND_SEQ_PORT_CAP_NO_EXPORT) continue; qjackctlGraphItem::Mode port_mode1 = qjackctlGraphItem::None; const unsigned int port_is_input = (SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE); if ((port_caps1 & port_is_input) == port_is_input) { port_mode1 = qjackctlGraphItem::Input; qjackctlGraphNode *node1 = nullptr; qjackctlGraphPort *port1 = nullptr; if (findClientPort(client_info1, port_info1, port_mode1, &node1, &port1, true)) { node1->setMarked(true); port1->setMarked(true); } } const unsigned int port_is_output = (SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ); if ((port_caps1 & port_is_output) == port_is_output) { port_mode1 = qjackctlGraphItem::Output; qjackctlGraphNode *node1 = nullptr; qjackctlGraphPort *port1 = nullptr; if (findClientPort(client_info1, port_info1, port_mode1, &node1, &port1, true)) { node1->setMarked(true); port1->setMarked(true); } } } } // 2. Connections inventory... // snd_seq_client_info_t *client_info2; snd_seq_port_info_t *port_info2; snd_seq_client_info_alloca(&client_info2); snd_seq_port_info_alloca(&port_info2); snd_seq_query_subscribe_t *seq_subs; snd_seq_addr_t seq_addr; snd_seq_query_subscribe_alloca(&seq_subs); snd_seq_client_info_set_client(client_info1, -1); while (snd_seq_query_next_client(seq, client_info1) >= 0) { const int client_id = snd_seq_client_info_get_client(client_info1); if (0 >= client_id) // Skip 0:system client... continue; snd_seq_port_info_set_client(port_info1, client_id); snd_seq_port_info_set_port(port_info1, -1); while (snd_seq_query_next_port(seq, port_info1) >= 0) { const unsigned int port_caps1 = snd_seq_port_info_get_capability(port_info1); if (port_caps1 & SND_SEQ_PORT_CAP_NO_EXPORT) continue; if (port_caps1 & (SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ)) { const qjackctlGraphItem::Mode port_mode1 = qjackctlGraphItem::Output; qjackctlGraphNode *node1 = nullptr; qjackctlGraphPort *port1 = nullptr; if (!findClientPort(client_info1, port_info1, port_mode1, &node1, &port1, false)) continue; snd_seq_query_subscribe_set_type(seq_subs, SND_SEQ_QUERY_SUBS_READ); snd_seq_query_subscribe_set_index(seq_subs, 0); seq_addr.client = client_id; seq_addr.port = snd_seq_port_info_get_port(port_info1); snd_seq_query_subscribe_set_root(seq_subs, &seq_addr); while (snd_seq_query_port_subscribers(seq, seq_subs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(seq_subs); if (snd_seq_get_any_client_info(seq, seq_addr.client, client_info2) >= 0 && snd_seq_get_any_port_info(seq, seq_addr.client, seq_addr.port, port_info2) >= 0) { const qjackctlGraphItem::Mode port_mode2 = qjackctlGraphItem::Input; qjackctlGraphNode *node2 = nullptr; qjackctlGraphPort *port2 = nullptr; if (findClientPort(client_info2, port_info2, port_mode2, &node2, &port2, false)) { qjackctlGraphConnect *connect = port1->findConnect(port2); if (connect == nullptr) { connect = new qjackctlGraphConnect(); connect->setPort1(port1); connect->setPort2(port2); connect->updatePortTypeColors(); connect->updatePath(); qjackctlGraphSect::addItem(connect); } if (connect) connect->setMarked(true); } } snd_seq_query_subscribe_set_index(seq_subs, snd_seq_query_subscribe_get_index(seq_subs) + 1); } } } } // 3. Clean-up all un-marked items... // qjackctlGraphSect::resetItems(qjackctlAlsaGraph::nodeType()); } void qjackctlAlsaGraph::clearItems (void) { QMutexLocker locker(&m_mutex); #ifdef CONFIG_DEBUG_0 qDebug("qjackctlAlsaGraph::clearItems()"); #endif qjackctlGraphSect::clearItems(qjackctlAlsaGraph::nodeType()); } // Special port-type colors defaults (static). void qjackctlAlsaGraph::resetPortTypeColors ( qjackctlGraphCanvas *canvas ) { if (canvas) { canvas->setPortTypeColor( qjackctlAlsaGraph::midiPortType(), QColor(Qt::darkMagenta).darker(120)); } } // Client/port item aliases accessor. QList qjackctlAlsaGraph::item_aliases ( qjackctlGraphItem *item ) const { QList alist; qjackctlAliases *aliases = nullptr; qjackctlGraphCanvas *canvas = qjackctlGraphSect::canvas(); if (canvas) aliases = canvas->aliases(); if (aliases == nullptr) return alist; // empty! uint item_type = 0; qjackctlGraphItem::Mode item_mode = qjackctlGraphItem::None; bool is_node = false; if (item->type() == qjackctlGraphNode::Type) { qjackctlGraphNode *node = static_cast (item); if (node && qjackctlAlsaGraph::isNodeType(node->nodeType())) { item_type = node->nodeType(); item_mode = node->nodeMode(); is_node = true; } } else if (item->type() == qjackctlGraphPort::Type) { qjackctlGraphPort *port = static_cast (item); if (port) { item_type = port->portType(); item_mode = port->portMode(); } } if (!item_type || !item_mode) return alist; // empty again! if (is_node || item_type == qjackctlAlsaGraph::midiPortType()) { // ALSA MIDI type... if (item_mode & qjackctlGraphItem::Input) alist.append(&(aliases->alsaInputs)); if (item_mode & qjackctlGraphItem::Output) alist.append(&(aliases->alsaOutputs)); } return alist; // hopefully non empty! } #endif // CONFIG_ALSA_SEQ // end of qjackctlAlsaGraph.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlPaletteForm.ui0000644000000000000000000000013215174607203017462 xustar0030 mtime=1777536643.513914305 30 atime=1777536643.512914312 30 ctime=1777536643.513914305 qjackctl-1.0.6/src/qjackctlPaletteForm.ui0000644000175000001440000001723115174607203017456 0ustar00rncbcusers rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlPaletteForm 0 0 534 640 0 0 Color Themes Name 0 0 320 0 Current color palette name true QComboBox::NoInsert Save current color palette name Save :/images/formSave.png Delete current color palette name Delete :/images/formRemove.png Palette 280 360 Current color palette true Generate: 0 0 Qt::StrongFocus Base color to generate palette Reset all current palette colors Reset :/images/itemReset.png Qt::Horizontal 8 20 Import a custom color theme (palette) from file Import... :/images/formOpen.png Export a custom color theme (palette) to file Export... :/images/formSave.png Qt::Horizontal 8 20 Show Details Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok qjackctlPaletteForm::ColorButton nameCombo saveButton deleteButton paletteView generateButton resetButton importButton exportButton detailsCheck dialogButtons qjackctl-1.0.6/src/PaxHeaders/qjackctlSessionFile.txt0000644000000000000000000000013215174607203017665 xustar0030 mtime=1777536643.515914291 30 atime=1777536643.515914291 30 ctime=1777536643.515914291 qjackctl-1.0.6/src/qjackctlSessionFile.txt0000644000175000001440000000123015174607203017651 0ustar00rncbcusersqjackctlSession format specification ------------------------------------ client-command . . . . . . . . . session-name := string-literal client-name := string-literal client-uuid := string-literal client-command := string-literal port-name := string-literal port-type := "in" | "out" qjackctl-1.0.6/src/PaxHeaders/qjackctlInterfaceComboBox.cpp0000644000000000000000000000012715174607203020742 xustar0029 mtime=1777536643.51191432 29 atime=1777536643.51191432 29 ctime=1777536643.51191432 qjackctl-1.0.6/src/qjackctlInterfaceComboBox.cpp0000644000175000001440000003265315174607203020737 0ustar00rncbcusers// qjackctlInterfaceComboBox.cpp // /**************************************************************************** Copyright (C) 2003-2021, rncbc aka Rui Nuno Capela. All rights reserved. Copyright (C) 2015, Kjetil Matheussen. (portaudio_probe_thread) Copyright (C) 2013, Arnout Engelen. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlInterfaceComboBox.h" #include "qjackctlSetup.h" #include #include #include #include #include #include #ifdef CONFIG_COREAUDIO #include #include #include #include #include #endif #ifdef CONFIG_PORTAUDIO #include #include #include #ifdef WIN32 #include #endif #endif #ifdef CONFIG_ALSA_SEQ #include #endif // Constructor. qjackctlInterfaceComboBox::qjackctlInterfaceComboBox ( QWidget *pParent ) : QComboBox(pParent) { QTreeView *pTreeView = new QTreeView(this); pTreeView->header()->hide(); pTreeView->setRootIsDecorated(false); pTreeView->setAllColumnsShowFocus(true); pTreeView->setSelectionBehavior(QAbstractItemView::SelectRows); pTreeView->setSelectionMode(QAbstractItemView::SingleSelection); pTreeView->setModel(new QStandardItemModel()); // pTreeView->setMinimumWidth(320); QComboBox::setView(pTreeView); } void qjackctlInterfaceComboBox::showPopup (void) { populateModel(); QComboBox::showPopup(); } QStandardItemModel *qjackctlInterfaceComboBox::model (void) const { return static_cast (QComboBox::model()); } void qjackctlInterfaceComboBox::setup ( QComboBox *pDriverComboBox, int iAudio, const QString& sDefName ) { m_pDriverComboBox = pDriverComboBox; m_iAudio = iAudio; m_sDefName = sDefName; } void qjackctlInterfaceComboBox::clearCards (void) { model()->clear(); } void qjackctlInterfaceComboBox::addCard ( const QString& sName, const QString& sDescription ) { QList items; if (sName == m_sDefName || sName.isEmpty()) items.append(new QStandardItem(m_sDefName)); else items.append(new QStandardItem(QIcon(":/images/device1.png"), sName)); items.append(new QStandardItem(sDescription)); model()->appendRow(items); } #ifdef CONFIG_COREAUDIO // borrowed from jackpilot source static OSStatus getDeviceUIDFromID( AudioDeviceID id, char *name, UInt32 nsize ) { UInt32 size = sizeof(CFStringRef); CFStringRef UI; OSStatus res = AudioDeviceGetProperty(id, 0, false, kAudioDevicePropertyDeviceUID, &size, &UI); if (res == noErr) CFStringGetCString(UI,name,nsize,CFStringGetSystemEncoding()); CFRelease(UI); return res; } #endif // CONFIG_COREAUDIO #ifdef CONFIG_PORTAUDIO #include #include #include #include namespace { class PortAudioProber : public QThread { public: static QStringList getNames(QWidget *pParent) { { QMutexLocker locker(&PortAudioProber::mutex); if (!PortAudioProber::names.isEmpty()) return PortAudioProber::names; } QMessageBox mbox(QMessageBox::Information, tr("Probing..."), tr("Please wait, PortAudio is probing audio hardware."), QMessageBox::Abort, pParent); // Make it impossible to start another PortAudioProber while waiting. mbox.setWindowModality(Qt::WindowModal); PortAudioProber *pab = new PortAudioProber; pab->start(); bool bTimedOut = true; for (int i = 0; i < 100; ++i) { if (mbox.isVisible()) QApplication::processEvents(); QThread::msleep(50); if (i == 10) // wait 1/2 second before showing message box mbox.show(); if (mbox.clickedButton() != nullptr) { bTimedOut = false; break; } if (pab->isFinished()) { bTimedOut = false; break; } } if (bTimedOut) { QMessageBox::warning(pParent, tr("Warning"), tr("Audio hardware probing timed out.")); } { QMutexLocker locker(&PortAudioProber::mutex); return names; } } private: PortAudioProber() {} ~PortAudioProber() {} static QMutex mutex; static QStringList names; void run() { if (Pa_Initialize() == paNoError) { // Fill HostApi info... const PaHostApiIndex iNumHostApi = Pa_GetHostApiCount(); QString *hostNames = new QString[iNumHostApi]; for (PaHostApiIndex i = 0; i < iNumHostApi; ++i) hostNames[i] = QString(Pa_GetHostApiInfo(i)->name); // Fill device info... const PaDeviceIndex iNumDevice = Pa_GetDeviceCount(); { #ifdef WIN32 wchar_t wideDeviceName[MAX_PATH]; #endif QMutexLocker locker(&PortAudioProber::mutex); if (PortAudioProber::names.isEmpty()) { for (PaDeviceIndex i = 0; i < iNumDevice; ++i) { PaDeviceInfo *pDeviceInfo = const_cast (Pa_GetDeviceInfo(i)); if (strcmp(pDeviceInfo->name, "JackRouter") == 0) continue; #ifdef WIN32 MultiByteToWideChar(CP_UTF8, 0, pDeviceInfo->name, -1, wideDeviceName, MAX_PATH-1); const QString sName = hostNames[pDeviceInfo->hostApi] + "::" + QString::fromWCharArray(wideDeviceName); #else const QString sName = hostNames[pDeviceInfo->hostApi] + "::" + QString(pDeviceInfo->name); #endif PortAudioProber::names.push_back(sName); } } } delete [] hostNames; Pa_Terminate(); } } }; QMutex PortAudioProber::mutex; QStringList PortAudioProber::names; } // namespace #endif // CONFIG_PORTAUDIO void qjackctlInterfaceComboBox::populateModel (void) { const bool bBlockSignals = QComboBox::blockSignals(true); QComboBox::setUpdatesEnabled(false); QComboBox::setDuplicatesEnabled(false); QLineEdit *pLineEdit = QComboBox::lineEdit(); // FIXME: Only valid for ALSA, Sun and OSS devices, // for the time being... and also CoreAudio ones too. const QString& sDriver = m_pDriverComboBox->currentText(); const bool bAlsa = (sDriver == "alsa"); const bool bSun = (sDriver == "sun"); const bool bOss = (sDriver == "oss"); #ifdef CONFIG_COREAUDIO const bool bCoreaudio = (sDriver == "coreaudio"); std::map coreaudioIdMap; #endif #ifdef CONFIG_PORTAUDIO const bool bPortaudio = (sDriver == "portaudio"); #endif QString sCurName = pLineEdit->text(); QString sName, sSubName; int iCards = 0; clearCards(); int iCurCard = -1; if (bAlsa) { #ifdef CONFIG_ALSA_SEQ // Enumerate the ALSA cards and PCM harfware devices... snd_ctl_t *handle; snd_ctl_card_info_t *info; snd_pcm_info_t *pcminfo; snd_ctl_card_info_alloca(&info); snd_pcm_info_alloca(&pcminfo); const QString sPrefix("hw:%1"); const QString sSuffix(" (%1)"); const QString sSubSuffix("%1,%2"); QString sName2, sSubName2; bool bCapture, bPlayback; int iCard = -1; while (snd_card_next(&iCard) >= 0 && iCard >= 0) { sName = sPrefix.arg(iCard); if (snd_ctl_open(&handle, sName.toUtf8().constData(), 0) >= 0 && snd_ctl_card_info(handle, info) >= 0) { sName2 = sPrefix.arg(snd_ctl_card_info_get_id(info)); addCard(sName2, snd_ctl_card_info_get_name(info) + sSuffix.arg(sName)); if (sCurName == sName || sCurName == sName2) iCurCard = iCards; ++iCards; int iDevice = -1; while (snd_ctl_pcm_next_device(handle, &iDevice) >= 0 && iDevice >= 0) { // Capture devices.. bCapture = false; if (m_iAudio == QJACKCTL_CAPTURE || m_iAudio == QJACKCTL_DUPLEX) { snd_pcm_info_set_device(pcminfo, iDevice); snd_pcm_info_set_subdevice(pcminfo, 0); snd_pcm_info_set_stream(pcminfo, SND_PCM_STREAM_CAPTURE); bCapture = (snd_ctl_pcm_info(handle, pcminfo) >= 0); } // Playback devices.. bPlayback = false; if (m_iAudio == QJACKCTL_PLAYBACK || m_iAudio == QJACKCTL_DUPLEX) { snd_pcm_info_set_device(pcminfo, iDevice); snd_pcm_info_set_subdevice(pcminfo, 0); snd_pcm_info_set_stream(pcminfo, SND_PCM_STREAM_PLAYBACK); bPlayback = (snd_ctl_pcm_info(handle, pcminfo) >= 0); } // List iif compliant with the audio mode criteria... if ((m_iAudio == QJACKCTL_CAPTURE && bCapture && !bPlayback) || (m_iAudio == QJACKCTL_PLAYBACK && !bCapture && bPlayback) || (m_iAudio == QJACKCTL_DUPLEX && bCapture && bPlayback)) { sSubName = sSubSuffix.arg(sName).arg(iDevice); sSubName2 = sSubSuffix.arg(sName2).arg(iDevice); addCard(sSubName2, snd_pcm_info_get_name(pcminfo) + sSuffix.arg(sSubName)); if (sCurName == sSubName || sCurName == sSubName2) iCurCard = iCards; ++iCards; } } snd_ctl_close(handle); } } #endif // CONFIG_ALSA_SEQ } else if (bSun) { QFile file("/var/run/dmesg.boot"); if (file.open(QIODevice::ReadOnly)) { QTextStream stream(&file); QString sLine; QRegularExpression rxDevice("audio([0-9]) at (.*)"); QRegularExpressionMatch match; while (!stream.atEnd()) { sLine = stream.readLine(); match = rxDevice.match(sLine); if (match.hasMatch()) { sName = "/dev/audio" + match.captured(1); addCard(sName, match.captured(2)); if (sCurName == sName) iCurCard = iCards; ++iCards; } } file.close(); } } else if (bOss) { // Enumerate the OSS Audio devices... QFile file("/dev/sndstat"); if (file.open(QIODevice::ReadOnly)) { QTextStream stream(&file); QString sLine; bool bAudioDevices = false; QRegularExpression rxHeader("Audio devices.*", QRegularExpression::CaseInsensitiveOption); QRegularExpression rxDevice("([0-9]+):[ ]+(.*)"); QRegularExpressionMatch match; while (!stream.atEnd()) { sLine = stream.readLine(); if (bAudioDevices) { match = rxDevice.match(sLine); if (match.hasMatch()) { sName = "/dev/dsp" + match.captured(1); addCard(sName, match.captured(2)); if (sCurName == sName) iCurCard = iCards; ++iCards; } else break; } else { match = rxHeader.match(sLine); if (match.hasMatch()) bAudioDevices = true; } } file.close(); } } #ifdef CONFIG_COREAUDIO else if (bCoreaudio) { // Find out how many Core Audio devices are there, if any... // (code snippet gently "borrowed" from Stephane Letz jackdmp;) OSStatus err; Boolean isWritable; UInt32 outSize = sizeof(isWritable); err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &outSize, &isWritable); if (err == noErr) { // Calculate the number of device available... int numCoreDevices = outSize / sizeof(AudioDeviceID); // Make space for the devices we are about to get... AudioDeviceID *coreDeviceIDs = new AudioDeviceID [numCoreDevices]; err = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &outSize, (void *) coreDeviceIDs); if (err == noErr) { // Look for the CoreAudio device name... char coreDeviceName[256]; UInt32 nameSize = 256; for (int i = 0; i < numCoreDevices; i++) { err = AudioDeviceGetPropertyInfo(coreDeviceIDs[i], 0, true, kAudioDevicePropertyDeviceName, &outSize, &isWritable); if (err == noErr) { err = AudioDeviceGetProperty(coreDeviceIDs[i], 0, true, kAudioDevicePropertyDeviceName, &nameSize, (void *) coreDeviceName); if (err == noErr) { char drivername[128]; UInt32 dnsize = 128; // this returns the unique id for the device // that must be used on the commandline for jack if (getDeviceUIDFromID(coreDeviceIDs[i], drivername, dnsize) == noErr) { sName = drivername; } else { sName = "Error"; } coreaudioIdMap[sName] = coreDeviceIDs[i]; // TODO: hide this ugly ID from the user, // only show human readable name // humanreadable \t UID sSubName = QString(coreDeviceName); addCard(sName, sSubName); if (sCurName == sName || sCurName == sSubName) iCurCard = iCards; ++iCards; } } } } delete [] coreDeviceIDs; } } #endif // CONFIG_COREAUDIO #ifdef CONFIG_PORTAUDIO else if (bPortaudio) { const QStringList& names = PortAudioProber::getNames(this); const int iCards = names.size(); for (int i = 0; i < iCards; ++i) { const QString& sName = names[i]; if (sCurName == sName) iCurCard = iCards; addCard(sName, QString()); } } #endif // CONFIG_PORTAUDIO addCard(m_sDefName, QString()); if (sCurName == m_sDefName || sCurName.isEmpty()) iCurCard = iCards; ++iCards; QTreeView *pTreeView = static_cast (QComboBox::view()); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) pTreeView->header()->setResizeMode(QHeaderView::ResizeToContents); #else pTreeView->header()->resizeSections(QHeaderView::ResizeToContents); #endif pTreeView->setMinimumWidth( pTreeView->sizeHint().width() + QComboBox::iconSize().width()); QComboBox::setCurrentIndex(iCurCard); pLineEdit->setText(sCurName); QComboBox::setUpdatesEnabled(true); QComboBox::blockSignals(bBlockSignals); } // end of qjackctlInterfaceComboBox.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlSocketForm.h0000644000000000000000000000013215174607203017126 xustar0030 mtime=1777536643.517914276 30 atime=1777536643.517914276 30 ctime=1777536643.517914276 qjackctl-1.0.6/src/qjackctlSocketForm.h0000644000175000001440000000551315174607203017122 0ustar00rncbcusers// qjackctlSocketForm.h // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSocketForm_h #define __qjackctlSocketForm_h #include "ui_qjackctlSocketForm.h" #include "qjackctlJackConnect.h" #include "qjackctlAlsaConnect.h" // Forward declarations. class qjackctlPatchbay; class qjackctlPatchbaySocket; class qjackctlSocketList; class QButtonGroup; class QPixmap; //---------------------------------------------------------------------------- // qjackctlSocketForm -- UI wrapper form. class qjackctlSocketForm : public QDialog { Q_OBJECT public: // Constructor. qjackctlSocketForm(QWidget *pParent = nullptr); // Destructor. ~qjackctlSocketForm(); void setSocketCaption(const QString& sSocketCaption); void setSocketList(qjackctlSocketList *pSocketList); void setSocketNew(bool bSocketNew); void setPixmaps(QPixmap **ppPixmaps); void setConnectCount(int iConnectCount); void load(qjackctlPatchbaySocket *pSocket); void save(qjackctlPatchbaySocket *pSocket); public slots: void changed(); void addPlug(); void editPlug(); void removePlug(); void moveUpPlug(); void moveDownPlug(); void selectedPlug(); void activateAddPlugMenu(QAction *); void customContextMenu(const QPoint&); void socketTypeChanged(); void socketNameChanged(); void clientNameChanged(); void stabilizeForm(); protected slots: void accept(); void reject(); protected: void updateJackClients(int iSocketType); void updateAlsaClients(int iSocketType); void updateJackPlugs(int iSocketType); void updateAlsaPlugs(int iSocketType); bool validateForm(); private: // The Qt-designer UI struct... Ui::qjackctlSocketForm m_ui; // Instance variables. qjackctlSocketList *m_pSocketList; bool m_bSocketNew; int m_iSocketNameChanged; QPixmap **m_ppPixmaps; int m_iDirtyCount; QButtonGroup *m_pSocketTypeButtonGroup; }; #endif // __qjackctlSocketForm_h // end of qjackctlSocketForm.h qjackctl-1.0.6/src/PaxHeaders/qjackctlSession.cpp0000644000000000000000000000013215174607203017030 xustar0030 mtime=1777536643.515914291 30 atime=1777536643.515914291 30 ctime=1777536643.515914291 qjackctl-1.0.6/src/qjackctlSession.cpp0000644000175000001440000004327015174607203017026 0ustar00rncbcusers// qjackctlSession.cpp // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSession.h" #include "qjackctlMainForm.h" #ifdef CONFIG_JACK_SESSION #include #include #endif #include #include #include #include #include #include #include #include // Deprecated QTextStreamFunctions/Qt namespaces workaround. #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) #define endl Qt::endl #endif //---------------------------------------------------------------------------- // qjackctlSession -- JACK session container. // Constructor. qjackctlSession::qjackctlSession (void) { } // Destructor. qjackctlSession::~qjackctlSession (void) { clearInfraClients(); clear(); } // Client list accessor (read-only) const qjackctlSession::ClientList& qjackctlSession::clients (void) const { return m_clients; } // House-keeper. void qjackctlSession::clear (void) { qDeleteAll(m_clients); m_clients.clear(); } #ifdef CONFIG_JACK_SESSION #if defined(Q_CC_GNU) || defined(Q_CC_MINGW) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif #endif // Critical methods. bool qjackctlSession::save ( const QString& sSessionDir, SaveType stype ) { // We're always best to // reset old session settings. clear(); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == nullptr) return false; const QString sSessionPath = sSessionDir + '/'; // First pass: get all client/port connections, no matter what... const char **ports = ::jack_get_ports(pJackClient, nullptr, nullptr, 0); if (ports) { for (int i = 0; ports[i]; ++i) { const char *pszSrcClientPort = ports[i]; const QString sSrcClientPort = QString::fromLocal8Bit(pszSrcClientPort); const QString sSrcClient = sSrcClientPort.section(':', 0, 0); ClientItem *pClientItem; if (m_clients.contains(sSrcClient)) { pClientItem = m_clients.value(sSrcClient); } else { pClientItem = new ClientItem; pClientItem->client_name = sSrcClient; m_clients.insert(pClientItem->client_name, pClientItem); } PortItem *pPortItem = new PortItem; pPortItem->port_name = sSrcClientPort.section(':', 1); jack_port_t *pJackPort = ::jack_port_by_name(pJackClient, pszSrcClientPort); pPortItem->port_type = (::jack_port_flags(pJackPort) & JackPortIsInput); const char **connections = ::jack_port_get_all_connections(pJackClient, pJackPort); if (connections) { for (int j = 0; connections[j]; ++j) { const QString sDstClientPort = QString::fromLocal8Bit(connections[j]); ConnectItem *pConnectItem = new ConnectItem; pConnectItem->client_name = sDstClientPort.section(':', 0, 0); pConnectItem->port_name = sDstClientPort.section(':', 1); pConnectItem->connected = true; pPortItem->connects.append(pConnectItem); // pPortItem->connected++; } ::jack_free(connections); } pClientItem->ports.append(pPortItem); // pClientItem->connected += pPortItem->connected; } ::jack_free(ports); } #ifdef CONFIG_JACK_SESSION // Second pass: get all session client commands... jack_session_event_type_t etype = JackSessionSave; switch (stype) { case SaveType::Save: default: break; case SaveType::SaveAndQuit: etype = JackSessionSaveAndQuit; break; case SaveType::SaveTemplate: etype = JackSessionSaveTemplate; break; } const QByteArray aSessionPath = sSessionPath.toLocal8Bit(); const char *pszSessionPath = aSessionPath.constData(); jack_session_command_t *commands = ::jack_session_notify(pJackClient, nullptr, etype, pszSessionPath); if (commands == nullptr) return false; // Second pass... for (int k = 0; commands[k].uuid; ++k) { jack_session_command_t *pCommand = &commands[k]; const QString sClientName = QString::fromLocal8Bit(pCommand->client_name); ClientItem *pClientItem; if (m_clients.contains(sClientName)) { pClientItem = m_clients.value(sClientName); } else { pClientItem = new ClientItem; pClientItem->client_name = sClientName; m_clients.insert(pClientItem->client_name, pClientItem); } pClientItem->client_uuid = QString::fromLocal8Bit(pCommand->uuid); pClientItem->client_command = QString::fromLocal8Bit(pCommand->command); } ::jack_session_commands_free(commands); #endif // CONFIG_JACK_SESSION // Third pass: check whether there are registered infra-clients... ClientList::ConstIterator iter = m_clients.constBegin(); const ClientList::ConstIterator& iter_end = m_clients.constEnd(); for ( ; iter != iter_end; ++iter) { ClientItem *pClientItem = iter.value(); if (pClientItem->client_command.isEmpty()) { const QString& sClientName = pClientItem->client_name; if (sClientName == "system") continue; InfraClientItem *pInfraClientItem = m_infra_clients.value(sClientName, nullptr); if (pInfraClientItem) { pClientItem->client_command = pInfraClientItem->client_command; } else { pInfraClientItem = new InfraClientItem; pInfraClientItem->client_name = sClientName; pInfraClientItem->client_command = pClientItem->client_command; m_infra_clients.insert(sClientName, pInfraClientItem); } } } // Finally: save to file, immediate... return saveFile(sSessionPath + "session.xml"); } bool qjackctlSession::load ( const QString& sSessionDir ) { // Load from file, immediate... const QString sSessionPath = sSessionDir + '/'; if (!loadFile(sSessionPath + "session.xml")) return false; // Start/load clients... ClientList::ConstIterator iter = m_clients.constBegin(); const ClientList::ConstIterator& iter_end = m_clients.constEnd(); for ( ; iter != iter_end; ++iter) { const ClientItem *pClientItem = iter.value(); const QString& sClientName = pClientItem->client_name; QString sCommand = pClientItem->client_command; if (sCommand.isEmpty()) { // Maybe a registered infra-client command... InfraClientItem *pInfraClientItem = m_infra_clients.value(sClientName, nullptr); if (pInfraClientItem && !isJackClient(sClientName)) sCommand = pInfraClientItem->client_command; } else if (!pClientItem->client_uuid.isEmpty()){ // Sure a legit session-client command... const QString& sClientDir = sSessionPath + pClientItem->client_name + '/'; sCommand.replace("${SESSION_DIR}", sClientDir); } // Launch command and wait a litle bit before continue... if (!sCommand.isEmpty()) { QStringList cmd_args = sCommand.split(' '); sCommand = cmd_args.at(0); cmd_args.removeAt(0); if (QProcess::startDetached(sCommand, cmd_args)) { QElapsedTimer timer; timer.start(); while (timer.elapsed() < 200) QApplication::processEvents(); } } } // Initial reconnection. update(); // Formerly successful. return true; } #ifdef CONFIG_JACK_SESSION #if defined(Q_CC_GNU) || defined(Q_CC_MINGW) #pragma GCC diagnostic pop #endif #endif // Update (re)connections utility method. bool qjackctlSession::update (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == nullptr) return false; // We'll count how many connection updates... int iUpdate = 0; // Now, make the saved connections... ClientList::ConstIterator iter = m_clients.constBegin(); const ClientList::ConstIterator& iter_end = m_clients.constEnd(); for ( ; iter != iter_end; ++iter) { ClientItem *pClientItem = iter.value(); if (pClientItem->connected < 1) continue; QString sSrcClient = pClientItem->client_name; #ifdef CONFIG_JACK_SESSION if (!pClientItem->client_uuid.isEmpty()) { const QByteArray aSrcUuid = pClientItem->client_uuid.toLocal8Bit(); const char *pszSrcUuid = aSrcUuid.constData(); const char *pszSrcClient = ::jack_get_client_name_by_uuid(pJackClient, pszSrcUuid); if (pszSrcClient) { sSrcClient = QString::fromLocal8Bit(pszSrcClient); ::jack_free((void *) pszSrcClient); } } #endif QListIterator iterPort(pClientItem->ports); while (iterPort.hasNext()) { PortItem *pPortItem = iterPort.next(); if (pPortItem->connected < 1) continue; const QString sSrcPort = pPortItem->port_name; const QString sSrcClientPort = sSrcClient + ':' + sSrcPort; const QByteArray aSrcClientPort = sSrcClientPort.toLocal8Bit(); QListIterator iterConnect(pPortItem->connects); while (iterConnect.hasNext()) { ConnectItem *pConnectItem = iterConnect.next(); if (pConnectItem->connected) continue; QString sDstClient = pConnectItem->client_name; #ifdef CONFIG_JACK_SESSION if (m_clients.contains(sDstClient)) { const QString sDstUuid = m_clients.value(sDstClient)->client_uuid; const QByteArray aDstUuid = sDstUuid.toLocal8Bit(); const char *pszDstUuid = aDstUuid.constData(); const char *pszDstClient = ::jack_get_client_name_by_uuid(pJackClient, pszDstUuid); if (pszDstClient) { sDstClient = QString::fromLocal8Bit(pszDstClient); ::jack_free((void *) pszDstClient); } } #endif const QString sDstPort = pConnectItem->port_name; const QString sDstClientPort = sDstClient + ':' + sDstPort; const QByteArray aDstClientPort = sDstClientPort.toLocal8Bit(); int retc; if (pPortItem->port_type) { // Input port... retc = ::jack_connect(pJackClient, aDstClientPort.constData(), aSrcClientPort.constData()); #ifdef CONFIG_DEBUG qDebug("qjackctlSession::update() " "jack_connect: \"%s\" => \"%s\" (%d)", aDstClientPort.constData(), aSrcClientPort.constData(), retc); #endif } else { // Output port... retc = ::jack_connect(pJackClient, aSrcClientPort.constData(), aDstClientPort.constData()); #ifdef CONFIG_DEBUG qDebug("qjackctlSession::update() " "jack_connect: \"%s\" => \"%s\" (%d)", aSrcClientPort.constData(), aDstClientPort.constData(), retc); #endif } // Comply with connection result... if (retc == 0 || retc == EEXIST) { pConnectItem->connected = true; pPortItem->connected--; pClientItem->connected--; iUpdate++; } } } } // Report back. return (iUpdate > 0); } // Specific session file load (read) method. bool qjackctlSession::loadFile ( const QString& sFilename ) { // Open file... QFile file(sFilename); if (!file.open(QIODevice::ReadOnly)) return false; // Parse it a-la-DOM :-) QDomDocument doc("qjackctlSession"); if (!doc.setContent(&file)) { file.close(); return false; } file.close(); // Now, we're always best to // reset old session settings. clear(); // Get root element. QDomElement eDoc = doc.documentElement(); // Parse for clients... for (QDomNode nClient = eDoc.firstChild(); !nClient.isNull(); nClient = nClient.nextSibling()) { // Client element... QDomElement eClient = nClient.toElement(); if (eClient.isNull()) continue; if (eClient.tagName() != "client") continue; ClientItem *pClientItem = new ClientItem; pClientItem->client_name = eClient.attribute("name"); pClientItem->client_uuid = eClient.attribute("uuid"); // Client properties... for (QDomNode nChild = eClient.firstChild(); !nChild.isNull(); nChild = nChild.nextSibling()) { // Client child element... QDomElement eChild = nChild.toElement(); if (eChild.isNull()) continue; if (eChild.tagName() == "command") pClientItem->client_command = eChild.text(); else if (eChild.tagName() == "port") { // Port properties... PortItem *pPortItem = new PortItem; pPortItem->port_name = eChild.attribute("name"); pPortItem->port_type = (eChild.attribute("type") == "in"); // Connection child element... for (QDomNode nConnect = eChild.firstChild(); !nConnect.isNull(); nConnect = nConnect.nextSibling()) { QDomElement eConnect = nConnect.toElement(); if (eConnect.isNull()) continue; if (eConnect.tagName() != "connect") continue; ConnectItem *pConnectItem = new ConnectItem; pConnectItem->client_name = eConnect.attribute("client"); pConnectItem->port_name = eConnect.attribute("port"); pConnectItem->connected = false; pPortItem->connects.append(pConnectItem); pPortItem->connected++; } pClientItem->ports.append(pPortItem); pClientItem->connected += pPortItem->connected; } } m_clients.insert(pClientItem->client_name, pClientItem); } return true; } // Specific session file save (write) method. bool qjackctlSession::saveFile ( const QString& sFilename ) { QFileInfo fi(sFilename); QDomDocument doc("qjackctlSession"); QDomElement eSession = doc.createElement("session"); eSession.setAttribute("name", QFileInfo(fi.absolutePath()).baseName()); doc.appendChild(eSession); // Save clients spec... ClientList::ConstIterator iter = m_clients.constBegin(); const ClientList::ConstIterator& iter_end = m_clients.constEnd(); for ( ; iter != iter_end; ++iter) { const ClientItem *pClientItem = iter.value(); QDomElement eClient = doc.createElement("client"); eClient.setAttribute("name", pClientItem->client_name); if (!pClientItem->client_uuid.isEmpty()) eClient.setAttribute("uuid", pClientItem->client_uuid); if (!pClientItem->client_command.isEmpty()) { QDomElement eCommand = doc.createElement("command"); eCommand.appendChild(doc.createTextNode(pClientItem->client_command)); eClient.appendChild(eCommand); } QListIterator iterPort(pClientItem->ports); while (iterPort.hasNext()) { const PortItem *pPortItem = iterPort.next(); QDomElement ePort = doc.createElement("port"); ePort.setAttribute("name", pPortItem->port_name); ePort.setAttribute("type", pPortItem->port_type ? "in" : "out"); QListIterator iterConnect(pPortItem->connects); while (iterConnect.hasNext()) { const ConnectItem *pConnectItem = iterConnect.next(); QDomElement eConnect = doc.createElement("connect"); eConnect.setAttribute("client", pConnectItem->client_name); eConnect.setAttribute("port", pConnectItem->port_name); ePort.appendChild(eConnect); } eClient.appendChild(ePort); } eSession.appendChild(eClient); } // Finally, save to external file. QFile file(sFilename); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return false; QTextStream ts(&file); ts << doc.toString() << endl; file.close(); return true; } // Infra-client list accessor (read-only) qjackctlSession::InfraClientList& qjackctlSession::infra_clients (void) { return m_infra_clients; } // Load all infra-clients from configuration file. void qjackctlSession::loadInfraClients ( QSettings& settings ) { clearInfraClients(); settings.beginGroup("/InfraClients"); const QStringList& keys = settings.childKeys(); QStringListIterator iter(keys); while (iter.hasNext()) { const QString& sKey = iter.next(); const QString& sValue = settings.value(sKey).toString(); if (!sValue.isEmpty()) { InfraClientItem *pInfraClientItem = new InfraClientItem; pInfraClientItem->client_name = sKey; pInfraClientItem->client_command = sValue; m_infra_clients.insert(sKey, pInfraClientItem); } } settings.endGroup(); } // Save all infra-clients to configuration file. void qjackctlSession::saveInfraClients ( QSettings& settings ) { settings.beginGroup("/InfraClients"); settings.remove(QString()); // Remove all current keys. InfraClientList::ConstIterator iter = m_infra_clients.constBegin(); const InfraClientList::ConstIterator& iter_end = m_infra_clients.constEnd(); for ( ; iter != iter_end; ++iter) { const QString& sKey = iter.key(); const QString& sValue = iter.value()->client_command; if (!sValue.isEmpty()) settings.setValue(sKey, sValue); } settings.endGroup(); } // Clear infra-client table. void qjackctlSession::clearInfraClients (void) { qDeleteAll(m_infra_clients); m_infra_clients.clear(); } // Check whether a given JACK client name exists... bool qjackctlSession::isJackClient ( const QString& sClientName ) const { const QByteArray aClientName = sClientName.toUtf8(); #ifdef CONFIG_JACK_SESSION qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == nullptr) return false; const char *client_uuid = ::jack_get_uuid_for_client_name( pJackClient, aClientName.constData()); if (client_uuid) { ::jack_free((void *) client_uuid); return true; } return false; #endif jack_client_t *pIsJackClient = ::jack_client_open(aClientName.constData(), jack_options_t(JackNoStartServer | JackUseExactName), nullptr); if (pIsJackClient) { ::jack_client_close(pIsJackClient); return true; } return false; } // end of qjackctlSession.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlSessionSaveForm.cpp0000644000000000000000000000013215174607203020473 xustar0030 mtime=1777536643.515914291 30 atime=1777536643.515914291 30 ctime=1777536643.515914291 qjackctl-1.0.6/src/qjackctlSessionSaveForm.cpp0000644000175000001440000001571015174607203020467 0ustar00rncbcusers// qjackctlSessionSaveForm.cpp // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlSessionSaveForm.h" #include "qjackctlAbout.h" #include "qjackctlSetup.h" #include #include #include #include #include //---------------------------------------------------------------------------- // qjackctlSessionSaveForm -- UI wrapper form. // Constructor. qjackctlSessionSaveForm::qjackctlSessionSaveForm ( QWidget *pParent, const QString& sTitle, const QStringList& sessionDirs ) : QDialog(pParent) { // Setup UI struct... m_ui.setupUi(this); // Setup UI entities... QDialog::setWindowTitle(sTitle); m_ui.SessionNameLineEdit->setValidator( new QRegularExpressionValidator( QRegularExpression("[^/]+"), m_ui.SessionNameLineEdit)); #if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0) m_ui.SessionDirComboBox->lineEdit()->setClearButtonEnabled(true); #endif if (!sessionDirs.isEmpty()) { m_ui.SessionDirComboBox->addItems(sessionDirs); const QFileInfo fi(sessionDirs.first()); m_sSessionDir = fi.absoluteFilePath(); if (m_sSessionDir != QDir::homePath()) m_ui.SessionNameLineEdit->setText(fi.fileName()); } if (m_sSessionDir.isEmpty()) m_sSessionDir = QDir::homePath(); m_ui.SessionDirComboBox->setEditText(m_sSessionDir); adjustSize(); // UI signal/slot connections... QObject::connect(m_ui.SessionNameLineEdit, SIGNAL(textChanged(const QString&)), SLOT(changeSessionName(const QString&))); QObject::connect(m_ui.SessionDirComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(changeSessionDir(const QString&))); QObject::connect(m_ui.SessionDirToolButton, SIGNAL(clicked()), SLOT(browseSessionDir())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(accepted()), SLOT(accept())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(rejected()), SLOT(reject())); // Done. stabilizeForm(); } // Destructor. qjackctlSessionSaveForm::~qjackctlSessionSaveForm (void) { } // Retrieve the accepted session directory, if the case arises. const QString& qjackctlSessionSaveForm::sessionDir (void) const { return m_sSessionDir; } // Session directory versioning option. void qjackctlSessionSaveForm::setSessionSaveVersion ( bool bSessionSaveVersion ) { m_ui.SessionSaveVersionCheckBox->setChecked(bSessionSaveVersion); } bool qjackctlSessionSaveForm::isSessionSaveVersion (void) const { return m_ui.SessionSaveVersionCheckBox->isChecked(); } // Accept settings (OK button slot). void qjackctlSessionSaveForm::accept (void) { // Check if session directory is new... const QString& sSessionDir = m_ui.SessionDirComboBox->currentText(); if (sSessionDir.isEmpty()) return; QDir dir; while (!dir.exists(sSessionDir)) { // Ask user... if (QMessageBox::warning(this, tr("Warning"), tr("Session directory does not exist:\n\n" "\"%1\"\n\n" "Do you want to create it?").arg(sSessionDir), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel) return; // Proceed... dir.mkpath(sSessionDir); } // Save options... m_sSessionDir = sSessionDir; // Just go with dialog acceptance. QDialog::accept(); } // Reject settings (Cancel button slot). void qjackctlSessionSaveForm::reject (void) { QDialog::reject(); } // Session name in-flight change. void qjackctlSessionSaveForm::changeSessionName ( const QString& sSessionName ) { QFileInfo fi(m_ui.SessionDirComboBox->currentText()); if (fi.canonicalFilePath() == QDir::homePath()) fi.setFile(QDir(fi.absoluteFilePath()), sSessionName); else fi.setFile(QDir(fi.absolutePath()), sSessionName); const bool bBlockSignals = m_ui.SessionDirComboBox->blockSignals(true); m_ui.SessionDirComboBox->setEditText(fi.absoluteFilePath()); m_ui.SessionDirComboBox->blockSignals(bBlockSignals); stabilizeForm(); } // Session directory in-flight change. void qjackctlSessionSaveForm::changeSessionDir ( const QString& sSessionDir ) { if (sSessionDir.isEmpty()) { m_ui.SessionDirComboBox->setEditText(m_sSessionDir); } else { QString sSessionName; const QFileInfo fi(sSessionDir); if (fi.canonicalFilePath() != QDir::homePath()) sSessionName = fi.fileName(); const bool bBlockSignals = m_ui.SessionNameLineEdit->blockSignals(true); m_ui.SessionNameLineEdit->setText(sSessionName); m_ui.SessionNameLineEdit->blockSignals(bBlockSignals); } stabilizeForm(); } // Browse for session directory. void qjackctlSessionSaveForm::browseSessionDir (void) { const QString& sTitle = tr("Session Directory"); QString sSessionDir = m_ui.SessionDirComboBox->currentText(); #if 0//QT_VERSION < QT_VERSION_CHECK(4, 4, 0) // Construct open-directory dialog... QFileDialog fileDialog(pParentWidget, sTitle, sSessionDir); // Set proper open-file modes... fileDialog.setAcceptMode(QFileDialog::AcceptOpen); fileDialog.setFileMode(QFileDialog::DirectoryOnly); // Stuff sidebar... QList urls(fileDialog.sidebarUrls()); urls.append(QUrl::fromLocalFile(sSessionDir); fileDialog.setSidebarUrls(urls); fileDialog.setOptions(options); // Show dialog... if (!fileDialog.exec()) return; sSessionDir = fileDialog.selectedFiles().first(); #else sSessionDir = QFileDialog::getExistingDirectory(this, sTitle, sSessionDir); #endif if (sSessionDir.isEmpty()) return; changeSessionDir(sSessionDir); const bool bBlockSignals = m_ui.SessionDirComboBox->blockSignals(true); m_ui.SessionDirComboBox->setEditText(sSessionDir); m_ui.SessionDirComboBox->blockSignals(bBlockSignals); m_ui.SessionDirComboBox->setFocus(); stabilizeForm(); } // Stabilize current form state. void qjackctlSessionSaveForm::stabilizeForm (void) { const QString& sSessionDir = m_ui.SessionDirComboBox->currentText(); bool bValid = !m_ui.SessionNameLineEdit->text().isEmpty(); bValid = bValid && !sSessionDir.isEmpty(); if (bValid) { QFileInfo fi(sSessionDir); bValid = bValid && (fi.canonicalFilePath() != QDir::homePath()); while (bValid && !fi.exists()) fi.setFile(fi.path()); bValid = bValid && fi.isDir() && fi.isReadable() && fi.isWritable(); } m_ui.DialogButtonBox->button(QDialogButtonBox::Ok)->setEnabled(bValid); } // end of qjackctlSessionSaveForm.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctl.qrc0000644000000000000000000000013215174607203015467 xustar0030 mtime=1777536643.509768862 30 atime=1777536643.509768862 30 ctime=1777536643.509768862 qjackctl-1.0.6/src/qjackctl.qrc0000644000175000001440000001047215174607203015463 0ustar00rncbcusers images/qjackctl.png images/qjackctl.svg images/about1.png images/accept1.png images/aclienti.png images/aclienti_32x32.png images/aclienti_64x64.png images/acliento.png images/acliento_32x32.png images/acliento_64x64.png images/add1.png images/aportlni.png images/aportlni_32x32.png images/aportlni_64x64.png images/aportlno.png images/aportlno_32x32.png images/aportlno_64x64.png images/aportlti.png images/aportlti_32x32.png images/aportlti_64x64.png images/aportlto.png images/aportlto_32x32.png images/aportlto_64x64.png images/aportpni.png images/aportpni_32x32.png images/aportpni_64x64.png images/aportpno.png images/aportpno_32x32.png images/aportpno_64x64.png images/aportpti.png images/aportpti_32x32.png images/aportpti_64x64.png images/aportpto.png images/aportpto_32x32.png images/aportpto_64x64.png images/apply1.png images/asocketi.png images/asocketo.png images/backward1.png images/clear1.png images/client1.png images/connect1.png images/connections1.png images/copy1.png images/device1.png images/disconnect1.png images/disconnectall1.png images/displaybg1.png images/down1.png images/edit1.png images/error1.png images/expandall1.png images/forward1.png images/graph1.png images/graphAlsa.png images/graphCenter.png images/graphColors.png images/graphConnect.png images/graphDisconnect.png images/graphRename.png images/graphFind.png images/graphJack.png images/graphRedo.png images/graphUndo.png images/graphThumbview.png images/graphZoomFit.png images/graphZoomIn.png images/graphZoomOut.png images/graphZoomReset.png images/graphZoomRange.png images/graphZoomTool.png images/mclienti.png images/mclienti_32x32.png images/mclienti_64x64.png images/mcliento.png images/mcliento_32x32.png images/mcliento_64x64.png images/messages1.png images/messagesstatus1.png images/mporti.png images/mporti_32x32.png images/mporti_64x64.png images/mporto.png images/mporto_32x32.png images/mporto_64x64.png images/msocketi.png images/msocketo.png images/new1.png images/open1.png images/patchbay1.png images/pause1.png images/play1.png images/port1.png images/quit1.png images/refresh1.png images/remove1.png images/reset1.png images/rewind1.png images/save1.png images/session1.png images/setup1.png images/socket1.png images/start1.png images/status1.png images/stop1.png images/up1.png images/xactivating1.png images/xactive1.png images/xinactive1.png images/xsocket1.png images/xstarted1.png images/xstarting1.png images/xstopped1.png images/xstopping1.png images/formOpen.png images/formRemove.png images/formSave.png images/itemReset.png images/qtlogo1.png qjackctl-1.0.6/src/PaxHeaders/qjackctlStatus.h0000644000000000000000000000013215174607203016335 xustar0030 mtime=1777536643.517914276 30 atime=1777536643.517914276 30 ctime=1777536643.517914276 qjackctl-1.0.6/src/qjackctlStatus.h0000644000175000001440000000363615174607203016335 0ustar00rncbcusers// qjackctlStatus.h // /**************************************************************************** Copyright (C) 2003-2010, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlStatus_h #define __qjackctlStatus_h // List view statistics item indexes #define STATUS_SERVER_NAME 0 #define STATUS_SERVER_STATE 1 #define STATUS_DSP_LOAD 2 #define STATUS_SAMPLE_RATE 3 #define STATUS_BUFFER_SIZE 4 #define STATUS_REALTIME 5 #define STATUS_TRANSPORT_STATE 6 #define STATUS_TRANSPORT_TIME 7 #define STATUS_TRANSPORT_BBT 8 #define STATUS_TRANSPORT_BPM 9 #define STATUS_XRUN_COUNT 10 #define STATUS_XRUN_TIME 11 #define STATUS_XRUN_LAST 12 #define STATUS_XRUN_MAX 13 #define STATUS_XRUN_MIN 14 #define STATUS_XRUN_AVG 15 #define STATUS_XRUN_TOTAL 16 #define STATUS_RESET_TIME 17 #define STATUS_MAX_DELAY 18 // (Big)Time display identifiers. #define DISPLAY_TRANSPORT_TIME 0 #define DISPLAY_TRANSPORT_BBT 1 #define DISPLAY_RESET_TIME 2 #define DISPLAY_XRUN_TIME 3 #endif // __qjackctlStatus_h // end of qjackctlStatus.h qjackctl-1.0.6/src/PaxHeaders/qjackctlPatchbay.cpp0000644000000000000000000000013215174607203017140 xustar0030 mtime=1777536643.514914298 30 atime=1777536643.513914305 30 ctime=1777536643.514914298 qjackctl-1.0.6/src/qjackctlPatchbay.cpp0000644000175000001440000015056215174607203017141 0ustar00rncbcusers// qjackctlPatchbay.cpp // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlPatchbay.h" #include "qjackctlMainForm.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) #include #include #endif // Interactivity socket form. #include "qjackctlSocketForm.h" // External patchbay loader. #include "qjackctlPatchbayFile.h" //---------------------------------------------------------------------- // class qjackctlPlugItem -- Socket plug list item. // // Constructor. qjackctlPlugItem::qjackctlPlugItem ( qjackctlSocketItem *pSocket, const QString& sPlugName, qjackctlPlugItem *pPlugAfter ) : QTreeWidgetItem(pSocket, pPlugAfter, QJACKCTL_PLUGITEM) { QTreeWidgetItem::setText(0, sPlugName); m_pSocket = pSocket; m_sPlugName = sPlugName; m_pSocket->plugs().append(this); int iPixmap; if (pSocket->socketType() == QJACKCTL_SOCKETTYPE_JACK_AUDIO) iPixmap = QJACKCTL_XPM_AUDIO_PLUG; else iPixmap = QJACKCTL_XPM_MIDI_PLUG; QTreeWidgetItem::setIcon(0, QIcon(pSocket->pixmap(iPixmap))); QTreeWidgetItem::setFlags(QTreeWidgetItem::flags() & ~Qt::ItemIsSelectable); } // Default destructor. qjackctlPlugItem::~qjackctlPlugItem (void) { const int iPlug = m_pSocket->plugs().indexOf(this); if (iPlug >= 0) m_pSocket->plugs().removeAt(iPlug); } // Instance accessors. const QString& qjackctlPlugItem::socketName (void) const { return m_pSocket->socketName(); } const QString& qjackctlPlugItem::plugName (void) const { return m_sPlugName; } // Patchbay socket item accessor. qjackctlSocketItem *qjackctlPlugItem::socket (void) const { return m_pSocket; } //---------------------------------------------------------------------- // class qjackctlSocketItem -- Jack client list item. // // Constructor. qjackctlSocketItem::qjackctlSocketItem ( qjackctlSocketList *pSocketList, const QString& sSocketName, const QString& sClientName, int iSocketType, qjackctlSocketItem *pSocketAfter ) : QTreeWidgetItem(pSocketList->listView(), pSocketAfter, QJACKCTL_SOCKETITEM) { QTreeWidgetItem::setText(0, sSocketName); m_pSocketList = pSocketList; m_sSocketName = sSocketName; m_sClientName = sClientName; m_iSocketType = iSocketType; m_bExclusive = false; m_sSocketForward.clear(); m_pSocketList->sockets().append(this); updatePixmap(); } // Default destructor. qjackctlSocketItem::~qjackctlSocketItem (void) { QListIterator iter(m_connects); while (iter.hasNext()) (iter.next())->removeConnect(this); m_connects.clear(); m_plugs.clear(); const int iSocket = m_pSocketList->sockets().indexOf(this); if (iSocket >= 0) m_pSocketList->sockets().removeAt(iSocket); } // Instance accessors. const QString& qjackctlSocketItem::socketName (void) const { return m_sSocketName; } const QString& qjackctlSocketItem::clientName (void) const { return m_sClientName; } int qjackctlSocketItem::socketType (void) const { return m_iSocketType; } bool qjackctlSocketItem::isExclusive (void) const { return m_bExclusive; } const QString& qjackctlSocketItem::forward (void) const { return m_sSocketForward; } void qjackctlSocketItem::setSocketName ( const QString& sSocketName ) { m_sSocketName = sSocketName; } void qjackctlSocketItem::setClientName ( const QString& sClientName ) { m_sClientName = sClientName; } void qjackctlSocketItem::setSocketType ( int iSocketType ) { m_iSocketType = iSocketType; } void qjackctlSocketItem::setExclusive ( bool bExclusive ) { m_bExclusive = bExclusive; } void qjackctlSocketItem::setForward ( const QString& sSocketForward ) { m_sSocketForward = sSocketForward; } // Socket flags accessor. bool qjackctlSocketItem::isReadable (void) const { return m_pSocketList->isReadable(); } // Plug finder. qjackctlPlugItem *qjackctlSocketItem::findPlug ( const QString& sPlugName ) { QListIterator iter(m_plugs); while (iter.hasNext()) { qjackctlPlugItem *pPlug = iter.next(); if (sPlugName == pPlug->plugName()) return pPlug; } return nullptr; } // Plug list accessor. QList& qjackctlSocketItem::plugs (void) { return m_plugs; } // Connected socket list primitives. void qjackctlSocketItem::addConnect( qjackctlSocketItem *pSocket ) { m_connects.append(pSocket); } void qjackctlSocketItem::removeConnect( qjackctlSocketItem *pSocket ) { int iSocket = m_connects.indexOf(pSocket); if (iSocket >= 0) m_connects.removeAt(iSocket); } // Connected socket finder. qjackctlSocketItem *qjackctlSocketItem::findConnectPtr ( qjackctlSocketItem *pSocketPtr ) { QListIterator iter(m_connects); while (iter.hasNext()) { qjackctlSocketItem *pSocket = iter.next(); if (pSocketPtr == pSocket) return pSocket; } return nullptr; } // Connection cache list accessor. const QList& qjackctlSocketItem::connects (void) const { return m_connects; } // Plug list cleaner. void qjackctlSocketItem::clear (void) { qDeleteAll(m_plugs); m_plugs.clear(); } // Socket item pixmap peeker. const QPixmap& qjackctlSocketItem::pixmap ( int iPixmap ) const { return m_pSocketList->pixmap(iPixmap); } // Update pixmap to its proper context. void qjackctlSocketItem::updatePixmap (void) { int iPixmap; if (m_iSocketType == QJACKCTL_SOCKETTYPE_JACK_AUDIO) { iPixmap = (m_bExclusive ? QJACKCTL_XPM_AUDIO_SOCKET_X : QJACKCTL_XPM_AUDIO_SOCKET); } else { iPixmap = (m_bExclusive ? QJACKCTL_XPM_MIDI_SOCKET_X : QJACKCTL_XPM_MIDI_SOCKET); } QTreeWidgetItem::setIcon(0, QIcon(pixmap(iPixmap))); } // Socket item openness status. void qjackctlSocketItem::setOpen ( bool bOpen ) { QTreeWidgetItem::setExpanded(bOpen); } bool qjackctlSocketItem::isOpen (void) const { return QTreeWidgetItem::isExpanded(); } //---------------------------------------------------------------------- // qjackctlSocketList -- Jack client list. // // Constructor. qjackctlSocketList::qjackctlSocketList ( qjackctlSocketListView *pListView, bool bReadable ) { QPixmap pmXSocket1(":/images/xsocket1.png"); m_pListView = pListView; m_bReadable = bReadable; if (bReadable) { m_sSocketCaption = tr("Output"); m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET] = new QPixmap(":/images/asocketo.png"); m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET_X] = createPixmapMerge(*m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET], pmXSocket1); m_apPixmaps[QJACKCTL_XPM_AUDIO_CLIENT] = new QPixmap(":/images/acliento.png"); m_apPixmaps[QJACKCTL_XPM_AUDIO_PLUG] = new QPixmap(":/images/aportlno.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET] = new QPixmap(":/images/msocketo.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X] = createPixmapMerge(*m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET], pmXSocket1); m_apPixmaps[QJACKCTL_XPM_MIDI_CLIENT] = new QPixmap(":/images/mcliento.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_PLUG] = new QPixmap(":/images/mporto.png"); } else { m_sSocketCaption = tr("Input"); m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET] = new QPixmap(":/images/asocketi.png"); m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET_X] = createPixmapMerge(*m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET], pmXSocket1); m_apPixmaps[QJACKCTL_XPM_AUDIO_CLIENT] = new QPixmap(":/images/aclienti.png"); m_apPixmaps[QJACKCTL_XPM_AUDIO_PLUG] = new QPixmap(":/images/aportlni.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET] = new QPixmap(":/images/msocketi.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X] = createPixmapMerge(*m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET], pmXSocket1); m_apPixmaps[QJACKCTL_XPM_MIDI_CLIENT] = new QPixmap(":/images/mclienti.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_PLUG] = new QPixmap(":/images/mporti.png"); } if (!m_sSocketCaption.isEmpty()) m_sSocketCaption += ' '; m_sSocketCaption += tr("Socket"); } // Default destructor. qjackctlSocketList::~qjackctlSocketList (void) { clear(); for (int iPixmap = 0; iPixmap < QJACKCTL_XPM_PIXMAPS; iPixmap++) delete m_apPixmaps[iPixmap]; } // Client finder. qjackctlSocketItem *qjackctlSocketList::findSocket ( const QString& sSocketName, int iSocketType ) { QListIterator iter(m_sockets); while (iter.hasNext()) { qjackctlSocketItem *pSocket = iter.next(); if (sSocketName == pSocket->socketName() && iSocketType == pSocket->socketType()) return pSocket; } return nullptr; } // Socket list accessor. QList& qjackctlSocketList::sockets (void) { return m_sockets; } // List view accessor. qjackctlSocketListView *qjackctlSocketList::listView (void) const { return m_pListView; } // Socket flags accessor. bool qjackctlSocketList::isReadable (void) const { return m_bReadable; } // Socket caption titler. const QString& qjackctlSocketList::socketCaption (void) const { return m_sSocketCaption; } // Socket list cleaner. void qjackctlSocketList::clear (void) { qDeleteAll(m_sockets); m_sockets.clear(); } // Socket list pixmap peeker. const QPixmap& qjackctlSocketList::pixmap ( int iPixmap ) const { return *m_apPixmaps[iPixmap]; } // Merge two pixmaps with union of respective masks. QPixmap *qjackctlSocketList::createPixmapMerge ( const QPixmap& xpmDst, const QPixmap& xpmSrc ) { QPixmap *pXpmMerge = new QPixmap(xpmDst); if (pXpmMerge) { QBitmap bmMask = xpmDst.mask(); QPainter(&bmMask).drawPixmap(0, 0, xpmSrc.mask()); pXpmMerge->setMask(bmMask); QPainter(pXpmMerge).drawPixmap(0, 0, xpmSrc); } return pXpmMerge; } // Return currently selected socket item. qjackctlSocketItem *qjackctlSocketList::selectedSocketItem (void) const { qjackctlSocketItem *pSocketItem = nullptr; QTreeWidgetItem *pItem = m_pListView->currentItem(); if (pItem) { if (pItem->type() == QJACKCTL_PLUGITEM) { pSocketItem = static_cast (pItem->parent()); } else { pSocketItem = static_cast (pItem); } } return pSocketItem; } // Add a new socket item, using interactive form. bool qjackctlSocketList::addSocketItem (void) { bool bResult = false; qjackctlSocketForm socketForm(m_pListView); socketForm.setWindowTitle(tr(" - %1").arg(m_sSocketCaption)); socketForm.setSocketCaption(m_sSocketCaption); socketForm.setPixmaps(m_apPixmaps); socketForm.setSocketList(this); socketForm.setSocketNew(true); qjackctlPatchbaySocket socket(m_sSocketCaption + ' ' + QString::number(m_sockets.count() + 1), QString(), QJACKCTL_SOCKETTYPE_JACK_AUDIO); socketForm.load(&socket); if (socketForm.exec()) { socketForm.save(&socket); qjackctlSocketItem *pSocketItem = selectedSocketItem(); // m_pListView->setUpdatesEnabled(false); if (pSocketItem) pSocketItem->setSelected(false); pSocketItem = new qjackctlSocketItem(this, socket.name(), socket.clientName(), socket.type(), pSocketItem); if (pSocketItem) { pSocketItem->setExclusive(socket.isExclusive()); pSocketItem->setForward(socket.forward()); qjackctlPlugItem *pPlugItem = nullptr; QStringListIterator iter(socket.pluglist()); while (iter.hasNext()) { pPlugItem = new qjackctlPlugItem( pSocketItem, iter.next(), pPlugItem); } bResult = true; } pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->update(); m_pListView->setDirty(true); } return bResult; } // Remove (delete) currently selected socket item. bool qjackctlSocketList::removeSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { if (QMessageBox::warning(m_pListView, tr("Warning") + " - " QJACKCTL_TITLE, tr("%1 about to be removed:\n\n" "\"%2\"\n\nAre you sure?") .arg(m_sSocketCaption) .arg(pSocketItem->socketName()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { delete pSocketItem; bResult = true; m_pListView->setDirty(true); } } return bResult; } // View or change the properties of currently selected socket item. bool qjackctlSocketList::editSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { qjackctlSocketForm socketForm(m_pListView); socketForm.setWindowTitle(pSocketItem->socketName() + " - " + m_sSocketCaption); socketForm.setSocketCaption(m_sSocketCaption); socketForm.setPixmaps(m_apPixmaps); socketForm.setSocketList(this); socketForm.setSocketNew(false); qjackctlPatchbaySocket socket(pSocketItem->socketName(), pSocketItem->clientName(), pSocketItem->socketType()); socket.setExclusive(pSocketItem->isExclusive()); socket.setForward(pSocketItem->forward()); QListIterator iter(pSocketItem->plugs()); while (iter.hasNext()) socket.pluglist().append((iter.next())->plugName()); socketForm.load(&socket); socketForm.setConnectCount(pSocketItem->connects().count()); if (socketForm.exec()) { socketForm.save(&socket); // m_pListView->setUpdatesEnabled(false); pSocketItem->clear(); pSocketItem->setText(0, socket.name()); pSocketItem->setSocketName(socket.name()); pSocketItem->setClientName(socket.clientName()); pSocketItem->setSocketType(socket.type()); pSocketItem->setExclusive(socket.isExclusive()); pSocketItem->setForward(socket.forward()); pSocketItem->updatePixmap(); qjackctlPlugItem *pPlugItem = nullptr; QStringListIterator iter(socket.pluglist()); while (iter.hasNext()) { pPlugItem = new qjackctlPlugItem( pSocketItem, iter.next(), pPlugItem); } pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->triggerUpdate(); m_pListView->setDirty(true); bResult = true; } } return bResult; } // Duplicate and change the properties of currently selected socket item. bool qjackctlSocketList::copySocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { qjackctlSocketForm socketForm(m_pListView); // Find a new distinguishable socket name, please. int iSocketNo = 1; QString sSocketName = pSocketItem->socketName();; QString sSocketMask = sSocketName; sSocketMask.remove(QRegularExpression("[ |0-9]+$")).append(" %1"); const int iSocketType = pSocketItem->socketType(); do { sSocketName = sSocketMask.arg(++iSocketNo); } while (findSocket(sSocketName, iSocketType)); // Show up as a new socket... socketForm.setWindowTitle(tr("%1 - %2") .arg(pSocketItem->socketName()).arg(m_sSocketCaption)); socketForm.setSocketCaption(m_sSocketCaption); socketForm.setPixmaps(m_apPixmaps); socketForm.setSocketList(this); socketForm.setSocketNew(true); qjackctlPatchbaySocket socket(sSocketName, pSocketItem->clientName(), iSocketType); if (pSocketItem->isExclusive()) socket.setExclusive(true); QListIterator iter(pSocketItem->plugs()); while (iter.hasNext()) socket.pluglist().append((iter.next())->plugName()); socketForm.load(&socket); if (socketForm.exec()) { socketForm.save(&socket); pSocketItem = new qjackctlSocketItem(this, socket.name(), socket.clientName(), socket.type(), pSocketItem); if (pSocketItem) { pSocketItem->setExclusive(socket.isExclusive()); pSocketItem->setForward(socket.forward()); qjackctlPlugItem *pPlugItem = nullptr; QStringListIterator iter(socket.pluglist()); while (iter.hasNext()) { pPlugItem = new qjackctlPlugItem( pSocketItem, iter.next(), pPlugItem); } bResult = true; } pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->triggerUpdate(); m_pListView->setDirty(true); } } return bResult; } // Toggle exclusive currently selected socket item. bool qjackctlSocketList::exclusiveSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { pSocketItem->setExclusive(!pSocketItem->isExclusive()); pSocketItem->updatePixmap(); bResult = true; m_pListView->setDirty(true); } return bResult; } // Move current selected socket item up one position. bool qjackctlSocketList::moveUpSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { const int iItem = m_pListView->indexOfTopLevelItem(pSocketItem); if (iItem > 0) { QTreeWidgetItem *pItem = m_pListView->takeTopLevelItem(iItem); if (pItem) { m_pListView->insertTopLevelItem(iItem - 1, pItem); pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->update(); m_pListView->setDirty(true); bResult = true; } } } return bResult; } // Move current selected socket item down one position. bool qjackctlSocketList::moveDownSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { const int iItem = m_pListView->indexOfTopLevelItem(pSocketItem); const int iItemCount = m_pListView->topLevelItemCount(); if (iItem < iItemCount - 1) { QTreeWidgetItem *pItem = m_pListView->takeTopLevelItem(iItem); if (pItem) { m_pListView->insertTopLevelItem(iItem + 1, pItem); pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->update(); m_pListView->setDirty(true); bResult = true; } } } return bResult; } //---------------------------------------------------------------------------- // qjackctlSocketListView -- Socket list view, supporting drag-n-drop. // Constructor. qjackctlSocketListView::qjackctlSocketListView ( qjackctlPatchbayView *pPatchbayView, bool bReadable ) : QTreeWidget(pPatchbayView) { m_pPatchbayView = pPatchbayView; m_bReadable = bReadable; m_pAutoOpenTimer = 0; m_iAutoOpenTimeout = 0; m_pDragItem = nullptr; m_pDropItem = nullptr; QHeaderView *pHeader = QTreeWidget::header(); // pHeader->setDefaultAlignment(Qt::AlignLeft); // pHeader->setDefaultSectionSize(120); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) // pHeader->setSectionResizeMode(QHeaderView::Custom); pHeader->setSectionsMovable(false); pHeader->setSectionsClickable(true); #else // pHeader->setResizeMode(QHeaderView::Custom); pHeader->setMovable(false); pHeader->setClickable(true); #endif // pHeader->setSortIndicatorShown(true); pHeader->setStretchLastSection(true); QTreeWidget::setRootIsDecorated(true); QTreeWidget::setUniformRowHeights(true); // QTreeWidget::setDragEnabled(true); QTreeWidget::setAcceptDrops(true); QTreeWidget::setDropIndicatorShown(true); QTreeWidget::setAutoScroll(true); QTreeWidget::setSelectionMode(QAbstractItemView::SingleSelection); QTreeWidget::setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); QTreeWidget::setSortingEnabled(false); QTreeWidget::setMinimumWidth(120); QTreeWidget::setColumnCount(1); // Trap for help/tool-tips events. QTreeWidget::viewport()->installEventFilter(this); QString sText; if (m_bReadable) sText = tr("Output Sockets / Plugs"); else sText = tr("Input Sockets / Plugs"); QTreeWidget::headerItem()->setText(0, sText); QTreeWidget::setToolTip(sText); setAutoOpenTimeout(800); } // Default destructor. qjackctlSocketListView::~qjackctlSocketListView (void) { setAutoOpenTimeout(0); } // Patchbay view dirty flag accessors. void qjackctlSocketListView::setDirty ( bool bDirty ) { m_pPatchbayView->setDirty(bDirty); } bool qjackctlSocketListView::dirty (void) const { return m_pPatchbayView->dirty(); } // Auto-open timeout method. void qjackctlSocketListView::setAutoOpenTimeout ( int iAutoOpenTimeout ) { m_iAutoOpenTimeout = iAutoOpenTimeout; if (m_pAutoOpenTimer) delete m_pAutoOpenTimer; m_pAutoOpenTimer = nullptr; if (m_iAutoOpenTimeout > 0) { m_pAutoOpenTimer = new QTimer(this); QObject::connect(m_pAutoOpenTimer, SIGNAL(timeout()), SLOT(timeoutSlot())); } } // Auto-open timeout accessor. int qjackctlSocketListView::autoOpenTimeout (void) const { return m_iAutoOpenTimeout; } // Auto-open timer slot. void qjackctlSocketListView::timeoutSlot (void) { if (m_pAutoOpenTimer) { m_pAutoOpenTimer->stop(); if (m_pDropItem && m_pDropItem->type() == QJACKCTL_SOCKETITEM) { qjackctlSocketItem *pSocketItem = static_cast (m_pDropItem); if (pSocketItem && !pSocketItem->isOpen()) pSocketItem->setOpen(true); } } } // Trap for help/tool-tip events. bool qjackctlSocketListView::eventFilter ( QObject *pObject, QEvent *pEvent ) { QWidget *pViewport = QTreeWidget::viewport(); if (static_cast (pObject) == pViewport && pEvent->type() == QEvent::ToolTip) { QHelpEvent *pHelpEvent = static_cast (pEvent); if (pHelpEvent) { QTreeWidgetItem *pItem = QTreeWidget::itemAt(pHelpEvent->pos()); if (pItem && pItem->type() == QJACKCTL_SOCKETITEM) { qjackctlSocketItem *pSocketItem = static_cast (pItem); if (pSocketItem) { QToolTip::showText(pHelpEvent->globalPos(), pSocketItem->clientName(), pViewport); return true; } } else if (pItem && pItem->type() == QJACKCTL_PLUGITEM) { qjackctlPlugItem *pPlugItem = static_cast (pItem); if (pPlugItem) { QToolTip::showText(pHelpEvent->globalPos(), pPlugItem->plugName(), pViewport); return true; } } } } // Not handled here. return QTreeWidget::eventFilter(pObject, pEvent); } // Drag-n-drop stuff. QTreeWidgetItem *qjackctlSocketListView::dragDropItem ( const QPoint& pos ) { QTreeWidgetItem *pItem = QTreeWidget::itemAt(pos); if (pItem) { if (m_pDropItem != pItem) { QTreeWidget::setCurrentItem(pItem); m_pDropItem = pItem; if (m_pAutoOpenTimer) m_pAutoOpenTimer->start(m_iAutoOpenTimeout); qjackctlPatchbay *pPatchbay = m_pPatchbayView->binding(); if ((pItem->flags() & Qt::ItemIsDropEnabled) == 0 || pPatchbay == nullptr || !pPatchbay->canConnectSelected()) pItem = nullptr; } } else { m_pDropItem = nullptr; if (m_pAutoOpenTimer) m_pAutoOpenTimer->stop(); } return pItem; } void qjackctlSocketListView::dragEnterEvent ( QDragEnterEvent *pDragEnterEvent ) { if (pDragEnterEvent->source() != this && pDragEnterEvent->mimeData()->hasText() && #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) dragDropItem(pDragEnterEvent->position().toPoint())) { #else dragDropItem(pDragEnterEvent->pos())) { #endif pDragEnterEvent->accept(); } else { pDragEnterEvent->ignore(); } } void qjackctlSocketListView::dragMoveEvent ( QDragMoveEvent *pDragMoveEvent ) { if (pDragMoveEvent->source() != this && pDragMoveEvent->mimeData()->hasText() && #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) dragDropItem(pDragMoveEvent->position().toPoint())) { #else dragDropItem(pDragMoveEvent->pos())) { #endif pDragMoveEvent->accept(); } else { pDragMoveEvent->ignore(); } } void qjackctlSocketListView::dragLeaveEvent ( QDragLeaveEvent * ) { m_pDropItem = 0; if (m_pAutoOpenTimer) m_pAutoOpenTimer->stop(); } void qjackctlSocketListView::dropEvent ( QDropEvent *pDropEvent ) { if (pDropEvent->source() != this && pDropEvent->mimeData()->hasText() && #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) dragDropItem(pDropEvent->position().toPoint())) { #else dragDropItem(pDropEvent->pos())) { #endif const QString sText = pDropEvent->mimeData()->text(); qjackctlPatchbay *pPatchbay = m_pPatchbayView->binding(); if (!sText.isEmpty() && pPatchbay) pPatchbay->connectSelected(); } dragLeaveEvent(nullptr); } // Handle mouse events for drag-and-drop stuff. void qjackctlSocketListView::mousePressEvent ( QMouseEvent *pMouseEvent ) { QTreeWidget::mousePressEvent(pMouseEvent); if (pMouseEvent->button() == Qt::LeftButton) { m_posDrag = pMouseEvent->pos(); m_pDragItem = QTreeWidget::itemAt(m_posDrag); } } void qjackctlSocketListView::mouseMoveEvent ( QMouseEvent *pMouseEvent ) { QTreeWidget::mouseMoveEvent(pMouseEvent); if ((pMouseEvent->buttons() & Qt::LeftButton) && m_pDragItem && ((pMouseEvent->pos() - m_posDrag).manhattanLength() >= QApplication::startDragDistance())) { // We'll start dragging something alright... QMimeData *pMimeData = new QMimeData(); pMimeData->setText(m_pDragItem->text(0)); QDrag *pDrag = new QDrag(this); pDrag->setMimeData(pMimeData); pDrag->setPixmap(m_pDragItem->icon(0).pixmap(16)); pDrag->setHotSpot(QPoint(-4, -12)); pDrag->exec(Qt::LinkAction); // We've dragged and maybe dropped it by now... m_pDragItem = nullptr; } } // Context menu request event handler. void qjackctlSocketListView::contextMenuEvent ( QContextMenuEvent *pContextMenuEvent ) { m_pPatchbayView->contextMenu( pContextMenuEvent->globalPos(), (m_bReadable ? m_pPatchbayView->OSocketList() : m_pPatchbayView->ISocketList()) ); } //---------------------------------------------------------------------- // qjackctlPatchworkView -- Socket connector widget. // // Constructor. qjackctlPatchworkView::qjackctlPatchworkView ( qjackctlPatchbayView *pPatchbayView ) : QWidget(pPatchbayView) { m_pPatchbayView = pPatchbayView; QWidget::setMinimumWidth(20); // QWidget::setMaximumWidth(120); QWidget::setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); } // Default destructor. qjackctlPatchworkView::~qjackctlPatchworkView (void) { } // Legal socket item position helper. int qjackctlPatchworkView::itemY ( QTreeWidgetItem *pItem ) const { QRect rect; QTreeWidget *pList = pItem->treeWidget(); QTreeWidgetItem *pParent = pItem->parent(); qjackctlSocketItem *pSocketItem = nullptr; if (pParent && pParent->type() == QJACKCTL_SOCKETITEM) pSocketItem = static_cast (pParent); if (pSocketItem && !pSocketItem->isOpen()) { rect = pList->visualItemRect(pParent); } else { rect = pList->visualItemRect(pItem); } return rect.top() + rect.height() / 2; } // Draw visible socket connection relation lines void qjackctlPatchworkView::drawConnectionLine ( QPainter *pPainter, int x1, int y1, int x2, int y2, int h1, int h2 ) { // Account for list view headers. y1 += h1; y2 += h2; // Invisible output plugs don't get a connecting dot. if (y1 > h1) pPainter->drawLine(x1, y1, x1 + 4, y1); // Setup control points QPolygon spline(4); const int cp = int(float(x2 - x1 - 8) * 0.4f); spline.putPoints(0, 4, x1 + 4, y1, x1 + 4 + cp, y1, x2 - 4 - cp, y2, x2 - 4, y2); // The connection line, it self. QPainterPath path; path.moveTo(spline.at(0)); path.cubicTo(spline.at(1), spline.at(2), spline.at(3)); pPainter->strokePath(path, pPainter->pen()); // Invisible input plugs don't get a connecting dot. if (y2 > h2) pPainter->drawLine(x2 - 4, y2, x2, y2); } // Draw socket forwrading line (for input sockets / right pane only) void qjackctlPatchworkView::drawForwardLine ( QPainter *pPainter, int x, int dx, int y1, int y2, int h ) { // Account for list view headers. y1 += h; y2 += h; dx += 4; // Draw it... if (y1 < y2) { pPainter->drawLine(x - dx, y1 + 4, x, y1); pPainter->drawLine(x - dx, y1 + 4, x - dx, y2 - 4); pPainter->drawLine(x - dx, y2 - 4, x, y2); // Down arrow... pPainter->drawLine(x - dx, y2 - 8, x - dx - 2, y2 - 12); pPainter->drawLine(x - dx, y2 - 8, x - dx + 2, y2 - 12); } else { pPainter->drawLine(x - dx, y1 - 4, x, y1); pPainter->drawLine(x - dx, y1 - 4, x - dx, y2 + 4); pPainter->drawLine(x - dx, y2 + 4, x, y2); // Up arrow... pPainter->drawLine(x - dx, y2 + 8, x - dx - 2, y2 + 12); pPainter->drawLine(x - dx, y2 + 8, x - dx + 2, y2 + 12); } } // Draw visible socket connection relation arrows. void qjackctlPatchworkView::paintEvent ( QPaintEvent * ) { if (m_pPatchbayView->OSocketList() == nullptr || m_pPatchbayView->ISocketList() == nullptr) return; QPainter painter(this); int x1, y1, h1; int x2, y2, h2; int i, rgb[3] = { 0x99, 0x66, 0x33 }; // Draw all lines anti-aliased... painter.setRenderHint(QPainter::Antialiasing); // Inline adaptive to darker background themes... if (QWidget::palette().window().color().value() < 0x7f) for (i = 0; i < 3; ++i) rgb[i] += 0x33; // Initialize color changer. i = 0; // Almost constants. x1 = 0; x2 = width(); h1 = ((m_pPatchbayView->OListView())->header())->sizeHint().height(); h2 = ((m_pPatchbayView->IListView())->header())->sizeHint().height(); // For each client item... qjackctlSocketItem *pOSocket, *pISocket; QListIterator osocket( (m_pPatchbayView->OSocketList())->sockets()); while (osocket.hasNext()) { pOSocket = osocket.next(); // Set new connector color. ++i; painter.setPen(QColor(rgb[i % 3], rgb[(i / 3) % 3], rgb[(i / 9) % 3])); // Get starting connector arrow coordinates. y1 = itemY(pOSocket); // Get input socket connections... QListIterator isocket(pOSocket->connects()); while (isocket.hasNext()) { pISocket = isocket.next(); // Obviously, there is a connection from pOPlug to pIPlug items: y2 = itemY(pISocket); drawConnectionLine(&painter, x1, y1, x2, y2, h1, h2); } } // Look for forwarded inputs... QList iforwards; // Make a local copy of just the forwarding socket list, if any... QListIterator isocket( (m_pPatchbayView->ISocketList())->sockets()); while (isocket.hasNext()) { pISocket = isocket.next(); // Check if its forwarded... if (pISocket->forward().isEmpty()) continue; iforwards.append(pISocket); } // (Re)initialize color changer. i = 0; // Now traverse those for proper connection drawing... int dx = 0; QListIterator iter(iforwards); while (iter.hasNext()) { pISocket = iter.next(); qjackctlSocketItem *pISocketForward = m_pPatchbayView->ISocketList()->findSocket( pISocket->forward(), pISocket->socketType()); if (pISocketForward == nullptr) continue; // Set new connector color. ++i; painter.setPen(QColor(rgb[i % 3], rgb[(i / 3) % 3], rgb[(i / 9) % 3])); // Get starting connector arrow coordinates. y1 = itemY(pISocketForward); y2 = itemY(pISocket); drawForwardLine(&painter, x2, dx, y1, y2, h2); dx += 2; } } // Context menu request event handler. void qjackctlPatchworkView::contextMenuEvent ( QContextMenuEvent *pContextMenuEvent ) { m_pPatchbayView->contextMenu(pContextMenuEvent->globalPos(), nullptr); } // Widget event slots... void qjackctlPatchworkView::contentsChanged (void) { QWidget::update(); } //---------------------------------------------------------------------------- // qjackctlPatchbayView -- Integrated patchbay widget. // Constructor. qjackctlPatchbayView::qjackctlPatchbayView ( QWidget *pParent ) : QSplitter(Qt::Horizontal, pParent) { m_pOListView = new qjackctlSocketListView(this, true); m_pPatchworkView = new qjackctlPatchworkView(this); m_pIListView = new qjackctlSocketListView(this, false); m_pPatchbay = nullptr; QSplitter::setHandleWidth(2); QObject::connect(m_pOListView, SIGNAL(itemExpanded(QTreeWidgetItem *)), m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pOListView, SIGNAL(itemCollapsed(QTreeWidgetItem *)), m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pOListView->verticalScrollBar(), SIGNAL(valueChanged(int)), m_pPatchworkView, SLOT(contentsChanged())); // QObject::connect(m_pOListView->header(), SIGNAL(sectionClicked(int)), // m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pIListView, SIGNAL(itemExpanded(QTreeWidgetItem *)), m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pIListView, SIGNAL(itemCollapsed(QTreeWidgetItem *)), m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pIListView->verticalScrollBar(), SIGNAL(valueChanged(int)), m_pPatchworkView, SLOT(contentsChanged())); // QObject::connect(m_pIListView->header(), SIGNAL(sectionClicked(int)), // m_pPatchworkView, SLOT(contentsChanged())); m_bDirty = false; } // Default destructor. qjackctlPatchbayView::~qjackctlPatchbayView (void) { } // Common context menu slot. void qjackctlPatchbayView::contextMenu ( const QPoint& pos, qjackctlSocketList *pSocketList ) { qjackctlPatchbay *pPatchbay = binding(); if (pPatchbay == nullptr) return; QMenu menu(this); QAction *pAction; if (pSocketList) { qjackctlSocketItem *pSocketItem = pSocketList->selectedSocketItem(); bool bEnabled = (pSocketItem != nullptr); pAction = menu.addAction(QIcon(":/images/add1.png"), tr("Add..."), pSocketList, SLOT(addSocketItem())); pAction = menu.addAction(QIcon(":/images/edit1.png"), tr("Edit..."), pSocketList, SLOT(editSocketItem())); pAction->setEnabled(bEnabled); pAction = menu.addAction(QIcon(":/images/copy1.png"), tr("Copy..."), pSocketList, SLOT(copySocketItem())); pAction->setEnabled(bEnabled); pAction = menu.addAction(QIcon(":/images/remove1.png"), tr("Remove"), pSocketList, SLOT(removeSocketItem())); pAction->setEnabled(bEnabled); menu.addSeparator(); pAction = menu.addAction( tr("Exclusive"), pSocketList, SLOT(exclusiveSocketItem())); pAction->setCheckable(true); pAction->setChecked(bEnabled && pSocketItem->isExclusive()); pAction->setEnabled(bEnabled && (pSocketItem->connects().count() < 2)); // Construct the forwarding menu, // overriding the last one, if any... QMenu *pForwardMenu = menu.addMenu(tr("Forward")); // Assume sockets iteration follows item index order (0,1,2...) // and remember that we only do this for input sockets... int iIndex = 0; if (pSocketItem && pSocketList == ISocketList()) { QListIterator isocket(ISocketList()->sockets()); while (isocket.hasNext()) { qjackctlSocketItem *pISocket = isocket.next(); // Must be of same type of target one... int iSocketType = pISocket->socketType(); if (iSocketType != pSocketItem->socketType()) continue; const QString& sSocketName = pISocket->socketName(); if (pSocketItem->socketName() == sSocketName) continue; int iPixmap = 0; switch (iSocketType) { case QJACKCTL_SOCKETTYPE_JACK_AUDIO: iPixmap = (pISocket->isExclusive() ? QJACKCTL_XPM_AUDIO_SOCKET_X : QJACKCTL_XPM_AUDIO_SOCKET); break; case QJACKCTL_SOCKETTYPE_JACK_MIDI: case QJACKCTL_SOCKETTYPE_ALSA_MIDI: iPixmap = (pISocket->isExclusive() ? QJACKCTL_XPM_MIDI_SOCKET_X : QJACKCTL_XPM_MIDI_SOCKET); break; } pAction = pForwardMenu->addAction( QIcon(ISocketList()->pixmap(iPixmap)), sSocketName); pAction->setChecked(pSocketItem->forward() == sSocketName); pAction->setData(iIndex); ++iIndex; } // nullptr forward always present, // and has invalid index parameter (-1)... if (iIndex > 0) pForwardMenu->addSeparator(); pAction = pForwardMenu->addAction(tr("(None)")); pAction->setCheckable(true); pAction->setChecked(pSocketItem->forward().isEmpty()); pAction->setData(-1); // We have something here... QObject::connect(pForwardMenu, SIGNAL(triggered(QAction*)), SLOT(activateForwardMenu(QAction*))); } pForwardMenu->setEnabled(iIndex > 0); menu.addSeparator(); const int iItem = (pSocketList->listView())->indexOfTopLevelItem(pSocketItem); const int iItemCount = (pSocketList->listView())->topLevelItemCount(); pAction = menu.addAction(QIcon(":/images/up1.png"), tr("Move Up"), pSocketList, SLOT(moveUpSocketItem())); pAction->setEnabled(bEnabled && iItem > 0); pAction = menu.addAction(QIcon(":/images/down1.png"), tr("Move Down"), pSocketList, SLOT(moveDownSocketItem())); pAction->setEnabled(bEnabled && iItem < iItemCount - 1); menu.addSeparator(); } #if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) pAction = menu.addAction(QIcon(":/images/connect1.png"), tr("&Connect"), tr("Alt+C", "Connect"), pPatchbay, SLOT(connectSelected())); pAction->setEnabled(pPatchbay->canConnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnect1.png"), tr("&Disconnect"), tr("Alt+D", "Disconnect"), pPatchbay, SLOT(disconnectSelected())); pAction->setEnabled(pPatchbay->canDisconnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnectall1.png"), tr("Disconnect &All"), tr("Alt+A", "Disconnect All"), pPatchbay, SLOT(disconnectAll())); pAction->setEnabled(pPatchbay->canDisconnectAll()); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("&Refresh"), tr("Alt+R", "Refresh"), pPatchbay, SLOT(refresh())); #else pAction = menu.addAction(QIcon(":/images/connect1.png"), tr("&Connect"), pPatchbay, SLOT(connectSelected()), tr("Alt+C", "Connect")); pAction->setEnabled(pPatchbay->canConnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnect1.png"), tr("&Disconnect"), pPatchbay, SLOT(disconnectSelected()), tr("Alt+D", "Disconnect")); pAction->setEnabled(pPatchbay->canDisconnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnectall1.png"), tr("Disconnect &All"), pPatchbay, SLOT(disconnectAll()), tr("Alt+A", "Disconnect All")); pAction->setEnabled(pPatchbay->canDisconnectAll()); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("&Refresh"), pPatchbay, SLOT(refresh()), tr("Alt+R", "Refresh")); #endif menu.exec(pos); } // Select the forwarding socket name from context menu. void qjackctlPatchbayView::activateForwardMenu ( QAction *pAction ) { int iIndex = pAction->data().toInt(); // Get currently input socket (assume its nicely selected) qjackctlSocketItem *pSocketItem = ISocketList()->selectedSocketItem(); if (pSocketItem) { // Check first for forward from nil... if (iIndex < 0) { pSocketItem->setForward(QString()); setDirty(true); return; } // Hopefully, its a real socket about to be forwraded... QListIterator isocket(ISocketList()->sockets()); while (isocket.hasNext()) { qjackctlSocketItem *pISocket = isocket.next(); // Must be of same type of target one... if (pISocket->socketType() != pSocketItem->socketType()) continue; const QString& sSocketName = pISocket->socketName(); if (pSocketItem->socketName() == sSocketName) continue; if (iIndex == 0) { pSocketItem->setForward(sSocketName); setDirty(true); break; } --iIndex; } } } // Patchbay binding methods. void qjackctlPatchbayView::setBinding ( qjackctlPatchbay *pPatchbay ) { m_pPatchbay = pPatchbay; } qjackctlPatchbay *qjackctlPatchbayView::binding (void) const { return m_pPatchbay; } // Patchbay client list accessors. qjackctlSocketList *qjackctlPatchbayView::OSocketList (void) const { if (m_pPatchbay) return m_pPatchbay->OSocketList(); else return nullptr; } qjackctlSocketList *qjackctlPatchbayView::ISocketList (void) const { if (m_pPatchbay) return m_pPatchbay->ISocketList(); else return nullptr; } // Dirty flag methods. void qjackctlPatchbayView::setDirty ( bool bDirty ) { m_bDirty = bDirty; if (bDirty) emit contentsChanged(); } bool qjackctlPatchbayView::dirty (void) const { return m_bDirty; } //---------------------------------------------------------------------- // qjackctlPatchbay -- Output-to-Input client/plugs connection object. // // Constructor. qjackctlPatchbay::qjackctlPatchbay ( qjackctlPatchbayView *pPatchbayView ) { m_pPatchbayView = pPatchbayView; m_pOSocketList = new qjackctlSocketList(m_pPatchbayView->OListView(), true); m_pISocketList = new qjackctlSocketList(m_pPatchbayView->IListView(), false); m_pPatchbayView->setBinding(this); } // Default destructor. qjackctlPatchbay::~qjackctlPatchbay (void) { m_pPatchbayView->setBinding(nullptr); delete m_pOSocketList; m_pOSocketList = nullptr; delete m_pISocketList; m_pISocketList = nullptr; (m_pPatchbayView->PatchworkView())->update(); } // Connection primitive. void qjackctlPatchbay::connectSockets ( qjackctlSocketItem *pOSocket, qjackctlSocketItem *pISocket ) { if (pOSocket->findConnectPtr(pISocket) == nullptr) { pOSocket->addConnect(pISocket); pISocket->addConnect(pOSocket); } } // Disconnection primitive. void qjackctlPatchbay::disconnectSockets ( qjackctlSocketItem *pOSocket, qjackctlSocketItem *pISocket ) { if (pOSocket->findConnectPtr(pISocket) != nullptr) { pOSocket->removeConnect(pISocket); pISocket->removeConnect(pOSocket); } } // Test if selected plugs are connectable. bool qjackctlPatchbay::canConnectSelected (void) { QTreeWidgetItem *pOItem = (m_pOSocketList->listView())->currentItem(); if (pOItem == nullptr) return false; QTreeWidgetItem *pIItem = (m_pISocketList->listView())->currentItem(); if (pIItem == nullptr) return false; qjackctlSocketItem *pOSocket = nullptr; switch (pOItem->type()) { case QJACKCTL_SOCKETITEM: pOSocket = static_cast (pOItem); break; case QJACKCTL_PLUGITEM: pOSocket = (static_cast (pOItem))->socket(); break; default: return false; } qjackctlSocketItem *pISocket = nullptr; switch (pIItem->type()) { case QJACKCTL_SOCKETITEM: pISocket = static_cast (pIItem); break; case QJACKCTL_PLUGITEM: pISocket = (static_cast (pIItem))->socket(); break; default: return false; } // Sockets must be of the same type... if (pOSocket->socketType() != pISocket->socketType()) return false; // Exclusive sockets may not accept more than one cable. if (pOSocket->isExclusive() && pOSocket->connects().count() > 0) return false; if (pISocket->isExclusive() && pISocket->connects().count() > 0) return false; // One-to-one connection... return (pOSocket->findConnectPtr(pISocket) == nullptr); } // Connect current selected plugs. bool qjackctlPatchbay::connectSelected (void) { QTreeWidgetItem *pOItem = (m_pOSocketList->listView())->currentItem(); if (pOItem == nullptr) return false; QTreeWidgetItem *pIItem = (m_pISocketList->listView())->currentItem(); if (pIItem == nullptr) return false; qjackctlSocketItem *pOSocket = nullptr; switch (pOItem->type()) { case QJACKCTL_SOCKETITEM: pOSocket = static_cast (pOItem); break; case QJACKCTL_PLUGITEM: pOSocket = (static_cast (pOItem))->socket(); break; default: return false; } qjackctlSocketItem *pISocket = nullptr; switch (pIItem->type()) { case QJACKCTL_SOCKETITEM: pISocket = static_cast (pIItem); break; case QJACKCTL_PLUGITEM: pISocket = (static_cast (pIItem))->socket(); break; default: return false; } // Sockets must be of the same type... if (pOSocket->socketType() != pISocket->socketType()) return false; // Exclusive sockets may not accept more than one cable. if (pOSocket->isExclusive() && pOSocket->connects().count() > 0) return false; if (pISocket->isExclusive() && pISocket->connects().count() > 0) return false; // One-to-one connection... connectSockets(pOSocket, pISocket); // Making one list dirty will take care of the rest... m_pPatchbayView->setDirty(true); return true; } // Test if selected plugs are disconnectable. bool qjackctlPatchbay::canDisconnectSelected (void) { QTreeWidgetItem *pOItem = (m_pOSocketList->listView())->currentItem(); if (pOItem == nullptr) return false; QTreeWidgetItem *pIItem = (m_pISocketList->listView())->currentItem(); if (pIItem == nullptr) return false; qjackctlSocketItem *pOSocket = nullptr; switch (pOItem->type()) { case QJACKCTL_SOCKETITEM: pOSocket = static_cast (pOItem); break; case QJACKCTL_PLUGITEM: pOSocket = (static_cast (pOItem))->socket(); break; default: return false; } qjackctlSocketItem *pISocket = nullptr; switch (pIItem->type()) { case QJACKCTL_SOCKETITEM: pISocket = static_cast (pIItem); break; case QJACKCTL_PLUGITEM: pISocket = (static_cast (pIItem))->socket(); break; default: return false; } // Sockets must be of the same type... if (pOSocket->socketType() != pISocket->socketType()) return false; return (pOSocket->findConnectPtr(pISocket) != 0); } // Disconnect current selected plugs. bool qjackctlPatchbay::disconnectSelected (void) { QTreeWidgetItem *pOItem = (m_pOSocketList->listView())->currentItem(); if (!pOItem) return false; QTreeWidgetItem *pIItem = (m_pISocketList->listView())->currentItem(); if (!pIItem) return false; qjackctlSocketItem *pOSocket = nullptr; switch (pOItem->type()) { case QJACKCTL_SOCKETITEM: pOSocket = static_cast (pOItem); break; case QJACKCTL_PLUGITEM: pOSocket = (static_cast (pOItem))->socket(); break; default: return false; } qjackctlSocketItem *pISocket = nullptr; switch (pIItem->type()) { case QJACKCTL_SOCKETITEM: pISocket = static_cast (pIItem); break; case QJACKCTL_PLUGITEM: pISocket = (static_cast (pIItem))->socket(); break; default: return false; } // Sockets must be of the same type... if (pOSocket->socketType() != pISocket->socketType()) return false; // One-to-one disconnection... disconnectSockets(pOSocket, pISocket); // Making one list dirty will take care of the rest... m_pPatchbayView->setDirty(true); return true; } // Test if any plug is disconnectable. bool qjackctlPatchbay::canDisconnectAll (void) { QListIterator osocket(m_pOSocketList->sockets()); while (osocket.hasNext()) { qjackctlSocketItem *pOSocket = osocket.next(); if (pOSocket->connects().count() > 0) return true; } return false; } // Disconnect all plugs. bool qjackctlPatchbay::disconnectAll (void) { if (QMessageBox::warning(m_pPatchbayView, tr("Warning") + " - " QJACKCTL_TITLE, tr("This will disconnect all sockets.\n\n" "Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { return false; } QListIterator osocket(m_pOSocketList->sockets()); while (osocket.hasNext()) { qjackctlSocketItem *pOSocket = osocket.next(); QListIterator isocket(pOSocket->connects()); while (isocket.hasNext()) disconnectSockets(pOSocket, isocket.next()); } // Making one list dirty will take care of the rest... m_pPatchbayView->setDirty(true); return true; } // Expand all socket items. void qjackctlPatchbay::expandAll (void) { (m_pOSocketList->listView())->expandAll(); (m_pISocketList->listView())->expandAll(); (m_pPatchbayView->PatchworkView())->update(); } // Complete contents rebuilder. void qjackctlPatchbay::refresh (void) { (m_pOSocketList->listView())->update(); (m_pISocketList->listView())->update(); (m_pPatchbayView->PatchworkView())->update(); } // Complete contents clearer. void qjackctlPatchbay::clear (void) { // Clear socket lists. m_pOSocketList->clear(); m_pISocketList->clear(); // Reset dirty flag. m_pPatchbayView->setDirty(false); // May refresh everything. refresh(); } // Patchbay client list accessors. qjackctlSocketList *qjackctlPatchbay::OSocketList (void) const { return m_pOSocketList; } qjackctlSocketList *qjackctlPatchbay::ISocketList (void) const { return m_pISocketList; } // External rack transfer method: copy patchbay structure from master rack model. void qjackctlPatchbay::loadRackSockets ( qjackctlSocketList *pSocketList, QList& socketlist ) { pSocketList->clear(); qjackctlSocketItem *pSocketItem = nullptr; QListIterator sockit(socketlist); while (sockit.hasNext()) { qjackctlPatchbaySocket *pSocket = sockit.next(); pSocketItem = new qjackctlSocketItem(pSocketList, pSocket->name(), pSocket->clientName(), pSocket->type(), pSocketItem); if (pSocketItem) { pSocketItem->setExclusive(pSocket->isExclusive()); pSocketItem->setForward(pSocket->forward()); pSocketItem->updatePixmap(); qjackctlPlugItem *pPlugItem = nullptr; QStringListIterator iter(pSocket->pluglist()); while (iter.hasNext()) { pPlugItem = new qjackctlPlugItem( pSocketItem, iter.next(), pPlugItem); } } } } void qjackctlPatchbay::loadRack ( qjackctlPatchbayRack *pPatchbayRack ) { (m_pOSocketList->listView())->setUpdatesEnabled(false); (m_pISocketList->listView())->setUpdatesEnabled(false); // Load ouput sockets. loadRackSockets(m_pOSocketList, pPatchbayRack->osocketlist()); // Load input sockets. loadRackSockets(m_pISocketList, pPatchbayRack->isocketlist()); // Now ready to load from cable model. QListIterator iter(pPatchbayRack->cablelist()); while (iter.hasNext()) { qjackctlPatchbayCable *pCable = iter.next(); // Get proper sockets... qjackctlPatchbaySocket *pOSocket = pCable->outputSocket(); qjackctlPatchbaySocket *pISocket = pCable->inputSocket(); if (pOSocket && pISocket) { qjackctlSocketItem *pOSocketItem = m_pOSocketList->findSocket(pOSocket->name(), pOSocket->type()); qjackctlSocketItem *pISocketItem = m_pISocketList->findSocket(pISocket->name(), pISocket->type()); if (pOSocketItem && pISocketItem) connectSockets(pOSocketItem, pISocketItem); } } (m_pOSocketList->listView())->setUpdatesEnabled(true); (m_pISocketList->listView())->setUpdatesEnabled(true); (m_pOSocketList->listView())->update(); (m_pISocketList->listView())->update(); (m_pPatchbayView->PatchworkView())->update(); // Reset dirty flag. m_pPatchbayView->setDirty(false); } // External rack transfer method: copy patchbay structure into master rack model. void qjackctlPatchbay::saveRackSockets ( qjackctlSocketList *pSocketList, QList& socketlist ) { // Have QTreeWidget item order into account: qjackctlSocketListView *pListView = pSocketList->listView(); if (pListView == nullptr) return; socketlist.clear(); const int iItemCount = pListView->topLevelItemCount(); for (int iItem = 0; iItem < iItemCount; ++iItem) { QTreeWidgetItem *pItem = pListView->topLevelItem(iItem); if (pItem->type() != QJACKCTL_SOCKETITEM) continue; qjackctlSocketItem *pSocketItem = static_cast (pItem); if (pSocketItem == nullptr) continue; qjackctlPatchbaySocket *pSocket = new qjackctlPatchbaySocket(pSocketItem->socketName(), pSocketItem->clientName(), pSocketItem->socketType()); if (pSocket) { pSocket->setExclusive(pSocketItem->isExclusive()); pSocket->setForward(pSocketItem->forward()); QListIterator iter(pSocketItem->plugs()); while (iter.hasNext()) pSocket->pluglist().append((iter.next())->plugName()); socketlist.append(pSocket); } } } void qjackctlPatchbay::saveRack ( qjackctlPatchbayRack *pPatchbayRack ) { // Save ouput sockets. saveRackSockets(m_pOSocketList, pPatchbayRack->osocketlist()); // Save input sockets. saveRackSockets(m_pISocketList, pPatchbayRack->isocketlist()); // Now ready to save into cable model. pPatchbayRack->cablelist().clear(); // Start from output sockets... QListIterator osocket(m_pOSocketList->sockets()); while (osocket.hasNext()) { qjackctlSocketItem *pOSocketItem = osocket.next(); // Then to input sockets... QListIterator isocket(pOSocketItem->connects()); while (isocket.hasNext()) { qjackctlSocketItem *pISocketItem = isocket.next(); // Now find proper racked sockets... qjackctlPatchbaySocket *pOSocket = pPatchbayRack->findSocket( pPatchbayRack->osocketlist(), pOSocketItem->socketName()); qjackctlPatchbaySocket *pISocket = pPatchbayRack->findSocket( pPatchbayRack->isocketlist(), pISocketItem->socketName()); if (pOSocket && pISocket) { pPatchbayRack->addCable( new qjackctlPatchbayCable(pOSocket, pISocket)); } } } // Reset dirty flag. m_pPatchbayView->setDirty(false); } // Connections snapshot. void qjackctlPatchbay::connectionsSnapshot (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == nullptr) return; qjackctlPatchbayRack rack; rack.connectJackSnapshot(pMainForm->jackClient()); rack.connectAlsaSnapshot(pMainForm->alsaSeq()); loadRack(&rack); // Set dirty flag. m_pPatchbayView->setDirty(true); } // end of qjackctlPatchbay.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlConnectionsForm.h0000644000000000000000000000013215174607203020160 xustar0030 mtime=1777536643.510914327 30 atime=1777536643.510914327 30 ctime=1777536643.510914327 qjackctl-1.0.6/src/qjackctlConnectionsForm.h0000644000175000001440000000717615174607203020163 0ustar00rncbcusers// qjackctlConnectionsForm.h // /**************************************************************************** Copyright (C) 2003-2021, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlConnectionsForm_h #define __qjackctlConnectionsForm_h #include "ui_qjackctlConnectionsForm.h" #include "qjackctlJackConnect.h" #include "qjackctlAlsaConnect.h" // Forward declarations. class qjackctlSetup; //---------------------------------------------------------------------------- // qjackctlConnectionsForm -- UI wrapper form. class qjackctlConnectionsForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlConnectionsForm(QWidget *pParent = nullptr, Qt::WindowFlags wflags = Qt::WindowFlags()); // Destructor. ~qjackctlConnectionsForm(); void setup(qjackctlSetup *pSetup); qjackctlConnectView *audioConnectView() const; qjackctlConnectView *midiConnectView() const; qjackctlConnectView *alsaConnectView() const; enum TabPage { AudioTab = 0, MidiTab = 1, AlsaTab = 2 }; void setTabPage(int iTabPage); int tabPage() const; QFont connectionsFont() const; void setConnectionsFont(const QFont& font); void setConnectionsIconSize(int iIconSize); bool isAudioConnected() const; bool isMidiConnected() const; bool isAlsaConnected() const; void refreshAudio(bool bEnabled, bool bClear = false); void refreshMidi(bool bEnabled, bool bClear = false); void refreshAlsa(bool bEnabled, bool bClear = false); void stabilizeAudio(bool bEnabled, bool bClear = false); void stabilizeMidi(bool bEnabled, bool bClear = false); void stabilizeAlsa(bool bEnabled, bool bClear = false); void updateAliases(); public slots: void audioConnectSelected(); void audioDisconnectSelected(); void audioDisconnectAll(); void audioExpandAll(); void audioAliasesChanged(); void audioRefresh(); void audioStabilize(); void midiConnectSelected(); void midiDisconnectSelected(); void midiDisconnectAll(); void midiExpandAll(); void midiAliasesChanged(); void midiRefresh(); void midiStabilize(); void alsaConnectSelected(); void alsaDisconnectSelected(); void alsaDisconnectAll(); void alsaExpandAll(); void alsaAliasesChanged(); void alsaRefresh(); void alsaStabilize(); protected slots: void audioDisconnecting(qjackctlPortItem *, qjackctlPortItem *); void midiDisconnecting(qjackctlPortItem *, qjackctlPortItem *); void alsaDisconnecting(qjackctlPortItem *, qjackctlPortItem *); protected: void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void closeEvent(QCloseEvent *); void keyPressEvent(QKeyEvent *); private: // The Qt-designer UI struct... Ui::qjackctlConnectionsForm m_ui; // Instance variables. qjackctlJackConnect *m_pAudioConnect; qjackctlJackConnect *m_pMidiConnect; qjackctlAlsaConnect *m_pAlsaConnect; qjackctlSetup *m_pSetup; }; #endif // __qjackctlConnectionsForm_h // end of qjackctlConnectionsForm.h qjackctl-1.0.6/src/PaxHeaders/qjackctlMessagesStatusForm.cpp0000644000000000000000000000013215174607203021204 xustar0030 mtime=1777536643.512914312 30 atime=1777536643.512914312 30 ctime=1777536643.512914312 qjackctl-1.0.6/src/qjackctlMessagesStatusForm.cpp0000644000175000001440000002353615174607203021205 0ustar00rncbcusers// qjackctlMessagesStatusForm.cpp // /**************************************************************************** Copyright (C) 2003-2021, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlMessagesStatusForm.h" #include "qjackctlStatus.h" #include "qjackctlMainForm.h" #include #include #include #include #include #include #include #include // The maximum number of message lines. #define QJACKCTL_MESSAGES_MAXLINES 1000 // Deprecated QTextStreamFunctions/Qt namespaces workaround. #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) #define endl Qt::endl #endif //---------------------------------------------------------------------------- // qjackctlMessagesStatusForm -- UI wrapper form. // Constructor. qjackctlMessagesStatusForm::qjackctlMessagesStatusForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); // m_ui.MessagesTextView->setTextFormat(Qt::LogText); // Initialize default message limit. m_iMessagesLines = 0; setMessagesLimit(QJACKCTL_MESSAGES_MAXLINES); m_pMessagesLog = nullptr; // Create the list view items 'a priori'... const QString s = " "; const QString c = ":" + s; const QString n = "--"; QTreeWidgetItem *pViewItem; // Status list view... QHeaderView *pHeader = m_ui.StatsListView->header(); pHeader->setDefaultAlignment(Qt::AlignLeft); // pHeader->setDefaultSectionSize(320); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) // pHeader->setSectionResizeMode(QHeaderView::Custom); pHeader->setSectionsMovable(false); #else // pHeader->setResizeMode(QHeaderView::Custom); pHeader->setMovable(false); #endif pHeader->setStretchLastSection(true); m_apStatus[STATUS_SERVER_NAME] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Server name") + c << n); m_apStatus[STATUS_SERVER_STATE] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Server state") + c << n); m_apStatus[STATUS_DSP_LOAD] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("DSP Load") + c << n); m_apStatus[STATUS_SAMPLE_RATE] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Sample Rate") + c << n); m_apStatus[STATUS_BUFFER_SIZE] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Buffer Size") + c << n); m_apStatus[STATUS_REALTIME] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Realtime Mode") + c << n); pViewItem = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Transport state") + c << n); m_apStatus[STATUS_TRANSPORT_STATE] = pViewItem; m_apStatus[STATUS_TRANSPORT_TIME] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("Transport Timecode") + c << n); m_apStatus[STATUS_TRANSPORT_BBT] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("Transport BBT") + c << n); m_apStatus[STATUS_TRANSPORT_BPM] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("Transport BPM") + c << n); pViewItem = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("XRUN count since last server startup") + c << n); m_apStatus[STATUS_XRUN_COUNT] = pViewItem; m_apStatus[STATUS_XRUN_TIME] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN last time detected") + c << n); m_apStatus[STATUS_XRUN_LAST] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN last") + c << n); m_apStatus[STATUS_XRUN_MAX] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN maximum") + c << n); m_apStatus[STATUS_XRUN_MIN] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN minimum") + c << n); m_apStatus[STATUS_XRUN_AVG] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN average") + c << n); m_apStatus[STATUS_XRUN_TOTAL] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN total") + c << n); #ifdef CONFIG_JACK_MAX_DELAY m_apStatus[STATUS_MAX_DELAY] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Maximum scheduling delay") + c << n); #endif m_apStatus[STATUS_RESET_TIME] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Time of last reset") + c << n); m_ui.StatsListView->resizeColumnToContents(0); // Description. m_ui.StatsListView->resizeColumnToContents(1); // Value. // UI connections... QObject::connect(m_ui.ResetPushButton, SIGNAL(clicked()), SLOT(resetXrunStats())); QObject::connect(m_ui.RefreshPushButton, SIGNAL(clicked()), SLOT(refreshXrunStats())); } // Destructor. qjackctlMessagesStatusForm::~qjackctlMessagesStatusForm (void) { setLogging(false); } // Notify our parent that we're emerging. void qjackctlMessagesStatusForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeFormEx(); QWidget::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlMessagesStatusForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeFormEx(); } // Tab page accessors. void qjackctlMessagesStatusForm::setTabPage ( int iTabPage ) { m_ui.MessagesStatusTabWidget->setCurrentIndex(iTabPage); } int qjackctlMessagesStatusForm::tabPage (void) const { return m_ui.MessagesStatusTabWidget->currentIndex(); } // Messages view font accessors. QFont qjackctlMessagesStatusForm::messagesFont (void) const { return m_ui.MessagesTextView->font(); } void qjackctlMessagesStatusForm::setMessagesFont ( const QFont& font ) { m_ui.MessagesTextView->setFont(font); } // Messages line limit accessors. int qjackctlMessagesStatusForm::messagesLimit (void) const { return m_iMessagesLimit; } void qjackctlMessagesStatusForm::setMessagesLimit ( int iMessagesLimit ) { m_iMessagesLimit = iMessagesLimit; m_iMessagesHigh = iMessagesLimit + (iMessagesLimit / 3); // m_ui.MessagesTextView->setMaxLogLines(iMessagesLimit); } // Messages logging stuff. bool qjackctlMessagesStatusForm::isLogging (void) const { return (m_pMessagesLog != nullptr); } void qjackctlMessagesStatusForm::setLogging ( bool bEnabled, const QString& sFilename ) { if (m_pMessagesLog) { appendMessages(tr("Logging stopped --- %1 ---") .arg(QDateTime::currentDateTime().toString())); m_pMessagesLog->close(); delete m_pMessagesLog; m_pMessagesLog = nullptr; } if (bEnabled) { m_pMessagesLog = new QFile(sFilename); if (m_pMessagesLog->open(QIODevice::Text | QIODevice::Append)) { appendMessages(tr("Logging started --- %1 ---") .arg(QDateTime::currentDateTime().toString())); } else { delete m_pMessagesLog; m_pMessagesLog = nullptr; } } } // Messages log output method. void qjackctlMessagesStatusForm::appendMessagesLog ( const QString& s ) { if (m_pMessagesLog) { QTextStream(m_pMessagesLog) << s << endl; m_pMessagesLog->flush(); } } // Messages widget output method. void qjackctlMessagesStatusForm::appendMessagesLine ( const QString& s ) { // Check for message line limit... if (m_iMessagesLines > m_iMessagesHigh) { m_ui.MessagesTextView->setUpdatesEnabled(false); QTextCursor textCursor(m_ui.MessagesTextView->document()->begin()); while (m_iMessagesLines > m_iMessagesLimit) { // Move cursor extending selection // from start to next line-block... textCursor.movePosition( QTextCursor::NextBlock, QTextCursor::KeepAnchor); m_iMessagesLines--; } // Remove the excessive line-blocks... textCursor.removeSelectedText(); m_ui.MessagesTextView->setUpdatesEnabled(true); } m_ui.MessagesTextView->append(s); m_iMessagesLines++; } void qjackctlMessagesStatusForm::appendMessages ( const QString& s ) { appendMessagesColor(s, Qt::gray); } void qjackctlMessagesStatusForm::appendMessagesColor ( const QString& s, const QColor& rgb ) { const QString& sText = QTime::currentTime().toString("hh:mm:ss.zzz") + ' ' + s; appendMessagesLine("" + sText + ""); appendMessagesLog(sText); } void qjackctlMessagesStatusForm::appendMessagesText ( const QString& s ) { appendMessagesLine(s); appendMessagesLog(s); } // Ask our parent to reset status. void qjackctlMessagesStatusForm::resetXrunStats (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->resetXrunStats(); } // Ask our parent to refresh our status. void qjackctlMessagesStatusForm::refreshXrunStats (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshXrunStats(); } // Update one status item value. void qjackctlMessagesStatusForm::updateStatusItem ( int iStatusItem, const QString& sText ) { m_apStatus[iStatusItem]->setText(1, sText); } // Keyboard event handler. void qjackctlMessagesStatusForm::keyPressEvent ( QKeyEvent *pKeyEvent ) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlMessagesStatusForm::keyPressEvent(%d)", pKeyEvent->key()); #endif int iKey = pKeyEvent->key(); switch (iKey) { case Qt::Key_Escape: close(); break; default: QWidget::keyPressEvent(pKeyEvent); break; } } // end of qjackctlMessagesStatusForm.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlMessagesStatusForm.h0000644000000000000000000000013215174607203020651 xustar0030 mtime=1777536643.512914312 30 atime=1777536643.512914312 30 ctime=1777536643.512914312 qjackctl-1.0.6/src/qjackctlMessagesStatusForm.h0000644000175000001440000000523415174607203020645 0ustar00rncbcusers// qjackctlMessagesStatusForm.h // /**************************************************************************** Copyright (C) 2003-2021, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlMessagesStatusForm_h #define __qjackctlMessagesStatusForm_h #include "ui_qjackctlMessagesStatusForm.h" // Forward declarations. class QTreeWidgetItem; class QFile; //---------------------------------------------------------------------------- // qjackctlMessagesStatusForm -- UI wrapper form. class qjackctlMessagesStatusForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlMessagesStatusForm(QWidget *pParent = nullptr, Qt::WindowFlags wflags = Qt::WindowFlags()); // Destructor. ~qjackctlMessagesStatusForm(); enum TabPage { MessagesTab = 0, StatusTab = 1 }; void setTabPage(int iTabPage); int tabPage() const; QFont messagesFont() const; void setMessagesFont(const QFont& font); int messagesLimit() const; void setMessagesLimit(int iLimit); bool isLogging() const; void setLogging(bool bEnabled, const QString& sFilename = QString()); void appendMessages(const QString& s); void appendMessagesColor(const QString& s, const QColor& rgb); void appendMessagesText(const QString& s); void updateStatusItem(int iStatusItem, const QString& sText); public slots: void resetXrunStats(); void refreshXrunStats(); protected: void appendMessagesLine(const QString& s); void appendMessagesLog(const QString& s); void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void keyPressEvent(QKeyEvent *); private: // The Qt-designer UI struct... Ui::qjackctlMessagesStatusForm m_ui; // Instance variables. int m_iMessagesLines; int m_iMessagesLimit; int m_iMessagesHigh; // Logging stuff. QFile *m_pMessagesLog; // Status stuff. QTreeWidgetItem *m_apStatus[19]; }; #endif // __qjackctlMessagesStatusForm_h // end of qjackctlMessagesStatusForm.h qjackctl-1.0.6/src/PaxHeaders/qjackctlGraphForm.ui0000644000000000000000000000012715174607203017131 xustar0029 mtime=1777536643.51191432 29 atime=1777536643.51191432 29 ctime=1777536643.51191432 qjackctl-1.0.6/src/qjackctlGraphForm.ui0000644000175000001440000006256715174607203017135 0ustar00rncbcusers rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2025, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlGraphForm 0 0 800 600 Graph :/images/graph1.png 0 0 0 0 800 20 &Graph &Edit &View T&humbview :/images/graphThumbview.png &Zoom :/images/graphZoomTool.png Co&lors :/images/graphColors.png S&ort &Help Qt::AllToolBarAreas Qt::Horizontal Qt::ToolButtonTextBesideIcon true TopToolBarArea false :/images/graphConnect.png &Connect Connect Connect Connect selected ports Ctrl+C :/images/graphDisconnect.png &Disconnect Disconnect Disconnect Disconnect selected ports Ctrl+D Cl&ose Close Close Close this application window Select &All Select All Select All Select All Ctrl+A Select &None Select None Select None Select None Ctrl+Shift+A Select &Invert Select Invert Select Invert Select Invert Ctrl+I :/images/graphRename.png &Rename... Rename item Rename Item Rename Item F2 :/images/graphFind.png &Find... Find Find nodes Find nodes Ctrl+F true &Menubar Menubar Menubar Show/hide the main program window menubar Ctrl+M true &Toolbar Toolbar Toolbar Show/hide main program window file toolbar true &Statusbar Statusbar Statusbar Show/hide the main program window statusbar true &Top Left Top left Top left Show the thumbnail overview on the top-left true Top &Right Top right Top right Show the thumbnail overview on the top-right true Bottom &Left Bottom Left Bottom left Show the thumbnail overview on the bottom-left true &Bottom Right Bottom right Bottom right Show the thumbnail overview on the bottom-right true &None None Hide thumbview Hide the thumbnail overview true Text Beside &Icons Text beside icons Text beside icons Show/hide text beside icons :/images/graphCenter.png &Center Center Center Center view &Refresh Refresh Refresh Refresh view F5 :/images/graphZoomIn.png Zoom &In Zoom In Zoom In Zoom In Ctrl++ :/images/graphZoomOut.png Zoom &Out Zoom Out Zoom Out Zoom Out Ctrl+- :/images/graphZoomFit.png Zoom &Fit Zoom Fit Zoom Fit Zoom Fit Ctrl+0 :/images/graphZoomReset.png Zoom &Reset Zoom Reset Zoom Reset Zoom Reset Ctrl+1 true :/images/graphZoomRange.png &Zoom Range Zoom Range Zoom Range Zoom Range JACK &Audio... JACK Audio color JACK Audio color JACK Audio color JACK &MIDI... JACK MIDI JACK MIDI color JACK MIDI color ALSA M&IDI... ALSA MIDI ALSA MIDI color ALSA MIDI color JACK &CV... JACK CV color JACK CV color JACK CV color JACK &OSC... JACK OSC JACK OSC color JACK OSC color &Reset Reset colors Reset colors Reset colors true Port &Name Port name Sort by port name true Port &Title Port title Sort by port title true Port &Index Port index Sort by port index true &Ascending Ascending Ascending sort order true &Descending Descending Descending sort order true Repel O&verlapping Nodes Repel nodes Repel overlapping nodes Repel overlapping nodes true Connect Thro&ugh Nodes Connect Through Nodes Connect through nodes Whether to draw connectors through or around nodes &About... About... About Show information about this application program About &Qt... About Qt... About Qt Show information about the Qt toolkit qjackctlGraphCanvas QGraphicsView
qjackctlGraph.h
qjackctl-1.0.6/src/PaxHeaders/qjackctlSocketForm.ui0000644000000000000000000000013215174607203017314 xustar0030 mtime=1777536643.517914276 30 atime=1777536643.517914276 30 ctime=1777536643.517914276 qjackctl-1.0.6/src/qjackctlSocketForm.ui0000644000175000001440000002754715174607203017323 0ustar00rncbcusers rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlSocketForm 0 0 400 300 Socket :/images/patchbay1.png 9 6 QTabWidget::Rounded &Socket 8 4 &Name (alias): Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false SocketNameLineEdit Socket name (an alias for client name) Client name (regular expression) true Add plug to socket plug list Add P&lug :/images/add1.png &Plug: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false PlugNameComboBox Port name (regular expression) true Qt::CustomContextMenu Socket plug list false true false true Socket Plugs / Ports Edit currently selected plug &Edit :/images/edit1.png Remove currently selected plug from socket plug list &Remove :/images/remove1.png &Client: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false ClientNameComboBox Move down currently selected plug in socket plug list &Down :/images/down1.png Move up current selected plug in socket plug list &Up :/images/up1.png Qt::Vertical QSizePolicy::Expanding 8 8 Enforce only one exclusive cable connection E&xclusive &Forward: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false SocketForwardComboBox Forward (clone) all connections from this socket false Type 8 4 Audio socket type (JACK) &Audio MIDI socket type (JACK) &MIDI MIDI socket type (ALSA) AL&SA Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok SocketTabWidget SocketNameLineEdit AudioRadioButton MidiRadioButton AlsaRadioButton ClientNameComboBox PlugNameComboBox PlugAddPushButton PlugListView PlugEditPushButton PlugRemovePushButton PlugUpPushButton PlugDownPushButton ExclusiveCheckBox SocketForwardComboBox DialogButtonBox qjackctl-1.0.6/src/PaxHeaders/qjackctlInterfaceComboBox.h0000644000000000000000000000012715174607203020407 xustar0029 mtime=1777536643.51191432 29 atime=1777536643.51191432 29 ctime=1777536643.51191432 qjackctl-1.0.6/src/qjackctlInterfaceComboBox.h0000644000175000001440000000364015174607203020376 0ustar00rncbcusers// qjackctlInterfaceComboBox.h // /**************************************************************************** Copyright (C) 2003-2021, rncbc aka Rui Nuno Capela. All rights reserved. Copyright (C) 2015, Kjetil Matheussen. (portaudio_probe_thread) Copyright (C) 2013, Arnout Engelen. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlInterfaceComboBox_h #define __qjackctlInterfaceComboBox_h #include // Forward decls. class qjackctlSetup; class QStandardItemModel; //---------------------------------------------------------------------------- // Combobox for device interfaces class qjackctlInterfaceComboBox : public QComboBox { public: // Constructor. qjackctlInterfaceComboBox(QWidget *pPrent = 0); void setup(QComboBox *pDriverComboBox, int iAudio, const QString& sDefName); protected: void clearCards(); void addCard(const QString& sName, const QString& sDescription); void populateModel(); void showPopup(); QStandardItemModel *model() const; private: QComboBox *m_pDriverComboBox; int m_iAudio; QString m_sDefName; }; #endif // __qjackctlInterfaceComboBox_h // end of qjackctlInterfaceComboBox.h qjackctl-1.0.6/src/PaxHeaders/qjackctlSetupForm.ui0000644000000000000000000000013215174607203017164 xustar0030 mtime=1777536643.517914276 30 atime=1777536643.516914284 30 ctime=1777536643.517914276 qjackctl-1.0.6/src/qjackctlSetupForm.ui0000644000175000001440000043562415174607203017172 0ustar00rncbcusers rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. S1ee the GNU General Public License for more details. with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlSetupForm 0 0 640 520 Setup :/images/setup1.png true false 0 Settings 4 4 Preset &Name: false PresetComboBox 0 0 Settings preset name true (default) Clear settings of current preset name Clea&r :/images/clear1.png false Save settings as current preset name &Save :/images/save1.png false Delete current settings preset &Delete :/images/remove1.png false 0 Parameters 50 false Driv&er: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false DriverComboBox 50 false The audio backend driver interface to use false dummy sun oss alsa portaudio coreaudio firewire net netone Qt::Horizontal 8 20 50 false &Interface: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false InterfaceComboBox 140 0 50 false The PCM device name to use true (default) hw:0 plughw:0 /dev/audio /dev/dsp Qt::Horizontal 8 20 50 false MIDI Driv&er: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false MidiDriverComboBox 80 0 50 false The ALSA MIDI backend driver to use false none raw seq 50 false Use realtime scheduling &Realtime 50 false Sample &Rate: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false SampleRateComboBox 50 false Sample rate in frames per second true 22050 32000 44100 48000 88200 96000 192000 Qt::Horizontal 8 20 50 false &Frames/Period: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false FramesComboBox 50 false Frames per period between process() calls true 16 32 64 128 256 512 1024 2048 4096 50 false Periods/&Buffer: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false PeriodsSpinBox 50 false Number of periods in the hardware buffer 1 999 1 Qt::Vertical 20 4 50 false Whether to use server synchronous mode &Use server synchronous mode Qt::Horizontal 20 8 50 false Whether to give verbose output on messages &Verbose messages Qt::Horizontal 8 20 50 false Latency: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 72 0 50 false Output latency in milliseconds, calculated based on the period, rate and buffer settings QFrame::StyledPanel QFrame::Sunken 0 msecs Qt::AlignCenter false Advanced 8 16 16 Please do not touch these settings unless you know what you are doing. Qt::Horizontal 20 8 50 false Server &Prefix: false ServerPrefixComboBox 0 0 50 false Server path (command line prefix) true jackd jackdmp jackstart 50 false &Name: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false ServerNameComboBox 120 0 50 false The JACK Audio Connection Kit sound server name true (default) Qt::Vertical 20 4 50 false Do not attempt to lock memory, even if in realtime mode No Memory Loc&k 50 false Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) &Unlock Memory 50 false Enable hardware metering on cards that support it H/&W Meter 50 false Provide output monitor ports &Monitor 50 false Ignore xruns reported by the backend driver So&ft Mode 50 false Force 16bit mode instead of failing over 32bit (default) Force &16bit 50 false Ignore hardware period/buffer size &Ignore H/W Qt::Horizontal 8 20 50 false Priorit&y: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false PrioritySpinBox 50 false Scheduler priority when running realtime 1 5 95 50 false &Word Length: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false WordLengthComboBox 50 false Word length true 16 32 64 50 false &Wait (usec): Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false WaitComboBox Sans Serif 50 false Number of microseconds to wait between engine processes (dummy) true 21333 50 false &Channels: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 ChanSpinBox 50 false Maximum number of audio channels to allocate 999 50 false Port Ma&ximum: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false PortMaxComboBox 60 0 50 false Maximum number of ports the JACK server can manage true 0 128 256 512 1024 50 false false &Timeout (msec): Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false TimeoutComboBox 50 false Set client timeout limit in milliseconds true 0 200 500 1000 2000 5000 50 false Cloc&k source: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false ClockSourceComboBox 50 false Clock source false 0 Qt::Horizontal 8 20 50 false &Audio: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false AudioComboBox 0 0 50 false Provide either audio capture, playback or both Duplex Capture Only Playback Only 50 false Dit&her: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false DitherComboBox 0 0 50 false Set dither mode None Rectangular Shaped Triangular 50 false &Output Device: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false OutDeviceComboBox 50 false Alternate output device for playback true (default) hw:0 plughw:0 /dev/audio /dev/dsp 50 false &Input Device: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false InDeviceComboBox 50 false Alternate input device for capture true (default) hw:0 plughw:0 /dev/audio /dev/dsp 50 false &Channels I/O: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false InChannelsSpinBox 0 0 80 0 50 false Maximum input audio hardware channels to allocate 999 0 0 80 0 50 false Maximum output audio hardware channels to allocate 999 50 false &Latency I/O: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false InLatencySpinBox 0 0 80 0 50 false External input latency (frames) 9999999 0 0 80 0 50 false External output latency (frames) 9999999 Qt::Vertical 20 4 Qt::Vertical 20 4 Qt::Horizontal 20 8 50 false S&elf connect mode: SelfConnectModeComboBox 50 false Whether to restrict client self-connections false 0 Qt::Horizontal 20 8 Qt::Vertical 20 4 50 false Server Suffi&x: false ServerSuffixComboBox 0 0 50 false Extra driver options (command line suffix) true 50 false Start De&lay: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false StartDelaySpinBox 50 false Time in seconds that client is delayed after server startup secs 0 999 Options 75 true Scripting true 8 4 50 false Whether to execute a custom shell script before starting up the JACK audio server. Execute script on Start&up: 50 false Whether to execute a custom shell script after starting up the JACK audio server. Execute script after &Startup: 50 false Whether to execute a custom shell script before shuting down the JACK audio server. Execute script on Shut&down: 0 0 50 false Command line to be executed before starting up the JACK audio server true 22 22 24 24 50 false Qt::TabFocus Scripting argument meta-symbols > 22 22 24 24 50 false Qt::TabFocus Browse for script to be executed before starting up the JACK audio server ... 0 0 50 false Command line to be executed after starting up the JACK audio server true 22 22 24 24 50 false Qt::TabFocus Scripting argument meta-symbols > 22 22 24 24 50 false Qt::TabFocus Browse for script to be executed after starting up the JACK audio server ... 22 22 24 24 50 false Qt::TabFocus Scripting argument meta-symbols > 22 22 24 24 50 false Qt::TabFocus Browse for script to be executed before shutting down the JACK audio server ... 0 0 50 false Command line to be executed before shutting down the JACK audio server true 50 false Whether to execute a custom shell script after shuting down the JACK audio server. Execute script after Shu&tdown: 22 22 24 24 50 false Qt::TabFocus Scripting argument meta-symbols > 22 22 24 24 50 false Qt::TabFocus Browse for script to be executed after shutting down the JACK audio server ... 0 0 50 false Command line to be executed after shutting down the JACK audio server true 75 true Statistics true 8 4 50 false Whether to capture standard output (stdout/stderr) into messages window &Capture standard output 50 false &XRUN detection regex: false XrunRegexComboBox 0 0 50 false Regular expression used to detect XRUNs on server output messages true xrun of at least ([0-9|\.]+) msecs 75 true Connections true 50 false Whether to activate a patchbay definition for connection persistence profile. Activate &Patchbay persistence: 0 0 50 false Patchbay definition file to be activated as connection persistence profile true 22 22 24 24 50 false Qt::TabFocus Browse for a patchbay definition file to be activated ... 50 false Whether to reset all connections when a patchbay definition is activated. &Reset all connections on patchbay activation 50 false Whether to issue a warning on active patchbay port disconnections. &Warn on active patchbay disconnections Qt::Vertical 20 4 75 true Logging true 50 false Whether to activate a messages logging to file. &Messages log file: 0 0 50 false Messages log file true 22 22 24 24 50 false Qt::TabFocus Browse for the messages log file location ... Display 75 true Time Display true 4 4 50 false Transport &Time Code 50 false Transport &BBT (bar:beat.ticks) 50 false Elapsed time since last &Reset 50 false Elapsed time since last &XRUN Qt::Horizontal 8 20 4 4 180 0 260 32767 50 false Sample front panel normal display font true QFrame::StyledPanel QFrame::Sunken Qt::AlignCenter false 180 0 260 32767 50 false Sample big time display font true QFrame::StyledPanel QFrame::Sunken Qt::AlignCenter false 50 false Big Time display: false 50 false Select font for front panel normal display &Font... false 50 false Select font for big time display &Font... false 50 false Normal display: false 50 false Whether to enable blinking (flashing) of the server mode (RT) indicator Blin&k server mode indicator 75 true Custom true 8 4 50 false &Color palette theme: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter CustomColorThemeComboBox 50 false Custom color palette theme false (default) Wonton Soup KXStudio 22 22 24 24 50 false Qt::TabFocus Manage custom color palette themes ... Qt::Horizontal 20 20 50 false &Widget style theme: CustomStyleThemeComboBox 50 false Custom widget style theme false (default) Qt::Vertical 20 4 75 true Messages Window true 4 8 180 0 260 16777215 50 false Sample messages text font display true QFrame::StyledPanel QFrame::Sunken Qt::AlignCenter false 50 false Select font for the messages text display &Font... false Qt::Horizontal 8 20 50 false Whether to keep a maximum number of lines in the messages window &Messages limit: 50 false The maximum number of message lines to keep in view true 3 100 250 500 1000 2500 5000 Qt::Vertical 20 4 75 true Connections Window true 180 0 260 16777215 50 false Sample connections view font true QFrame::StyledPanel QFrame::Sunken Qt::AlignCenter false 50 false Select font for the connections view &Font... false Qt::Horizontal 8 20 50 false &Icon size: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false ConnectionsIconSizeComboBox 50 false The icon size for each item of the connections view false 0 16 x 16 32 x 32 64 x 64 Qt::Vertical 20 4 50 false Whether to enable client/port name aliases on the connections window E&nable client/port aliases 50 false &JACK client/port aliases: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false JackClientPortAliasComboBox 50 false JACK client/port aliases display mode false 0 Default First Second 50 false Whether to enable in-place client/port name editing (rename) Ena&ble client/port aliases editing (rename) 50 false JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) Misc 4 4 75 true Other true 4 4 4 0 50 false Whether to start JACK audio server immediately on application startup &Start JACK audio server on application startup 50 false Whether to ask for confirmation on application exit &Confirm application close 50 false Whether to ask for confirmation on JACK audio server shutdown and/or restart Confirm server sh&utdown and/or restart 50 false false Whether to keep all child windows on top of the main window &Keep child windows always on top 50 false Whether to enable the system tray icon &Enable system tray icon 50 false Whether to show system tray message on main window close Sho&w system tray message on close 50 false Whether to start minimized to system tray Start minimi&zed to system tray 4 0 50 false Whether to save the JACK server command-line configuration into a local file (auto-start) S&ave JACK audio server configuration to: 50 false The server configuration local file name (auto-start) true .jackdrc 50 false Whether to enable ALSA Sequencer (MIDI) support on startup E&nable ALSA Sequencer support 50 false Whether to enable D-Bus interface &Enable D-Bus interface 50 false Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface 50 false Whether to stop JACK audio server on application exit S&top JACK audio server on application exit 50 false Whether to restrict to one single application instance (X11) Single application &instance Qt::Vertical 20 4 75 true Buttons true 4 0 50 false Whether to hide the left button group on the main window Hide main window &Left buttons 50 false Whether to hide the right button group on the main window Hide main window &Right buttons 50 false Whether to hide the transport button group on the main window Hide main window &Transport buttons 50 false Whether to hide the text labels on the main window buttons Hide main window &button text labels Qt::Vertical 20 4 50 false Whether to replace Connections with Graph button on the main window Replace Connections with &Graph button 75 true Defaults true 4 4 Qt::Vertical 20 4 50 false &Base font size: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter BaseFontSizeComboBox 50 false Base application font size (pt.) true (default) 6 7 8 9 10 11 12 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Apply|QDialogButtonBox::Ok qjackctlInterfaceComboBox QComboBox
qjackctlInterfaceComboBox.h
SetupTabWidget PresetComboBox PresetClearPushButton PresetSavePushButton PresetDeletePushButton SettingsTabWidget DriverComboBox RealtimeCheckBox InterfaceComboBox SampleRateComboBox FramesComboBox PeriodsSpinBox MidiDriverComboBox SyncCheckBox VerboseCheckBox ServerPrefixComboBox ServerNameComboBox NoMemLockCheckBox UnlockMemCheckBox HWMeterCheckBox MonitorCheckBox SoftModeCheckBox ShortsCheckBox IgnoreHWCheckBox PrioritySpinBox WordLengthComboBox WaitComboBox ChanSpinBox PortMaxComboBox TimeoutComboBox AudioComboBox ClockSourceComboBox DitherComboBox OutDeviceComboBox InDeviceComboBox InChannelsSpinBox OutChannelsSpinBox InLatencySpinBox OutLatencySpinBox SelfConnectModeComboBox ServerSuffixComboBox StartDelaySpinBox StartupScriptCheckBox StartupScriptShellComboBox StartupScriptSymbolToolButton StartupScriptBrowseToolButton PostStartupScriptCheckBox PostStartupScriptShellComboBox PostStartupScriptSymbolToolButton PostStartupScriptBrowseToolButton ShutdownScriptCheckBox ShutdownScriptShellComboBox ShutdownScriptSymbolToolButton ShutdownScriptBrowseToolButton PostShutdownScriptCheckBox PostShutdownScriptShellComboBox PostShutdownScriptSymbolToolButton PostShutdownScriptBrowseToolButton StdoutCaptureCheckBox XrunRegexComboBox ActivePatchbayCheckBox ActivePatchbayPathComboBox ActivePatchbayPathToolButton ActivePatchbayResetCheckBox QueryDisconnectCheckBox MessagesLogCheckBox MessagesLogPathComboBox MessagesLogPathToolButton TransportTimeRadioButton TransportBBTRadioButton ElapsedResetRadioButton ElapsedXrunRadioButton DisplayFont1PushButton DisplayFont2PushButton DisplayBlinkCheckBox CustomColorThemeComboBox CustomColorThemeToolButton CustomStyleThemeComboBox MessagesFontPushButton MessagesLimitCheckBox MessagesLimitLinesComboBox ConnectionsFontPushButton ConnectionsIconSizeComboBox AliasesEnabledCheckBox AliasesEditingCheckBox JackClientPortAliasComboBox JackClientPortMetadataCheckBox StartJackCheckBox QueryCloseCheckBox QueryShutdownCheckBox KeepOnTopCheckBox SystemTrayCheckBox SystemTrayQueryCloseCheckBox StartMinimizedCheckBox ServerConfigCheckBox ServerConfigNameComboBox AlsaSeqEnabledCheckBox DBusEnabledCheckBox JackDBusEnabledCheckBox StopJackCheckBox SingletonCheckBox LeftButtonsCheckBox RightButtonsCheckBox TransportButtonsCheckBox TextLabelsCheckBox BaseFontSizeComboBox DialogButtonBox
qjackctl-1.0.6/src/PaxHeaders/qjackctlPatchbayForm.h0000644000000000000000000000013215174607203017431 xustar0030 mtime=1777536643.514914298 30 atime=1777536643.514914298 30 ctime=1777536643.514914298 qjackctl-1.0.6/src/qjackctlPatchbayForm.h0000644000175000001440000000603615174607203017426 0ustar00rncbcusers// qjackctlPatchbayForm.h // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlPatchbayForm_h #define __qjackctlPatchbayForm_h #include "ui_qjackctlPatchbayForm.h" // Forward declarations. class qjackctlPatchbay; class qjackctlSetup; //---------------------------------------------------------------------------- // qjackctlPatchbayForm -- UI wrapper form. class qjackctlPatchbayForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlPatchbayForm(QWidget *pParent = nullptr, Qt::WindowFlags wflags = Qt::WindowFlags()); // Destructor. ~qjackctlPatchbayForm(); void setup(qjackctlSetup *pSetup); qjackctlPatchbayView *patchbayView() const; bool queryClose(); const QString& patchbayPath() const; void newPatchbayFile(bool bSnapshot); bool loadPatchbayFile(const QString& sFileName); bool savePatchbayFile(const QString& sFileName); void loadPatchbayRack(qjackctlPatchbayRack *pRack); void setRecentPatchbays(const QStringList& patchbays); void updateRecentPatchbays(); public slots: void newPatchbay(); void loadPatchbay(); void savePatchbay(); void selectPatchbay(int iPatchbay); void toggleActivePatchbay(); void addOSocket(); void removeOSocket(); void editOSocket(); void copyOSocket(); void moveUpOSocket(); void moveDownOSocket(); void addISocket(); void removeISocket(); void editISocket(); void copyISocket(); void moveUpISocket(); void moveDownISocket(); void connectSelected(); void disconnectSelected(); void disconnectAll(); void expandAll(); void contentsChanged(); void refreshForm(); void stabilizeForm(); protected: void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void closeEvent(QCloseEvent *); void keyPressEvent(QKeyEvent *); private: // The Qt-designer UI struct... Ui::qjackctlPatchbayForm m_ui; // Instance variables. qjackctlSetup *m_pSetup; int m_iUntitled; qjackctlPatchbay *m_pPatchbay; QString m_sPatchbayPath; QString m_sPatchbayName; QStringList m_recentPatchbays; bool m_bActivePatchbay; int m_iUpdate; }; #endif // __qjackctlPatchbayForm_h // end of qjackctlPatchbayForm.h qjackctl-1.0.6/src/PaxHeaders/qjackctlSessionForm.ui0000644000000000000000000000013215174607203017507 xustar0030 mtime=1777536643.515914291 30 atime=1777536643.515914291 30 ctime=1777536643.515914291 qjackctl-1.0.6/src/qjackctlSessionForm.ui0000644000175000001440000001737515174607203017514 0ustar00rncbcusers rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlSessionForm 0 0 480 320 Session :/images/session1.png Load session &Load... :/images/open1.png Recent session &Recent Qt::Horizontal 20 20 Save session &Save :/images/save1.png Qt::Horizontal 220 20 Update session Re&fresh :/images/refresh1.png Qt::Vertical Session clients / connections false true false true Client / Ports UUID Command Infra-clients / commands false true false true Infra-client Infra-command Add infra-client &Add :/images/add1.png Edit infra-client &Edit :/images/edit1.png Remove infra-client Re&move :/images/remove1.png Qt::Vertical 20 8 LoadSessionPushButton RecentSessionPushButton SaveSessionPushButton UpdateSessionPushButton SessionTreeView InfraClientListView AddInfraClientPushButton EditInfraClientPushButton RemoveInfraClientPushButton qjackctl-1.0.6/src/PaxHeaders/man10000644000000000000000000000013015174607203013741 xustar0029 mtime=1777536643.50968178 30 atime=1777536643.508914341 29 ctime=1777536643.50968178 qjackctl-1.0.6/src/man1/0000755000175000001440000000000015174607203014010 5ustar00rncbcusersqjackctl-1.0.6/src/man1/PaxHeaders/qjackctl.10000644000000000000000000000013215174607203015676 xustar0030 mtime=1777536643.508914341 30 atime=1777536643.508914341 30 ctime=1777536643.508914341 qjackctl-1.0.6/src/man1/qjackctl.10000644000175000001440000000607715174607203015700 0ustar00rncbcusers.TH qjackctl 1 "April 16, 2026" .SH NAME qjackctl \- User interface for controlling JACK (Jack Audio Connection Kit) .SH SYNOPSIS .B qjackctl [\fIoptions\fR] .SH DESCRIPTION This manual page documents briefly the .B qjackctl command-line options. .PP .PP \fBQjackCtl\fP is used for controlling the Jack Audio Connection Kit (JACK) and as a patchbay for ALSA MIDI and JACK MIDI devices. \fBQjackCtl\fP also has support for the JACK transport control protocol, so you can use it to start and stop the JACK transport. Once you start qjackctl, you get presented with a single GUI window, the buttons are self-explanatory and have tooltips. .SH OPTIONS .HP \fB\-s\fR, \fB\-\-start\fR .IP Start JACK audio server immediately .HP \fB\-p\fR, \fB\-\-preset\fR=[\fIlabel\fR] .IP Set default settings preset name .HP \fB\-a\fR, \fB\-\-active\-patchbay\fR=[\fIpath\fR] .IP Set active patchbay definition file .HP \fB\-n\fR, \fB\-\-server\-name\fR=[\fIlabel\fR] .IP Set default JACK audio server name .HP \fB\-?\fR, \fB\-\-help\fR .IP Displays help on command-line options. .HP \fB\-v\fR, \fB\-\-version\fR .IP Show version information. .SH D-BUS INTERFACE Enable 'Setup > Misc > Other > Enable D-Bus interface' to use the D-Bus interface commands as shown below. .PP .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.start\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.stop\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.reset\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.main\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.messages\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.status\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.session\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.connections\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.patchbay\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.graph\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.rewind\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.backward\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.play\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.pause\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.forward\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.setup\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.about\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.quit\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.preset string\fR:[\fIlabel\fR] .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.active-patchbay string\fR:[\fIpath\fR] .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.load\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.save\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.savequit\fR .RE .RS \fBdbus\-send \-\-system / org.rncbc.qjackctl.savetemplate\fR .PP .SH SEE ALSO .BR jackd (1) .SH FILES Configuration settings are stored in ~/.config/rncbc.org/QjackCtl.conf .SH AUTHOR QjackCtl was written by Rui Nuno Capela. .PP This manual page was written by Guenter Geiger , for the Debian project (but may be used by others). qjackctl-1.0.6/src/man1/PaxHeaders/qjackctl.fr.10000644000000000000000000000013015174607203016302 xustar0029 mtime=1777536643.50968178 30 atime=1777536643.508914341 29 ctime=1777536643.50968178 qjackctl-1.0.6/src/man1/qjackctl.fr.10000644000175000001440000000347515174607203016305 0ustar00rncbcusers.TH qjackctl 1 "Avril 16, 2026" .SH NOM qjackctl \- interface utilisateur pour contrôler JACK (Jack Audio Connection Kit) .SH SYNOPSIS .B qjackctl [\fIoptions\fR] .SH DESCRIPTION Ce manuel décrit rapidement la commande .B qjackctl . .PP .PP \fBQjackCtl\fP est utilisé pour contrôler le kit de connexion audio Jack (JACK) ainsi qu'en tant que baie de brassage pour les périphériques ALSA MIDI et JACK MIDI. \fBQjackCtl\fP possède également un support pour le protocole de transport JACK, et vous pouvez donc l'utiliser pour démarrer et arrêter le transport JACK. Lorsque vous démarrez qjackctl, une fenêtre d'interface graphique unique vous est présentée, dont les boutons sont simples à comprendre et possèdent des info-bulles. .SH OPTIONS .HP \fB\-s\fR, \fB\-\-start\fR .IP Démarre le serveur audio JACK immédiatement .HP \fB\-p\fR, \fB\-\-preset\fR <\fIétiquette\fR> .IP Paramètre le nom du pré-réglage de paramètres par défaut .HP \fB\-a\fR, \fB\-\-active\-patchbay\fR <\fIchemin\fR> .IP Paramètre le fichier de définition de la baie de brassage active .HP \fB\-n\fR, \fB\-\-server\-name\fR <\fIétiquette\fR> .IP Paramètre le nom du serveur audio JACK par défaut .HP \fB\-?\fR, \fB\-\-help\fR .IP Affiche de l'aide à propos des options de ligne de commande .HP \fB\-v\fR, \fB\-\-version\fR .IP Affiche des informations de version. .SH VOIR ÉGALEMENT .BR jackd (1) .SH FICHIER Les paramètres de configuration sont stockés dans ~/.config/rncbc.org/QjackCtl.conf .SH AUTEUR QjackCtl a été écrit par Rui Nuno Capela. .PP Cette page de manuel a été écrite par Guenter Geiger , pour le projet Debian (mais peut être utilisée par d'autres). .PP La version française a été traduite par Olivier Humbert , pour le projet LibraZiK (mais peut être utilisée par d'autres). qjackctl-1.0.6/src/PaxHeaders/qjackctlSetup.h0000644000000000000000000000013215174607203016152 xustar0030 mtime=1777536643.516914284 30 atime=1777536643.516914284 30 ctime=1777536643.516914284 qjackctl-1.0.6/src/qjackctlSetup.h0000644000175000001440000001364215174607203016150 0ustar00rncbcusers// qjackctlSetup.h // /**************************************************************************** Copyright (C) 2003-2026, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSetup_h #define __qjackctlSetup_h #include "qjackctlAbout.h" #include "qjackctlAliases.h" #include // Forward declarations. class QWidget; class QComboBox; class QSplitter; // Audio mode combobox item indexes. #define QJACKCTL_DUPLEX 0 #define QJACKCTL_CAPTURE 1 #define QJACKCTL_PLAYBACK 2 // Icon size combobox item indexes. #define QJACKCTL_ICON_16X16 0 #define QJACKCTL_ICON_32X32 1 #define QJACKCTL_ICON_64X64 2 // Server settings preset struct. struct qjackctlPreset { qjackctlPreset() { clear(); } void clear(); void load(QSettings& settings, const QString& sSuffix); void save(QSettings& settings, const QString& sSuffix); void fixup(); QString sServerPrefix; QString sServerName; bool bRealtime; bool bSoftMode; bool bMonitor; bool bShorts; bool bNoMemLock; bool bUnlockMem; bool bHWMeter; bool bIgnoreHW; int iPriority; int iFrames; int iSampleRate; int iPeriods; int iWordLength; int iWait; int iChan; QString sDriver; QString sInterface; int iAudio; int iDither; int iTimeout; QString sInDevice; QString sOutDevice; int iInChannels; int iOutChannels; int iInLatency; int iOutLatency; int iStartDelay; bool bSync; bool bVerbose; int iPortMax; QString sMidiDriver; QString sServerSuffix; uchar ucClockSource; uchar ucSelfConnectMode; }; // Common settings profile class. class qjackctlSetup { public: // Constructor. qjackctlSetup(); // Destructor; ~qjackctlSetup(); // The settings object accessor. QSettings& settings(); // Explicit I/O methods. void loadSetup(); void saveSetup(); // Command line arguments parser. bool parse_args(const QStringList& args); #if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0) void show_error(const QString& msg); #else // Command line usage helper. void print_usage(const QString& arg0); #endif // Default (translated) preset name. static const QString& defName(); // Immediate server start options. bool bStartJack; bool bStartJackCmd; // Server stop options. bool bStopJack; // User supplied command line. QStringList cmdLine; // Current/previous (default) preset name. QString sDefPreset; QString sOldPreset; // Available presets list. QStringList presets; // Options... bool bSingleton; QString sServerName; bool bStartupScript; QString sStartupScriptShell; bool bPostStartupScript; QString sPostStartupScriptShell; bool bShutdownScript; QString sShutdownScriptShell; bool bPostShutdownScript; QString sPostShutdownScriptShell; bool bStdoutCapture; QString sXrunRegex; bool bActivePatchbay; QString sActivePatchbayPath; bool bActivePatchbayReset; bool bQueryDisconnect; bool bMessagesLog; QString sMessagesLogPath; int iTimeDisplay; QString sMessagesFont; bool bMessagesLimit; int iMessagesLimitLines; QString sDisplayFont1; QString sDisplayFont2; bool bDisplayEffect; bool bDisplayBlink; QString sCustomColorTheme; QString sCustomStyleTheme; int iJackClientPortAlias; bool bJackClientPortMetadata; int iConnectionsIconSize; QString sConnectionsFont; bool bQueryClose; bool bQueryShutdown; bool bQueryRestart; bool bKeepOnTop; bool bSystemTray; bool bSystemTrayQueryClose; bool bStartMinimized; bool bServerConfig; QString sServerConfigName; bool bAlsaSeqEnabled; bool bDBusEnabled; bool bJackDBusEnabled; bool bAliasesEnabled; bool bAliasesEditing; bool bLeftButtons; bool bRightButtons; bool bTransportButtons; bool bTextLabels; bool bGraphButton; int iBaseFontSize; // Defaults... QString sPatchbayPath; // Recent patchbay listing. QStringList patchbays; // Recent session directories. QStringList sessionDirs; // Last open tab page... int iMessagesStatusTabPage; int iConnectionsTabPage; // Last session save type... bool bSessionSaveVersion; // Aliases containers. qjackctlAliases aliases; // Aliases preset management methods. bool loadAliases(); bool saveAliases(); // Preset management methods. bool loadPreset(qjackctlPreset& preset, const QString& sPreset); bool savePreset(qjackctlPreset& preset, const QString& sPreset); bool deletePreset(const QString& sPreset); // Combo box history persistence helper prototypes. void loadComboBoxHistory(QComboBox *pComboBox, int iLimit = 8); void saveComboBoxHistory(QComboBox *pComboBox, int iLimit = 8); // Splitter widget sizes persistence helper methods. void loadSplitterSizes(QSplitter *pSplitter, QList& sizes); void saveSplitterSizes(QSplitter *pSplitter); // Widget geometry persistence helper prototypes. void saveWidgetGeometry(QWidget *pWidget, bool bVisible = false); void loadWidgetGeometry(QWidget *pWidget, bool bVisible = false); private: // Our proper settings profile. QSettings m_settings; // Default (translated) preset name. static QString g_sDefName; }; #endif // __qjackctlSetup_h // end of qjackctlSetup.h qjackctl-1.0.6/src/PaxHeaders/qjackctlSystemTray.h0000644000000000000000000000013215174607203017176 xustar0030 mtime=1777536643.517914276 30 atime=1777536643.517914276 30 ctime=1777536643.517914276 qjackctl-1.0.6/src/qjackctlSystemTray.h0000644000175000001440000000423315174607203017170 0ustar00rncbcusers// qjackctlSystemTray.h // /**************************************************************************** Copyright (C) 2003-2024, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSystemTray_h #define __qjackctlSystemTray_h #include #include //---------------------------------------------------------------------------- // qjackctlSystemTray -- Custom system tray widget. class qjackctlSystemTray : public QSystemTrayIcon { Q_OBJECT public: // Constructor. qjackctlSystemTray(QWidget *pParent = 0); // Default destructor. ~qjackctlSystemTray(); // Background mask methods. void setBackground(const QColor& background); const QColor& background() const; // Set system tray icon overlay. void setPixmapOverlay(const QPixmap& pmOverlay); const QPixmap& pixmapOverlay() const; // System tray icon/pixmaps update method. void updatePixmap(); // Redirect to hide. void close(); signals: // Clicked signal. void clicked(); // Toggle Start/Stop server. void doubleClicked(); // Xrun reset signal. void middleClicked(); protected slots: // Handle systeam tray activity. void activated(QSystemTrayIcon::ActivationReason); private: // Instance pixmap and background color. QIcon m_icon; QPixmap m_pixmap; QPixmap m_pixmapOverlay; QColor m_background; }; #endif // __qjackctlSystemTray_h // end of qjackctlSystemTray.h qjackctl-1.0.6/src/PaxHeaders/images0000644000000000000000000000013215174607203014354 xustar0030 mtime=1777536643.508914341 30 atime=1777536643.503874424 30 ctime=1777536643.508914341 qjackctl-1.0.6/src/images/0000755000175000001440000000000015174607203014421 5ustar00rncbcusersqjackctl-1.0.6/src/images/PaxHeaders/xstarting1.png0000644000000000000000000000013215174607203017243 xustar0030 mtime=1777536643.508914341 30 atime=1777536643.508914341 30 ctime=1777536643.508914341 qjackctl-1.0.6/src/images/xstarting1.png0000644000175000001440000000046215174607203017235 0ustar00rncbcusers‰PNG  IHDRÄ´l;ùIDATxÚí“¡ŽÃ0 †½)ÈdÔ°ô°ßÁR_dï>fRØñ>C%¿CèŽ š4X%§é¦jÕª­ÓõGŽòë‹ÿXµjÕÿkss.˜ùKDJ"ÚÅÏfÖ†>àgÑ ˆXªj—RêÇJ)õªÚ!b¹„[¨jw�ÕǺ¿•ªvP–Pf:‹ÿÿén” du$·öÿÿW”4s�04Å€ÿX”K†Y2'È€ÿX’b¤€/&Ë€ÿ[’ A¥ ‚-*Ëÿÿì… ’ [ª£�,)ÊæöÖ‘‘ f¯¦‚4l¯ïüÖ˜%‘ q³ŸMOe¶éõé‹‘ €�¤‡dy·ýÿÿ]‘ iÒÒ«yVÓÿû·‘ Ÿîë†!3Šèa’ #»Ù©wÿ‘ ”0¥¶¶‚3ÿ€•"’Ù®²ÿ” 8 Ó­ÿ‚” Ö§ÿ†˜#Ú ÿŠ˜'ßšÿ�—-à’ÿP˜3á’}¢˜@k/(ÿ¡—ßp#ö&–BÂ[Æœ— :47ÿM—1`NPñ—uZj˜#d¦¢™auÍJ˜Ica©† –fMs­©<–Oe9‚ÿÿÕ\” ct!œäÿÿI”3so'+­€ÿI”FqK)¯€ÿI’S‹l'±€ÿM“ 6Œˆn$"²ÿÿÔp’ M‘‹m$ °ÄÓ·}’ V”�n)[•Ôã¶€‘ _˜†@BU›ÊÑÕy ‘ lxŒrTfœôÿÿO‘ X³²‘gJ»ÿú·‘ ‡ËÈq(‚èa’ Ÿ¹�cÿ‘ ”'Œšª‚3ÿ€•}Û­²ÿ” 8 Ó¬ÿ‚” Ö¦ÿ†˜#Ú¡ÿŠ˜'Þšÿ�—-à’ÿP˜2à‘}¢˜@k/(ÿ¡—Þp#ö&–BÂ[Æœ— :47ÿM—1_NPñ—uZj˜#d¦¢™`tÎJ˜Hb^¨… –eH q®³.–Nb7p‰‰b$” `rCk’„” 2u/ L€Ž…” ;+ L�Ž„“ !;- M‚Ž„“ <9- N�‹`.’ >;- KV^P6’ "?<- $A`kP6’ 'A8"CZ\g3“ ,2;/!*D|��‘ #NN>*Sƒµ³‘ 9ZX/ Zïa’ DQ>#ÿ‘ ” <>‡„4ÿ€•=߬°ÿ• 8 Ñ«ÿ‚•Õ¦ÿ†˜#Ù ÿŠ˜'Þ™ÿ�—-ß‘ÿP˜3ß‘}¢˜@k/(ÿ¡—Þp#ö&–BÁ[Æœ— :37ÿM—1_NOñ—tZj˜#dl8mk î÷B£ÿÿÿâ;ÀÿíöÿÿÃdÿóÿÿåõÿ?çÿÿÿëÿÿÿé!;ÿîìÿþþþÿÿ/¹ýýÿÿÿÿþÿÿBÿÿþÿÿÿÿþþÿW7ÿþÿÿÿÿÿþþÿo÷ÿþÿÿÿÿÿþþÿˆ/ÿþþÿÿÿÿÿÿþÿ¡Kÿþÿÿÿÿÿÿÿþÿ·nÿþÿÿÿÿÿÿÿþÿË’ÿþÿÿÿÿÿÿÿþÿݵÿþÿÿÿÿÿÿÿþÿWÑÿþÿÿÿÿÿÿþÿNéÿþÿÿÿÿÿÿÚûÿþÿÿÿÿþÿ` ÿÿþþÿþþþÿh ÿÿÿÿÿþþþÿp§^Ýÿþþþÿyéÿþÿþÿ�óÿþÿþÿŠüÿþÿþÿ™ÿÿþÿþÿ›ÿÿþÿþÿ§"ÿÿþÿþÿ¬+ÿþþÿþÿ@;ÿþþÿýÿ7SÿÿþÿÿQ;ßÿÿÿoT©Åì]it325Tÿƒ '*öG¼ÚÒfô #ÍÎÞÝè‘)ò "H�ÀÇÆÓ½d! ï6[·»×ÇÈ‘;î6R%!/›·ßÔÐÄP(ê[nN)3‰ÄÚ¹ÈÜ�"$è ra`b3Z‡¤áµ�ºÝk çnf[RQ7O­zÑØ“t•Å�$ågLZg`B$")ÊŠ^·áªmc‚„3 ãUERTpt0$(;JÔŽY„ÊÖ¡f8;'â?CLfVk`3 [eVÊË}R†ÌÙ¦'à4L_rRw91')¨ŠK˜æÌyZ�–u$ß @az~Aw,% );EÆÅ`]²åÓ›e4( Þ7]hxe_?C&0#Œ�?£ë¶]p½ì©, Þ"]j_‡By5" !)F¶ÊW�Öè¦s~Ÿ ˆpHÞ ShXq]eSS+3›?¤ç•|­ñ�ÿýÛ©p0 Û1alKŠNgS)&F’Å\£ô…ÿþì­P+ÚO‚A|;†o79@( OU�õ…ÿöçÔÁ«™l,Ù$,|ceifB}^-#$ "*-…Òööþÿÿü÷óíæäìå·tBÙ$YrD~=�O-)/"!1X„¿åúùéäìùüþÿÿþî­^, Ø9iH‰V‡f‚:$%!$.Z³æÝÚÛçú„ÿ÷¼`+ × LLƒNx\{¦H! # 'D «Äâþ…ÿþï·]+ Ö,DiqY€Pxc;D0! #+b„”ÄÞòþ…ÿþë²[-!Ö-M{B�„Š�udJ-#&OrpqÇæöü‡ÿò¹^, Ö,zF†O{I‚ybL4-NK8I‡Äáîý†ÿþô·d+!ÕbGyz‚v‡~nd;&0#$.Ezš½Ïðþ…ÿþò»f."Õ *ElŒF‡Š…€\$(+$"$+@o¢ÎÚóþ…ÿþë³^,"Õ 8N‹[‹ˆ�Œ3$PP3#!#*D�Éçòú‡ÿí®`-"Ô5xh‹�’e"BsfH1#!#.HŒÌèõü†ÿþò°c.!ÔTu‹‘Ž52�€o^F/"!$/H„ªÓäý‡ÿö¼`/"Ô 8l‹–r#f”Ž}ddM.!"$.Dvž½Öò†ÿþöÃc0"ÓZŠ•I(’–”ŒvpeN-!!$,Cs²ÁÝòþ…ÿüõºj/! Ó2ˆ�$Uš™˜•�}u^F.""$,E‚ÂØçù†ÿþì»d2" Ó}|${›˜š˜•�€i]E.#!$0N‘Êãîü†ÿþç»a,# Ñ[c-Ž�›œšš˜�}daL,! #+Q�Òåóû†ÿþí·b1" Ñ,R1”€�›œš˜�xofN, !$/N‹¾áïû†ÿüèÁ}gU# Ð +/�—žŸžžœ›˜�}vhE*"!$/Hˆ±Óëû„ÿ ýòؼ­ž–l'Ï.w�›Ÿ  Ÿžœ™‘~oaA+!!$/Jx·Ìíü‚ÿ ýïâÛϼ¯¢‘m(Ï. J|”›¡¡¢Ÿ �šŽ|pV>(!!&/G{šÑéüÿÿüö÷ôìä×Íǰ£�q-Î/&N•ž¢££¢¡ž›ŽznVA'!"%1M{¨¾éùóåçó÷óíß×Ëõ¢Žk/Î/&T…—¡£¥¤¢ ŸšŒh^?' !&0Pv®ÞÝÚâäêòùöëà×ËÁ¶§’n,Î/'V…™ ¥¥£¤¡Ÿ›�‚r]G*!!&3TŸ¬·ÏÚãçëó÷õëÞÕÑÒº�a`0Î/)^‡š£§¦¦¤¢¡›“„peF'!!%V{‰¡¹ÎÛããìõ÷ôëïõîÆ´©šr4Î/,_Œœ¦§¨¦¤¢¡œ‘…jeI(#|žª­ª}‚Œ“���ƒucM_r~y}~…¢»ÓÜåç„ÿ ýðÍt2$Ì#B�žª”}�›¥¦¥Ÿ›�slfdy„zy…£½×íý…ÿ ýòÅn, Ì %Fƒžyƒ˜¥±··²°¡š‡tfm~‡€ˆ¯çðý†ÿýôw' Í &Hzb�°»ÃÅõµ·¨Žujq…‹}‚wÍÉéóý†ÿóa �Í (CX|˜³ÄËÑÌ»ÊÇÁ°”yms‡ŒŒ�X¤ÅÚñýƒÿþíº5 € Í)6k•­ÄÓØ½ÔÕÒÐȵ™ygx‘š/5^†¨Õéý�ÿüëÙÕÅ›J�Í)8:}©¿ÍÍËááÜ×Ó̸šxmŠ9!&:\•ÅÔéýÿÿòáðüýüñk� Î( @C�¹Ë½ßåçäÝÙØÌºžl@$ !'5^�ºÖúþÛÍêþÿþÜw0� Ï'!GO—ÀÈÙãëëæáÛ×ΧkQ9& &7b�¥ê¶«Ì÷ÿù´lS#€Ð%&L]—ÅØÝçíïçâÝÍ’{iV5#!(7:QUr�Îüí“kc@� Ò$*Ql¨ÓÝßéïïêܲ›Œ~lR3! !"%!$@Œëïºtg^-€Ó(-9r­ÓßáëñðЭ¥�ŽyeT3  #‚ïúûÉtQ Õ 3G}±Øââìè·«ª§Ÿ‰vlO €&©ý€ÿ׈ Ö AF†µÔãáÆ³¯¬©¥�‹~I$�.tí�ÿöD× II“¼Ò×·³²°¬©¤ž…sd!€]à�ÿÏ< ×LJ“Ä»µ¶´²°«©›�½Êa *)6Áò€ÿÑ? ×&OJ–¡¯¶¶µ³°¦†³ÔÔÈO);9'.—îÿÿþÉ@ ×&VSƒž²´µ³°“¢ÕÕÖ¹?=A@6>!,–êÿÿþÎA ×&",E~£°µ³£’ÍØ×ÊU->DBx¸n0“êÿÿþÍ@ ×&#&I…¤°¯�¾ØÙ×y($1DiÄÏÎl 0—êÿÿþÎ@ ×&'J†¥žžÕÙÙ«/&%$B¿ÑÒÔÐm 1•ëÿÿþÓ@ × &S‰y¶ÕØËN'&&#SÇÑÔÖÖÎf€ 3šìÿÿþÑ@ × &5-|Îׄ)'%"JÀÖ××ÕÑe 0“ì€ÿØAÖ '–¼;$"NÉ€×ÖÌ_€3ší€ÿÓB×*@!‚ UÈר×ÖÎ\€2–î€ÿÙFÖ…  ZËØØ×ÕÊY€4›ï€ÿ×EÖ „`Ì€×ÕËS 2œî€ÿÜEÖ �   bÍ×ÖÕÕÈS  4™ñ€ÿÝHØ � iÐ××ÖÔÆL 5¢ò€ÿÝI؆ jÏÖÖÕÔÇM€7 ô€ÿæJã  rÒÖÕÕÓÂH 8¤ó€ÿßLãyÑÖÕÕÓÄI 6 ô€ÿæMã#~ÒÖÕÔÓ¾G 9¢ô€ÿãPã"ˆÓÕÖÔÒÀA 7¨ö€ÿçPã%ŽÓÖÕÔÒºB <§÷€ÿçPã&—ÔÕÕÓз= 9­÷€ÿæWã&™€Ô Òз= ;©ø€ÿîYã*¢ÓÔÔÒϱ9!;±ù€ÿê\ã(¥€Ó Ñβ7 :®ø€ÿòYã.¨ÓÔÒÑÍ«6 =²ù€ÿë]ã -®ÓÒÑÏ̬1€:µù€ÿ© €ã2­ÒÒÐÎ˦4!>´úÿ¸:& ã 7µÒÑÏÍÊ¥, =·£€3AZ ã ;·ÑÐÎÌÈŸ/ ' ,Qäõm ã B½ÑÏÎÊÇ›+ 5ßÿÿòlã B¾ÏÍÌÉÆ˜œü€ÿús âJÁÏÍÊÅuBÂý€ÿõu âIÄÍÉx  CÂý€ÿú|! âTÀw&t* GÆý€ÿù�!â2-¤¼ˆ%!GÍþ€ÿú… â /«Â½¸�'!HÌþ€ÿühâ©ÅÁ¾»³{#!G×þÿÿÛD# ãl¿Á¾º¶°x$ IÑþâU@8$ â"u½½º·±ªm" L¶J:AA?y â"tº¹´°«¥k",:EÀþœ!â!x´´¯ª¥Ÿd" 1£ÿÿý¤!ã#z¯®©¥Ÿ˜L sþ€ÿþ‹â!{§¥¢�tTç€ÿüŠ  á${ �n  ]õÿÿúÚWâ %vX &  iùùþÿˆ1'%ã  FtC€ "|âþÿô|cµä Yxnb9 Qôþÿö¼æå2 å^tle]P-/GM¸öÕçþÎM æ )^e`ZPCLfVj_.ZdUÊÊ|R†ÌÙ¦&à4L^rQu8/$'§‰K˜æÌyZ�–u$ß ?ay}>u*! &9EÆÅ^]²åÓ›e3' Þ7]gwd[?@#-"‹Ž>£ë¶]p½ì©+ Þ"]i^…@x1  &F¶ÉU�Öç¦s~Ÿ �b?Þ ShWn\bSR'2™=£ç•|¬ñ�ÿòËœ`( Û1`kI‰LgO)#D’ÃZ¢ô…ÿýÜ–D$ÚO‚@y:„m76@&KSŠãüÿþ�ÿ ûêÒ¹¥‘‚[$Ù$,|bbicB|\-!!&(q´Úà÷ÿÿ÷ãÓËÊÍÞΞb7Ù$YqC~:�L-).(Jp£ËéôÕÆÊàôýÿÿüá˜O$Ø9hF‡U†e�7#!%L™ÊȽ»Îõƒÿúå£Q# × LJ�Mw\z¥G  8lˆ‘§Êõ…ÿøÜ�O# Ö+DhqW€Nwa99(#Sp~ªÇÝ÷…ÿûÝœL% Ö-K{@�ƒ‰‹iU>$C`__«Ìèóþ…ÿýâ O$Ö+xE…NzCnfR@+%A?/>r§ÈÜõþ…ÿûäžU# ÕaExy�erk]U1'&:g„¤·ßù…ÿùá¢V&Õ *Bj‹AruqmM!##5^еÁßøþ„ÿöÚ›P$Õ 7MŠRvsxv+CC*"9n®Ïâïû…ÿûÛ˜Q%Ô4wZvw|U7bV<(%=w¯Ïæõþ…ÿýãšT&ÔSdu{x,)mm^O;''f�³Üñý€ÿ þîÓü°¡–‰{]! Ï >i}„€‰%‡ˆ…ƒxi^H4 '}§Ÿ››™˜–’�„n¹Éa *)6Áò€ÿÑ? ×&B=‰•››š˜–�q¬ÔÓÇO);9'.—îÿÿþÉ@ ×&HFn†˜š›˜–|•ÔÔÕ¸?=A@6>!,–êÿÿþÎA ×&#:kŠ–š™ŠÊ××ÉU->DBx¸n0“êÿÿþÍ@ ×&=q‹–•z¶×ØÖx($1DiÄÏÍl 0—êÿÿþÎ@ ×&>r�†ŽÓØØ«/&%$B¾ÐÒÓÏm 1•ëÿÿþÓ@ ×Fug±ÕØËM'&&#SÇÐÓÕÕÎe€ 3šìÿÿþÑ@ ×,&|ÍÖ„('%"JÀÕÖÖÔÑd 0“ì€ÿØAÖ '–»;$"MÉ×Ö×ÖË_ 3ší€ÿÓB× *?!‚UÇ€×ÕÍ\€2–î€ÿÙFÖ …  ZË××ÖÔÊY€4›ï€ÿ×EÖ ƒ`ÌÖ×ÖÔËS 2œî€ÿÜEÖ �   bÍÖÖÕÔÈS  4™ñ€ÿÝHØ � iЀÖÓÆL 5¢ò€ÿÝI؆ jÏÖÖÕÓÆM€7 ô€ÿæJã  rÒÖÕÕÒÂH 8¤ó€ÿßLãyÑÕÕÔÒÄI 6 ô€ÿæMã#~ÒÕÕÔÒ½G 9¢ô€ÿãPã"ˆÒÕÕÓÑ¿A 7¨ö€ÿçPã%�ÒÕÔÓѹB <§÷€ÿçPã&—ÓÔÔÓз= 9­÷€ÿæWã&™ÓÔÓÒз= ;©ø€ÿîYã*¡ÓÔÓÑϰ9!;±ù€ÿê\ã(¥ÓÓÒÐα7 :®ø€ÿòYã.§ÒÓÑÐÍ«5 =²ù€ÿë]ã -®ÓÒÑÏ̬1€:µù€ÿ© €ã2­ÒÑÐÍË¥4!>´úÿ¸:& ã 7µÑÑÎÍÊ¥, =·£€3AZ ã ;·ÑÐÎÌÈŸ/ & ,Qäõm ã B½ÐÏÍÊÆš+ 5ßÿÿòlã C¾ÏÍÌÈŘœü€ÿús âJÀÎÌÊÅuBÂý€ÿõu âIÄÍÉx  CÂý€ÿú|! âTÀw&s* GÆý€ÿù�!â2-£»‡%!GÍþ€ÿú… â /«Â½¸�'!HÌþ€ÿühâ©ÅÁ¾º³{#!G×þÿÿÛD# ãl¿À½ºµ°w$ IÑþâU@8$ â"t¼½º·±ªm! L¶J:AA?y â"t¹¹´°«¥k",:EÀþœ!â!x´³¯ª¤Ÿd" 1£ÿÿý¤!ã#z¯­¨¤Ÿ˜L sþ€ÿþ‹â!{§¥¢�sTç€ÿüŠ  á${ �m  ]õÿÿúÚWâ %vX &  iùùþÿˆ1'%ã  FtC€ "|âþÿô|cµä Yxnb9 Qôþÿö¼æå2 å^tkd]P-.GM¸öÕçþÎM æ )^e`ZPBLeUh^%UbUÊÈ{Q†ÌÙ¦&à3K]pOo6)#§‡K˜æÌxY€•u$ß ?_x{8t#5DÆÄ\]²åÒše2& Þ6\ftcT>:%!ŠŒ=£ëµ]p½ì¨+ Þ"\i]‚e‰310/-  &;PWgw�‡Š‹�ŒŠ‰wdD Õ( 5J‰81021  .L]ho|‚†Š‹�Œ‹ˆ~dB Ô2u.024"("  2M\ju„ˆŠ€Œ ‹…hC! Ô)P,142 --%  /?R\s~…‡‰ŒŒ‹‹…{kG Ô) 5%15'"52+!!  ):HVh|„‰‰‹�ŒŠ†whJ! Ó*"15 4652)&"  (BJYhyƒˆŠ‹ŒŒŠ†vfG$ Ó0377652,( € .IW^mzƒˆŠ‹‹Œ‰…wdG! Ó*+++877662-#  4M]dn{‚ˆ‹‹ŒŒŠ„|`G Ò! 2€87763,!   3P\jq|ƒ†‹€Œ ‹„{eF! Ò 5‚8763*&"  2G[gt}ƒˆŠ€Œ ‹…xdE("Ñ 36�9#8863+(#  0ATdr}‚†‰ŒŒ�…mNF@:6% Ð- )389:9:9874,&   *DOdr}„†Š‹q]WSNFA;4% Ð+58‚:#872+&  +8Q^r|†v`_^ZWSMJA<3' Ï,59€;%::982*%  +>IanaWY]_^[UQLIC;3$ Î/.6:;<;::982,#  )@QPSVXZ]__[VRLHD=5% Î//8:<<;<::83-'  3;DNTWY[]__[UQOTF. Î/ 07;=<<;;:84.&"*1;EMTWXZ^_^ZeufKC>8'Î/ 28<==<;;:84/#! "(,0;DNUWY[^e|uZROID=8+Î !2:€=&<<;:83+& %),1;EOTXYpzg^[WTPHD=7+Î/ #4;<>==<<:84+"  $(*1€=$<;93)"%+,1%=<;7%()+-BEPTX[[^`_\VSPICXJÎ/'6>=<-%&!!2;DPUXZ[^`_[XVjvS.Í'7<€?&>:$"$$!"'*1;HPUYX[__^sƒ‚wgP-Í1(8=?@>.)+,+)(#**),1?:)-14322.(!',*,,/;EPUYfŠˆ€Œ ‹…|iP( Ì1-9>1+18;<;973'$"").-*+/<93*!  #‚ïúûÉtQ Õ+@PTTXWB?>=:0)% €&©ý€ÿ׈ Ö/COUTHA@?><91, �.tí�ÿöDØ4FNPCBB@?><9/8]!€]à�ÿÏ< Ø4HDCCBAA?>86¬È_ *)6Áò€ÿÑ? Ø%6:@CCBB@<,”ÒÒÆO):9'.—îÿÿþÉ@ ×&.9ABCBA4mÒÓÔ·?=A?6> ,–êÿÿþÎA ×& ,;ABB;GÃÕÕÈU-=CBw·n 0“êÿÿþÍ@ ×&/´úÿ¸:& ã 7µÑÐÎÌɤ, =·£€3AZ ã ;·ÐÏÍËÇž/ % ,Qäõm ã B½ÐÎÌÉÆš+ 5ßÿÿòlã C¾ÎÌËÈĘœü€ÿús âJÀÎÌÉÄuBÂý€ÿõu âIÃÌÉw  CÂý€ÿú|! âTÀw&s* GÆý€ÿù�!â2-£»‡%!FÍþ€ÿú… â /ªÁ¼·€'!HÌþ€ÿühâ©ÅÁ½º³{#!G×þÿÿÛD# ãl¿À½¹µ¯w$ IÑþâU@8$ â"t¼½¹¶°©m! L¶J:AA?y â"t¹¸´¯«¤k",:EÀþœ!â!x³³¯©¤Ÿc" 1£ÿÿý¤!ã#z¯­¨¤ž˜L sþ€ÿþ‹â!{§¥¡�sTç€ÿüŠ  á${ �m  ]õÿÿúÚWâ %uX &  iùùþÿˆ1'%ã  FtC€ "|âþÿô|cµä Ywmb9 Qôþÿö¼æå2 å^tkd\P-.GM¸öÕçþÎM æ )^e`YP  *›àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿךJ xÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß�P  B±ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã¡Y ‹Ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç¥b>ªîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì©ik·óÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿí­r#ƒ½øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô±{,‹Æúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô·‚" 4”Ëýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû»ˆ) =›ÓýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÁ�3 D¡ÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÇ’;  N¨ßþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýË–C Y«æÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÒ—I !a°êÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÖ›V #pµòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝ›S %{»ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã¢I )†Âûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè£? /�Èúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï¢$  6—ÏýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏh >�ÕþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝ›)  G¤ÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÓ_ O©ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ— ]¬èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»)!h´îÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©2$uµóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü�4'€¾õÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáW/+‰ÄúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûœJ$  2’ËûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ^; 9šÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷†M) B ÖþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÑh;  K¦ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÞš3VªãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ�  c®ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÙx"q´íÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ~%|ºôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÝ… *‰Á÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜ‹& 2“Åúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþß�,  ;›ËýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÞ’1  DŸÓýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá—6  I£Ûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþâš= P¥âÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã�B V¬éÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿå�H !T­íÿÿÿÿÿÿÿÿÿþí½Ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿä¡M !JŸÁÔýÿÿÿÿþöÌyj£Ýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç¢S !9s¦ÕûÿýñÕ¨hVHMŸßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæ¢Z -Bu º·¡{XH4&%CŸáþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê¦^  !0@MROF8'F¥åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé¥a (,*# Nªçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì©f  V®ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿí©g!a³ìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿí¬i#k´ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ­m%t¹ñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð¯n'¹óÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó±r,ˆ¿öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó²r 0�Á÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷¾v 5“Æùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú¾z 9—Èúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú»z =œÌüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø¸| CžÐýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø» H¢Ñþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù½€M¤Øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù½€T§ØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÁƒ! ZªÝþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÁˆ&!a¬ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûË."h®âÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüΑ4#n¯çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÑ‘5 %v²èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÒ’0 '|¸öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÊŠ$)ƒ¿ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÐ� ,‰ÂôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþËL 0�¾ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò  4’Âöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò˜& 9–Åùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñº„S$ <šÇúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûúø×W  A�Éþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ­'  F ÌüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂT L£ÐþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎr O¤ÚþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ†" WªãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖ—( _­çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿߣ,"d¯áÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿí¨3$f¯çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô«A$_®êÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿö°L$WŸÍÓØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøµW"7Q^œþÿÿÿÿÿÿÿÿÿÿÿÿÿÿû¼\*7rüÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÄ] CóÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÆ\ Ÿæïôøýÿÿÿÿÿÿÿÿÿú¸J0ƒ­¶¿ÊÑ×Ûáêøýþúß™: /F`n{ˆ”¡­µ·»¾¸�W0 #-38f|{âM¨à´Á‘™Uc£%~‹6 ß‚š"Ô²~õüîdü¿,±6KQD\��¿QL· µm#ïAq&ï@*¦ƒÍeLW4Í?^Cð¬ŠõÙi�ÕÖ_¸ÃÏÀº~Óó2Ph9¾>6A¿öø£g¼÷”Ãu«¡W¤°ÔòGBˆ¥{3¸˜ÚÂ5cçÏûÅîlX-ª)BIæòx‰«�ÁBÓJ„Ò÷ç­ÐÊ…¿¾¢©dpg3忝ÉìwàȃQ¼ë³—W.ÙËÔö¯+P û'ö/«�?¢#èÅʱʺÂëŠÈ’,C2 ­ÏÀ¾~óó2Ph9¾>6AÁUÙNwê8¶MAè&8ȇ£Â!Ü ¹"ê€ÓNÂÛë(=ªZ‚¿í…SG öaÚÖböþ›ãàÕpaúèL°§ê ‰ÂÍÝhX$m23ꑘ9ïìwàȃi> ­`¿ùÝgp:X=ìññ;9Z_}È‹¹Ù-ˆÕ’—%ù~s¼!ÌXgÏÀ²~³ó/Pvz³œçÉâùåñç»=ó/C5ò6rzG÷ŽSÕ¥Ð{U:¹‹õ¸À7û b׌¸ùG•¿~ý%ùã P ƒ¥«»"cÀ“¸Ú‡6•�›z6ÔsÑ%¿û&íûÉrJ‹åò ÇñÊvîÃç³¶‡Ü€RÕG&C|˜]ßoÏ®gfÈ�*b?ÏÀÊ~Só7³ú’H»mHÌøîƒ­¡´Ïa‘¾€üIaýü½âr~%¯ì†DAvIïO? !w+8@ç³Äc2+LÉS¸ML�¥P×ý±~øçAz]yÝT1 OFXF¤A�7Š!`j¦Í_ùz'fs{“|ÓZ85§6y5œÀ@\ÆriÈLǘã–xk³ª1³ãž-´¬\³Å¹/ÏÁÖ~só}”©Ã%Z°8k÷®Œv¯†½¬˜VEñÃz< #”©M'ãkg&%�¾ZþÀÚ£IÒ^]xÂN�—�žfÝ=ã�4ë¨2³Qx¤>×�‹ˆ<6øá o0tj«pQ§–¸¬gúv³ÄöEܶ˜‚÷KÆæ‰“ª©> æ×¥ž/æPÚͼz$ÊXåæo}k[²G‘³ì¨Ð]ÉÌ*õ�1V¬Uùø›;V­îJƒ}S7ÙÇäóhçÓß‹–p«\½Ö ºÓé:Ä®ÒQõìðˆ!F�"\Ãó~ÕÈ>¦½DNϦh.©Îáåxc”Ö"ÒqI 4“/+ÃgÄu{.ËømÒà&9ôDÖð ¬ekÍFh*1›vüİS§s¨Ôoi*~ Y¨äåÏ-÷>mòÚ'+™0pñÁ&hóT“=E Ï-¬¾•´s AB„]…Ê÷F:2ÆÖ1÷ÞQk¢E6F–î[¼:[ÏÁÚ~só|“•87&�)اo+”ЊôSÌl­Lн«aj0ŽŠûðyÅaį¦Ç˜‹{&�áfF¬Â)iüwŽã'ÍŠwz‰þŽ¢�¿§€ây3yÌš£úIå�•ñs£%Á!ËoÑWð!G‡Æ�ÆÙÞÈ‘G êKE4•YyŠß æ×¥ž/éƒJXŒ\g ˆ&x³.Êl8ɵg ¶;jÄy˜ºgí øµÚŸóV£¾ªþï¿RäêC£Ùá8ZÎïPDA(ˆÀ ý@…á§ÿ|‡ï7 ”Ç ú^�TnجVÃÓZ,Øȃ;… Þåq£gP_”Ö"ÒqI 4“/RÞ�ÌœYE…ÔÜ0mV–ƒrr”즸›\w¾§Iü’þ�Àº·�Šbºõœ:'aJŸ¼¿®+èf¾0×#nT¸ÇR“C-x±LC)Àè·`S‹È$ø)ÑžïÖ:@Ý|Ú—‚[È[)÷ÏÁÂ~ Sóx“•87&�)اo+”Ð�ù¯«¢$ÔÄaO®¥¾€•0RÈI;ɼ‰ì1ÝŽ¢àŠ;œÿ dî.–µ ª¤Æ6„'™ÂÐb.Ïgà‘ž $§Þîàá)›«š®wž·ÎÕMøÐtÊçÉï YÙ— æ×©!¢›qX k¶–IRšsð%ÿ\9°uê�·¤VˆÖ`{,çagϱ,Ë{-æêE’IÃIc¿½Ló»�uH³µ1)býmè­Øä·))á â´Å0×ÏÁö~‘ø?€C°Š¥÷(»¢sÓ+u7�uqcÒÙ7€_îcÖ˜u¦qÅ®Put=QXés±¿+Âb¬´À-ˆ¶ÿ3,ü¡ï¼Ä‰Ž³Pnõ„U|Òå-ÅpsÄy 4BevYPï? =*ès™Y|î¥v€R —ÅØ?uÒ6µ`s;B(€gn›¨| ýœd§Ó   4"r8a‰\^ŸºâÊ`Æå0á�Þ}“œOůgàÜÛ> éaª-á?£�½Kó$×yngTù+/^ŠüìE*Æ…M²™• çh?”Ú=÷fsä.Ù^“ø� Þdá5~s<áQñe*³­¶VúÛ«ˆêóvñøa2qa_�3µ(_uÏß“G#3?–’nó£pågH™RP™&(˜à1'GrÄ£ï¨lsÕ°gþÐs÷¼Ê†Ðÿ.èÔc±»ððÿEU�É6”¯ ÒÎ*Î?Ú!ŸÔtT�B…îOs­Ü{ØÑú­˜t!œ…׺`幊G÷èUŠgnˆ²°;A¸ÍÅ ÿH²ÚL^œH,CŸh�S`ö6ZçOÏÃQgá¨Qøj¸Ðyч�¶#‚ Ydðº†ÌŸ;Aû‹n²Æìò~¡¤€�éé·MÓ‰àe¿-ãî vj©»i^²NĹbæïîW@íŸØ ‘²:ÂûÏݺjÂ>œq;¹y”X½KÏGÞõŒ÷jnŠÁNN¶¸qê=&·=énE™¯¼oŸàl`Êí.i³üÊð¥Z_3fkÃÏee¡'”o½äæœÑH1ÜÐù9Ä—«À½$U ³hlTk wÞî¾Æ{‰±Þº#×a? ,ò²ošdÎmÛÈX€/þáFÆmåF”ZäX!Ÿ+u<_„ì°ô±¥ÉìÌCÍ´"mó\@¢tKƒÆ`'ù_ EÛ�ÔÀ�ƒGO6åÔ¥o -}YdŽÿ].»·Ûªjõ¬HÿM3 |åøw[idg™4B~´äIC’¹C;‡ëTY?å$•z àåâ|íKï²jI·Ýî�_·1tq2:”y’ÁÒ%IÊcätá>m9ýçjâA?׉kMè|鿣�,ê[ß4I=Ò s½þΓ©Ô’ þ…E«Ë©ò¼¥ã«¾å~�TÝá,ðꊈëj!óÐh©P÷Ä,ráÕxÛšO¿�äÍžÕ7#ì„YûW�|”Ü UjDÑä÷¦¸W÷ɞ E™ÝÒŠ´šzŸœ*û2@ÙÑL©Ôœ t ²Úä#”'¶šâµfGI”ƒue…œ"3÷æ‰ÏÈÂIðÀñLÑ¥æp¡²)vüævºD”Õ:6NT–w¿ É¥œ=àÌ0V lÅá‘P#ü§l81,iQ¨3"âN ­©¹ˆQJ7?ÐÀ9 Š�£À‰dëW,ÚÇÓ�[aI`Ǧ8]±R½zØŽ*˜¦LíؘX.,�j£ßäITÕÆ]èpa=d€‰¡Ó”Á!K¢ÿJ$¾h‹ß4é!�@§p.îüpÛñ»Hʪ¦oñ¤‰µ±"ã#.G»\ÈO“þ�’Ú/!œÓ‚û_¶$]ƒBŸ�ÕHÜ�L¸w9ßTCß° ¯ëZˆt¯*KæàvdxáÎü Í‚Bg‹ª5Üï?øréÝ@ß2™ÝAæè¿¾&OðëóNêè�û)äžg•iŽ$sû:Ã�¦‹äa€ÌÂ9õΜî ëÎC5IF%êqmë½&` Ø,ƒ½(97ÖòOàÃ5Üc]¥ÙN+²$ĨaѸÀïMPC˜9öÅœÐYòRì$ÈJÏçÜV¸Rótänç :¬;øâ«–CsC@ â—cÊ íDÏÃAgá ±øhPãŠÈ[æYØŒylÛ}[¬5Ì•"ë/{Mù°´GÆ8Ã’IÓÑÊvX=ÊàÖd«ý‡÷‰ËiÛDütîHþzÀ‹íÇ,sn;ôUÖ}|²ž¦2˜2åD‡†éžû¤ê4ÛÌwkÛêµï “xÁBf'@kÔú™¬oPo„E/ÜÎiu9Jw”ûðióŠÑò©&)§órbå;¨Í]ô˽êæRçGÑe�fÜæ­žÄCfxqj\:v—ûÉÄeÒ¾íX4�yͼNô¤Á/XrnC}vûȶ+yw ut•, uð뾕…Œn¢»Þ^¥Ó+q43Ͱ-­N ™i€¢Š¼[µ².’›w&_Ó•±ó¥‘ô÷(뾸°…÷) oÔÈe¿Äæ¯yƒfž áÄ8èƒDÒþ°8|ú’Õ$œw*êc:ޝÀ¯íÌ‚M‡ñÛ°ÙÒ¬ÅÆÑÌUÇrëx�º¢Qî\ÛÃò§•÷ßÊqË÷å¹6øÌñí†ÆB#`ò.Î]uÑaï²E�"ÇÛÞ,ü;´�ÃÐ 3×¼tFŽÑ•AËŠÊ¡jþè'À![éÉJ†è@RBæÝkmÏúZ3ȼqò³kòÊSPÛ.Ì‹ÙfÜ4Ú0ögd¤YMy=Ž­uÂÏdà=œçÑ•©¤ôÊ^º¢,³~.¼Ãg.¾ùh� U¶Ä†Ãe²Ér¦#¿7AÇÿ)–J¹xw =ìÅQÇÏ�ÃÅ^ÍŠÍ1Ó.èÔ£Pb7\ô««èW »Œ»3W‡»N&g" ?±´õ#Æ�f9º&×>˜#–!WØÊV%,¸Ð[w°³¨"PÆÌ8ÙWË5äºL'%‡÷îú ä9qɘÂÚ _´t÷CÐS¯qTÏV^qˆQsMŠ;K}šÕHŽJi5±¡ ëÁßaîU9äü†mزÒDÊý”5ãˆdÍ‘}åE�ÀK¼WHyd.mê´äߎí”aœ=¤Íc­-kHñćäöà›‹Çš`P—®(ž©þľÕ/­;_ÕÞHŒsÆ­1 XUG©�¯p‚Š—`p/’i¼¦&Ͼädf©�$~»Ïî ¿¼qlÿ €/€¨œ @CS[³ÛA´w‚w¸›roÁ؇"U<‹xa’ž€¨1à<ÿSP?ú!Òùv”9M’ìü·Î~f«~7Lò7ðû¨“} Â¤hçŽ@/¥2¦:äÒ ÏYÝ™bß¡©åþin$‘ÙPGåj´fkeYç¾Xo þ#c9óÚÊã±5´}z‘†E°J'äSÎ$¯Ø°|¦g˾Bã¬ÅºÃþ! è__ødÒì�Gpzù–¥¾¥CdE-ãb‹$�×ð=á óý‹Äš#Vta_šyÅsYô«ï®³ó2%]îvãF±›a\úñ;¨•Óßb+•vÃ{:Ô/ž˜1Lf/qŸ¶Y”àã¸ÔUÄÞcê%',QþBòë$À ôÐbáÄ"·”~ &D�B€`ù Ývмɵ`Ø:*Û’-AÛ õ±쎯à¯ü•–?$·cn@q†–��êäe25#kÏL–o~ë`¸ V¨'#àû„ÝY|áHÿ}¹$%Á퉋— á—#KñôÔá$Hæ³ è–‘´ØH !G_Æ—ë3z@ë«âÅ®êkµbÕ­t.ç«)¶g˜©é³èQ.q(>„1øäŸ†¯ÒCz�Ú óNÀ¼.ÎYÌ#‡h¬r4ãu^)�þì Ý£HA:Qƒ% Tøúÿw ÚúÈd¢]TTÏV~@Õ,ãMܧü¡}#ì™MãNÅñu@¯Ì)¼^¾»ˆ�p(ÍÁF²h„Ò‰¼4¨£Š�NîuµýV‡TÂO¦šsƒÕÍQY¾mVÛTwÐxqþ*wÖ¼e€}›Äìi¶¦³I+Ÿ�‚”8EL±6aé•*Ø“õtÞ2û{Åm¶i¡�Öf(îc%¨„ݶðXE1êMfœ”¢H ]ƒOS·%¹FH˜;Åàd”¾ÎÌÏjžÞ¥<ÛB˜úvhþ_è|Ãæ÷ѪO7�V4 �Й¸ 6aüca2]½ý9;“‚¸Ew)õZ.Xpxˆ‹nSj�—…ªnõ˜B‘iiê� ¥UÎ%b»î°DzÞ:ò\’†LMAO{˜PšÁãâ9¦,\¬Šï-?€o¬Æ]o"e*M=0†b{5¦Ä`üÛÉ]r=fªñ¯{˼~ù‚0:!-¡wì5/ú’ à¿}èUÌhlžU¯ììw Í3¢‡¶Lj®´’X왕Ãy®£ö”V£w¬ú~ûD-²KÑ]gg€ý@ :æ•[o[\­·�„Ï·¾+Ö(¬Ð5Óß3OU q˥ߜ¦–øa»ipZ!¥ ðÅ’Oø»Óʾ–ÔòRȆ3†®8®¤\³€½LûaÏ”†oÒÐÊ�§äúx={ó$3™’…�Æ Áz§LvxXãÕ0E›B"z‚¨Á5™DV‚Ù||êYkÁq*d"3»%¹÷gAZ�Añ]¸®‚KwåC£ú‚ˆ2eߎ¬¡Ù&·­µïƒÚÐÑÊv�‡ñØ NÊAÂM/[§:ëU�^ðù}ÌLú ÌãÍùeð }…šÅ%Dë‘ÔnuË@â£VèNø¦®‘ßžXƒ~¸Ñ0ëÙ$�¸¥â¡~PC++qO"쑦,'êG°RÃýæÇÛÝÌü;ª�ÃÐ  3×¼u¢¤vËÆ»Eý5c-¯oÜÉC T|EÈëÙ 8Ì ÆÆÆ…ÝmV0g6 Krâ«¢Œÿ`7A¦Fmï(O/=Â@öƒÝæ-«­g9Ô—¤ýø¥!oóÒ+ö�–§ ¯Ìj¼;2ù )ø¾�JûT("yVöÀxè�ãý‘Ø%®Ž.4ʪü³˜§ý•Û $!ijb#©cºN�üû ÷±´`Dɹ̮ŽDò~6iÈ M3Ñ8× ðãíJì…=0Ÿ› àè£;KçpE!».�;ó&�9P¹Mñ׉ÖMá²½ZKY5�¼7w¢Ý>Ó§§ZT¾£¨��kq ¢_EäS‘Ve*(3 Ž)GðES¯{H ÙI¾Ý¥.”‹œÇÌEŽÏƒRÞOÍ2ÅV–�öõbãˆy²¯HËT³ù�”}$KV僼W%/œ1@†³ ÓæQn¨l¼Š<-Ç ÚáMYñªuÓh9pìSþu· )hµ©¢Á9¯ÌRYy3«&%K+¾� û§þõ†œÖ"Ý�AÅ&ÕSnÆ(Dí’Æ.¼Ä¢gƒ9Aº×qgÒIùg·ÈKV/cˆ9 rçepCÙ%d‹=ûöæ¹ó¶Iþpg{“þqÒVó‹¬ôÔ‹ éøz•<ð‡‹8•˜¡0‡<¶UkÐú5É:Nü^êÒUNÀ Ó™:;s°ý7)+”» ò™ 8U~‘¡·ì?ÙÄÝ^XÊX�]w‹&Éæyp&]BÝ·›ÅF.ðÍt©ÛÅ=b"I0¯ÒdqçhÉ·QrÖ)÷J&yôÄø1“^éÏÞ®j6�ÌÆSóû¨x©eü!sßç 2Eʸ x‡ˆ‘ñ�þ©uÙm–txGáÍȹ N«ÒRLPf8‰0´sÙ¸2÷ â<¼«´›ÄÓ^ÅÃÊ+亴ٽŒæìÞ* mÍ2÷Q&Ý¥á.ÞüÎ#2²Bê™fxÑ ä« ¶­gx7C¢Ê%b«åÇ�ÅôöH,Ѓé2±$F' é,R¤DÍ¢Oå|óØ)‹HkŒƒ®“IC¹ ÛèÙ‡×Þm° lÄÉ™ÊQÐI9ÔTÝåàCÖÓÄàXé¼.°k¨»µXð]hP0Df�›‹»˜LR¬¡ Õyk}�08Ž�÷ÛƒÆßá’ÿC”uÂgs  |"OŒ¹J³¯ëývð0â£ÒÄÐï•%NÔ {H£…~›ÀªMh|24æ£èyôu÷�™Bòƒ+A�Œ˜ëÑp\o¸‚¬þ€êm ÀL†¢h³ÚHBÏ[Ü‹#Ì á{1^á´�'cŘ ]õ¹Ní+1‚�€TÛs˜…Ý`w£ýäâí1 æsµûëÖðÈ­Ù Å«ðñèß"†P¾ �FëÓ#f¨*d°Ês9=D¼æÜâ�”íÛZÿ ÅÐ!î ªtŸ‰F[isTÊI�XFŸƒy$ÿ>æbµÌ$LÏy-EÓ˯úx‘£‡ý{¸JÖ.£¦’ %ÈIX½¯N˜jTÈþAæ®i¦îÜ €R˜RêKŽVãi̲:o…H#yÀǶYBà²ìÔÚ¦ù{mÉ-j"*Û%tÆ :ä\¨Ö]˜fI+°‰�Ôà N1qìUE)¨ ÷ûíÙ†FE>\:„‹hŠ‚}õg*“ÅÎחμÑÁ©)mÌó|ƒ”/@äp-ûó‹¼Ñã3“e>Fäê©ÄÐSR¬%¸5N[¿¢¬Qq!ThS�?ø ºÖl×§õºåÆ›Ö7^q&[AvßËÈ�!½Å¦2µfÆôpY×(;Ú³LYÅÐ�·Ä._ñ­Ì˜7¬/æÝ â=XN!øzl/²¬-i¡Ò· ‰2qŽ£¶%­ÛAY Ä>4”a°T•�Mi7oßXÜëßÈrI3ÅkšWwõ�ËZØ fÃï(rAŒ· Æå/÷Õú äΈ (¹{V‹#þ¤i§œ·t7·dœ°À�Kt3ò³~À0Hßñ#jI�ÚÈîå肜£�~¡Ê’EÉGÀï±+=`§‘'#œâ’_¢ö½þ�2eÂ|^¼�jæSŽ®ßE!˜¥ñÐ Ž‡53' Ý:Ã1Ôªoã©oD£PHƒßpØö¢µ^YËÿ ø €Ù±W¤‹Á˜£ÅÔüÒÚE‹1÷ŸuOÐß _T÷&×#ÌS(—î¡vpÿ-£é̵V³#5´s°-ÙºfäzÔÃ�Ÿ¹¢{ý ¼‡6ò‚ÂäÌiØ„ƒ¶Rë"Ž+Ñ$ó²7=TÉï®Hü¤!b©¹®0ãW´”Ÿz‘…{™$Ù?Ï€öV´—–f1~Äày.t†MªˆCƒ¶1hh—CS5Žn—|�~8NÑS_Â^åΊJ ¸½Ã¹ìϸk7‹D”‘ ˆNÑ®z�Ö½±y–N‹=Ø�Å�¡»Ã�Õv‘²-Ô·õ´X5ìz¯yEÇÊ nVSŽjöÕ±?•, Býê™­Nöàø´˜‘µ½/¬®%QÚ6êxWC`ëŽM¤)Ç‚yoçqaÑ"ù„N59ÆCäÏQÑØ†Ò]ï,2ÎÌ6ZrÈÔS/à$§ªs^°á@:Ól{ë1¿Å hÈÔp;ùO&ª2¡É茗9ùDc°¢¯Áº~ð!Åé¹Úlw)Õ!k”£hòÐOéñà¡i)&S‘ké•gÂÌZø„N°Ù 5(,#¦ÆMŠøðLùüÁaŒÎ°ð}tÓE»‡'¸¯Œ2(TÖß©÷Á¤<«…ÜÛ!¦ñï¥R„Ødõ»¤›Çè1LÃ…Òú—èp:Ï¢HnØéQ 8²WEÁïäÜ •×RSµ#„>ìâbR•þ¢n]ßpHÖÑ1Ù˜iŸ‹€ ˆtQ¿V•oïoÙóô^¤ÇëâÝæ"ÔËÏãô“롈+o’šk‡½{ g”ŽŒSP`õÞõ£¨B?B‰ê¤êìû™ô˜Yé�ÕS#Lšª´iÏŽäyå+LÃeñcÖï ¸úÑÂ¥}Z°3m/°3£¿fË+M­®¤0/f3î3#oÍßYxpº‡:6u…ç�ÝÝ´)bâˆÀLV¨‡’y r$¿að 唬±Ï¾„(%úBj® 2vy½”ÓÙp243ž[Ðýöb¦ýÜ@„+ÓÐ^G2Dçúæ;©žìä¨õÌ?ËØm?ÕÖ�¶ eSå |+A*OèÙפ3fÖ}9ê eq4ST–YÞ‡9�Ü�;©ƒæŠK¿PÖy1v„ –Ò%^~CÐ7>ð»bògô7C…Õ4ŒU‰è¿÷Öž‰� Ê€ldßÄ Å{U“é‰Só^ä“M>äçÕ2¾71o±ÅrèËKDÊ[(ØZY¦ÈëœÚEìöøŠë lDt&Û~ ÉB‚› âaÖ<\½�Ö¹ÁØ>)$p6D2—‰»¿ÿoFÕå�ž»Y¯ÇÛÛÌü;v�ü° 3×¼u¢¤vËÆÂ·~ÿYAôDo/¨Þ¹ô.(¥ú[¡ûoì²[,Øî»ºÃã7w8%é›’}ºœ#é�ì)ôúdäKh�5é8¬§§óÅ”J© Ñÿ2€òÚ‚´¨“á:ù¶iš-£æùð…€Ýfé¼ÈgLb�dÅÎFÖ‘<éÓ<�c~ª†ÔðÝO56ÙÃ?<¾Tmízl{À6„ÜBò£I.Pwg%ì>ß«¬Í�?ä1áÁ]æðgˇya˘!œU«|ªÏÐ@‡ÀR)�æîñÂֱà žÙ5H/ñ:‚f!säñ]ª²K&OaiœúZç5î«©_rR•ð/ïBb4kkö™GöÁ{íõ§öÜò®@FZ7¸‡ò!±°Å—CöŠÁã‹K „�KðÇlµ¸Çiæ7П`)ñŽÕk¢´ííÌûÿOoÒ=t¿ƒÍ$7ÿht]ý=’ï—}Â`}’¹Œ¹+ÁÀdÖ¦ÍE·³€Ú–f–8g£äi*,ƒ%ˆì20‘qŒ';H°ÌàL°9àB] †ïÿ üÛ5X'Í>üü•2·')JÞÜ„à¡-Tß>†ÖCƒ^|§³*ób¼aåà,óÑL"0×Òè½zçRÊ뉷$hî[ÅI¬!ÆÈ¶)ãûû3Ìu½ÈþeßsNú·ÝçxÊÃÚûù‘VŠah$êRsb—Vo�4%h÷,qÞA~ ö)y˜é„¡N®PÒ S*2~ s;ûð)Þ³>^ž÷/-%ÆðL0Ÿb¨a$ë;‰ÿçØ¤ Âç+öÞŠ�|c›žÌ6e0þs—ÞÁ¿W Õ¯N„w Å!"°‡ðJJ_ƒ ù \ ¥d�_˜�‹ @‡��Jn¥¢ÃLwhVL"öã÷‚�µþÀf¶ Fq —ÃͰ憈1 ãŠ]m=&\TTÔtíBþ�UÐû±ZõLùðÊ››‰\š2Ó0)‘>¥$ Ȥø®rD@îøó¶·Ö„2€«æ¦J=@ú��ºötóR�í)T­Éqäó=ž#Lsž§NøV×­ò€Ê¸¨ß�ßÕrÀ©9·ò›))ÓàwIQ±¡U¼c´ A;?Š8À*§�‰yž°æZ,"Oÿc�IΕ¸ x‡ˆ’³è`#¹^­ÓùáÃÕ¢ÿE �J¾e¨ô>ìXX3�!9zaGµŸA€hâ0éÐç½Ny!y!–hƒß÷šÍÐ>µ½­AOø©®É^ÛÖ‡Á®$œzÝy^ýΉFìxÇõütsiC¡þщçØtv¡ë¥»š¿k„áu2ehXxUã�Â<&¹”§ze@Ý÷©û/=ÿ´Xs3�›’–öñë¡‹Ì¿õP¯ÍÆ2ØÏE#´…º2^ÿ]ƒö€Œ¢çWm®ˆ®4.L‹æU5ó¸.[·n¶¼ÓÒñ¯@›0o¯wh7Î|’m*í�iKý×2\Ä?-kKˆáDì‚“ÆFŽs„Ó±(†pš/k›þ±ÚH]�“?Q®¦¬6)”ŠX`òFÎAI"¶ë—¥ò¼�øÇg;ßjúdoé˜'™OÅ­#Ÿ ÙªŸ2•ÕØ“¡î!,žv,ëcrMéûäší4-0â߃[`\³û‰*W‚-z&é$ oêø |·�à©„÷u4"&{*ì™ûïþÙ$´ô§ó§m¤5‘à‹Þœ> Œ^â8~p¹âI…Yó=¯C(RnJÍÏfÂAnOG$`KñF͆ú–BEôÚÚÀ…Ô‘0¸ò5†=œŸK,Ï︒DµÁI%"NVo.•\÷¦°¸Ì*a½ÿD†‰CBWh‰§Ñn*_®�.¨÷ÖêTœþQGéÆ߉ž C4ߦЇ”Ìv›§œ]@‰¯Öÿv—w Óä ÛL©|Ŭi•³£E‚H튋ä%íáɳ÷~Ø™ ~D°bK¶ã>ïô?IdX\s“Ä_°|dø1jÏ!WW*÷(âÑy¦dbp-•­3„v‰ÒtU}’¸âŒ¹u:våé„¶à©¿mãÕ@*tð:t¡úH§tLÞ`Âl&!Ù²�‡¸Ý»dÛ›$UùäwŒ¢å{ͤ7: ‘r3Ú¨?îMTé[»:E=Ã;‘_Ì.?ÜÈäÇ û=‰ËÿM1mX¬€©ªèoH5/&…wz³7!Tq7…Wxhj‰#~í 43 „á]éÙ!Úžµqg…©/V*5+ÉÏÆJ=‡Œ^°l{^k¢xÃaÙ!]Ô" Ÿ ÅítGª‘þ%EE›ýÖê„&Îp°½nRÅ…òi¤ÚJb>ßÔ¢÷ਥ õë;lõ_þQaX›'tзŒC¶ÅõÐsn/UæK´]cM8Á¬¹N ÕN=éý{r˜¼™3”ÒR Ù-¼Œ,K™À«ž>XƒXìÈ ê�I ¶·xxzE.S¨O�OÛ—ÿ'£Pf�‚Õ¦ú´ö‰õp§œ–a›‹V ú`/8,ÖâvO0ù†î÷¢O³`Wöd+²ñW@ò¦ò€GÈÔ !q1ƒ©Qáùb:_"oš!åSêòŽ–âðã�@“wÏsøéæ aµ°G ürgq–,…²l ÌYyæǹ“Iz‰ÞWâÁï+Åün­eÚ]^�/“–C¤c÷X¶Òqݮᚨ”ÛyÌBÍæ�Ÿv�ø\y!Yò”¥ð8U«+¦@áùAúê;ý<ÿ;�‹žÖ×´1ðúųz{*Ä7‘úhìâ„^]Š:ÝS#òg�Ú DV‹ì—±[ôòå6P•|»U0Q”rÄ^6¯æaLÁQSI¿8(aßlìy“Á5A­sö8pLß»d˜dVJÛàøEÇžšu‹÷toJ𻽇,»}¤èkwÛC©]}Ýäª;aÂth'€Aç’)“.®àš,|âö¨‹™cô•û¦[4‰ îÆ�®kvÐ&¥lÊ�s‚nh’dí@ÇUÄá�¥AŸ¦ÐKäpŒQXKöê>ˆ¿+Ê „/ŽØ–ˆG(M ‹‡ˆ‘̓Úå£9úµ)Á ?õ¹CIŒñÔ´Ú·÷Aê&ÚtÌY1Ë@´=¯tà¡Ìë®öZû u)› ­;SëÖÊ*bÞþy¯T‚!ÞÐÞé-u‚ž °t{$ù9]­âE[¦è7ZQÚ•uŒÈŸPÀ"×ô¢$N�©këºñ•@qp¸y8K¿èWÇÛÒl}½&ÃíéhµtŽÕ¤æ “ðºb-Ù)X;‘¬ƒÖÏ�� _UiV{Užì ¦ýóLýÓ9©Ã¿(ÀË /…dgäÈ …È�‘é¯"GCÅÃL«·úÈtôBýnŠÍª}Ú“Cnjâ—Öæ,6‘n9°ƒËAޕ؈wG/Èm/¾Ž5 WÐÔšÉüïéøI @/ú9»ÁšU(^ÑÇ;*$-YhŠºJ2€ÿ ë£;ÞùT4[@�7l°À“…KÑq¥^¸2ù £z˜bâ‚e[=-PH’Ý»£àRµtsýAë¡‘/ûIëHn¢Â›„�úŒ¢VMsúô­XÕ…Ãàleè5*Õtǽ(¯˜.‹} °ióÿ�O£Ñ¬cLáã—ÉLùD „ý®ìÊY ¨Ï:„ÔÃÉÞPl½¿º¦�f÷(¹ E$ &� ö¿ñ¹èdô®®F`)B›À�³lL®¯Ü”²C™Ô+ÑJ# ‘}œ—aР¿‡£ÊoY%OÛTlðë#ŒlÕH ý`’÷2l— E™‰n‡T^µahLÈŸ¶-…¿Ä’9Ôìa~ôêËøÝ‘ªÍë`îþ*¡eDŸªâ¶õO`¢ €ððwRpP_+<Üï z磫G Á}žç^ÜÓ“:”Ý��1 \õ™x¥~˜ ’÷o$x÷Ìym]PÁW¢ÉïÝñô0<&'X†`·)a7�42àŠY~x]|j`.ÂÒ¤,áè=Eª“�ÏÁ9ã·«Wq×ÉŸ?ë)8«4|!‰6&#y ƒí©½)c.š !¾(i‡éÑ1Õ¢q÷“`’ùÔ^$œ×g~±Â’ÿl¹¤2síÃrÛ—ë„F´ŸÖ<ÿ ĸ�JÔ³ëRªïàÒ|ç*ÙI#o¿Ù‹4-XÆmp²¨-6å~^ * °éi·é þ ±ýÌ~|°�šOÐ2>ºÿS%P sSˆâÇ㸖ËÐÖö›tŽbÓJoÕ`s_ì;Šf6Sá¬ý@D¢F¼N«U&• G¾òlÙÆlÓ6�ï£C˜3®ùl•aTø.j!m_øQÉ1“ p,ü.–h^Ñ)4qø úD]%__ yåé*’-8+™á`þcî,8 r´h^\èÓærXÖázÑT\2ú|/-xn»õ ð&�¡×2×í+¼ÅK²Lî ›xzä�Ç^ð®Û¼ÓÓšcAt-ŸYr8XŽ+]ìOúÈŧ¶fÙ±†”>q2Ô;!yGm4êGñ#O|›—EžþÁ‡2UÚB k‰&¡ânD–?ZÉ>M(ÍC‹-’T½;?RE‰¸kAGõ_\\›¿8ÈK”JðC�ªþ·+¦—Oܸ”@_­ØØö™¡€W˜¥e9òå1L|Þ[fÀ�A«=+晿¡w ÌË¢À²¯³9�çU™°×œ‚ýx�+„ÐFIŸfµ‹òÉ¢<áG$+†mõ•ó`„i{ú¿U{ÃDQ0N :µB)»ÄÇ„f¢’b9iÊ] ªùê[q!‰Tá Ø’©mVÆì§K¸´‚m¦¢’{²;Æ @^øO¨2¤îÇxndëô#ă�²ÎN¬T‹j”Üqv»ªq^ê¢ñÂCªHWò�9\èÇ‹gÚÔçlþ#Ùý3 2X 7Í${Ií!š½÷'}cñèr(ÿhÆW¥Kd ´ìÔ]C„60¯áÎÌ- ]73*1ãÕr¹VHh•”’M„K0Ä['æß窳èäƒå>pi&ìfY)»ÛbaÍé)[¬u°`!nó‚'f³]�¤ÓQ\Øé,3ÅpÛ€žz­Àìr½qWÚcŽŒmmpy‰Q8¶V±FÖ<1nÑ‘>Ìtt"5è6¦&Õ/ë¶F‡@F‡h†aYÆŒ�¬&)ý±Æª‚¼gé#¿€ÇB `8c9t4«¦œù $ƒ8õ“œ£l“mì­=§ÙcÔ2á�]"Âh°&5Ô*ä]«�FY블.;8¨ ªU,ѽg›ÎT\+¤vÊïx/�ï#{‘ÖÉ1SÇ„)Aðÿ#ÑT 3«"á‰Ê%D2"îÿçB�õ ¢iH ÀZÈ(UJbÇØ9ó4ʨ¥þ¯~¢¿bˆŒ†»î¿‹×BmŽ·O°eÿú¶Àóóëq°a‘t‚ÿ*#ȉðVÜoF¦ éê'È®û‰ÑÒ iî‰îÚÑ^¯M¤(rM‚6 ­•ïa\Ì„e{ü>}¼ˆ$ŽS"Tå 6 nvbÍÈ0d¹!uÛE�›¦€ó½±š5éXš…‚*¶›ƒ:í,~³ &ñT°´©*béSs"ö;"ÉÖðÚ?wáw“I#[�Ɣޢì‰)a§çW?²3‘H ó„!7$Î7xn³üsʳ+�‚ëÅCûD}Zb+ºw—R>Z4fcB@’B_zõç rŨ7ºÀHü>ãëHdÏy/[Î�ü7…2Ó`“äº'w®addìæÅ: %L\Váž„Ç**ÇúL좒·$gOmÒHe…¯îM02/©î—�IÜ¡SUþ§ݣ̊µ:Oñ\ëöÓ3u@Í4:ᇳµPoÖ�‰‹ª$—ŸÛž¥¹ö ”Îi‰ž+:–y˜ÉÑu°þåv!ú^;†½ØëÓÍåH ˜š4”ÝFC¨¤Jžº_ÈÜÌÝ ¢ÅusoŒ£¥Ð‹�u·)®“èCÔ2ŽZ$è‰ÕÂo´ÛdÍ`þ½ Ç¿3hz¨rsf|ÛiÓVèžâ™oJ·N1*MŸ»5U+ç‹zê9­ ¨þ)3mEê0`ŸíWXiž6 y^…Ð6k¤hµÙ½'·[ñ¿}…ôž¾Rë2‰ :xH (pâ§9K~Çæ‘/ª€kº±KF¶£]=�â©ükä�Ï:e•¶8úu4SB»Yè¿PÎyõ'¨æ¼ð˜#ÙjÊ^ýb:7d2‹x󱂺ñVÕpx…K�‡¨ÐhŒ6:í¢ð’µB°9�Bi¾ýª‚ßÓVÞTçÝÙ¯d¼Í¯-)«‹Ôë\°©žVÎÐ+®�Vç� R鿆ŠÙá•�Ði~zå»H¾¯ c·Ïµæ’øÙÔÆsG`®Šà&MÛDpý¼)”õëÑ»ôgH¿]â±á«¤XóÚq/D;£ôiËß@Oôcëé¾ûÂ*Ÿûxï¸På3¿ © =ú½~éç3û¼�¢YWø¬ä`1©ÒŒóøŽÈ§4>¬˜ÊŸB¹[9;i‹qC4›eÑweŸ�:g÷˜2;(j¨†åmC8%½Þ,qät6i`Rñ£{û}Æ“[z�V‹O5oçs6÷=|òÒTCâ>)ë¡� ÝŒ”‚[  o7!º9ré·Tc£ÁÀ®ø˜Q!bˆ÷ãÑR㙈MâúLáøøføY=ùtL'£JÉ;.lÔ ï‘èÜ?GÿwW\`FHÍ =²Î<£!ºd`eœÌÌê­4nuý£—üÓc�Æ�¤©?åwŸRŸÀìV½f»î/¾Â[-ÐXøX`y½ýop¿øÃMc"Õh‘‡P* ÃOÒ›r?–S®ËT{ý÷ Læ˜àARÌbJºmð#�ùý�Ý©Ž «w9šŸUÝ›1¦EæþØxÜÜ1²Šžíô®¾g)͆0˜­w& jÁéßɶÅ;Ñ,iþÁt«j"«Eq_ûÇÌ@Š/–ºµ~ÅàbQ/õ’Pj‚(ÿB:¨‹«Ý%¤(¤Úû¿µ~6ëŒ&wpO£ šò �p–S0°é×>Aʬ†Úó*õö:0å¯.rðŠšIòSuÄwî {›ö4Ôãï¾mµ<^ r…¨¶Sv²¯,Šæ¸ «láí"4ƈM¡ Fbu-!„ ë0̤m9ƒ%&AÔý‡p¢v¶à[ÜæT˺ò_Sµ’í4ÊÔëŒÈÜ̘†­rA�þ1fëª?â�Ö˜ÅÛl(f døLÊãnH{ìBI´¥‡ü€[ éœ/Á>¦Ä Ží¦F4­F/¿ <Ó¶z`I€É¦ê�TÖ³�£PO¼›@o>±wƒ8T9M·VË?ëã\f¾ÐÐ5#{ÆìbìÀûƒNÅð=ë8q¬,pG}�¬ÔÜp ôS¢î6—ÞØˆ„ëÄ�ƒ¢{Œ€ùÕYpDà ÔÅwà÷—Ëj¤Â«”ãn�…‡,-GfÄ Ãí|Ù´Œ‚›Ãþ}¬5c>’l¿±ãd¬‚ßî$ârÿ 9g¬P�ç’KnšóK]Ê–°WêÂ[>pErlÑz)Ce ª"QèŸ }æ¹þâ•цt¿&jãæ€–ÏyùÕ5Tã<L¡Á¢p`%dŽsz›ëôð§8¦è6p¥Þ|ɨ)M²2]‘]—uöe•²*Äðš­Â¿89 ²…VE6v8�'�=ïrì|“Œë0I©­ôâõ9µÃ�@]¸órð¤åÝfBZw6„�Ý•”‹€y¯-;P& "Ü( ËDû|Oeƒ„é`þ7v¯}¿]�‰@Ô|³Aüî#Ê8P—]4ã£õ-C†Î΋·Íþ}eOd™,x�Œóœ›—X˜´ÚÈ�¬+²Ûœ×¼É{µÑ:]xªÈ�3·møš±H††0yL:?Ï6Ú4‘¸Æò¾¡q¸~Å[¹,ò­ÆT‚&©n2ùD£¡ìdÛ{“v-¶}(ÆÙí´sôw‘ ·øc trB¸JŽ„‘ý¶j\Ósá„L|JXƒÞü¨¾£\ƒlks'#~ÝU“¬«}�‹ÌÓɉ…ojú4»iPiV)â=šË�Ä猒E�Œì´e⼇£>·Bn:Á<~O_^Ö!L„Ødê%²®[¢pÞeŠ?ÚÀ)Ò{ §hkE™ÜdÌ¢�gän¡t§™éëŽÖ«ƒ8ßaS˜8¶ð>¼:“䫪ŸG¾›cíMÙÌ{ ¢sÒ¾Úû—\;ýŒ^É86î€qHàp9ÏÉFI¬Ž’œ¼=Çrv6„\›éWŒ83V%1Eßg ‰²³÷Ó5šôJ2†6™ƒn8±72áW¨æß‰‰­TŸ4"Æüú®éŸRÞF[ìucbÛ¬3£Ù´ôâ5Vù‘x„ZWÏuAK”Ú˜{*-…ºAJä¥cø¿Ëhèðƒ4&§áqÖKxéŸ$�csA/;¶q¨c8bõKÄ섌wØvŒhÂ3� è.¬Ê³çgÁv$â7k÷g9|ïv@)ªl…IS¹³Œžô†ì>]Þ íæŒ X$èxðûÖCCì´Žf+óp­#úPŠõv^ Bõ4ÖQÖ=æ´ ZÁÊl‘â;ónGòTw1¬‚ЬQKEŸ¤¿«—B^&·W ”¾yÊOÖtÅÏCùp˜d¨$Ǩ ²WzCŽªVsfó-u÷av“ºò$� É MJ&Î>0]ô¾çΜݺøÑL £šFÛ,E\Z ¦z4¶(Ç•w[fNÂRžS'Ó‚»°½ì´ÎðHžÿ¿P|²Nü!@8° :XøP™€µ° “E>–Î a7�k&Ö£@ƒ\¹}¼í4“÷Æ¿‘’z 2çsÍ »Å44Âô±b$1ÁÞˆ(ëϻƒ_C×ðLı�êMߎ””3ÜPÑG‹û Û\Q5¾döûàÌç¹X@y â÷˜(ò¼Ò¸&pqTñ¥-r*çèvà~Žmë‰�°/ˆ4Ppr¿Ãú)‘³¹ZGÙý Çüåàé›:È/’T¾}¯~\ h E ªð~_EÊж„ûžäú­+Ž5ü=ã`%ÒGׇäš(Z¡øu÷šbÕI+G~Ô7"eÚpêÓé«4BßÑ 3�ó7€š ‡NBƒGt|’†·fN lèµmKÑdM IØAmhw!YÏß’ï;M-wö�É“*áÓlâ�×¹x›ÁÏ WÔ<|u­ƒÓ|HË'HÝ_5O. µg¨™õ&Òlü�x¸CTà­F¡NÖ öP]5µ Äp~XØ¸ÞæÆ^ج…T†(œµ»·�n§‡?3æ°ö°m¬lš£°ù¿rVb ‘;s…´T‘bÄp{vÑåæB¨æ´8a<ï HiLýÕÙPþÉ<,È8¥iÇSiþÊ[¤N%¤6q°IÊÖŒõ…GÏêí¦,U¶â^Ø+xéB[ú±ÔܵAã"³>„8L }ì©F2�rjôörƒ ïËðC�#Ä8Ķ«ü+TÏÞw~@7¾>ñ _£’û¼!1gè~ä+U‡_!Å=€_É¿Á4\±®à’›å÷ÕÈÈo>)JwcD+Xyyׄu´'ˆ]ªÕà€éÐÈ5jy§~#U² =N Ò0g…+rvÑwÞÎc5›± ›ÀªW8çªûÅà Ʋ4 ¢3”.¹»| ™Miö<µÑÓ�ÝuÓ¿ Çáîè¹?iœ›ÜlÅ£SŸ²¢ tDæÚgSu“éww2]ÊIÿCõ§G:8˜|l±ó R¡"‰E±B|› Œ!Y%Z%´3MDãVxÞ£ŽF±>ß¹� úfã§ÊO$šßË ¢Y¹‘;gˆ° ´ð•�}}G›<qoÓ�<šá«Vø1OüFÓîçsÍ£1Â�ëU #Ddä�Z'S{+*övfÿûªt©ƒS¹Ç`@;¿ÐÂj⯤„¤01nÇáõ½ò ¢¸Šú/BÂÕÉD †¿Vi§JMh›vË“ù¤Ú÷ îoÙŽhô#Q¿jøH)Ucæ¢Lús¹�c óÅl|äSX9'œ…‘ÚùmîŒu±XI�Ö(ƺٮõÆôm¿Éæ `Ô¿§ ¯/X¿­•œ–™!�›dó|¸Þóvô!Ì�z" §8Z|}<»cHV¥ó:ßr°¿Þä_µ/ÿY1ˆ–vÖÀ¶ìàs¾{üÊE£œÛd;¤Ð KÐT´O~6åBM–Z<E?8åÿV›(kÁ{ÀÌ¥­ªÁ"r}½ÆáÛ’ýšT €à#�F²4­´¯fŠ$VÜ¿ˆ” L™–§y ¨f¬.­@CgEÀÁâžëtû¾ëÞŸ�´/eóóµ¿ò;S6}Î$zu¢ŸÕ¯»¾çS͆ióÈÉ£õùÖr‡ø—ódZ{ãÒÌ:æ”hßas�Îzõm훬ðÍÑ�i ždxù°]É÷&(ÞŒ¡Ýu Íþ‰>fX+2³yÖJ¾cS¥Â‘ò„�iõ¼-¡­[#Ažc<@Á4ãt½ñõ9:9�yfÆOæFûµ¿‘#}G %I½ž Ü[ôZ6I dÜ+ˆ¼Ó`†[öm2$÷Iîrµ1w¼Üpñcd°áÈÊ;â:Ðé™ÊrF¦¿Û6ïAÞÐb¨I×&‘—’zqànU~³›Ê™|3õ@®DéîK1º ðXÕ&ŠL¼j˜'€Wï¯c OF�Fë•ùV/|;@gÝe¦N×àFÒS9㢧‹bWGAìZ‰ %¤Æê}ÅVDzS-áÚ(T»Í¥Ç H YSœ· eväÏgÊäÄ—Îw×nÕ¿ÿ‚l2PÍ�8@¶ØËõcp0©Ëá]äGØÖ�gŒîj³ZC „q|<Û*pYDÝOz­ìðÆ(ãÚ@à¤Að~`hЊ3ÜÈ¡Óf„¯Uk®~³²aýý‚ãõã·øè«lÞÅóûÔ7"æaÜщ)ÇïiÆæòbxÞ3VR‡~¯¡ì¹ ;OîX„'_Ü à)U‹¡5ñá+¤öógà ­¸l°?Ö„¦¾Ñ¬š÷å‡ç.™ Úq$„œ)ÿ F'DS-_j Â�@ÌTð‡óJ`ëª�‘Tj¸ë £�x §›ô©wÐJðÅ6X¡À¸|ñiȬ¹‰À‘K/@ú°j "쪠¸ó·}p»ÔF8MWóC�”@¾iÒ"LÇjmá~b›YäJ,R†ïmð\ø[ÑZÓuŸfÒ%0øNi¹™Ð“;ÆŒð ªÝ»öK_F.g­D~­qc’E-¾7±ÌøLŽÕÿDpZ’�½T¯õÄÙ3Sš¤=õ:-k‚;ÒtøæÆžú†ú1dß×êM�¬|ôù ñ¯Y9S1,€ò6Û¯¡MCölº:¦Â‘ï2î£ßI&Ùaaod¿Ã»N»ïÊFVSl­Ícc¢ö &СFÄÏvDzÒ\Ô-Í�pÇÍR5Æ‚…XØ—_D½?¬eã1qº�rQÊfÍχ j˜öÝ•ù'pìxJ;¹à€ 9¯¤/ l÷tGí¸!ÚájsLªæÙ²R·»Ò.YÐ |jUÜ|½ÎTÃ: U�1Y�uM„.~ؽô¡§ -/¯Â/¸²¥-<Œ7Ý"ÿ ä`ò·ß¹Ëž:Üê�h•ÿ)aXX¿ExÀ M™šÌ�ÄA÷y¿Ïѽ±ç¨õ�“6~}Äßw‰ÂéÔøzrƒñ�nNÖµÎÔé¶!D–úlö䀪÷2EV,Í—ÜÏ,YoÛeùª—ÿ?¦¥ÍÐlé�±&ˆ<ö~䇊W>¬kd m÷Œ:ÃY³Ñ�]qÚÊ÷´õÏ7ðf)3›aüØc„’O÷\.Î.0+üag6¤ˆÖ LÅ•)¶-7&OA3T[¥KYY¿²ðÏvŒÑ®õ´ËNi 3J›ªñæµqÉd OõqÏÍÞ>”w>Z<¨¾,Ÿ'NÚ" Ú\tp·2ЪÐÉk35áÁW ¨[Ù^*µWq¢*¿äòÆ\ã´ß¦Ž&P§5|É´�‡l•ÅÀ˜2Í>GÁåñê©(u/Y‰Æ Eµ[;C>“’²µ±%š*çn•ÐkÀÈncŒÔ �Á)†9å»A:Q╨KøÒÜXÚ ½6B]‹!v8�?((¾u0Ì|AÕ•"ØöWtÃÅ•  Ú˜.¤$Ýpd £: =S‡÷�0�1ˆm–Ÿ­á­®üá�‰´˜.¸Ï×eE4ÎlýëYm/GÇÜ@FRÞZçú?ã8)¿“³Sg6»»%ÐyͱØ�³( !Rµ�D„ªup²kPª`z÷‚Svj‡ƒ)L«ÛM ðƒjÔî•¿c%š:®–äá ¥wë4W^1¤{(ù Ÿ_)°a�I* EÈ52MŸÉjS‰¬„Î\Vâ?©IÁˆ‚o$÷èu…ÀÀÒS-k�'¥âQ¯fâ€èÈ„!áûxCD<¾Ëü€;êàìGú8S 4-Q›ÀþNØó5êOЪWá<þv¼AB|à`Úl6¦ž‰�vw9wløºš·§Üå Ec0ä—ÍÁx æê»¯~pR`öK­¸´Ax|6’÷ûàWµ!í}Å<álÒu•¼î…v±%¹Á¶—`A€Š;Õ³ Á…ؼœíZ¨¡”…²åoêPÒ‚ Ñ;YprKþ0]æ‹”mÕ5¦Ù!vøå¬cLîoR�̸É@¾uÈcb¯xf ˜¿3Ênb<äáO?àG�”Ü|-†}�ÈwÍ [‹Òà{ üÇ$Àá<ÕvTÛÃÔLLÌÚý˜;FÓ‹V?gü~Â3ߨa¢I”æÌ©{Ò~�úâ ü ——ÿµûÿ<sûÎÅ¿â±5ŠR9 ”¤Ö¼GæÆ0 íZ.Ü[ø³T4$· Ê$LDê#E}àZœ�@.KºÜ®èá�ùi÷×:'3§$u¬A@±‚ÓÚØ^»€¬ªMxª·�T¤¸A<ŒËàßo’o8JVº?zBE«ü}ïÉùßùÔ9C @0‰}BH'8�DÀ?ànšÅ­`jõK4¹Ú4KÖJL¿æÈq =tB®Aiñ@×Xì�©FD-µºªŒŸo÷~g¢ËÅ�ÜÒÿm G ‚¹DìèÛ^ùé/tøìLši©fÒª‡–Ë:{ÆäÇãûû¿ K‡ŠúV�».³« Bš/þƒ•ZN-©¡(LÓˆ[¿ü:­ÿjú`š¤«y5ùQK3&�DLµAKv\ë_S,zrÕ%$ò46Ïùî©)yʵYÿ*k#,z³D4U{JH¥ËrËSä(H! raPJïõ¹*¶"ÈlÆ�ª÷òÿŸ™Øœ³pªW‡ÇQ)¯¡4rÁë"¡ÅP&z~PÂú�Gzl“|~Z*x¾`®ÆŸj}tr ±' æcàt' ú¤»ø.óV ö« 媅ZmJ !§šØßºZ/܆‡<"Ïõ5hg#³ÏmëÆ ¯C᥇  ]ž�á�S¦0Ý ©÷@ºäCýӪݦø"gµÖÔ³l.¯[voì,Ä¥ãz,}©4ß;ZÂn›0£Ä9L9|k\¿²:Âþ}>¥… gG-NÃÂçD0´<ÞG}uªlöìŸàB¹‹lUXBâ±Ñ*>]2èŽ2×�_”Š©Tcwn ñÚd]óum·‘Ù;*�Kâ!3TÝUd¤O+ÌkÞvkd47×N2eÇw $oàEX•U® l" É#¿én»j0«9ÔðtÛžªŸÞâè*Æ)„ZËxÂ÷îJ„‹¢³ÁÏêi´ú´ÉZ} áă‡JÞN~VYYZ¥Øgö‡÷—Sd¥‹è±@ð¨©z*¨íf¾¹àhËyOjÌ{‚o£ ¼_Å´éœÐ’jå*†8¹K„§¾kÕ,7ñ�%IôJ3ÑšP0fI!†§Ç_"�g®²¬ŒzR‚ÌJä®j-òÍaX†°Xª‚z…]Rù¬_Îΰ3I�S62…é°ðLÁ´O2Ð@Á7†8Áne›‡?Oû’“(r �k“)­~©v·ÛwN¸‘’;"‚(õ_3gAeÕå[�TŒ'nöxž§BùHÏç¢8ÿÌn-¡(õF^¡%âW¦.*�ÿZ`3›ukvâ ^g§%0ªNFˆðÜHTÓŠ¸ëg'Ò2ŸqR§O× ²(iaDðß[]:M�V7ù·ÂEup`Xë¾QŸ\Ïp™¿–Åï¶û%7iÖ"ÿqɬ…æd@ѧ‘Šñ2¢CÚE¤^Mz‰¿0 “‘Ý•Tc¬u4'lïyúZÂð¶¯z;�£¨¯7íRLP®Ÿ�¢xF(ÑD`MÝ’3K&2 ˆTXlûN�ápWq½à6.󋄦}„¯•|($×·?ž:ýA18s{jÍQÎ:£‡ª‰?^Õ嵃ˆ[á‚Êçê�#ŵ+;�´r3=R™Ç<ÏO¦ºÀÃuso,–P„ƒ-~¹’9‚± Q…è»mPçZ¸-ßßFd‡1ÖvÌYéé9ª±ê'~øf¼*�å¯ÃeÙ�ݹ'Ÿ6_Î;úZD;Áq:%?ŽÕŒ¦è\ø/ÑGX•×÷±k1PX€¹¯yQÓ¦ñ´�Á7² ®l|ÆsË´DÑ 3Ï)|«S-³ÿr±,›‰£Áû˜²ý;—^5›þGúÏd«à@bš¶iÜúª�zI%Þ!hºšÀ�öŒ{L —äÙ"LO�I³Aþ„ûư¸Yí(óJ—>¹í|Á®­úU,Ó/{“qRK–q ÕÎQ½nãé´ç¤ª�ý¢Y²·×(|dŒÚrp=Û»Ù-®v¤%‡Y—…©0çl“\¿û]Ûˆ 3(#,:å„Z{˯ƒsé” —jÿÂèU´È�J—�¤c´8# ~q"HÀFsÄ«yUhñÍñuršÓ‚|‘¯«9£°W?9{µ×µ�Âî¶â8··k�Jðœ2ýeE¨*tó83¾%œ ‰Ý´˜òà7+«ÎÛò(iK ‹÷¼GÍ4ÖîÈÂç‰T[ç9Y�+— ÇìZã#öÊFÏ3ŽOŸ»!kc¿]^ç n¸ PÅ.`îŒr˜ž±˜B%? ´±sŽx]¢°@¤š=ÀhWDc¸á¤ŒµÏÛ@oÃGÃØôÚ†ah;éˆÌ+¢ 5jÓÃoRÑŠTÏü,»š&ä@P8Ëq’ÞX'åÀfº3“€µ ŽVsïÿeÑb#2ÃD¡;šw©¯3 Þ:…—.9Hg‘ñËwˆ/ŒrÃ×y(‹²Š¹\Ï›”UCtÆ>çè›+¡: ¾€’…ZYŠ@¨µ“ FHd¸¤›ÿ*BZ&V@Iœ2Ìß‚Q<FœGvßÄmÒU‹¨•™ý¥ô$h%Šø¼6aŒÆ_i<-hîõ ÀLW¾%—›$Ø\èM鯹P-y§0Wì›­7uˆpùŸÜÊPX¶£óÞW|.­ª‰} ´vcF ÎÙ0Îë1™ Üž4G¡ÔÆÇ ¦‡Mi…[BeZÎ6dnv/ÃQµD<´�'u†AlõHKJ Ð)¦*Æ©yF:‡ÔÔö»3k-ç%lŒ,{$/pOC *¢Ô> d&>qˆ«¾‚çÎmÌ<¾xÀü›49°mÝjñGøYÎ" ¯Í 4ª0ÄE¤ùkVín[çž’ùm+€}i;ÁSvûz'"*LóB�u’tò(-Ì“óˆ„>š¢QÅèÕʶԺ%MI¯±ñâ|¹¾²ã¬F¾G°?ޤ–JrsÇæIJ©ÜÂo÷#^!НšÁ¤ö(agš]ˆŽ‰âBµG¼á9NÔ^|"]ê-òHº8$ßë³øèJ…q¸b0ÿCYã=µ¥õÏ7*A wl�ì#Âédb®[VÒ„6,¶¢ã»¯ÊáÜ,9�|•‰”D˜`¿JKF´á˜ÝÏ¡qµqÝìÀ€æ¸i­šÔñ'°êFÕí¼‹ù›Ö¸ø£ÇÓB´ž·8dÉ~Ñý6)@òømâcÔ;òËЅ:=âèIrØÏq ÙÓ2>±Án²‘fUR‹åWùâUöÃ'É?�é‚Ô¡ —�/s0Ã}ý(w�ä²E¨;�ôûÚ™y£ C®wghEªZ‰¶±¨Ó¾yɆ2 áì9Ãoû€FLµC�ctïÅø�0i!tY%CS�‡Ó�%G®Û;À¶™ÚWz}ˆÞ.È—õ“—b‡J1¹Ýñ�#ðó7;mŠØÀ�´fSEú§-«»åµ0ýÝÀ# KpT/¶ËÍ[²ÜÏ”Sæ¡®ôL.Óõ–•krn:Ã¥(b;ìhNTÔÄ*‚…ZÁØÑMjÚÝýU£exá“j„/þZe«çJ0Õ�ö¤ç9#ÙÉêú_Àʹk&ëœ V]x…«ð¸Á"ºzÉùŠCfßøÃMn|`ÝdIãS2ª œÍdjø˜=ô/Ö ÜË™ e@RÖ&-~ú0ª›ÖµâÒ MN3(ÁûVQu¸“€¼ :)Ù-ÅïúLªˆ©;«Çû+6²Ò+OÃ(¢A—y —+5)‡ùBÿd¤d5@øÇ£ÿ;šñÑ@Lɇ.Ú®Mð‚Ö’Õ¡ ÅŠsD8Ÿ+e è….6”jR·¡'·R8b»ðô¨ I¯m�{ œÚØQŒù—‹©�;�]ö²Z8 Šv–|Sç0rК`^àáAÀî[¾]÷BøŽ‹­p5ªÙNp¹Íˆ,Uxí^«$wÇ8ü&ì&Ì¿O~»m�%ŠŸoîBËüÕ×�î]Îs^‰àg‰Y‚ÐÁOÌQPdµ2ë²u}G¯Élšx¯å¶êVLçjÄü;Øô?êÿ?QF&7òÀªNl„)€îXu DÆ[W…îAÇ÷#•r5ns`©>û­ò�?Dïþ·hîC3c+þ§Å\q`¹ 2lc„^GŠ˜é:fà€'Åÿz[{GZ[ÂE^7Lãt¿\Ýß—MÍ:OçúJ6óÁwŒ1ªÂWÚ¡+âYùmÓÇŽÜ€mƒ>)͆0˜­w& jÁéßɶÅ;Ñ,iýn]ü ËNž K3n''òÙ…h›ë…ž\°¡â{Öºïʆ¦#0÷J•˜©ÈDrªac*6ëŒ&ṽ^†N¶ò©‘èayígîî4“­èÀ“ðý£${n‡Ù‡0þïÒÁG½Ö§ Œ(5�¹q¶AhŸÁ­2ËGp%äò-Ý( ãìeÕµpsIçd¹RcøhyС ÷˜3qyí]_m§,0å{osÃÏ#Š'4—Ù�.Õ g¬�A:!‹˜;ºB¯;„æ©QæКðk‰kP61 ÿ�erðpBfWrCØbYñ²"· =› éœ ÷ÅsÞ¾¦F4}»W˜½àl•�bš>(Ð`Ì‘3 žƒÆA{5ò$ÂÏMøž|¯øxôÒûD,æÌN³R-fʵˆY|Âbj¡ä™ÙŒËǰäȳԟ€ém‡c˜pR¾¦ž{G):ÁV[´×¡ª4Í=±’Êœ¯j©’;ɳX7Áîë)­K¿w7â*Õ¾;6‘�RÔ7pÄóGŸ"tשY¦@Ôþ¹©¥›®LŸèÒÑOÂÍ�B£¸8ÉàÀ/d¥-‹> ëz熌ÜS©X“ßôZfÃ)G‚˜›n¸úG X`¦ò"‘*Æ= ¡Ýç.êê˜=¿ÐntB2 D�ê½æ~{‚˜û8цÎx7§<‘ÆR ê‰Ý7äZœò/ýD]�¾"?çÈ{q–^Ä‹IæûV1ôGp¿êdaâŸu{]°‹ ÃÎö¦_0x/£Ø˜ÜxõB$šYŠ)Y8¡3*TA¾§T)"£aÌ$wñ1sHlˆa*¸3³üVÀ!·ŽßÕFl} —Æâc¬—èŽKF=[.‚]ä š»LüÓƒYsgñKr>ð»©yUõÂ)¦ÜÕ%Ì›¶Ã8”´b„­’â˜NÝ‘h§¶ñW/[É Ð1YFêPe뜠‚ mfãØ8cödA&Ф�€²Õé0áȤ~e _C¸ŠŒ ãÂv\¢Cs „ÙcªK° –�:Ê‘uô_+q2ïü�…ƒÊîƒ 8ê@< nÑcŒî�/�åÌÊIý¿jƒÖV>(Œ`6pì¹Eªɘ4í¦ññkì¾9_%5³d²ïŸ]¹EHá "ññàðsÝ{¡�±¾a]tY¶“hvÔa.uÈxC®7Õ�Ø“ˆ{'jƒˆlÕ¨Ù¢Çå´à[^ÂmÉ 4j ÎñqÕc ‚ر2³ñ¨•ÈÌ£Î0ÂUy¬Ë—QÙ;I.[[(â�-ƒf¶FkÞ=æj¡*Ë¿}•/Ü®@xÖÜìæ3ýÈì&e,wIC6¬„ˆÌúwÆ&BDµïG»à’9N1öø:¨fÐö[™C4e[LÕŠaá3!ÛBR/ÛÓ” �¹¯ÞýN›”dÊÐÿL­ÙfxÇ ê+YWU3?t ]1ê¨à‹ÞŒ0zHý6èûa) ´"/ßõ¡ü>ä>OSð9nþpŸF7¸›�“i.âWò7 =1›Iå�б̲]ÚƒMêE3P(6c0KkèªóÁ�A_ék½”D(x(%Ö™¢BxÑ Hen‘VÅÀP?Ë&ãæ<��9î\!r%rðþ3ìÊo��ipô œ/51wa\j:³ÐŠøÞl¥´•Àç¯o„ô¥àÙ”¹©¶¼¶5Ò‘ „Ý#n·vhK›�'“ns¼’ºÃ"¸¥/ÓÇ5ÎŒ_íifA¤Èuîæ ÿ6ƒE¿)—¡åÌÑ`£Üˆ•íÂW$'vöVa±p´'9E4¶ <4ª3\L/}ň�ð�‚­>}ÿ#ºðo-�ÖEâúL<¹˜C ¾B{‚x¥O0azcm®�rñO‹&ûæ»ÛŒvÌ î¯;’AÉïÆÏ§ù ‘$.Êí)î{�þ�Š@åjÿ{ýwî¡-.¾ïs òHÉ7A4w“űê-ÓEèbÐó#l»d¬«ä@¼oUÍ�òDïð3N˜8‡ƒ=øÏâ¸ÑDò“=G�Ñãsu§Ow(‰ÆÙà=Åt$·/©=e !©Š2i†HH RSH12²¼–ÊüµüÁÿP?Ë©taFY вÙÁ7xg¾Lö¼Ú¸�Ýõ1xÌ.ÑZ$Æ>VTñ&ñŽù3B˞˯hŒÑ©9‡hƒÚ20²¡eŠÂjç¿u Y�}}88—™a7�µ;#*Ñ e¾ErÊPǤóÅèÕ…Ü“´U+¶Ôòw=Ç6zµ%xÿg•ʼ6ÊaU|!Cèy5p5ž àë ¦3JóÌ"šò^Ðù XæÏÓ�(ÛÀÝâÈüê ŸjŽ©� j/œÒ–‘S6i!B¿½@¨!Žâ{°SD¢Üo#GÏÅ*½»OÖ¸À»²xìà¶´ò¬~ûÜ;ý�ïNoK¦ `Z\÷Ô+ #òa�)ÿ Þ“žbÞI¿…¸ô]4J#œH|‹K7˜pÚg¶l…yІ�e¼Y1i[VÒüÖøÙ¡ÇI#Ñ¥$¶&)‹$RÛ~SŽÖîùçMß¡e±‹”®*ŽdIèÇ4Tô’Iµn Ý5@¸ÇïȦ¾Ã·¡mQ˜s†Yê÷~ö/ꀈ¤;u|Q’E�¨èÔ«,?þ@Þ$©…[ pªÁw¦´0RúYe4Åb�ãþfÒJ|C¡F%)—>´@ùI!R¸†öWÒb@#mûSx Ðd´ ÅŸDð&Q’´Ç” ~-ûåÏlWjú‚ô[ãƒGó‹}Ž¡åÞ‹Õ èƒu�R¯=éb e>û5ôÁ¦˜%Y—[Rg $X¥÷O|wï϶>—¤Ð-õ±àÒŒ~‹ÊQõ=2É \ˆWmÈ›s} óÿ ýü Q+—¹´ ^/ó|¾?Aüâ|ÚîÞ=†QMRõ ëTÝh"ÁØÄ[íßhX<ÏÈøUêÉ\‰GœˆK³an¹ðR«Éù£òI§×ÊaÍ=àÑ/^"D¶-%f8ÞW¦ÑTÒæRh˜»»MÖ( E‰äÔì9†8�-<0ÍÓá.,Šå]À¶q_b§ZÒ ä¿•fl6°ª‰P5“¸±ˆ>î�®ÔAm¢¹ÞRÖük¥gb­¥¡¹]Êy;[…Ë Äm彈ýÔ5—ÛߺóÇÄ\áW•Ì]^{¨¶ŸiqÉâ1€�¢ZëÞǽ#aePIb”Bs:‰çŒᬵ{ɸ¶‡1JÐ=9÷—êܨ!?9gR¯—e5r‡) וÝ4_‡ÑYdÉàŸéTšzýû5¢ƒ<„ŽÂ†|&0=Ñ5oÛâÙÑ( ˜�·o»ˆÍKü'¼¯zí^)gŒHûÍ?H|þk5$CÔÅNÎ¥6H05¥Ý¸n„¬Ji*J%þ‰"iˆ�€­Xô£®=ÁŠ“ÝPrøª’sèíìz¿¿XQ˜/¦¹}S7q4æüCz^Ãfɶ‹ÅGLÌI±ÃÌVÆÿUȉ/Õ|@ÁòjVÑgùÌ&1á„’ž’ÓW´�‰€åëÎ"Á‚ZšÇg®±5ìSÙt~–]شļZã¼£Õ‚Ënòí4v®áBϘÈNZçÞdÙŒ-ñ ?*ºÂÛè [fÎÒLÑBÇŸÍbª¦Ò¥�;Ç‚ÅÄÐPØí‚<†Q1Mn|[lKyƒïm#õEÍœ>Û¢ÎÑ.?.0M‡›�l:"£ž•�´ûáåhÅÀýå‘þW¤øJk´äÚ»\Œv¬QÞÎ…ª@‘âpiSùáþè²ÿñ\Z?zÓT_êiסÍ<å7ã ›…þe)Ì�eL¯¯éЮWû(íCeQ¢Á²˜£lߔڒš–9®ÀØp¶.-¼V¡�YM40uKîj ÿ+Ug(Žß13`‡ÅQ#7Æu˜°C}gWÔË‚°08ÜPFb䮽<ü´ZNëi�½É¡ pJ|*דYì�‚机0%ÅŽ<ʽW/sa‡ Èœ7°ÚI�Vÿ ¾1Ÿ¡?­¶ ©D‹ä5ߺ�}”<º3•¯¨àå¿“/¿¶M!aøK8K^Nâ…‹¹Q:¸�!Â7ZÃPH Æ‚s�—ôEöÃøVI¥�½WÔÕxó2"Gy:R3^ 9”ŽÖ™1¸È»]Å­èá]CC~Ýø{±Ø‹­Ìc�­WÈ*Zez…‘‡šhç\²pµ‡×L𻡏ù=bÖí‘Ú�¦ûƒø˜{ù8 †8Î?iô¹‘}Q½úîâÐí ð¿ð?ñjèšê!*–ð‹–tšŒŠ!C’„ŸcRÓizò´TÑÁy°°HÑ�„Xà¸;W > ç�í7•�ŠÕÝ¥º´Î©+ù’¥KšÊ·s€,eM÷õßjäH G†[²²qOGŸhë�‹Å Yö Î|ÐõUoCÑݶAˆ…/€rhéVGîûnP„·œ×‡œ¥·“%3Íݾ$XËWtì _aVÆRÊù°Té‘8JDꋤ;Ü�çÒªL?žËÍ[–�™ çN]þô²S]Uð(–°”^D&8PË9½Å’¿<.ÓʾËÊYÙ2X15“¹Èžëbiâ·³º>[°9”–1§J�ëK Yµoùb[U"2"Y�9ñ6W¯õqŒ<ŸîdCŽ.�,j¡_—ßJgˆA®Û÷ÊYÒZ·/¼(_:äS‰h¬¥°3Drc8–èÿH—ïzÖ™êgøÀmäÖNxÆ>Lb€�ñÎNà�Ùóéâ/%Î}�ÁE•xóF`åTGPd›Uç#B¥  eZ6.­uÜW›‚|舫6ÏÂ[ža§4›©°)ÊE£tŽ ‘>Îê�˜9";MCQߪÞtÊ(.RdýÇ…®ñyÚ÷#&>¾n7Û rG©‹Ðªºöùô}~¨ÈÚÌU¡ÀzyóG³|2SÚ�0£2<ý�»�¬=~´œ@§“Õ@žyªGdJöÕëŠÙŽí3�çmëøP—§tf”j:kMôvë¸4Á"n_ ~Eó“Pá+RŸó P«¯=ñ6eê<"}žfãÅ—Ú|}•øDéEö�­ú'3~–dIqñÜä�¡¿ô†%™ÇŸé¯çÝè�ÖضjÙÒÎá„ä>Ü*…N·òú±kt¤Wº¤ZR@שœ‚vŒ”,/,'¨P@€{|{,G"|ÑNmÝeúÀy"8„Y‘·Ì'’ å°O�/qeA¾Ï«Ár®½¸rˆÇþu²aÙ'lr wFߊP7Z®Üs*jäЂ÷Á!çFô……Wû‰q>ŒÁæÆëÈùòý¿Éãå(‚GŠa-gDY;™Ø£â òóæ }iâ;ºß� ñ¼|ôW6>&ìì#W¼öðü)òôBÔPƒþ¿xVÊ”Ž¶¸o™NÂ@Ù�(&Ã|köZ�4|\�T+èVšIäÒ :Nñ£DHËš³±K+]v¶DÝÅõ§m|Ú•þâß Ã¤ÈÊ…uç­ j”fy:�¼CKAaçl«Ý"°ecͤõ­“‰@/îM>®ÔÒ𠃫P bҠ݈u O>¯r†ö/ÒÔð÷:&Wüó)küù‚Á‰ ,-Ÿü ÷&SétAƒixô,‚˜_›:BŒšL¤ÖìÏþ2Šˆ8j.,Ø�,¦^PŒ ÖK;¯�ŸÏ¤¥æyÉ…Äbà³vá½P֔©²ìl¾Tzâ$À<ºhðj…¿Î¿$,Aèo­Ê'dŠöi•)ðF×*à%{j:úÎNûì ÔûUU%No*æ¨Ã§¤oüIS‡¹Â8mš¿‚BÍØú¡™å…3Ž�D έ²÷XftPi‰ÒÔâwnZ $|‰·¨,æ,ƒû]™ wÍ?˜Iò”MñLBº2SÏ0×#´�TÁüÊ�»Nà®þó¡Zu¦¾Im3ïË$‰›7 n˜¹Ñ£ë2þb Q‚�:BlÍŒ›9€HÇX=3¸( ôBþÔEýPã­ž‘2Ù�§À¸jÕ:DÁ§:‡iéµVEJ×÷´dü­6v'Š–% T±ªP"êaÇÚÛÅ@-µ?ÇEõÍ4&¥œ³È†õ‹Z¨&-É&úˆnÄ{ål°Ð¶){qjñA&Ðd”‰#¥•Kq«¹‚9œÉÐ3Cæá# ‚á ¾÷]¾,üF¶µ�� »=Š‚?7›ƒR÷éìÍÜ�~_8gG5+‘‡®ø9ÉC¸DŒxس+åùäëè T êÂàìl ÇÔ�ÐSÓ¢“–TŠ:ûiê™n@|1�}ýÛB>y.IÊCŸô¥/\õ&���‘ý©RŽ×‡#wéÝ�‚s5øÕQz.A´´¨?ÄÏ»NJíÒ„«™ø+x©6Š«!]]޽z7ûÖYõ”œÁ:@l xX1â ù¤žÓ Âé‚ëíš©G‡ú´x;Þh¹Ä±€AJ÷èÙ€*¦žÜHbúY¾'¹F.õ=E ŠóçÀ?ÕÒº×÷⌣ Ÿ“]2èŽ2× mú‰ÅYjR¼iOï¶d�ÏeRòX_GÏ@”>ŸoîôSC£ ƒI·?'ì<ÓHÞOÈ3]5è=—¼¤¡ÐÇ^fõ±Y‹îJ»}×m^(0�÷o;Ji4=jßLÊ4ùZí¯g"ÚŽ çXKd€Ì E%Ø�¦M€èO{†Š¬±±-åóüõI^ž¾Sr8œ~ƒÊNå~ÜÌï’£�]¥Kª:νö%öt®ûàw$ÿûg ðÕþ"3à]Úé/«õüC|ªÿD $¡jÔÑ ’?ãöú«~ÚÆú«_ÛèŸÃÔr}UýöÕ—Ûß®·Ö:ú«?ÛXþÞü²ôtXý!/¶HÊRRDz-ïµtîJ†…ºc76Ìö÷A‹ÈY8}™éëlÏ~�Á V_E†‚T–!.Í î&Ú�`±Ún}ψÇXÅ2OøM­áOóQ\>!2HxÎ{W’ÞÆ_�¿‡Þþv¥3z»õÐäàÄlW?�*‚�Ú¹â MþúNï'uõrçáÔ÷øÿ>a T‚Ž!@ø1q£Ü*ÞMâ¸Gôƒ›ë3»|£¬ú®t—%�L›§#õ¶›æÊà3Dt4þPe6ÐßKøT‚¥•¬kYãhû+ð¸8ÐEâžyAwš”I½,‹Êò‹ Ù—¬›ýlUgÁlÙái7�Œ§àÊÏÿgd[’e�YPyo�Äá«s M“;^ÀÐèUØEšÓê—Rçk¿% »{-‹Wï|¶®dŸÑAP¯b%© ™ä÷“jLö^˜|Ö²áGQ§îADÔ‘Qéë šíð[Q\& ¢ÞR~ßæ¶$é½sM³bÞ`§–ÅSÍ¥Ž*´ “b1åöE@<ןð…uí'ìå-ÙÝ5?¹«‡ ð꛵Op@¸)%wš¾ŸdbcÌàü|Ô±…GquÍVTDË=ýw/tÐÞuS˘&ö†âõàôšHN¦ë®ê MÅæë�†4Ð<º(ù±Ç.ùéW½ÈuñYkj °Ý ~ҴJƒµ·âѶ‡üö! FD¢†�c¼È3R�‚>XòÏ[Ö=ýU»J‹†S9Á5úÁǬâ2ÃÖj¸áçS¨Š’`ðżYk{x£´qߥè£5Jšp¼&Àƒ=Õtmq�¥qß�RIÞ#Š�Ö¦ô Ap@Zöcz©µÒ _`Ó1Úq ‹AßÚm4ö€9’@K¼¢š|.ÂSÞ³�_0ª‰ðWïœñ?V†ìî~D�cRΨ×y¸äG[«kéíri¨5SêD £ô[Q=Ä_ª‰Cj±í )·o2Unšý‚ý:6ösVöW47Q ÓÊ^'f"çº4Û—Gmõc›¯ëË—“ÎHìÊc¥²i$¼‘@.È. Çϡ誫’’ÅE™`6•P“ç‚|�zôù$ó5W�-™7náû©M;R,„jE/P‘ù¢°Àd‘trˆ�R¾HÇr$wù�+d°�‚¢Ä`èðUƒ95á•B–^ý)Ï<Œ|f6²H"ð1éúràZ×±‘Ë­'ø|-ݽOwj ¤‰0® ç»!¦ºÙ£›÷#:ÂtUFUõO-ÀNRk¡âíXýñ Œñ�¡ÌÍj‚õ,‘ÅïÐ’ X`(ÊËjUܳKÿi7šÑh·¼w`áóõÏSŽ™kßû:k¦¤eò¦Ò‚k¯í]]‰?5À °X׌B]Ô˜ñçÕ­Ö–ŒL†”‚Š@¬i3NTË # 'C£6#ýÐÚ…Xü[Î^Ø^½Êƒó–TsŸ‹p🨣>ztp<üJ{ăõ—OŸ•W�ãt�Êš�yí¹ ÿ,7»cÈ ™Å"*Ô% dBH›|�òä=k+Ô5{¼ÚQóez‰RÕ´8Q>Érà›ß<¼ñ*ȃŸ�*ãy><Û‚Vú ¾€…u¤vÃ=àá0EÄŽ ¯Zd49ã¤ÓÒ@½ã‰c¸’|1Y‰ù±„€ós¸¿²õþž}CÞßB:ÃçyÞã¥g®>ÆÜ°Ð<¨ÈØqœð“Uè᜕¤4½tOf°¬¸Øt+îþ³€\æ*Ã�ÇÌí+¹îð®œÎpyIÕµnã�™{™Ï8ÆÊÓ¿©;]’øÆg2ïÆxÄm'mêéMgÝT?³L"Ï›FágÝV±PxṴ̈%úí¾8ysÐuÅûÚ·ã…˜Éëϧ¯Edyãæÿ í#�о àf—ä°ïN€]Ê-¾–àœòä‡rnq>–¯å¹ÞpŒÏS î'{Îû=‰ÞFʶúbe±¬«þ¬$ö]Ú':'¾Ž e�°7q‘æAÌôÈÙƒ3ˆ<ÖÀàÐà[´­{¥}¶#?ÊÛ,Uuãð þm µ+ôc–Ì ŽHÇûa’|5]¥ól « Þ^IŠ/!'cHB²Ô±9ñr?ñ ñblN‹Ã¹6½=Â×^ ¡X½b¤þ]Øeÿ ��ëù\té•- ¬Ía2Ž|Ö�Šòy#fgœŒ7  „oÜÕóHÆHÝ쫼«ÉØd­Úo‹f诶Dâg`ëE�TþóŽ�ÈäáŸéæ­'®b)釘½Ú¾'GŠ˜é:fà€'Åÿz[{GZ[ÂEDH&fû¢«X¸Å|®™}CtÂÌ�‘Ö|bå�³ËÎ\oè %–b×Ôò’CZþ¨ŒÌld S¿Ð¦™Œ@D‰K×ZrƒAî¼œÌØƒå¬u,,Θ>þnÒN5FvŠÞ$qn ?N†R:uî°Ø]Ày }æ_æÅzn|Ñ|ldqDRááÖôcèZ‚m4·²YÐi°)‰x×€Z"-$ìß#DWÅà¦ù¡‚aîŸMMùÉžÔôÙëBž ¨õ¬S±k•J¶5ÉØÙ°@HìFT¥�˜Ÿ!ij|+ÝÇ_V 4œkñîÜAÒw4‹eeû4ný™ Ežž²c¡ÈÒŸRhÙO¾J5wׂDgŒhÚmþ#•´8árïù÷Ď&2 ?KÇ•”€þ� aa}3…ø'ÔàHïïîòÍŠRÙdsüg#–#ÑÓò·ò|£ÉÏ/7PPd¹G=Ä5–s‰Ó¿Æ,Þpd76Åà3¶˜Ò£rBè§íÓ:Læ=Ôv>L|Š(í—Ť!-h!ßÒ»P OJE¾%W=HQ— Ã0b:¯=5�IOø!ëâ×ù Úß"CÌÇŒ\M‘Ô%aþüš‹ ]]Ї¿Ïæ²E–"}<Îÿ—$wzXŠvn´CèTŠ#Ãa÷9í´öB=÷™f ý%CdÔyTÝ«˜îÇûˆ%üÔ•ÿnmñÌE›¤ M±Ü®¥y�#-hå|Ëé�?V½”ô¥ÇÖ™�c}¹cxùÏÃ[{s܇qÒ¹¥'2.+ã€Ýx­« S‘îq•ÆM¿7ëûl91Øe•F3$¾µÁ%_u÷Ùqm^ýÁGQ‡£/[a/÷Âú³‘áÌâêq>NžîDñ¼?- ×ÌgÇ´Uh¹^÷´G�Ý” ÿnG¼vˆÃIéçDcØW«©(äMÚ8"®‹ìéC³Š×t>‹µ�m@ÃB�j®G7-ðSžŽ:Ò•<Ìíá� @§À[™×6—µ9Ó @Íï}ød€ÖZzýµû�¤3‡ÞŸ8lÙóÙÉ`Âqm7|ßo ‹4D-ÑïÕ¼PS@Ýúvê5h\ ÜÙ”ü&�ìéô6àêTpÛµK.¶r,ñX@´ ì±îC W%|èÂíŒy$cX/=ã;“ßinÝ\™(ŒÐ�5㩬á�Ù ¢éý‡–/cp´ÚjÊ<Žá\´¬Êš�µÂ$šq:À2°¶5{‰Ôð± ¡‡–£~ÕÑmL¸½µÀ €SµíòHÖ)·ýg�rf+®Æqjº[n�áT$£LhËŒ[i¾›cíM¾>ùóyji¢U;DHUÑXW&iS_X?°v 7#-Оíø.§r�F’Á© ×Eû» ØÐ„ÿx¡)!8ËܦoùBDv3�6†¿ÔŽjÆÉFÝ\ïÀ&Ó#';å´‡}ú:Ô¸î>Yÿ4¢‰ëfvÞ¸.sÏdÄU%¼FVB�cÇq–òˆÿ|� $ù}�¦Í˜|½p€§ÙŒ´4õSƒL¢³ /0#þJbâNäAWœ‰Aoi’¹!„¡yÀ'“æteì�#Zd%Ò�¼ö‡¦»eÀìz\º‹A ÖÐaÈ©¨<ÏÖí¬¬`%8ørø/º/ Cy?!Hp¤�×uùhv‡7öU¢H¾-má¿ÌN5vþÛØq:oàO=1›2|ȸ–1@æá.qƒã‰Ð+\^ñ¦8K•{òœ®Ž©ü2Ú �R§Èá{ÃaâX5—Bì=w¼…ºLGaêáÎÊ®ñ²ð÷ÿ!@¾€w�cwúòÆ%»' êûé{XŽÂU#‘…üŸß¥õ³c˜úˆX[HÚ dUƒ º–à»6Òð{^?ÅÍÛqä4“A¥“OÃý§Ò}.kVÖîŒ!I'ŸÄÛÁ.s†[Xœû>&�YÜm”Ææ/ÆÊSFÖ‚^©Ýƒ•�ÿ0êl-g¤ÉÊÕUŸ‘!ÀÒ'f4@lŒ‰}krY`ÚMDË"¿ÈÞ"k»"ð–I j}‘Réâd<Ó�¥&Áq2ÿK€¿ïÁÓ…£zB �ôѺ°FÊ—ˆ~ '’D–²Òùñ@ ó…<ßç¸Ø£-±ZŸÚüĹûh„¼�ÉPæq—"�ü<‰IìÔ±´Ã‡æx}Ô&~Ë|{Ð ‘%5™‘îä;k,>ÎÙGû  �ÇìG‰¨t¿ vo¹—\.V¬Âªó=f%T>«q²¾�Ñ•ø®üGMÉf‰Ç|_¿¤52ž—Üæ p崇Ǽü�£8¡ ^ “„<˜oCÅÄWj�ÉûöI“Afw¹OJâ (ñRzvÖ|Rçñø(؈<ê÷HV¶â@ÿ/¨9Y. 0f%÷÷#'[s@ f„âââÛÖÆN›©¦‹‚µ›BŸªŠpÿhGf0NgkM@DâãëwƒØqØ—ÈfÊçüñ�óH&‚ñš¯Ud£ÃóàvÊÃ.S8+/E&MÉ›‘qJ-–èdß÷ŒjÜ[s³y”áI¯#ÿUIͱ`á�Ì]^£HŽ×±´b` N‰™;.:ôvY†‚6ªô1?Ÿ8o’ò‹êIÌ-‡>0Ù�^à“b™‰µ²Z‡ð÷¦�îróõ.=ôb0Êž�;>”±<S�þË¿=‘/ìV$ÚÚóSäÍ”�¬ˆøu]²Îiô…†$ˆÑ »??ÃJ…½ph•L<™çÙL Ðã¿ênJÚè]ÈËGÞAŸ×Ð$Ô5œ”-Ö þP’áu.ò¾�vñŽ¡ëþ¨Š¬áH5j1%4�%¹Œq,>Ž�Ä#â›e ?¾BÐ2ºÆð ƒáåhÅÀýå‘þ°¸|%5Êzf®×# ê�·„ñ¡¹¨¤tU¹«ðb䨡 Íìn“ VÃÀa†Ä@²×8´W ê}dÙC@6+Ú¯wgÆ+¡Xü¶¦ªS²6V!Ñä_i…‘p€Ô4ÈÈ{ÞÞ¹¨P(H+R%ƒÊö)Yÿy—×QCç+oA¾HJÒÈ�ïÙNaÀN(9ÞõèSyñë¼{”>AçíϪנ¢ß9/ñjœ x­Í,|*ïÿ íÜrJû¼‚ªã×Y7W/sTüýh[ÓM ÎG…‡ð;òàjgÄ”'[ó QÎÚ"}É;R‚Í´<¿QIQb«* –}mÊ9–{úÒƒúÞÿ šÐˆIPiSD¤c!£ l[·vwºj€·äS <¨¼#öœ y+9$ø±eí�³‘OΔῲ4 —nÞ�à4üˇ<îîGAµ`•/9dÕâ^ÿP»Zܾþ}�ݶ÷²êï�]„¥‘IÓzvÐöºæ5]arm¦%¤,‹ÅGÍZ*TBöLަ;ç¿Vþ=ƒ•Ú!fr1‡®t³æ16¬è©¥¼ë0c¦Ž(ÿ%�”`:Ônä~z§ Ÿ_.9Nø€Uø"¿Åʧ»ö!¨ Ñ�ë/ÆÖLŠ\yýì�sëó.�äf õ´*4LÀnyFóÖ~�Øâ¥È%VkC]I€¼2?k\q¼7n° ãtòæ?Ÿ¬'g$÷ðx™íøÆS×0¢Ž€À‰š7o±X^œÊˆ³^§^4}™»ÆâX­vö9_.Wÿg%}�s…ºh¥z½¿ÚÑûKh½Žð@"©uæÓ�æ^–çøDâ� Ò¢È|YŠHY1[Öû‘îÕ^afÒ˜NZV.[Á�»TÂoSJ� ¶_•iÌŸC¨¨€£Do¶*M$™�$ãJÞøÝ£Š6š¼ÔÝß9Ç`Úè¥]Â}ÿEÆìànSÊ¥´22Ss¡Ê$DÝ!À8OX®¦ôãg»ëulMö§L@PL ($.aÿ@Îå ¸µ¯#¦޾Ä̈“Rm3Ëì ¹ÇÕ•XÙi†ûªdOýÂ,^¤W€àèöZXB¨‡¥’1®T)¦¢{4^àsŠÝ�\£Œ“�MÐæ“ë&Acb(E}4ËÉ«2ü  ¸:¥I¯Y½,ÎðŠà`FÈÊpM!'CDÄ»‹Ð^~£»„äh”)ްäcø š^"M´U±Ð‚A3¼ƒ¸ML¾;H‡Ê¨ãÉ4k —ä‘ÕüµJ¬"ͱŽb–=!JÊ›OèNŽ ä\ưæÜlm+‡gnQ˜amß²¥”Mc:4MPEñÇ›³Û�Š-ŸsïÆŸú�3Í:–ü�Ë»1 ´U`—ɱänµßÏÄ¿�GÀ`LÖˆø!½²!5¼Þ/¤±vÁ‘ÁÂ-ÌÞnº(@…ßãŽP® ’ò>þE‚×jï'B{Y�8úü �‚–N\™±—ËuõÈ�¯>éÙ•®à»Ð\“²Ë ..GH¯±Ê®‡¼ïòà�8+ç_¦XÔýب/Λ,¶ÕÊxÏOì7Êx^ŽŒì趘În�K“à e§f¨­¨]¯=ÔÄ2~—Xæ‰MÕ�4¤p%ií%­N¡ÊÿåÕ›´‰Cª�ü„\LF·2$BÓ<€’–�áŸäìOLáћʪ �Ö'¡CÖæDq-JFrCÊúôl„\xm£C}–@¼\Á»;òÒ˜]©Ë—œâ–ãþµ¼á Ï4Ê9ó$7ÒI¥z\Ô¤k«ô¢HµûÁH À‡ää [(îô™ðM¦"xõÑxõbxž%#ÀåuG)•Â÷З3�þµ’¾ëåöÒ Hhn¬ QP[2—jÉ­-�æ ¯ŽŽ3‚+}ô,Î ߪºÔgD±Dw×9ùÿ1­2ßûÀƒèbû¬ÔOçZ·âÊàB¹Ž{+læ``;„p8½ïÅ‚YµšXÀ¾„N*™®Hα˜»w÷ŽÓöa®;¬D™§ÂOñx?êrH³iÖ ±`ò™\g8›˜È'g„CÛ¦ÖâŸE”\ì« T­ÖØ~ÉE„1îÆÁQ×¼S¢#I»¾g2±¶å�Ø/Æ»€o_±!Ѐ`Ãz¦�&–˜¦+´é´úÄCz™îš†gýÜ­ÒÒÚô©œ~¤–,w™/b_瘪£µšúär¼è±‚ëbMÃmÊ2€¿P!d ¾ß¥´ ³´5ë;•¡Tó{ÅdÒ5˜ÁnTíµöƒt�}dŒÇ�Ô­¡ ïež5Þ»�d3ü–cËhØx–ä\€}“Þ?ZpM‰.åØÚZH«V¿ë›‹vYŠY�P�Õs†ÓÒjzÚ¾nœ® ^³€—â_ 鮋ߎ'Ê�_þVA_¢»5¯F‚¶�@8[Î 5qXôô ЇèS…�Ä8ÐÁ7ë\[óv$òCw§¸º’º7Oæ¢ÕÂ'8™j!„vÀ�—ü‡M¼¯zÒ k÷‹T:‰Î?ãÊBÒŠÞ1º�çYËð½Ð/6�ã‹væƒZÕøèÖeÒŠ#‹€¾-§ø´¡x£�g©VÀSt¬ž@E|qV‡¥ 4‹È&@ѧIAJØYú ©ÿSÔäÆcjÇìµÐºäÓ÷ Ô­.ƒÜ·íˆq€PƯİ ¸Ó¼÷¢µEßÑOv°–�ÈçœjvàEz¾Ž*žå+^v„ýš8xƒêƒA¨ T’† |ÌHY¯Ò:¿˜\—ÖÂéŠM¿ýD‚ð %w«ƒd`IŠ4’=ßSžG€(d! ƒîkÒËÄ¥z*`´K™ì dtQ, xÛ38ÑaCÐò*ƦÃW[ô�|Hgz­­yÑIä!ZçD× ‰P)…½¶{ú38�òìÛ1)x -({ZLí�RiirÀe¬ëêÁ¼¼B�ѯU’ó¥&!Ñö©â=þBõÍž×ËEt[Z.fÑʪ…ðZæI º¢àgú£EÄÅk!2uêæM"w�ñºã¾’á †òð9ˆ$B'ïê^Ž®’@Öý„"õXŒ/e”#€Uô,É �_Ýk®Qï“vµñf+¨  ­«XT ¹�ö%Ú…ÚužŽ’ÝÀˆ4=óêlÇ.½†Gai”jô;eäÀDcEóŒùF.eÐWÈ/ã*£ØûŽI¦ TƒžºU;)ï¿à[žú7å17ŒNwmÁkÌ<½M�|ʲ  ¸FAm—½Nɼò̾Ÿ›ÎM±;¢écÏ�q’M6‡ý-áúº[ýM×Ïzý[÷‹êéB|ö»êý»ã‡íéÂú›¯ª‚¾®�@°ç1¶-WƒNXNdÁ¶7Ê5tH®z¼�ß Gb}‚¶,8ì�îJ3¹†6ãÕ4Ãf¼�â©õùGtSœiÏ»`-?Šk—7ŒŽR¤£M®ˆà•$ßm²‹$fÿ) c&ø´Ì†Ï=±®›aD:2XÃ\~¦r…Zê3ÉK18`v¾2ú÷Ó�£ùúŽcâµÝ»T꺼²òjVŒTÞ't4/ !cú¿kH7P‘X5ÜÂ}þ‘fJ”®-L©òïzÔ»À H€³FY<�€ìV"à™„ÙÔ1‰V4¾8HTÁ8¯®ƒÉMt °˜…ž¢Ÿ.úk$šïÎÖžÿ=‚•¹¸-ÍVÝâÑž6‡Ç RÅÀ­fßSÓNz!Su'딬›šbµö]Á¡>$…>5vѳm6&¤ ‡AÉP&Û45©sc{Ùï&È—IæõÖûUP:¨$(©½ÓUa| ú'ZBÅh«€×¯1Š1ÈËðåI-qB¥}&¼�&$'Ÿ½×7÷%âûÀ"éf¶ÿh÷rÞz‹ð'µêâ±ësý˜tñ}g£KÁtDû-ØÂóçY@¿9ÎOCŸ nv„;Êw:ç+›°òþx2j“dV¥R"Ê>„'z¼ÖJÅ’£k†«.׆ƒ^½øÈÚo${1(œ‰Òû}¬L‘Âí ›ú-DÚÐç_oìO¶¯Q¶1A;Àe]kõ:››¶ã¨‘Ã<Ò48a|lÌ}³6s¢¬ÔM£j¶BdNh+¥ëSŒû¸’'˜ß¯›ïU`íñ¦ÈEÎkŽÿ÷0¤üÝ"í÷-±Ö®þëÍÉ?ÃÝY svh*ÒËþxlwíL,5)µñÌ’AÁ'¹×g)�ê^ªl\X4é�˜þà™~\jƒû¯îŸ÷!æÏ[’²Ó+gkÇ4®{áŒ|¦;‹h´ÜÂ�§>—F*^|ð e‰¿”ùxÉQ«þy'<üˆÂm×ÍQ@ùq|n¥šÉU//A²Ø )¢z}›¸r*kO€˜a· °m‘hâ…LR-+Ëœ¡¤‡¾ÿ®@Œ.§A�k>—¥Ó•&~›ïWÿ…ý´@®Œ§,0_„VÓõ/FÙH° L­Vup¸³^\Œ„pö ãÛu•ü¤]-pwç¼+¾¹it?NÜNÜ,õöö�tèêQ¥Ž–€"{¨“Ïÿ¿.‚tÁ{Lo�m±ÔÇ­NôF›Yç®4l°ö‹QÎáÔ2þˆÑ¶Ã&i�ߥ UR^»òèGOÈõÏœûÁºR±=©S# oSRå¥0eŸ¡½g—Ëá“k.Ô‘½k-Õm i“8ŒD+i@+ZYKŸÒ2�Ùr5RÕÍ‘5’ñt j’ƒO”ŠUy¨K¡x– huÉ´" û„‰9Ëb-quÙ¿!”øzÒQÍcήµ‚xµ7ö'¹F´Ý¾?8`·\KS%%þĦd4/—×e™à_X¶�TdøõI›Ûˆ^Ür¥»•¬pHê}²é´gMâ?mOKQV¨»CähÈ! gÙ*¿�½›$<ÿAÅ©¾"HÁXÒåS‘Ý\Y‡ZM3X—6Ñ4B{‹$ç ÕÊ#òÕd ý Dˆ[œ"ráÁÒ¹GQ0ðqµÎ�±½ ÝÐ¥qÇb˜÷Öº¯%].Úø†Bîœ1HN±pˆ³K¥H#…êôî`gPëöìLÔ þÌ4ÛÈÏã’�mÌȳmõO$^ÕŠ§Ú,U®Àܤ¶¥þŠÞÒMòî[))ÈŠ [6 .B «Ü�ȃÎÿ4¢§º‡�é4 ‹ÂM V6 gBlý Žq�w2¹áië^�5œ8‚tƒ…®BõÖ“å¿«ZoÖ¨˜œíí‹ ô.Óó¼�Š QJUìdÚ™3ÔÖË�CÈ6ÉkpðuŸå�ëFvg'Ÿ¿i:ŒpNÑ~ ¢ÛÌ< ÐhÁ›i³ ¨á¡ŒxUÖ¹Õœúl¬µj^Aƪ ¬™wW¬£m‡.¤YzÀãíü%~› |PãÆIàýù•¤´Ý¡pÄ™ ,m—†}¸:?.— hTCŒ*ÅdÉB¿‡?rØÚ��W»ÄbªÔFSó½ –ÖxN-{°æÁë)ÆyQˆ]û™f/_m·Z%û#⾜ֲ1ˆ/1»^í’êþ\ö \Oû,¼&�Âñ¢ÎÃöÞ„‡ë§Àáh}QÍbV/†@`Ïl¬:‹42î:m['Ú÷Lí¡Gן-û2¦OpðÙæ» ÏxŽúi2ØìÕÏE÷É…Ä·”«·qÀ ¯cBµ—! n�‡ûà Véåí,Ú[+´‰ö…EóF X’Pkžm›£�fyÕE?çíÙ25ÚO=ÓZRáÑE%)–¿:¹kR Ô…�ho×±Ü(Èfüß¶ ¥7B1Æè�à«ÁR¯·S°H16³{PÛ£[Q.Ðí?´å6ßòn–Ku2Ÿ=O°ñ•>äÇÚ¢z=xÏñÛˆÓdk9Q_Z¬A_9\Þ+ö�çì™!J7YVCèØ^aÐXüA$åW®ruüø õ%0ðígròUÇÝ<×ÙMnb� ;,Ð5M-pž› ±n¥ù…¨]ez<Îc¤÷š:¬g“ßá5MÙÄÌ �ˆ~Ú)~äÝßûŠø ¬áÑb&K»Û q)hÍGAwZOiUPÎ�Vñ™Mb‹ÿã ðÚv:¤?ë]A)Ú*¤Þ+««2ÖТUôS{—Ê�t~eKV}w5l>w-TaY'1Ú� 6 i‹Ô¯ø/eKGº�°Ç­y¯b€ý‹­;WÔf³zmӯà ¨|t¶ò›Im²é˜?‰0"”Îä`8KPyÊl)oƒô«wÁ§ø’Mi›ZDƒóR¹v»®RE¶TRëMLR¾ËJäë›>;·%a¶ „2P'Ö8©—Dy­ ±Õ‚Î>»¶­°}!§ÿhÁâ,^KÔæ]&©9÷ËdÝ Û�aœï3³·…à?»'9¤\#¹› Q÷#”Ã@Z£Ø4 ~ß�Æo³¨½=²o˜øÐd`§®:¥"ûÚy§8°N“ó¤Íf²~´Ìý¯õ?clŸü{?EÿYp¢¶Á»05®ð%mž_oc@�©ouüËN Ö!!õŸ÷m «²&l"¹Öî:¡4­â¡Ì¥˜¦­œÙÕAcA(ªü¤¥8E%¤‚ë†üÕíŸ-8¸^±6gŠZâàI¶(]„�ÓÔƒŒÂÆ›I`8*sŽoM<ÎÙKàB‡mûI—íwºpü•ùCNMÑ{>ac Ä. ªÞ‰Æô’Ú�ÿ1XT³åDµŽ²sÞ@÷ià/ç "®½ä_!"Ûõ…œJŽ+,uåÎ{Ç_·vé‡kÇF¡Öñ2 Y~´¼�ÉNò÷P=Ö•æiZé\îa£ê±qDQô–aÉ;ÔѬ#ßµòIX¯s>PUÙôäKæªcA*K\Ëmßs»‹üF8#Ŷ’¿„wò²3š*†¾6U½€é${¡äþlà+«@|^H?*èx_ïXF·ôT±b¤TF%µžÜž{ÀÌtC^ ý4.a,h7Ü�4ñ‚øÌ]…¼Q “ÆI±©¦¶¥ç·¬HΛ¨ :9_BǘjLl²4¼|û°^€If ;qÖN¸²RÏΩæOFq\‡))„ûÜ^ÒvQ¯>F„$ŽF´±¸èØWsü÷ ­]ÇùkNˆU�Ö !G�ŸÙ€t° §%ö/L§4'Û;uŸ^Uö‚Ñv‡ôª A«ÈÒô€àSuíwÔê×gÄoNŽ„Â¹@@Ç]Í n³ëûLýÐMè_û›Vþ—c<“OðuÀ³Vq´Rà �ÿ[ÒµDK¼“.ëwMAœöƒ*¸ )ÖmŽq¼C!û/€�†Ë4Ãa5E»ˆíô×Ì¿.eYÑï¤=ÓN*·¹ <5 }áE5îFAÅ ¦L°_¸òééîHÁ~Œõ0ŸjÔš×LxxéÀ ½å¸=Ç$L$iõQ×›nÜîZ3ëµ{ð8ø“�=Y­mU%VÎÈÆ¹õ ¹C7®D”ýå͹j1WQ gÀb×í©Ø§r­9I>b–,«#MÈ:‹ŽØ9Jå€2ñÕUMvâÄú†¬Äm¿Ÿ¼‰‡n)TÁ»w1KÙ}ïd^ƒ³¥a$- oŒœ$vƒä+UfNЇ¦»ÂÃXêÌg®:¤7uz¸]cáƒ�Íä$¢ Ò¾–ù]¾×¬dÓ�•`åÒ;MÁÇ�Šr°®?ºñŽoíFo"A”ã{1ÍKCKïóØ3ùÅoˆm[1�Ømô½z?í.##^–éáyúàþëñÂ|^ó„ì“ì6ZSiM{8pÚ%Mï# “Ê—w°6¤<þàÓƒj–¨‰(+KxÜ5É#ƒ¤‚u/×[å•'ûöüT}�1z ´c  Öʦp'6‡ÁªåÎyB™o : •ƒH[d©�R0¡áðC`¿“ó1µ¡ÂM…æ"ïqiµCwÖt³¹ñ¬¤¡ñºß®ðÆ<¡Û ì=s)´#ªg`º_Û 3ð6XŒ�¼–>IQ¦§Í`–¸Þ+¢®’Þ7ëë(òÈ ÚLÑìLÑ»wƒD�(ê°J‡K#ÿX9"ÎÈdžÁqÑ~yµÕŽ¥v&IûzµNCd"­™+žàÊõ¤œµ¸a§™ŠUÔ cþƒ�5±J7/�Ï;5Õ1l%kÃg”ëV`ï㔄|oý'ØU< Ð ~T§áŽŽ ]pr kÕOJŽIXb㲎¦Î0ãõÐî…:i¸kŠ�Æ"‡bÓmºŽ›åÑË-vR°â’ôœL”�tîö¢ÂkZÇ¢�˜4N†ìLïÜ*ØäzR¿÷�YøWÃ<–…£XÛ¯ùeWjwtWauË@&|>@¥6S©¦ãAháã‹࿺['»ãhoéØ=R¬9³c�ô>Pô�ô9 ÜÝRqÑ`Ùe“²K(³_PùÂõž\ÿdDÔSq0\ûjù(çÆÆ%�Ä£T¾.ï¹^j=,$©{O&ªް÷ Ï®Œ™Ë+Ü‚V£_´K`Ó|¼Ü�k”L¶6Î]ÕwÄ­¥ê©Ê¿,#‰—,²à^sWÍtÙPÎ?ÛM]ªP ó©k·ÕHÌaVK¶3CLÈ�¦ã3åPvƒlòT×…1­ü�dW˜eZ�Ù«T©mrÐáAÞ×á4Ä·ápšÃwr³ `ä�¶Ã<š<òj3ξ ÿ7€ïIÂÕЊ¢þØIxÜ´¤™í/\Jæ]Ÿ‘7éT„€Sj}'>ÿ ,ãÄŠ³@©Ô&‹¼üåLì¿Kô=·I?ÿÙic09^ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdef]“jp2cÿOÿQ2ÿR ÿ\@@HHPHHPHHPHHPHHPÿd%Created by OpenJPEG version 2.3.1ÿ� ] ÿ“ß…’|¯ªëÛ镼é·Sbk8ŒÉ쎓£oŽÆg¦ûL¢›/8“€¿ d:z¨�� —ç´õ ö®´f­”Í�,³]e&iò¬çó­’uz[îX~²Ù¿kÞFcÆø;Ž×ïöžKO5/+µQf‚Uçÿ 넵ô²3UbÆÏ}f Àòq� ç.[¶B ÚkùEcÿR fÐÝ­,âˆÑõ¨ôíÀmºÐÚßT�äSuåX±ÝÝ£èÈpÃÙž.¿ªìE,v>Á¿ß…Ž|¯ªëÛÿD#°ýûÚ¨t›�®bª¼�ƒôSÆ´t”ÛC dJ’ Hî.š$ÜJÑ ÜB^š~T¢.¬Š–ÉmHéÔ$-;¶ˆé`il�²•œ¸Œ¡¹JGqÇ«÷ûO×Þ@¸�I˜ é•»s’¦¡>UbÆÏ|÷#ø,¤<ùæ…u°–eÞÌ»Yÿh?“!æ»Z5‚»×‘¡‡3™ D™hÈëµeímñ?±!÷7Cñõ¥/µk ª:Êmt2ß…~|¯ªèBÂ>¸Ñ+ŽkËu7'ŒÓe~¯¿“哈ç–@Ÿ6?!¿‚�J¨ÌM"'¿ÖÐ).…7þª¤ji0£i¶&3U€Û ,1zìû,zf¬IÔß?ŒtÐ÷ž<°¤²Fär™oÑ'L±½wmJC?Ríµ_‰sJ¨=~75Î A«Øs܇?ÏÁÞ~óó”¨bB*Ò Mû WJýà@Œ$)Ùdä–$ðÌ�õQ:Ï1mv“+|I*ªd¬ý®è™XÉMu˜Ÿq˜ƒ¤†¿oÄuA£´QÙÄÓ¬ëe1ƒoÛÕb]-²·U§“CÇV_¶ß÷—H^¿^±oyŸyÒðQU�%g˜?{vE“6f„ƒS�&ìþü~l‘&GAÏ–6<0¦´¦^,ÚŒ¥L6�¹Ñ&Ë'Ài5¶+ý-ŠSÀ–ßIÌhý«ï8@Çõx­»>ÏO4Ã) ÷ÎÍm2;GwÚµŠxÉOƒ†½Õâ¾eÖBS8J¨sØK�’2 ”Ö"Ìi¹°¡)�"z‘¿5ŸÊ)™!�þ|ÚmÂÉ3Ñ·[Q¸ÑùÓû•¡æ��¦Q4™íqwqyUõ¼•d>�‚N±R+wô�æHWÌ©J1¨ o×Fˆ|£ÏÁÒ~Óó}”¨bB*Ò Mû WJýà× „¢GëŠùé` >½¾KâÓ$¾«ýEŒd^›MLí^eí€xKåRV| =ýIˆÍG¢­êo–}leT‰º¨ØÍn!wŒ×ÅY¾ü#t©aƒ›S&³7Þär &—I_¥O3%g˜?{vE“6f„ƒS�&ìþü~ˆùxBp§EAù¹*{„�§6Ð+¡ÏèбŒÅt¥Á_ë퉮¸O½ìG­PÈÒª%bQ)Ÿaæ1›âfçmDOµq3›)#Êí²�oúðc²Ãƒ$5åâË‘º#y\·”Ö"Ìi´ÓÊ}E)ÕÄÒ¬ìjê½d L·��rîž�'xÜ�²ÊýD¨%¤Ü%‹‹OGa1‡ÇðÝt†¢üièN=æ"”jÚs$^Cæ4¢µÊµ©-{v¹±× ˜&1ËσAªºkz$r¼Œ b–柲Èÿ =Ë$À{ÏÁº~3óv”¨bB*Ò Mû WJø;ÑÆý�ªq…§…‡µƒ¨ô–è[ÜÀ5/Ý_EßÊHuGð31*£1𡲊;=[Ý`«ÍäÑz$\TÆÀX õK õ{ Ò¢)-aH�YðŽ¦–‡.d •–žp;‘×'ó…�ô¢�ÝŒ9Ê‚R$n&QÈF¦³Ì•ÓÂ}žªð€E¾¶&\Ò×Så>½"Têlìßy^ý&86Ì�³.›ÕÓjVE�j@øûöšX¾ã-Z1WW›~ݧ€ 7î_¾@hçZÅ7@/”Ö"Ìi´ÓÊ}E)ãá-dU¢w¨Žã/L Ýáh³ëü. 0PTC_äh –* î/ƒÃú™}3 ¹Y-[Ùòމ8÷SâÚߎ¸î¨h7ÒáCÍ“¢h¢eÝHan›�~]Ò;;"xöjÝê»ÃB}Sç‚*¹®gÏ€Ÿƒôüè€C°Ž˜Â<ÁÜâºÑìi'ºCG�Ÿä¾a^=4~âòv ø_¹*8àÚæ%žÿRøRíçÛn…€ù\>øñ ¥~–6]¶óxy¡j³GIµê—qP¨RÔ–—òe(_¯ÚèVØç©|$}öë=Õ°U¯7å½Îab+‘#äÀ‹ü‰ _ åôŠ 1ÖÅ  Kî�xØV7ƒö!ιhòy16Zæ¥g‹ü¤ªtÃR7`OÁû©“¦d¢e'’ÓÆx©£¢t4Ø$*A©ÿt RÛÎ%‰ŸÁl™Wrd»òÕæcU_Ë:g!šNNýWlu¿‘Îýì-|Bþ!Ъ„Ü„"ìüPm7rÔmñö­äåÑî3¹”b·]Ü=œPùúèLõ´rÛXÓç€ÉvÚöó ÏãÏ6–¼`!ÇíÞv,« *º’0 Io äD=jª*ëÛ…PHš_2ÝóÜØQdHï×OÌïµ^±_~ˆIyQÓó˲_ÏÃX§á«±økˆãlØÓýR8x`ÖT¶–J ã|t\Ž{!§)˹Ç-ápí&–Nlz!†�ü9:í4‰(aìw�\°xd‚]Õе‹$ñLydæ¾Ól"ÂL“: Ú”õErˆ A`™ÊHÁþÜ9áö˜à•;¥-|ceØi·-ýån! …æ¡È—õE¬)+ÿM †Üë”Ç4úaÔ¼ W…Â!å'íÿ2�Ö,•÷ø¢MZ²€#×þ7ÔoCš¢Ç@XÝñ¢M˜s—Sj�÷5ñ†yþë³LÚ4{³¾Ð¢»We|¢Ü~½†VÕÙΣüå;Ï£DÊÃ>¼7zÇ6ò¾x”âB-ùù9Æ»çÃ2ªybJqR¢ž ß®]'‰”¬©eCÓQE¦²žÁ#B–�ëO8,Õy¾låRøÇ)ãê³!<Ë �ÿXinή¼BT6Èõ×1£ÛQQ—Qÿ>‡ÏÜ£»LAT@·é”µ|•8ˇUqN·9ÎTiz…¡íÜÔ¶[Œ�!þö»Âé d_s7|åÈ�D ðÍ[< Šºêyr' ·÷â2´4Ö˜åDÛdùÂ�·WŠÖ¾% x7#©\ôÎæþNN“J Q¥¥Õ\¾D˜ótÓªr‚�þ—D¿‡‰¥&ÖG¢ÌÖ‰Äaü4]*]¶{c{S­�Ç_ Õ `À�”™¨?âŒ@ÿ`ŸDûnÊ!ä L¬ØTžÍxÒ„}~~Q»Œ· és·°ôl‚ëHÜEPi©=Jø�ÈD(¥tî¨êŽíX3ŽBSµ¨[¼T´Ù!‚ wYøíÈ.*†÷`Sõ¦Rx@þ–s5çl̽�*õ¦Y:(ÑàÓ"WQtSi@uøÒýM©~�aFJÆþ›ÉP¶œJ—^‹Š¬œæðx‚2‹e†Šdßôû†ÿOƒQQ)r˜ÈädFSÖ£køeƒ—A­û7âS é‡ê §yÕì¯áµ¬¦½z&ù¹\…bãr«®÷®3ÈÊ„ŠÃpf-4�Ï2º I½9NrùÞÐ=ŽÚ¥·r�òõÀ�°«“´d‘Z߯�x‹j 5NfØ`;QVâøág¯ £9%ç¼×”<ÛõcdùšbLg|ÔêªÝÚÎ�6{‘–¬~±þ#ÉšLÅÃ�l^¥¯zÁ^¥6DLu;Ÿ�h«"u¡E©e2™Ä�ø¿y{^_ûçêFR*²t »p°-¦ê1HÚ˜ãçÀ«àºÕô7ãà]§5ù³åô_��¼Èôn°MImÿC8IŸÍ\T¡Kß-îK ¹“Ñæ^„ŪR±Ú<=ŠÂúÁ K,o}ò)>-?ÂÎ/ßþÔ#ÌÚ&ÜDS¡À‘´G6húNTªJóÌÆìÏ Iy"¥XeƒBý�cqÔãÏÃWgáªñøk˜Ðí•‹‡ÏÜ£»LAT@·é”äjÓˆœ •vXn1†QÞ2Tý+Í­¼eŠÏ=0xr¡ùŠh?Ç0 %Ó¾µ;¡Z ;Q#ëxR81(õʨŽA"˜neš‘ç°Ëø@è ¤.jY³8&ˆ }93ƒçZ\¨Ý‰ƒ<Þ>ÒzuŠGêo^&Ô2™Œ·§«½I¬‰·_’:·êÛ#€-AãÕaL¢Ïåk¾RI›TÈÃûû†ÉGÔ#÷΄õ¥uÌ4Åúewo`‡¼‡h(Æ«ÿ Æ¢�‚k0–b¹fÝ�IL4…ŽrUÇ6I�8Ë™«›7½®{-ðv-–ÕYΫ©$©H PÖ³as;ù_�žŸ0rlV!0ýËMÞÍ Â?$š8èÇÃðŸ‚�¢­þêp}·'ÊÝ…Aϰe1ÓfXÐ ¼zL 8Ú¼M�lýMŒÏQ™Z`íXfÖúrƒ¿ôûìuЕÓo (â#tDf¥dÜÙÙl¿W�9Z¢ÀO(˜Ÿ%m‡åLS®¢sai�óÇμ�Í,Oc„(�ÛxiI(¸˜¿�•»_T×c…3øH·÷ÿlûç €'“¸½Ýø-6nŒ8ï~¬ë9[ï�}ŒPðUßžCÓ*^\3ùâêLr3†Bÿ1C{ä·ÂhÓ2Õ‡ˆI¸QW#p¬!SÄÂæ“¯/ÿu{©‹Z׿1î³%„L‘] >lL–õýäÞ…Xú¬$м�šÒ¾Å:Ó7 ƺkçº=>/ ÍIF#¤u-Æ!ºÍ  �€pr~hr0-¦¥G¿ÏÃPçá§ñøjàãlØÓýR8x`ΦEÝOÂG`ˆ>©‰ýÇ«\h±¡¾™ý�f€yèyŸ6ç¶ <³­°;œH-â×Y"Ï¿�\M:c¨ºâ¼ÖÕÉÀÓ–å%+Ôâ’Òšsü,}c¡«¤�Èß^×OCûMbØ3ÉÁüïŒùbZ£‘HnAü‘FèO±QE²Ÿ‹a%ÌÏ/NY¾pê¨W;4ú(K1¾I[ðšÚuT?ñzMz t÷(Š÷g•7¢ò0Jü‡÷µ‡ƒO…½ò® ×W¨²�èn`Ç´´M´s˜ €o±ÇZi“Z>Ãcè\&¬| R¡6’ÿ|Ò i˜Ah· «:�s@/ñ¢’¿–‹ÐÚuÕó _>hd/tït*õެvf÷Ú‡�?z*±~Æž¹È÷‚�ŽRÈ)ö/âûÛñ¢g„—޵¬l"ñ¡£ iDv/ïüð •a`!Dì^lÛJ� ÚÃD hªD7Í’&Ä�æžZ+¤ÖÁeÄ,xÙá( ¼ ϘyÊ�{±w;æ¡�<ö·?>Ĭ¸].�ïòxš$óë®–Ã-�Grìè@ó(-ä)š4IRÿ=Vñ¥ñÈððÖŸíéëgui»6xÂÀ}ì4þ·ˆAÍùkW6ÅÄy ·‡Ø2ç;�±^-aÂe|Cv5ôûìuЕÓ´E0:B_6\¥À0dÿy=�{ËúzX£ÄM—a¬fØÓíÁ_Ò˜�Ð;㬖ㅥDéyëk«ÛòDîUƒ· 9Cà43ù›8ó°5DÿÜAÂŒ~ÀP¯r2ÔJ£JÚ­ñ¢¸»j¼©V¦Ô„#poMš1"ùâõÝUÛ*ˆ±¡¨@‘:‘´J“r#�€.BÅÕT’ëÁÛ;ñtD"‹_Sþ¼wS‰²Và)˙Ф°h.ëÙÛ¾ 5DØØ'CìÖ„gS�»C2@êgÄäWÆ(Yc2VöÖ�Â+»Až®ÿR#_"n  Þ È$ßNüiÈü´°i¤o.¨OØz1Ш¿Ž…ü5ï¿ÚòA²ã¾ñØÜ”ÕhÏt(“‚Ž” Ðãж ªÎ7U±R-|´¹ø"eKÓA.`gñ±s÷�BÝUGÏ¿¶º¡8Å,­nx*ÇLxÃåÉÍç¤u,¾òw ›‘Õ–52yé�ç¼}ï´x?3*žÈ{Ó Z1È2°~½ºZOV7ÍM¸ÕË B�Õ¸–P]ÿIÙíÇ~=¶¸LBU“pGƱU¥S€KÁÆ:2í%â0b�ÍlØjÃrá” ÌæçìfOR³›Å2vÞ6i7:R¼î §hε„I8v½¥KØÓ¯hWbs"êCÂD|#Œ\¥3¿™é—¯M¡àð>U“:'Ð%Ì—ÑþºöPM#Ôø¹oðŒS;«C¢I¾éÃmÕôC^ñý\å2›s_¤3M3de³Â`¹Ú‘u:/m{¶uâ(`f  -;¡“™žÌZ9›zp$¦¦s¼^Ȉ±N�™_ž¯ÎÄñ*,”&£Â½9lV©2 ·¨¥ QâÌBGþØ>¦Ù÷nùµ –Íå>ø"§vÙ±R:aryÁk&á!ªÑ;«Ûð…:u¡.'Ì“ü"@ÿÝ‘8Õ0~RÆïœí&]÷Ì·ö]-ÁÚ“DÙh(IˆyŵŸ�s‰ý•êÁžxGGÌ´‚“ asו³ EÌS‹÷höÀÒâ÷÷7N÷GÑóVjŠ´‚̰[´ŠºÏÃТüýgçéͯJvx³h¿��,h;4nAæ(çP„@b;] u>ý©Ç¼mP:¿d�¼_”¢“;nöÓÅ&ŃÌz1¤é=5ÏÇñÛøp1à{ýŸi‚EKÖŠA—ÿ7%FtØ’;�¦äÞc_«Ÿú®¨¯\€/uNCµÔœÔoÄG�½«wËH¬c}àè0 ~‰*v!1KÛNhñn Ç+ ã_ëe½—‡ÍPº1ä>HÜD�á¥ã¿“ÇâÔ–˼°n±žŸ€Xƒå<0µ*°Ž�í{GUWr_tëâÀ›K,�£½ÅÚ5|K¤¤Ë""@-9ß ÞÞPw|$¸úóucÛ�ä| ›Êf¶{©)˜özÍå#ðáÀ¬J4TÜvP)·¢…ÉÝ”Ïç‹Ê<¥]ýmÌèÑ]‹X£4Š©êcž©¤Q_ü欀ûnrq~@¨fÏûÁíU.¤²wT`£Ýµ�ƒ°Á{F«'²UYLå�þ¶'ËŒöÑǗ٢ʽÏ]éG¥§â%­h0ÕÕ'p‚žœ7�Â�>ÙŸöêm®¶ñ;£E:º �äŹwÛ£¨Ÿ¨ò+I‘wFp&ì!Áã`;N*2Æ«¥±·§:Š»m¡‡uÜê2o,¦hNÔ‹Œ™×£Ò¥Ôi “„Ñ;²Ò-áÒæAJýUf™f!GrI‘V+˜qБõt‰¾Ó‚쾫çäÞ÷²*æ5 K�jn³$AÇ zç{ ãúÁ)õܤí8"V!„Méמû#ÃX^§ÙCAm8 ŠÙñ"·~ÎDA·÷—›ÈF1÷á"Qd)òsZÿråÚ×á�AÊò øÌM÷40I.ꪞç3Á’S’5źw^Ï›¹ŽM ó«ž³šbܵ¾¶±!é‚0øW¬hÙ˜.ú-ñé/�È“ö†TèíÖÂ%ņ(™#vÀB'á·³tô¸rò!ì>SšÉÑ .‹)N[KiønÓã$×NQȶ(ŽÀ3?ÙÒ¬Kàèuµ½¼õM¨±w÷ß²a•‹ÄíL ]�›>£â�u•Ž ÂN^Xû1‹Ôú³¤×³#ZêŽ^Z¶J;»ó®™¬RLžöR'�¨ˆ+ømU išÜ>Á3NgÜ� ’–I ™*öD4kiYR�'“úZØ,3'™ðw*ç˜;—Ú»XÕiˆ÷áG=òe\:úý–ŲÎ/|ð³ñ§­<ufwÜ  ãk$ç�Ïd+�YI°:á’Ü3Dx‡Œs-í3´ŸÔ r+0²¬q^ FÈ1Óüuù)R|>uHþ�‰ ~È÷áÑâ®ÍÌ\=«QèP$?$Êš,hÈÅzH?ª�Võ. üTÛ’²Æ&‹NžƒT�Jz�²9Û1Y¶ðêºûö(v‹¿æci- ÔN$>i`åÛ½ñK•´KF>Ñ yto$Õµekœ 8u2¿à£¨�O)úÖ"΢²Y¤µYt2££Ï'µŠÉm!vâþúcn9´EãD»ÿ~^Ìc˜·©[§¦ý:‹Lµš 0C2´Àz·TÈ‘O�¤|Zç­cËR] „:( ÇDN,ûlßåã‘·íÃz®>'›¼b°Ëòê¯àÍUáÎ1…ýÑfåúkÅ—´8ã«q$<ï.šŸƒX;õ@-­:L‡—FéVœFáë­jZív™3ƒ�ÖüÎûGç†H÷êtY¿Ë…˜® "볃Ý”ðó\Œ†mc?˜`¡ÉNÑGÝËÆ“ dEv†âÃÊ–ƒw˜övj@þÆŸ¤ì1_^ÅåÇqGN\¤Z #óÀuÌo[@M` ­ ¬¢ƒ*›1èD´HÍ6Ïùr¤tÐcÉyP‹rÅçÓ�ã—Šµ@ib|Þw‘TÃ_h´µtÇÜxe|£¥È/š,î¬q‡%¹6°~EÿX(Ÿ 'ÐSú-úêÒÞ‰�9s0U º´=ã·„ÛˆP"ÀÝÂâ-ÌÛ8¢.ÎÇ–a4€¬.©nåyïîùd¨·ƒRtУL¨!šUòƒ©Tk}ªIÓe”X ²²Þ§׬x)#¬H=%‘ìµ6£Vä*;zÂÃ>ì›h±�.⟤›ë‰q ^cçΉÊÏüùAvl’,T>JªÎé¥ÂXV¥&mªÃêvk‹ýKˆe93Cq½$‘ÃUß¡~÷“šÎby'öÚaëGò¾Ô»ßÃEï½ è1Üms’Ÿ3ŽnrFÓ4¶R5Ñ…�âa€Zi9É#š9ù= «M:!ð3•ºée— +±s™p<Þjˆ˜ƒsß"t¾_b$6•~ðz¬‹cKá™ïmóaŒÐÞU\W±¼0“”‰žhYAàãù? Òl½¼,Ë€¨@?+¾Í”BÎ.4Læ-,’�^qH®WÿE�-åL¾o;§(Ùlœ¡…D¾jpçyclQœ¶hÆ$95³«o�:›‹+Ð,l9cíÛCžý}ʲEú| �G#±©õjæ—lW‹‹Ö‰¢áªor7¤Ž>SÐ#TŠõ5n5»í¶²»–T•H€F‹_,Bx6z³f™h)üa6b5ã„\•Ÿc-�ïÎlié«IþIA×`¬Ç9� ?¼–€ÿ,"³z­L—“”oùb¯+Æ€cÈ6oX#|Õ�Ì4ç>aÀ’\‰4<KšPW<«ªÄèóõÇî‘+ˆŸìëß,{�h�+âÈ�â)¨ÖJÀúWDº•GWD‹þÏŒìùÕU°¢Ñ/¡€Ï»,ΰ¤—Œ‹äkñÞ:ulß`=¯™R‰Jã )Ldà.0¼Æ’C4Ÿ�<ó%Çß”Nÿ‚VcåAº Œ¾ËŠÙò…q4�‘ûWÇxÁ'�‰‹dÚ÷ÞUº°µÒä6ñmv“V©äpbbXˆñ"APõyËnÇj-Õ‰ Ôñ�j÷y'àë> (Î<¹¼ÉDI³ ä"WZ>,‹Ž. i˶Lc+n'—ô(ßaÍ�£Ôupбf¬Ö3 ÓäÔ¬x…´ßc ºA-}U ÕnJEž!Ú\¡c;,¡jwé°, ‚Ùþ�¡—Z¬*—®ÂA³Â¾Š{¡I(E>€÷! dt³”…Ëcã|rš³H͆©îS'ßÍ ûN¾i±©PÛïK_ŠRqbq•¼…vÖy ÆÔÙýóu di¬iJNÑ+ì 2Û¶ŽŒ>Ï ÁãP6X•ã¹úžW¦à2š‹ ˆÐg¹‡ð£DŒSåznpŸ]º‘`�Q(,ók¢PðåÈlCårö Ù¨“ün¼¬¹8XG†ÿ7÷»ÜÃ# ¸ë…á%´+nÔ›q»YìK”·A xA™èW¶bw]â@Ÿ�Êû¾­Ì9 ÆA¬GÆÎŒ"žÌwÉ/îþU­Hõ–þ*ûÆ…6½™¼=òÜù�‚4|aÇ¥ëLZƒê E‰˜qR~gÇ‘3áŽÐbŸKœ¼’�».G[ËÅÜè��DÃÖ1¹­áWi¹_à‚²­p_׌NZ‡Tÿg™93†¼e˜Jáù`ÕB˜â»#tš"‰ðl™²AÙÑ™6Ò3 æâH*íÒΨ{œe‘ 5ašrð�7 ‚¢œ¶ßýðT’Å s²�ûÊ3Zý'ÏD¹÷Ä ÇC„‰@ÞÇ3dn8²y,2Ã{Q±ÙEÙf«}ËÜÀ/ vl ~Zãš ©bÒ®ðÏüòÀJQŽ _ƒ>ªÏhw¸Z鄇Ædx…£¾Rñ¦Cú˜ãG¹›aÛ�OÏ-Üv{ôÌœ®µ_¤Â�»3d²�9ý»äŸð¢’Ûõ Xüÿax‡ÌùSþ_Fê ö¶¼c,M§­ík!Ò š:<;À$ Þ3·vý“LþIý¾[›¼¥öQr3¡I¦™¹¥0¸¨ßÓø&g©”ðiž½™»Fíù!oW³YîH7xㄱ-›RÚ¼%œÐ¸¤ã‚ȤbɆ7Í<Î}ÁÎJì2yHVÅØ…J¶>! g-{–Þ–üYñ@zF´wv0{0/ߌ·T{:,FÄûì*°É²A�3—°4Ô¨Q{êt}:Om�L zÜê2¥ ý~|GY±º¥E4B  |ti´–Õ‡‘˜{É6×ñ÷}ôŸBîüýpÅ¥M£ëj ó¤§ÔJpõ?w7N¶l!üðùŠ»v“£`¿g. µ¹ž'L5Õ*ÑB¸IÿIÐ%e€®LŸf‰OcU¼3dVäAyúË…rk¢YE+VŽ÷ºÒ&îcu¸?¸®D¥:½j%m[¿iÉ1h§py#ZÎ%ÔÕºÉyÇ£ô¤¦V!q¯èrŠ €='¯‡}8‹XU(Š.ò,­uÐ`L¿VàÅ¥Ô“Æ{°½h´}s¤!QŽë†Ë’­5°oÈò™‚†:� ÈÒŸ±û°bW@qrÌz¯a #¬Ô?hcm§WÚÄgB ”kÕñÉ1øgªH¸øý^ø-dùºö·‹®UqáßK–¶�‚<,¡]/SÑ W±òI){±# .»Òµ¤«ÿn³«»kîÄ[cc§˜0—ÄJÑJàV©“ŒˆNìµw©�Üv«Q­"¥ó†î•lÕ¶?˜F®UÎ¥øƒ1“M@{HxÚÕ�xãÉ�0ÃæH¼¥¼Ç÷zò5â ö¡wíVúãnP 4}³jp~�ÀÍ•:~¥8­õ£‰¡™þkÞ±³n1Ù¬ž ÒsïSzÐ&$ðñ«ÀV†\»a&3ŽnrFÓ4¶R5Ñ…�âa€Zi9ß!9èÊ1$ŸºsvIcWŸÕÑø ÌÅÓ!ê�ãƒ^ÒÖ6¤K*•’5, xûæéŠ¥ïàʼnI ƒ\LÀdVVlpËΘY­× i~Î,N”‚+,õžìŒ�pVZªúp.7»~•Nº0º]”:~™˜L+ìŸtZÄGx�Ì~×Åø3@Y_Éz+1ûnÅgõ“©€JHå1†˜66ÞDŽMÿ+¬1Q©!;õŽÃÛ7 Ý%UJ9lzü`Ìz.ÑYáTd]ޏ/ ,Ž`¤Hv1wú!ä Ýφ¨Æ{úýŒ•Pd¦&A1¦”Xým£úbíû³Þß‹[àÙXÆ%’´óKd&ÑoHí0Ðnmr}€W_¯M_WÑÍœ¶5.neÊÍýjÙÙãÁ»s'™ù”AÒsÙÆÕ:xrÒüÕªš™l#b±¥MövÞœvæƒTFFØ]Ý2T? iðΛ@�Us\"#!ŠFÒÀÀ~ØVsª� /¾p?ï·©õ$8ù À¦0U«2�i¢³ëƒ‚ÉZïÀ–ê?›e¡Ñ�çÒ‚ï!�5¶í|U;®ãœÕ·5,±|T®TIàÝèÖ^¼uJö;ø»Ï³õOo2Q¨ BÓÛ~ðÎ~û&$1 €I„;èÆ¼ã¾åüŠ‹äZÀ`€ŠUÚ5þÎmGëJ¡0å‡�rú}”ø*^ˆhÒj¢N¢ŸÊ—<7Mï¥Ý>Ó¤0[[ËxÅé]1‘¢C¾5(4梇AäˆÞ‡wf,›¾°kÈ™UÀXNÕÜî#ûµøîÄè]�êÓ‹œˆ.o[òK-kh¬S-:Îf}º¨a aÂm· º¤�îGOââµÎÇpetW®Ub9ó•ùo–bz1¸±}ŒÌ:þÐxuM”C«ŠÀ)Ѿ•—-ØLâ‹n-\hµŒŒ´T ='rãS’(~Õ!ÚÃõJê}*&<øÈÙ‹á©Õ†¾ó,QáRa°xh•M!­fq¨þö+D£ eU“$kNh1y†\`ÃÕ»0Û‚¯�4”B-VïmÊiåÁH3­û˜ ßGåð%æ­f]‡Êk{_pïi¹ÿh…¼È$ "ÿ8•x/–¬Šï½^a ó\Áó•27íøüsL¾{³í;ñÝJ¾)ê5-_!q®å(Z�‰>‰[ðëbÿ_%B5%”î@'ü�eLõðžÀ0Í`¥šÚuª¬Ð5ë:Ï»+~U¹AGB.®í&SS…Xñ¼Íj²rh‘~$ ÌÜ¢GÖ¬¢â®í¤*Æñí’lVuç«b™#:#7©‡ë®^òçÉ•‡#”"ôJ¯á b{/h¢þt Ê–=“p²¾è:†€](·K±t2V’% qS¯iØdšM¾BÅÙ^2Öéz¢Þr!€7ÛpÏ?cçÑãF@àTÿx·`pï”E�(i*n3# àÚ�yNëBš¥'/4Êþœ{è~ß²Õxõ¨ßÛ»:ýÏýóïR~~ˆ@ͯJvx³h¿��)>èÜƒÌ QÕljD¦ K":?ב‡ò8Þ‹qbûR4>O…ªó„bK×eŠU¥œ¡‘Êt‘UŒË½®7£~é¬]íHé½>ݚ̗l¿”�LÄdü�<\ÇSõe¸ò“o5¥�q?õ [¼¢š³ ÿ+É9†oè2EöŠ.—_ _¤89B.µîÂm£ÉXÎ';È€òø„kÄçªÅÛ`Nù�Ìá/¬‹ïÄ­(ÜÅÒ ðÐK% –žÍ©#* †Ùé�%†Xoi»›R‘byMxA±+”.¾ÂÖ‚/Âúî£6Þ‰§/4¨6¥Fá5Yѽ�µ»âv–ƒü"”ÄÜ ¸äGË¢<¢wa�UhRSWj�ÚÂ:P](Ú2²,6�±-Žî½Äl +ìXÁx¡×z6ƧTb¼§„b¯/2ÔP¬¢&á; ŠÖƒ´â¤ó¯n‚ôµ€ÚN¢„.ÛhaÝFpùWn ÅJJûa‹!t8ÉXÁèµÏQZís›¸6®¡’«ÄG‚ý04A�¯;Ġ瑆…zã ð˜kæ\×Uáñtæ5êûÉFW¸¶¬�p|z¼@_©^«Â¿ID©í‘Y¶šoh‚)n‡iqxÄî"ñ\ºÕ¶›¯Zú¦É뛟‰º¿ÌˆPþ¶ ¾¢×!¸&\É\Û[Õg”n³vŠ=R{;�†iìL'ÁÝUuH#ppd•V7~:¥†«é �ÍöÜwj^]õ(�ɤCxï¼ ‚?XasHÑ‘t„1ã÷èØ(5üg«»\‚l7^Fem`“$+õ(6èTò~²)ÒtÆ­ê»éï"L«,vßÏ�äSão_jÏ@B>ܶ:’ì¤Ð7±ô9¾y]ãÔÓZ]/™*,ÔÒ/Œ”CX_h—H,ó|˜h�úD )“�õæ´ý›Î*r<ë± ÛrÁ‘»Ó*­³Öœ-˜˜wç]2ˆºN5s·z�`}ÐÓÁщ¯•œ€tÝ} �îØ:öÄʨûŒýáeïry)]ÕµôFÔpe: rù®¨ÊÃ¥†±Ônqöü£ I ¨9»–º%DçMÍ0µ¦Å1ÐT¯ìZŒý8¹f4ñ(YuÌã?7*ömvÚÄ'ª®xñOŽô¿¶ 7E˜�t:oE;��â‚g݃2$· k`¡H'Ìx?#/´'ý§c¿¼®{àâüq@éËbºÝ­ð¢.Ü‹¤¾Âú Ï鸮-"ÿR†XäË©¡o×€£‹èPöQ Ä¿Þlâ!¾PÓ7É>Úúë¦J¿N7õ�ŠE`RF§ÑqAº<µ•†2– @·lC\œ³Çä�ßjÁXlêãZzÜ{š ¡Œ‰º?£@R­ìòv&Ìê”KÀÐ=o¸úÉÌ1ƒî¾Ã¯òD“µ! ’ J  ·: G„3³äÚx€õ drâ¸Ñ-…w¯èÇGêfvˆjGÍ,`Ãì0ã^÷‹Ž*,+oÔÔ1šì©Ü š¦è@¹‰5™>h%ôVæù�"¤E£ûÝ]zëSx ¶Doêæý3SÊÔt ÔËÒzРb‡!F_#N(1Ü#rºÊ¥�w¶#i ~²`cÜl`RLeð~ ¬OÞC0úžTY%/ï"3Áâ!_YšD¾½¨Ç+8áýÈ ì¦‰upÁ„õ·ün¿=)Vb–c+qS¶%dw….VÕÞ£KÈÙ«jÊ×9\˜á†‰5Ö�Œ»®Ëž@4/ÊãT`G |ÀB•›LĉB2ìØKà®<„%­¡ÇJÄh:ÊQŽ®] ¶Ëñûv±ô�·:8¬¼q ˆ±Ñ_DíK·¸=3¶%ƒ¥!¼ÞìQn4’$”±Ì–ò“.H¼ÖŽXõë¬á¢Å'¸ï†;£:¨Odñ+7æÞy|­Ð]˜ÍèÇ0ÓÄ%äÁk˜"©ýø=ë\$ݬ§·Ûz;÷­ô))C‘…–b!YJQàb52=k©ŸDÒhƒ'~Z¼4Ô‰KPzðQÖ^2ˆ˜{êÓ̲l„ü% ¹ýnCÏ‘™Aغ‹?™eäµ'¼ˆnp“n�©$Ó>ö{jÆM—ûP»a�Ǩ#£44&^Ò”šrüƒ1rò£µ�&B5SK\óºäòûr9târ•¥ÜÖàÂ9 ¯ˆŽ_3su.øÂ+©i­Sóé*Ñ gãó‘OÿKÐÎ#Ä9:I™æ‡‡î.¶ë�JÞÅ—#cÖ«§˜AÑ?+ð›‡îýôx]Ü5Î#øy’1�Šõ4ÒÅw¶jÌEê‚‚ñß�”’Šã)çûñ1¼¹=-nó-„‰Åu0Ûí¹,þéwû•Œs;ÅËn`RïRšáþ¥I_Ë?͹þ7S ^°l#‹6'Ç|Þ^Œn4˜†’T„®ÒVwÒ36 .=6ÅmÓ¡xŸmÝø²‹úÞø¶ íhð Wi7°ò¹#‘/á™>ÜVŽ`ìaxv|ú†»`DoÖ®–¼W”õБÏZ¡ K-—¾Šebf6WžfWº`þ3ŽnrFÓ4¶R5Ñ…�âa€Zi‚ॅ«GãÑw¦÷B^d?-þÖ¤ Æä‘u� ·P[8ÿLB³�øuÃJ9!É:}`Ð÷Ör:, ýó¹9«ÌHèî`®ßŸ…ÿ¸ /Ñ_ø°^§1”ho# /¹Ëdñ¶X¢r}åĿбȆ ª(ž=—;Xi…jXÁÌÄÉ<å}z:ÈVé¼À\:X»uŠ pˆÂ$Ú*áµãÇ Jc’¶Ç P`É™×n ´ˆ�¶å]4Óº®FTvyû±Ñ ^ r@†ZS "‚…^GJ¾Y‚Å–hØ`•êèòdMl� 'ç1:q0SÌ]M¡+9Á°Ö´­ –ð“@r–h­÷µ÷)vê‚*�Lß"|¼g˜.l¸ r¶Á³"Sµ,œö_†@iäªæÈ Á}'_“a¸-å‚n|Æáu»æð[ݾ¤^Ú5Ó;Ü�Ö·dV[²rhß>kj‰�³&QœÎøûPmc¬hñ½]ÕGXå®lÌ=òs3 V’Hÿ Œ)ÌNþñ�?•ž^ÃÚ€²v2ô¤BHÕèâD6…PŽ …Ë…8„€Þ3¢C§ÙÕÖ¹=šïñ>ÒIº¬élõaí² ‡?‘†ü]Úz�[/Pý0h+ÜØ‹‹”èØ€}êó绉êN™ã3œ¶rÆÖoõ K¤Q(‡åäl5«À½¬Ì¢¢fìqhs&Ðì!C3pQ1Ýh™ÄqžŽi0†í¯E)š²ãr²�0¼¶Î! jsÿi°™÷I»Ì†½½_<@ëí�²kpqBX§£¹U�1>ýRÍ–ßd˦}*˜HˆÙTV¡Ä)¼›ò6ïX0ÉÅ”·kŽßÔ È¡(I­€¯o�¶'å ~z‹!µÊkëéÊO–�,S4‚4Òð?M»;ª9vö?» b‚úÔŠ>d…”•ù`š›ÉÓ´Ü⽕Q¸Úî˜e»—W~³�ÊI…˜‹}vO’˜ƒéeû5¸Ñ^eÓ¾*Œ¼V¹O©h™ëÕó]8žXæFù¶lo�jk×üÓ3ó„¯ÿ`S¾¤N&P‘º}�gu„Rª¦L�*�?¾¨«Od¾/f¸'ãÛ:Ø šêE™™ooS‰¦Ðü¯�Uƒ†æ!¹Bõ;vÒó½’>ÎÜ :Š¥T»ÆB'ý£#89ÎÌëÝO·$×`¼fVº”ÄKã^CÝx&óšûnݧû*c ›ƒÇ7äIVÇJF•¦×úøØÇtX®Õ€R³%Ú­S8õêïÁî1�+¤¥ À¿¤º 7!²6Eû6Ç iäÓ†ž n&(nÐéŸÞa#À"ÓDQ�àX¿}0Ž4‰Ú‰¶Ž¥ídÏæëóéÚ~}9µa8·ëµ|¦kÕ‘ 7ªoU±âÌâ½õI'¡PÆ5vÜ|Ç:C"³óÝvP–“néØÖöÒ•fèð™O9]qê¯�£Ý�•.¸Šh�>Úë9Ôd‚[JüÑæ"¹£�`E9íŒ:‘TL\Å ÜúÇÙ�Ê7~q:}X÷YøJ‡É;þ•¼ók06Eüxzæa ÞÒ$`“³_¡rCnì*¸j"$U–ON'IÑK †ÅYÕ ”ãÑ2±ïÞËŽ·ö:�òðàáˆD;xçMë7âÒ¹¾5a8ÅÏædÊÀgpšÜahCWÉuY}¦Y‰ÒDöDULšôù×öÇv]ß�„~PåfoWå j÷âÈ;l›¡'y¢ {ç\þîôùv³{}K>Aµq+[ÑŒ6ÿ6öÍLL`3ÊTl‰ ièÞ±ïPâ !�à ²ù"¢¶¿Ê6n©2\Ó@ík cŸæŠw=ë´µ�ËíÒ8Ìçʋ̸¯Ä¢Ï ‡kóãBæ‘_ÿcî··½ˆp‹¿†ØSoÜ—ès·Æ¸Uœ�<5rƒÍòŒ!nÿ€éìwíR[»·—aµ-7SÂ×3ÿ€�ŽÆü·Íæpã ¥mS}5ìâ Ù™¨†V*�~šÿ òOP”ljþœ�®œÏ%G] 2�`Hè¸Y�IwlC(a:­Ãì+‚Þ£“}›§/÷¶èä j3ÜZŽÇ�ißQ�?ô�öcŸƒñü{VÅckNÝE)h††ME¾,[µ�uøD ªÊ4é–@» ”àj?Ì*`O<š,×é@_Mû’Ïø�éüÖúS&h¹ò™—Cc°Õ8îèÓâSÂX]º¯ƒ[n äÊ»…6Íl]<ÿ É»$å)+Ö·ß ‰åRkö«6|:rC¹ŠOy>7ÿZoÔ¿q`i?kεРW°ö‡•º ÕþÆÉðz�xBË®J±u}ÆîÒ7˜­ÐÀW¥J ¨™6÷ÆQÎÅ1-ð%jƒõ …ß|o_†ßËHçÚèèð÷ÛæGÅL¶›wx?,9NœÃ‰·'N/V³ÔÊ,›ìmZ àøY ] ›—NŽÖ4aT!Zé1±ÃFPÉŠZo»µ,À>µaE$ðF³?Úå3�øÃöØ“Ý*åý xŒ CQUìG-«Ò©–›>m8@åu‰f⪞ԺSó\Áäç„=¯“ìhŠn›ß§�€.œr�þêsÓQgcaïsBà’é@VlžõÁ{Ø«}zª5V1âÒI†5â€d«Ú* gSm|[½/-ÜT±H+lBÀ7µæØþæ< ×9 vjHÈ g2ÖMçŒJ’+Þöí´Ô™RÒxMÿ¹ áh€ƒ&Ùx?�~´fá+óG¤ 8ßÜ*ZÅÇ °®µ�*<öÀ°BŽu4wi4Iµú„^Œ#T¨™<{AiGŠìßÀøuj¾N%y9§¢£çP¸ÿeW º¡ÞØr+®}Šs²�éðL~vi=b®–âK­�4ÉU�Çü\å�ê­@š4õ¾ÙÌü+a<2¿<¶�¨›W:;…Pœ�ìn„k*ÕÁÁ`°ë±!€W‚Û9tŠì\æ%5ÈÅošÇ)!ƾyHIŸo±˜?¬ÓªÏÕé®AK5§ÕkRÙ¯çðöî¾Û"ût7øz>çðö§þ•öÞ÷ÛèëŸÏÞþ}¶õøhÝøzu€(š¨¸«²%'c¡xÏÊÛâMêQ’gD¯ñ¾_ƒ áçQ´ê¡ÖÉž)Rñcñ,d±ë¥¨´¤ã+$åâ�ÁG�„^……èSáÙ¾Ýø‚|˜AmCÐQ�^¼‹9¯ÝFpÆËdÌü“$4ÉÔ³œ�&�á*øV½ˆÓë÷á?¡QCr ¬™½””¸Qò(�ŒbÆ_/©-ŒÕ,ÿOD qfÀö¦ºúôßÅ0*>¯ñ,<Çà¶–žM ®êÇ1C•À–\r,ïÊn&èmß)«Çaˆoœ$ Ú@Üð¼j2꯺”vö}8»1ü,‹†â’QÑ•ÙÞX,üðÇYÙõjB-—\GZ½¨^Ý‚P�7xEX¹âòp¿×¬ùË*ÎR¥9ŸGó7<„—Ì)Ñ·ÄM]ÜöD[�UѳÑ—Â/ÖœéSdX¤OšgZݯ9°>Œƒ¤Æ#È;ìymJ”�T?Åî=æ%Ê©¼4ÚÏ­5óFÅÝlÖrà·mýe_£Àfë¸þ/{GÞ\QŒCÝ)šÇŠMf©GC'`Ÿ-h“&Y´ÝÈ™ºÒ�j‚Ô´ù=p¼tLöÎAõôB=˜ ™ ‰‡TW Þt°^´ mf\ÅÛ?½Þ&JÞœÔànã>Pv`Ýd“�”â_^eÄ…IóKÜÄ€Œ_ÞµNï~“›Î±%-nÝ¡hë[}®÷þ |zK«ööÙäÞÅò’–?)qqû™cž Z¿O1ðú¸=�‘s|<�Öã?Ç/÷‹ñwð‘¤ú†é4ˆ’©å5c6ˆd;5}Ü4¬[Å$zZÒú¥8O-QÐW5œì]`ıœ·’Øz¬“�ìXs¨ãËRhH )ùº»Ö¿Šv2îîN¡Û¡¼å�‚t¡Ì`A¥†šEX/Æ*•ËàjZÿyð±äüÚ£ï¾% ;½$¤ÆÞæöð¼¨Éë]ÈkÞ…*CnÌ ÿ Ô…%÷lñ´§6»hsGÒ½:7_†YÀ¤›–ß0Îûc.Ô¾žš-pž J0€�.*¬”õ‡é”0pŸîåT1¯tkª ƒ÷zú„B>Ps§ 9ÊŠ“N''½¦‡r3–àÝc«bB·ªšÞÐw¨]�¨æaá'ÉÒjNwà"ö +ÜOü‰KS§UmõjŸ;›!ó¤V¿T:PÉ<÷ ÙD~Â-%!N…‘óû˱ï?ø†*fË"êÉ�•�à\z¹Ç=6fl‡»zÀ oÙÒ/¦ŸÈæ¤K[yDBùS,€§‘A‰v=<™�l»>À±sÎ…²9îÁ­] EÁ›ËÿU¢¢SÏ1X©R·`�^&ãPŸ´ñ$íöRD»DCîìË„˨6PôŠ�Èiz¥5êØî�ÙÄ}2°¥ G Y±h”’‚Òçµæ»] K]À¾¿˜š Ò²à3dš—Ñ®û‹viïÐT‚Ǻº!Kt‰ ƒ'ZdïPj´·áÓ,ÎV7w±t‚“¸GVaÜKU>›Sà”ÔŸùZïÀzD�ƒµuv4M¨J¥t´›_†ë* %&u6p»ÐÝüÈÏv¡Ñ.²z1�äï·6B,‹�)§Ú!ò‰^ .˜¿¿|]Å®À“Ê\¿¶¨B¿àü"ñ3\ù$k;ú+“ѺˆeK'�ò·À� ýÓq—žö,'”žžî¯ÄÀ"úÒÅ@ʤ¡¸æ™4ssg¦èã¦Æp-ï;!Ѓ6câ´ÄÁþâÃöô_í�äýë{·ÉâXèˬЂlê·Ö"Ìû¶eÙö¼þÙwòàHø�bZ…Ñó£ý»«�Ÿ3¿êÿPËçÑ1{ø34Ö2VôÄ œÌƧ M]ƒ²Ï0~&ôêÆ�ù íã—ìEž€àe&p» °Wa™)’ƒˆºˆsëzIoñ:ôä<ºï\u¦%¼x°4†�¬iAZïÙ)„‘Xª¼«£?^¤®j¯Û¢3tצ°Å\˜)ÿu]2¾‘'—hMŸ©·`=q#þ%æcÏO@ÔÞî÷ÐŽEŸ&�`ç–w]6,\H�,êýò3èMût;|¸ÊnÒ=P¶zqfóºBáS£÷Љ0'_®™ýý7F áéÍ©Ý:tj™‹lòG RNy7Kñ4t 1ÿ‹ª‰6E¬pº‘ÔrÕո áÏNb²%j+›<{‹Dˆ¶/C)Ñ-2qÿOH`Ue…8WW+tòåî–¿,ÒÔ�³P_ßy2s¼¸#4ƒ'¯óÊ©ä+ý–zýÛ(a".ù K`Àí· “´iá<­ȈàÐÅ5¢glé³”\Y-W)å› ¤Õlg¿ÿfdÓP€Ã²2�]l›~¦]`GÆÉJ$yÕd®ãƒ—ëzZ«×Á8­®Ê9Ÿ]ã]5§8n®Ø¯ç ÓolÂ- É1Áõ0@%ps)ñ÷5,ÑMœ;?†©g¨õ^jÁ�å³ 8� ÖrŽdµ~°<-Ø«x”Ìu%�Èî4Í 9ÅÊjÅÆ&Œ¦‹è»nô]Gk)Ÿgbd_vfc￸ߨš«ŽÍÙÝRñÒ+­«žŸ© tž !1ņÆ_É4J‡5½‹-û‡ ë%Ë{mÞ.fL¸ÎcEn4©Œõ±ÎŒa`}« °v¢]¤éJ�÷}É4%ÚŠ~�m€7j&ýOÅöRÙbö»YK†Šl†�L�»²ƒË½ŽÔräOîy‡´aXÇ /©j:½”˜ø†âIøÕä ¨]Ô�ÍJ¯é9™… øAƒ ™[ò´“Ì,d´@­ÈåÐVA]À„»€Íü ÀQ ¦1y~«õmSÖñ7‰éÎÕñ»îçwÀw�só{ÃèÄìF�î`ÄÖ�SMµÒXœäˆ_rî;7~±‡lOl;zÃ=‡f‚ájU�U¹ófUMO’;‚§WE»Ó+ÅŠQ'°R(´%ž¶e:_æ¯oî™Óð‰]ªâJ²Uk&Ã*4Í.3ØÈµöÎ~{I××ã–9æ•Võ%Jóbí�¨ßN²Bè’ÕÕ’pÎQÓ:W¼x~žÁ´À�Ú¤`êbà°íaz¨gô•I*–WÜñ|²a~&*}Ç´KrKҵ̊t%nç·Í7ØÑ=’çb‹‡ºï¶º‰í§ >8Áo}fžUAòäÅkï�q:ÍþøÕ•r¸8/Äð™”’Ê"ì€دÆÃTÐ3‚OÚÄ„Ð=�õ¢ðÍJ?çí%ƒî™qÞòmE‡ñKx�•îNÏ4E}$;¼È³ŒkÛXh¥à9/��æ£ã=#)¿vP¸*RÛ— v0!$´|MŒ¼Ó±?²èÝD9Cp®êmdh.Œß¼ "Yðý;y±6�JÖÀ×'Pq»Ã%4NmgÆÓÆì²ý±Ÿ‡_h—}ñu�{z¹ЊêX£ö"."N¢¤×U²�¾Cª[|û}ðmŽ ·æW†ÅzÊŒr`xø‹�¯oü Ö%�"tb¸nåšhLœ‡|ͤ“g‡qU¹$î¾�CÅ8'Xaðþø0Äž®Œ¿„€2v‡â'Ü,©S “ =®%�Q—ÌåÙå�r¹ÈJï.ûáòµ9#ò9ÕAÑÅœßØfSÌØ´RLzF\h­6ŸÒßCÎÆ®òéÝ‹ä^—i”‘íT³-¬ ¯KxŸ<±ªp‹þR*ü‹Eª ¾Õ¡\+é…åÞÙ`ªôÀ¹‡âôá:n%b?¶ÛAqVµ²@PÚÍc’Kk}جTal©4.žtÅ+S±šŸ¡÷{~OIĨ8ñ!·é½LåsQ8QzByË|�µètlMº™½Baó2O>S ÒÞ�Ô~‡eoW¸/âé©hL™À’ÄFq~’g¬¿‹WåD�$”ú—†„UÓ»'¹_ç´mnÎ�-5´¢èš—G§½G~ÐÇZ½=ùò�“t -Å"vš$�F-¿%é]íòi ”‰¨ö¸œh‰=o`“%•Ò¡œ=ƒõÚvŠ{6=6ûP¸Ç›‚Ä5cæ)5�Äï§ oÌ}X”‡žï;`,¸`\5´ð§T\¿j.çyˆ½Þ`·/´ òÑòNÐ|ÐíÁ ãÿcm“¬zoå/^_-ß™ýZ} #DÅS F¬² ­±‹#è¾òpaWÎàl$½Ö—€Ú–.q”~÷u"[˜ý±e&eáÝ€Y ë”ØSõ4ß0Ö·šý?zˆ¿¤®ó”ñH]Þ0Ÿ�®íµáHË’ÃC ý(ŸFÃK €<{Ck7|¼K�è[º™ì"Œ?`õ.Þo‚’4H@™u½'Òé�“œPzPø¶™Ž'Öä(³Ò™8‚Bf¾è\é:#väØÖ©FPžT‘Ÿä„ç c½ Ç·Açú3´°®ØFMy…™RÔ›q—ÃÅÏ2zËÃÕ“Þë-4V|Ù½7qè(Š�^íÆZ.Y¨É�q–x¬ß ŸIÿwM§§X~PÜN[Jzx½þ#áÎ ñ9š.d‹B;¿¯5P¼ãl{íèÁ›!Pä:.ªyµkŽaÊžµ§“=QQÕ~B4Œ¼é…`ê²×ãIHbG¹Ú'dŸå “~†òžR‡Ž¦d؈–QA"¯tœ‚äE^$BdñÀ?œr]a! žÔ>ØŒ+¹y䣿ç`M@0¯ÆVŠîä#P�™‹™Ð(‡ÏQ.9¨†­x—ƒ8Ŭ¦X”ñ±Æ­ëà:Tã­|§ú–öHð$­¢N ý»žÐB=çƺCãd§ þ áÙú’ê/ÇË4Úb>)@Û]›P¤AÃ�õ !Ô™d1hï¶0G8lg˜yT¯áH35j¬vlýÐxYO— ‰�êÕzZÜ�ÓD n žr‹·åàB¾_Í4¿•˜S{e(÷¥ÛUÖ0K¹øïIEêéØÛÇã$x�8Ŭª›îÒàÙ÷Ú® nÆmö(ãäîËsK# ¹µmwZì|3M[Zò†f,êƒs»6¾ÍKâí–xʉÐÅW‚8]"’éŒoœæèjÂ}•ßÃÁ×(±ÇœQ ˆ‚½þ=T-àd#^=`ëõ¤çDÛøÞÀÔ8úÉì=&ª¤Ü`®óJ-àyż h™®«œºä ²ÇèBh#í'*òâ�‡½ôû2X´¥¸‹fW–™¿W�h?¶OÀ–ÏzcKýÖpÎ’…J¹—KœÊy+âõ–‚m-nê¼$.A›}’Gâ4ŸŒ´ŽNœ|ˆ®¢N#H¹¸ùûH›êqf�ú<KÝŠÅ%3K‚È=á§Kh¨yÈN~J¼£ðÎÇ{¤¾'™¼GŠLœþPíçtÙ?§DÎØÆ¿Ðžå9—ûªÙCQ}×ÅÈ?öݦÙKrþ`TWd<‰˜Iòd>²+t§Ñ#H–ÔŒoE™¬øÐ=Ž’5¡C¢¦‡l ¨ÄJ¶­8¶ Cs•ÂâŒæ|êƒêu�ˆŸõܾŠQÌZ2´Ü%ÙkÐY¤xðÐÿ)ËyUøï½«B™»åÍ´Yv‚÷Â|H1Ò‡À˜‡H�Xw°‡œR»d 7à)-Ï�®*oµ°·G°²Á¯Â)§ÕoU9†¯ ó8¯‰�ýP‡Õ¼,׿¥›œ©¼+\�Úù¤„â`SôÙ…^J#[�ª[…4}�©I®ˆÐß4ÔL-Ën…<-[q¶o_’þ¬1Õ¦áž8?ÇÅNcÈj‹�}£Ìªê>#'sIo\JÃ%µªûa^HŽ­Ž6ôw9ÈZh–o ‘¤ø$Ø#ޏDÀ¨•ÜT¶�°9 ³.V˜�>¤N1†®É’©ŒyÔ0ÏmÂלxï¥nŒþxùt²—åz�h‘zÔñ;�r<šk§ EÓ¹"…ë¾zúhû¡§4Û®¥-mÁ£”Güÿxšò‡½š”4š($€ACn7�+:âHPÔÿ‰ŽïÄRÿ…Ñ_qz¨<Õ7. ÎÞìÃ"PAgÅÅr¯9Éò�!¡€0V«}dÈ/€w5ð PYrnºª`E'¹?Y�M”J÷³*TçÜâþRõÏ3Œ„Ðǘ=²½và¿?¸íð{—†˜cÆÛDîŒ ¶X²Æ(gª«ª8D>IûH·/¯U_x=1«Hõ;ÝwñÓ‰¤ÎU™1RÙ—«–=Ùn&K„]ËÙz^ñ;€8Z)²›ëó:‚õ0ÊF3Ì)ɹ Ȉ±Gv=,‰¢ÊS©dî ¡ŒrÅm\-UìÖÈq–€ÎníÎŒÍ�Ú‘žÕÙVÀG 8ÿ71?ü‡(ƒU Ææ%Áp³x#ë==NPƒ´àƒã’J)F>+BY’ª}ßÀ)ï„�]¦V©R>�;’Mý|eg˜´0ÉRœ NQ–W}pà©gº@|CŸ\^¾B¤"×�R'û™Ä½S”ÜuãU¿–H•êŒ4ó\ïì¿¡ïÿe¹ìõWûQiÏܹ¼¹1²…¯PÓ®IƳLÙ²æS) ôûCæf*_·Œr§Ä•½ £ XÞ÷´2Óòµ£îäÙœü•.¡í‚cŠeæ`åéÛñ9¥?3œ*\gó“ÄvšóÛß%•=ÇIbÂâ‚ %Ňq'nÔ°ÇúŸ=ûêŸé{fç”x…Á iéÏײ‡DWQÒX9hT><ônïd! XÛùeŽþg… ¥XrylˆÔXð²Ø#û4FãqB+*È;”pñÜÙ´ì·dë-¡‘‘7˜'ª,Ò†±¢3ùï[po7œ‰2ÇîfÉ?¨…㵑 «M“”àL_gjþB d@jCŸ§ËL ƒ½oU9.‰��JØI(@Èqóèˆ&tóhœpQ â¹£MNÙw— Г $� l«ý¸+�ýy'£ë’|€µ¦yE*#­uÿ…¸‘±�:×K>Þ7ê‘ãD°ØIã9'½PVŸÝd$£cŒÑj·†žà‰¼öØDVtÌ<Ÿ ì-ÈÜNÎ�õÎKâžÐyºl°iwi`ÃhkXa Åy¥ ·2›ÄEÀmÆ¢ �R"믷 ³%„ò+•¤´êqTt슡™œsu‹í ´Y.<&Á‰§Ézýl+J¢BÓ„\8¿$.åSèüu…ç'¸W°8ð�+ HL2¡†ÏŽ5ùÂx<òN‡Ÿ~wÑ»"ñ�ΊЀxnä÷ÂüŠ~·à×sfJ·hvÅðe!gV¤o÷8‘6€:]ýü¶GÚé*å]¶< \´Ë»‹CÁdbô€Íž>ô“³É·&Òq0Ø—þ—ø÷Ëq¯Oçž�ò`âv'ó­ÛÔ]>Ù7Æõ Œ¹ñZŒÀ·e…¢Ì.±lk» ¡BD)�óâ!› („R0Ô>ŽKÔ©ó<»‹žÇc,5úÑèÐöüã7Øp¡�«tfñ©¡f¯‰oÎ5—ÚUï•£‚>"¸Ç¼�î Ÿ¼¸UAú°�¥æ„†žû‡>OWæò[Ž-~RYÖÒ씹gfbBv¢ñ?€�Eþ‰[¿Îÿ°@Æjñ—Òd[”dg H;³¶æ5„‹Nìã ÅÐË9‡˜*ά)ÚÆÒo<"G'¬Œ :ÆAïîj?{:ÒSoÔIt1¸Á* ˜p)AÏ{qÛÒ½sµ&)öl°tÑŠ"¸šçn£¡é·Wìs/'™Ÿ©“T÷xEó>5|ùJî°};Ùº[b±s.òp�ív¹ygu=õéMà#<�º©ˆÌx”ñGÛsì´;I!XÓw.cVµÏ3½ìäWÀVpnL1©MÍ.‚ÆJ½0Š]˜îUøñ&èÏ$ªòµ=8¸ITü#Ìc'Ö›+ÔJ—æ!òÃZްhâÍvs½*•é6¨#1”è8Ú¤PQV…Gʳ6÷hV4¤)Ã:�°}óŒG!ÞäÍó<Ô~4 (Ãð‚z" ކFi«ßœ6uýš—!°x-z��‘ÛÕ,ž™Yé|¼OVké¶È„abú‘gØ–ö|'C\(ø˜´õL zøaªá#�Ÿ šp„Q_XPMFnzµ³»b¡Çàª|D?ô"4]—¼ �œ qµ‰�©Á^ËÿU…œ'Ú��ykÈ?,*ƒ¬F 5¼M£˜jÝ31s¤ïÚÕ1üfäY·ðÊm.ß$Ž"mŽØ±U»Ÿ2jú51ªn“eÂ’Ü9æ-:r•¦9»�ÉÑ/ãŸvHQ‹åØÛ×x¬âÉ[bôâ¨ÖPÍÏ]7áë­ËûupÊ™¥ìiû&;“>€J/0P8Å,¹°ÎÃ5šC·•“5^ÎÓœ\]À›iòyN€š‹³ûƒ”ð¹csDm+X(^Å">9a­°y¸ÑC�nö3ò=²õ.qå¾±‘ÞZ8gññž‹ù„QõN&*“:öUùW^?Î\ÆÃ.)��çbÜdaþëÇ Ý3vïøyëºõþºR�ÎöÅÖ6¤³¡Pž_ šÚ-¹·]xæ…·Óqàõ•LÓó=õ@ôQ½½'ĉôCÙâª}2öÂñ^ÐW  Ÿd=¾/g’oRìÉÑû¼Î_hÿ/· 7•ë¨o©¦!WeŠƒß]êúŽ…a¯æjÅ_#6jU¨¬ðúw­»(Ú£�¸|}¤K¥ù”áð÷J¶››1¸MɆˋhP àˇŔ°™îËàÞ½¶¸ëcªÊIpóøûÅ.ÿܘ¼jÊc™½D˜E­³>?Ç´û²*.ÿaC#…pôø7ÓœB³Ã-üÈU'³)6uXUvû�¥0ðHÑW‘�)ê�¦Èêm•+n5„wº7Õ\S’Þ£OwUèIÙ€²g*·´¡*ÀRyÌ¢Jái¡ð7¹…ªëÌBKïH<”v`îî•kôÖ^[Jh¿pqg%°µ¿S’`¸XÄûÕ%OIË`EPüš'U‹Ó`Ú“7ëÏIüýés\)ÞÒ~ó8ÈÇ>»^Tàó"îj ]Ø;<ìmA4WU·"kOüW)Î̲¨©<9„Á œ�qR†±hÖß½�˜-ª×Xwñ mÜ�V!E ÛøÈGj釋ñ$DFî…]šó¿Nf­!£ƒü¬íM¬‹&²è•×b*ÉnM{Þ dÌ̘Ù~ßÉò¾íæF�‡ö¤;ýàØ46*W¤G�/S9âǘCDbåqÇDd6ÿj£`‡•<…b$%»S»˜`ˆì%]ëâÏŒû¦#':mtÂÙ›µÈº“¾ŠŽbÅÙ7NæjЇL¸ì8¹Oš£Nu°ÅÜ»KÅLJž„�v¾Œ†_cügÐ[ø1D»_º‚A�àý_dæS#«ÿ…á(ÖOŠœÆ{‚ CÇš›¦ Äz4Ë>°Ì®ùîqwC>r´yÈÙhcnÀ¡+¥ìãÏ™+“=S¿�ÉœB•kŒ¯¬9ŸÌbøÍf¨f>ªÂDQ±Ø¸Ú›È÷ïëõ8Ä`%Áîi·zGò+aÙ[Z8?bØÅ€=6BˆrxmÐllÓ£(qEâ|Ùæ4Çâ7 ðN©G§ÛÞ@'q�‡Y÷R{§Ó)ø�QœZôk ºeŠqE9pè¢Xšê]ÅÁnD6/Ž^çqJ_5A ÕbAÕ7Y+£­nànTèXŸS Ô}ÚHkoP#¡Zu#š˜8¿TtŸjÒ“NÀŠ„Fk®2‹zך�Ïþ)+¤]8H™…³Ô°že=‡Gl�žÀ{>è¸1&HBÈ< kÓwü§ã,Jÿ`%hKoVš¾÷DZé=}ê{€—ÁMƒƒÝPüVÓÔÈõÊb¦Vöˆÿk|³`Ë©¼ÎÐ5²ÝØÔg]©(§3<%M?Þ4ýN®Ú‘Q æ­@´Ú_×Rn\o•Å=|/ÖwhšÍÔ’ç@I”Ó–Ï…»LNí« G3þP뎘vøU™^ÿiNYlõslq·àÊ1ÛñëRÕ€5ýÆ `ˆíÄVs�ëøêÝë4AJ‚<®DŒX\f¸ "‡iãI'Lnyvu\PóÆÀFçv+’BŒwl¼>‰kǤbQ‰›…vcÇ.û䑯¨#.6¡¤þ£§¬°•Z¤±úÏ3˜(oF¿<«è›—#¹¯œ ¯J‡Â I›3‡WèGŒ¤Z€¡dФÞÞ‘iá0îÄ£á)5êèTŒü\u�®H=v楲5Ìù‘F†ö¦~ê¥5ÇW£ny7.Ÿ�.Dç.hBCh iܰ¤¨û�µâ@¿²Il‘Ʊš1•îü‡×.ërËÜ�jŸ Â^°L‰£2áSÁÑ�É}Y òDOãÌl½4ÔU³ʘgyׇ-X‚ª!Ø|Í<`z«I²Â2s‹îî)À—ê }Ù‰T0I-—“ï�f2—2Ð4!¦µƒyê>L¤wi<€>n Õ~gý£Yçž’z¯Ý¤®9Gà†,’%®FøA4÷ª �ÞTaŒPê}Þª fËU‚Ú×}ŽÍ\ÍV­¦b<ôr¢d7WŸ²‹²õ•:;\^F¨õ· ãÀ·gôÉ›ðǹ@ƒ¸s5”y€Y« Š’o¦àŽÏ4�ŽvS©øÝ‹L³=¨ÑUò®g㱩yåvÁÄ%yº¿Ë ”&µŠ¡�äl 3‰ñ„ö«K ÏbÈG½3,Ì-w ÜÙ~®rÐ-ÞØoNíÖ¿Âõyà Z «E\0a>Û–Ám)VZm¬™Tž9+ Ä™b3þ³•êÌh"¤¢³¯® ^'ª’†L·²Ä󳮕˜ÌEÍhsy†¢Âî˜]ˆ0Ðds[¥ê(Îm‡+-=êÒšwöá3:g2ÆNŸ7P„ú©Y¥óÃ/h)å5{`I=$~Y׎e¬wšýUÜQ˯R«éþ¾ ЋͥKEÜxøToY¾�VÄŸ#Ã{äÜùPò½¯¼·èù"÷™Âbv¿gÃ{ðT=<ê€Â µÌoqÕL§1À³¨NYÎêpx:´Ó $½”ż�Zwúü64…½¿äDz�Å®fØFpçp3c ³+KIr¨©bŠºR°k…dëì2O–KWpý'œ ÷1Ìí½8¡¾¹Ù³çrÀË\0õ�@Ë>dvâNý¼i3-VÜÖWÃ*Ê[ìøþ/£2>NgÔêWSZ Ê¢jlµGç‹·~qqcmçË:�ÿuâóp^äçu”#èHî�ÕÎjZ(FòT3†ÔLↇ4¬cÈË!½¤B%>ªÄ’�R¡jÞ°(®Mxk�j)Û–ò¤Ÿ\3ô¸ŠIlê6;ÊfY‹ˆýűZF)9 ÅK3Þ©Ü^ˆÿG §z~ÐìÒ§¾�šºÏçðöä¾Û&ût øz?çðö•¾ÛbûoíônÏçï[>Ûvü4Fü=9€(š¨¸«²%'c¡xÏÊÛâMêQ’gD¯ñ¾_ƒ áçQ´ê¡ÖÉG#©+ÌþÍû»!S–§xaækµ"jLQÊðC�|«dÍ«Q•ü\+T^ÒÆ·w”Qõà”›cA¡C•¼ü�aá³&N‰ÉxóQ6XÇ`,܆¯Å#Ã^í©yöOÈMãÎGÑ©(Ô(Q¢X9øÅîñdß×ûÝ¢46…Só€„'¶Ö˜3ñÑ”Ç>vÃÝE‚ñß•“bïã8˜ûcxÒgàn „Ï–ê ©ßµafßÎâÿ ¤'¸2©Î’/?ȇ—Æ42Dÿ’`f?µ1Z შ°Ã¯#dêX”×Þ´�b‡@~Ì)ƒ’#Ľ¡cÎPŽÏPV`öÒÉâˆ:¸¿‡²Ràúô-‚^¦ër7*8‘‘cáê¿`\�ðc.³N¡áÃÉÊù~ˆ¶»dôŽ8àõ¬ÿ5¯„‰9ðž¾÷¼q0ÛVáW¨WåÞE´ói1Y?”FÅŠ]މ­ÖòdA=5!‚=ÄÆ*÷å+®}ú~�"Ø”¬÷‚J¯3¥älAµ‡¡§�‡Ó¸ ’jŸ»ëÏ�ÉÍ:ú¨(do»k¾¤~­³âå)‚lœ‡\¯nèõŠ}U-1<¨ß²·H®ÿþΞ­‚J‡¾h:p¨ i‡@¾Ñˆ¼Ý¤^c(@ Ƴe{ŠŒ;H±K¥¨ %ª…ñÞ£½LÓÏÊZU®Ãþ‘)2Ù‘�ùälnëÄ¢e"Í^?®A =ââè@˜JßHx�Rý¬”EÉ)™>eHK{t%ÚÒ”yný¹ο¡‰’ë™®e±Ú÷¤NiG‚"’ižªÁÀ®qÃç]û�¨™RïÄ“b(øžûvá‹fLæfº·…Š1tžÚ¥•Iói*åµ”ZéPÊÀLÆAÏ�ÑÜÁ„P»€WT»› z>ë¨àê1Òâ;zz`C9Kàf%ÿ<%Ç�,‚àüÛpõÞ6ô»Nªà?ˆ³V½‚‚Ü�Žzî¡Â¼—áwÉĨÁ›ª•ÍÅŽ‰{m  Åÿ&¤›sÜ[qÞªºQmR̾tŠ"¡Š‚«o»Hªï÷Œ¢%ÒN×�"p¼~Îvu¹kå¿x�‚a‹@Œú�¢¼¨ò'�º&¸�ý®šóäw›3ÞNBAòXÌ%¸*$ŒǾu¶ôEYKtp(Óè�`VïÈ�5e[(W�šdîm•™'ì9p�ôKr§Ý_ÂàF”e©‰ø8¸èpðפqãýïŒ,cÕÈZ^ùÏ£Š›ÐǺŒAÿ%œ|šå%ÞjZq‘x\eùèx¹\j™§%˜r(¯æ�â\ ‡bç½ëøMã7IŽ›#åEMÐPŒ¶ÈÿOmôŒ•™‘¥zoaTÇõí™sbœŸmTõ³Y^\1±Œl6±%I˜ÒrÇÎ+aè æÑßÌñë›æ.äª6¢{ª_ �Î*\q_þÖ¶'ˆÐHÈr¦ÜÔžZ@TÕS7®èÈGBŸø*þ ;ÐëÅ¿�G ¹ìoƒæ¸6ÞdzsÞĦ”fß&§ïDcÂ�ðPwó¨¬SÇèn}+›Š~�©�¯Ž<‚]QÒ!‘…TBè‡ a®ž:^ –ÀØT‹†4À†-„|?xkÈ}ö�ÿq@ù­ù¹kÊá÷‘V ¹µo¾RÄÑ'‰��æäÙ«:ùd€yíØƒõv–öŸ$]1Ó†F%ZÿSç¹—»u®%PøãpᄳšÆ’3ošþ—n‚Ó¹ò¦ÑoÓäÿ—3¤Ö©�O ánF2jÉßö´í)#[ýËFò=‚YèJ׎’‡š!#ð`guâÆ…‹e~(YÊÆJCv¿á”k´¯cm~»¢$ü ¡H‚#Yþ¦Pw.'”¢³ÿuˆÄØ…wx†ˆºF»Ü*ùéïÎêMG;ÇßföÏËióûÿ‰·#о2X�÷»y›Tµ›­‰¢ï1눿x‡,kuk6A+Š(!m[Viðªöi l/š‹““žÇLp¾—ÈpÊtëë¨Rc«u)ùlÒg>˜7ÒÉÃ'Œ«O87êãèJãã^±•µfóñm¤#¥ûKYf¬ oÀ`úÎî�2‰:€–�€&4¨/›Q׳ã¦u=æ>*YÅ7¢¾ÆY[[Kb?ÿG§”£»Ýôtý®ª¹ •�&DGŒ®1v¢OfçÆç�J·‹}A ä*w€Y4 o¢)Çýèè~£½ro&°p@@¶¾ñ%Fu@M¾¯’Ýl}9¸£òñ÷ ÙD~Â-¢c­+ ¤ ? ãØr am²úa‡4-j="ΉuŒ[žo'ô�Î?м"ÚºÖ7“?}%Oü™„IZår ßÛì⢆ì(¸?$ãDvuÀäd[†Ð‹*Ï:T-zÄ3 ࡯ðJ/Hph€¿/¡Ä¤ìé"IR¡Ë®#%K(çÆâ<ÄÝ“r‹ †”>Qû˜Øu’ÞÞ?u2êZ 4ƒáOø1y|N¹ôæ'“ä™;÷7�QÊ`¹ Ù, .¥ ïWƒï”±?Y'{-:e_«–¥–ÜJ䤔æäråàÅÄ“Âî¥JþÓÝP*vš¥ÄòB}avbç°ó Þú¥Ò«¦»¥¶§,5´6ŽÊøcBoóÉ;�†Ç©Ô² ­Š8Û|mN0SÑ·WøV²Ð)1vµÔ áqò(]­ö—¼�ítxºC0¥Åû¬�ñ ´å ÅÙÙÄv�'ß•L£!QN~Øw¡?åÓÞþE¾"™¿ •Ø o®v§Û;E�±¬ |Ëþþ´ºñkeøV¾á›&^îêÁm?s;Pº‡ñ3¶§ZË“„QM('Ó…$û 8ßN×ÖýþÔÙGש¨¡Ê¹µÐ‹è]_Ý.ù&3S@¾]‰a(&ù¥Å�ÉÙZ‹ÅšÀ4¦8u²�»*Wqê½ca d¾f¤P�µ�CªZ?2\RÅT€Év‰ä» o ÌÝ;Xm7vTÝι9—ì`ºdmûaL9ຽ)J?çí¹iÿ�ƒá·)�ÏÓ¡QX J¢$HëÌKÐ N¦‰\ìÙD€9$ÿG9Î=#)¿vP¸*RÛ— v0!$´|MÉâ�çö] òd08;ŽJ+¨´œØðÂŒ¾9ÆàÆ£×ù(Ò1 äð©óTižÓcxsç>ê_±Ùõ�¦–Ðc øW¢ÝÛ&³Þ­ùSÕì2ÿ)t‘vïî@²R,7@ª/;úG`=Ïä`^fÌ�‡íÞJÓw‡fñƼT%Àe� ¦z€Jà7.3Nï«ÑYÑVm¨g~+ÕÖÀbÀBÙŸŽá' :LºÏàí�Ø ±ø#:ªºðx[»†S.Ó.> !îîFÒã+iäá]F�z¥ X¯Q^!=SÐæ© ÀÏD3-Ú‹4ýàN|òƬ\øg˜"±>¢+ÎÊ2gÌ%Úà{”Ž U°¥%�=Í¿"AÏåù6-ú…RHXN ‘3r¸…}†¤aAEv°x†)ÇøKïúsÛ§;aã~×€£©W³èþhVjNô‹>.ê¹ �–yé%ý6ѪfïÖ×Þj©íM1ñN3¾0Q³ãÄ^ñHGÚÿE7G!ãG¸®Žš×ÌÎyú‘À]¥àú«æyT Kl³×àŒ\ï™”×sÈn–yñïk 7Ë}üá·}:ËÍÂhlžÅCùÍó7ÁÅnÖá« ë~rIõܼîû—/¦na¾MßKi›õçrYÑøƒ‘tbÇ;Qç·£ó-º¯­¬0"!úú� {¢ˆ�a)‡àwt#è;Â6ýWÔ^E[ùA®Ô%–D˵0]?"ƒô7fêdì^ªi[·Aµ4¢ˆ«2äÇ1…±0swO>Í?w¨=›€'¸rá$éù4Züœ4þ,Z~Ö¹”[J�Ö®Æ6ýþ ¼4ïîuo¥2L;KVv¹,Ÿ%  �Æl[<ƒ°·¸†�CÓoÈÉ•ÔÆú‘nJ# úJÅë-γ�žz˜¹S‘ê¯âžRm’¸Ê{…:"²JC‚Wt•-Í¿‹+—šátŒl­É  èqõ2² ÒÝ Ë †î4=7"ó ‘²<�Û©_Ó.q°Þ‹Å…:•Mrýœe‡Šerñ UñÿÚ–BÂÇXçÞÒJ ïÉ¢ ùÕuÎvGd��Ϥ÷~§8ö预ÇrÐ##˜o¦kegÁy¡7t ¤±Ñ>®¢®29žÖ�QÉ7O†#d€P�ŸÙƒk#Å9 N/ÛÑ_úìþ<±ëŒÇbß Œg¬pÜ#½*¥Áz‹Z8† ~.Ç¢·Œ˜Á2ئ%/²ÙÄbr+ÿc7*„5ö%ñŠÉ&)-é >?ȉeû%\ŽM\om~š:vùvÁÍ%îZ !"½*^ÈOŸ¼'ˆ}÷m²¾cnëPzÙrí*ù)m3s µ«BL"ÿJ…>ó!)„±¤A+“gÕ<¾Ž·�à߀¥�J@¤Þ¸«°îUgº}۱ǺIÅ�õÔVw£nýR©I½¨ ”~™µª^rMÜHzÛCõî¯k&Ýa—÷}h·?Žô $’�r“¿îT¤±¿±L·ên~7}CG`ð.ßJ]ùÈÃ-AHø6nù&©A°e㸨9>Èÿ0‚£˜ääÁœ¤ v=îNŒÞ7~­™ø¸Têq¥ì¡/X¤kÏÒõÒîÅrïFnX$öE5W>ìk§ÍEÿ~Ð)¶„% ZFOy¶hŠŸòÑŒ¡VxÕ6¶Ÿ ÍMnª"Vù  gö¡¹2’çŸÈZh–o ‘¤ùÍ!ã"Ë&Qh›T?‘HÛyT}¾©ò¢8-ƒ÷%÷™é˜ûœvÁºZ§Rp±³©2y#¢=yoÍæ€BÐ¥}“ÕâÞ ,@Cœ280—„ö–{r, ƒ'Äíå“{7—“j�ÀÍ.QvðÕç™% þgÕÆ«R‰¢„7Ðö„jòMÛäSM(…¨êfáe뇰†Á“Lkø.•v�¢æ&Ör8qþÁ?kÃ;8âÚ¹ÄoŠ6…€>æœQ%ÛÕWæÈ�v|ýçwK‘bñMu;öŬMZÍ€FYº›n‹|Å, ¿ÔøJ‡êü?¸íð{—†˜cÆÛDîŒ ¶X²Æ(gª«ª8D>IûH·/¯U_x=1«Hõ;ÝwñÓ‰¤ÎU™1RÙ—«–=Ùn&K„]ËÙz^ñ;€8Z)²›ëó:‚õ0ÊF³h ÇžOM‰�Ô>N¶ò¾/&¨¦ñƒCgø¼*˜“Ÿ¶ó b‚ÑŠó‡-Ø:sŒ öòs±er„1iÎÅ+X!YSMâÿh>ÆüAqª¦S¢HÅr=pÕþ¨ W²m»$óC†LD@¥À4F½™a,‘w€÷Ðe°8`Ñ…ƒSó �pÞcŽBv»A¶Eý:XÑí]µ2'¬t¯…6|¸Ò“™çÔT|Î5Pw.¤Às©îž�cåPl‚Ëõx�çW²/Û²º0$B[p¹�È7ü„(|»íhã+ŽMÆ1ãú}áðvÖ_ÐîŠ&eT�Õã!ÆE¯;…&™“ǿ众�œI¸“RÛŒ÷.M¤â26LwŠ_“¢hs׈. VÅaæ¾§Øq}·Rá‘ÊYégú£Ó‹a®úøeàrìYöÅÁ@¨Á¹w{Œ!޳`UÍ@JøNk ˆA�¶Á�âBí³ÐŽÜ|0- [+º 3æ@ö‡Xͽé[|ÄàÅ/‰ÎëîG°Ò-œ™r®¹«çØð�­»6¹ zH¹áõÐ"*HÈyluŠ3žH®âþ/ËE ªÑ÷YÚ¡s G(6^Áã-,tÑ¤Ž¡Ý”Vobw“þ_¦i¼ 7*yìCÙ®^À WU† 6I÷*[ÛŠw§K� –�£Î·ëjC¼]­¯9ä+ ‡òIŸ5O$PFº!Þbqà<N(.î·SL´ª¨˜rw·‚ý:és=æš@”ÀëO&³zèn+­©gÎÇüc8 ø|Ò—u½›ó{x‹@òÚµtM´ó�Oy/6 nâ”KâšãÅ[Ô�ƒ}ël€¦7É ç1{K6–g’åî¤*€a¨lÔX")ˆ‘­µ]ˆðy·P¦Lii¢f†�=_GOÄl–_h9¦ÍÈÐJ$Ay•+>üh(ëž’Í¥ùÌs—rVI¹Ë,¿}é2Ö²÷qÖ†ÀGÏRy²"¸ƒŽÉ{êªû‰ïú”åëZI¿Ë©Õ�p¬QpúÁ-àÅínB`æ ¢vÓ.ñÍǽÐíJœrïÂíŠä-ìÏõžêûΉù:™44‚ýÛ,‡×™‰äC™y;ˆ±,‘� lÿ ÏÉ ~ä€t¸ç0Ns|Ái`Ëê¶8†.bMòvù]p,!jZ ëLÞs{+ƒníiÞ,fZ˜ØJWn·i§uæÇ’hN×q¨R·ÝÏêb"?´‘U?Ñ—1g£­ñ(rÉ%M}ŽùÞÄåsphI’Ìà ùöÞ–LAPðZê— “=}EÒ}µaù’¬£ø“ÐC•¡Ã*!‹ú﵇£‰ñPÅÉ ÎKº<öm6+ o_v˜¬&h_“�²Â%Lý€wãÚ˜EÜ7¡ƒ(û#µÊÔ¦ŸP–µ÷)z¿º_ÞOe53”(9Ò�µØš°ÅQ”ÂëÆ—RYŒ>/Z1'hX;©õ$wÇNÚhd²~©í]!t f%Œh-gÙ„Úä*B ¿�c'®¥e¾;ÍG5gÁHÒƒÅÌ]ô­—BüÔ®z¼ŠÖ#�þÏÆh T‡ñ�ñhµØDÎ}ÿ}‚oí}ƒ-޶ìPÒP ºúgNW�Ϋúnd‡àÙr2È”òƒäuJ4#fqO© ‘‰/ïN¢!Äû×õ›¯ ÄSè-Ç"Û–¹×ÊŠ’ªrÍØm<•äúûñá¬D%�ÉlžýrˆÈˆHÿn¼]ak“ßÉ)º¾>X òÆN�Ö7o—rõU•�Cü¶šŠ®Eî&¦•nàL7q×t ÉvÿÅß$ç™b\$ôGÍèt´ª]ä4X"ePg<&ûhëŽs@= ‚î2)ñ¬é¤´§â‰ddxzë1ÐÒRèT[$¾Y`Fj¿IîmJYiˆc mFÏRÁ5­⪢û€’û†7ÕWúYÐ*Ž‚œNÔoBjm9Õ* opé`R(ñ{È,[-€+Åe+WïW—¤fW�¦ɃÚ�ƺj™ïׄèZÚ*¯Ôθšhÿ ÉVç',¸ú²­3�°š�D¹èÊ Ó=¨¯Uáþë„£E¿B9ÃñšÊ£[2ðŠ ?"´nêÖ“©¡V£`XÕ[Ìvà Q}ºZ£à©©f„â!±32ý�‡„�·L°¢žÂl�˜°w’Yõž±Ïó$ DG\´ 4ã !Ô0ܳø ȹQ1µ¹ ÞÎöTEìüÆaª¹™µO¼½_¢á=ôˆsN$f‡GLtR?³’ÍùCZ%@j‹Ó3 Ñ‘[Ç9 ¶ �´¡”Œç˜Xh¬æŸë GƼ� û¤6Lô{YÀJÕ—ó¹’—ÕƒÏcmÓ ¢¿h½Q˜‹â´ðd%Ÿ™ùð5Ihƒl^Ôæƒ6ÌŽåÚdõú\R°É]Ú6×o·¯ g._ü½¸Eœš}ˆf³1R/{÷œk\ â6ãäEÅt?’±M2wóWàÅíUQùµ"2QÐ%Ó|ggM·˜(ŸµõN/#ë¨ô†³rŠÌ…¡MÖºpƒíÛ4Ûø¯X5„˜tXeÅ­ºé8��)äköŠ0a'þ›/©p¶Â¼$1E¥�NÄ 9 ­ÌÈ‚G‡ëNîI·ëŒÉ XÓ –@Œäp}KhÜAá“ÿUGýU›—*��Ùq+Mƒëó�P2¦ürâ¾×ò’–�摟¦vm<ÀO\¨æQðþÛˆáCÛ3a§Ëƒ¯ã×#”å$è²,¤\ö²épô!í‰F0JšÂ@wsZ°p¨¶Væu8‰ïsÊ oP²Ž/Ho'Q‘vE/ðJQ(ŽºŠÖؘPnì[¬èÖ�õfÚ�æÌ &/[Ñ®lʯ~ÿ ÞeþéyDQì\¡4žÏ9~—‹+El•/ôÊ8 i¡‡Ù[2¢�—FvûÁr€è¸ÞÍ�•¾À… ®Q"igpÆó«Àκì§ùí##*ªîÜo3‚–îñ2×ra§ Ç—Ê .~Mˆñ"Ípp›Rg€ßÕWF8.t{ìF{|r‚u!¶`õÁ0s”ÖQçónº1.�½Ä™µhœè ©P¿'ÌíªŠ~øǤÐ@ßúÚ`Ût¹'9� ¿»$bʼnx ®¼x½~Dœ4ñº¶÷½¢^îý†@=ZŸ•ùïv’ÝPSe}8üuÝÃÿJ‚B•¡·ö“À˜kiCvÙ—Ÿz ï%�¨x­ZÛu'ù’B¼gDŽf+ÎwÓDã¦"+�Ÿ—ÌÞþ O³e‡CÛ<>æ.¨nnœÄÐpÓRf‚f‡s4ð�Öt¿ôšØ!x¢ü�Ç|mìä?5,Âüfz»4i‡UF³Ù BQ‰àVøCÿ:~ò ¹F™t¶Á�@—uö« –~Ç6‹$w‰ Åë£|ª@~MTú@¬¼ÁEàd·GZAÉ:ß„`¹?é•®Ó£ú%žtÔsô·W¬—¥4æ4lßlõ&=¿L-ø1#>n�Ì <ªAE™”0¬SZ+ýt¡›»‚˜ùòÝ�öŒ!gŒ*ê¿v‡iÁ ÅáÐ= þ1’у’ff`å6’’ÉìÝGuœH=×[p u];™J¡N¢l�>¡Æx†�RJUÆŽúpÐmç⨿üY(%aa×”fñ¸+(vÜOâƒ¨Ê ÂðCt(²&ÎöEÛZ|Réü8š”¾>&…eYÕaó©Ë?>Ï^`ÀÈfZ6ˆ|2ÈZ!³»Iéá8*4ñ¼JmJX}<0ň·OŽ‹ûÞ€Ô‡i&Ìl¬–›(¼¶<”ô–—9°hxÖÄ4m ùñÉÑ|,‘óTÞ)Tí‹U�ÿ‰ý\7„= 32kœ*œG#°¤Ö§£Õ‚ë\ƒ¦ŠZ’daŒ>#Ç�‹UúMgð0Úÿ ©!ÿCíÞ’–¢p`-Å줾Ýîò%°v(Ü4U|ïkBb[UŒÕäqðE·´ðÐÌêÇ<é´!Té‘s¾Íƒ¡0¢0?·2f™ÿ)é€ïït©ÉõOv)-sAq‚ÞgóG[îçª�ß½(¹6·)Ü‘õSƒnŸ%½Œâjƒr§<Ûq©PDILÆMc…P¿}[Šº¨¹=¯�Ô½n v+ö‘Š 3+»Zÿ[ûkßDHTê;f]ëßEh‰vçðSB� èCô<÷j{=Š#Çi{9ÑXcŰ¢m~ì2>+Ì#5qÛ4,�üÓe^›ë+öá”÷A¡à9 ^“'f¢"`qì[ìúJ\á72*&ñøZ__pe*Kú‚” W†4æEr' }ÌEK9Ú@ÿ4æèQ38JŠÆhš‹([B–¬}ÂÙôýZq–©°—4BŒ¼6_ŽåL�¨ß:±�JiH'2‡ OöFÛ’�Ó)òä·ãþ‚t«·îÇsVr›j¹ B8ÍÜ4Õ½»í2zœë„Õ�)/¨ Ã‘½cŒâ´>Ö¨kïÛcf½[çðö-¾Úâûn_áéŸÃ׆ûl‹í³ï·ÑÓÃÜûmí»ÿCÓ (š¨¸«²%'cAèeRNŽÎy’é#ÇË2yAL*Y@ËkeËÉ@¦C„ø`ˆ+Þ¦ÇL¤2ïÎ�ƒå�Ú”þ¬ãÔa çJ%ª`¾àvç§Z9…7�ís¸ƒ“‰Ê¼¼éA Rñ§±sº3FÜ@6ïDÁ>ù8NÑMœ<ãpQ?ø;h¨Œå ñu¼ÔÞÓœ†‘q< ÚÛj´W…w½Øz«É®·`eÎ5�€²»Þ Ó�„ë�j}´9lþÁ5WÛéšÍ?©ÓŽØ`e•’F“Mzh6Q"Ù+Ö™†ax?/qhKƒÅ„•¯pÁiˆv Iç´¾ÿM‰�§qsÆDÕÀ âŸÔ´G=ŽÒUT¬îôø’ç&]0ïÀ%×Ïä[žž¼ì($`ZGl6Ÿp‡E¡üŽ…­´Ü•ôr‹ì©Z øK5\×,6UtÌ{Õ#ºk=´ù ëÍ` r­” Ñ]¦ÔšœnŒïλ¿Ï,°Ôä¿§á=ãÔðÙ=ˆ¸÷òµ-&#—Noí×m @8ŒYAJ¡h Ã^¼¶¾^Ëx­®‡€2º"Iñpð©>’Ý÷2Pë5bo&s­ÝqVrî¾ë…̉+ÜÖe䦋eÉÖ% Ƥ ö…m…wº¨#ð„¿ ýoj´¹UZÓì©Y'éˆ(î·‹D�²tÚ>ä…¶1J vï·´FK‹Z Ç2Ù.ñQÒS½ÅÕ”îeWò6´+ó¥ØgCé½ýLJóPC¤{›Ø¯kY|Mcçk«­q{‚ÿZHÎĶÓÝÙ�LÏ9ç²Ò¥ÓC¢R­…ß‚ÜD8klþº5‚¡� [ËT=Ãj9ý&L@Jž9TL —WP~¶¨´Ÿ~—ܸâ¡r/Ã�|+˜‚»b™œVÎ%Øp"íÜhùÆ×æl­±ÌÁàSüžÁ’0rBHË—H±ÆMì*�›»æ=,“,u0?¢þßâÝ‘ß5À±óåAÜμazæN$@^Ÿýr¼äb'ê!SGŒÊöìú.b3ë}Â\§*]¡q�ÆÆ¤d9ߌ¥+„�K'’ÐãëÐSf³FÏ£Xºôêˆ(øB"E€·à�Ä((Ò°:ß Oö´’î—ý-³ø÷G*¢§<=ƒ�ÛfüÀ’ß³þ1¹´¥³ã¹å…²ÚÅŸöPz–<¸¯æ qbË�BšŠ‡.ÀW±pÜ.xa —\E}R—oëdÉËÑÙ�ü8ý&Èr7oª*J1“6�WÔלØD6sbƲúÐbô»8œP£‹ßõˆ×íL Ôêë’ˆt‰™EHº—yÙˆ1>eoš§`Î�(š/éG‚Ó3Á‘Pߤ0î‘E58†+®G¾^‡'ÄÚ'²$OÌEÎ*îÛÿFs´š *Âõ�Ëw?\j†8ñŠÝÓøüF­™m R гz^®Lˆ–ÎS"óØ£ TøÖ(-™†yŽ 0Ž\™kÑ¿„x¯†|"Ý'UO¹ƒ6‰ öä§Lû<š5%É—AAKÂj�;ŽÔåÌÿF²wÛH?�SEto‚lêãÉSgaSq‡!¢âj¦Hu‡.¹{§buž'/É6…ôƒ9 q;˜iË$ÆÈû5kãÞ,ä ŽÑ°^RÒ™²a0!Êö�¿Êá¶¥ ÁE­‘Òs²óé{꼟3Œi8A§!fð§Íqí{<ÝÑúáto6ÔJE_å³àA,yÅ%£³S¢šÞît§à¦S‰í»·'аµAC•õk3ö©-MâÊ!”'JŸ’MUZ<.ÿ¯-Î4=xšt»?I  qõ*=W /m QsxèÉÜ×üÖ¤|{'¤Íýú…¯¦ äШ ”©|�ÕC#†mË@ÿtW¿Ñ`«65ržY² M‰~†Qm•B¡C`”ÜÄüS"Ÿ¿AæÒ{©æ“Ÿ+¥�P^´tLØC&»ø?âèQÒz øF‘ ªIï\%†¦î_´d±c©);/ä)®û(v_MA_;Lvþ��&øÔ�ºà·A‹ÃJ�ìµ×s‹«÷âÙHöò �¤ÛÑÌW.ñt‹µ¯‡‰Jw¼Õ'Õ�›«fgh�i"s†ñö´dŒÒE�»œ /âߨ—Ï‹¼£_ }®âžãç'¼ƒôgþ9iA8óOU/¢Ò®ûýÍ{D·5�ª¶h×OsúŽx^jE^ì×Õjâ×h:_0AŽ£Æ*'†b^Àᨻañãx՟΄tëUH+õð|æø¸¯2•ç©C7ª®æÎåkp!oÈ<¹ûÁÆ„C&"9X ¹)F�åI ä SOcO9HèSÞ¬LmXF…$(i÷ƒïë8?Ÿ=#)¿vP¸*RÛ— v0!$´pÅ®ÛËñk¿— ÐùY“Ä·U<<Ðrσ;aená]nÚN]¤§uüyY`¹á53£{·±-á A»e¹»–FÛfoð¢MþDl&™^WOOÌpT˜}#¯ñØJbYŠ1}÷Ö�¥�LÆË"Ž ©œ CÙ�~MÝÂþz§3lÅY‘ò½Þ+1òibfÆÄ–i}ôØ~Þ°ÈAŠTxãà‚35?ªïOŠWÁÄ;’·ZËb,9 ¡#–N ì±û–¤S!+O%£¦@Ó§TÖ6™¿eÛ©ºe�/wÖ|÷õ©ÇÖ–Új̸´¶‘›älò)v Œµò—Ópàm�9,(Ùv:C‡Wûbœ¹_9åuEä¿�”À…Å7¥i¸FeÕzyÒ}²‹>ÇÁI8( å ©I™ —wÉ®j‚{#ön ðèŸ(5y5æÐºØZv1bÈÛQêKŒ¤”ñeYœ$`Š$è]å‰{_»­dà­Ä®?§ž¡ Ä´5†±mZ}ùÃM™>ßÊïÏ�, RQΤËzœ”!ÿ 4¶²ž²¡¢÷ú¢èŽ¢µQ y³]²§ øž_ºk,Ú½ØÅl¯‚®€SîÃ7A6 #7a|ªË9-N®pÝ9Ô÷+VéŽÍâM÷—Ë’k§Ÿ‡ÑDYÜgâlÈ/¾:â¶—ˆ£�s{6ZÁÕÈ\!¿2 šâ­Ú±ôf׸Á ÛÜôC«ù+¬ù¬(ºÐú²,ye¤�˸0ì:;ظâ#¯é=addíŒ"]Ìì…¿Ÿ¸ ö£!v𠳋qwú®9ö��×¢_E¼��µû…L‡&ÝA «Fêð‹–ÅY˜Ë•ÝÓ8à)ìg¨/™:…õ9”Ȭ¾”€–_kÑþݦÍ�¢ß»E�ò´$ò%¦ëîžðà3“¥‹ %d,mVø•�#†P‡$¢’£0ƒÙ½!de_÷W;Ɇ”ŒéèÎÌõíây:à_+�ÝÆÂ~¯j0)õ¶dZÇ<þ…“¶ËC‹Mœ¥¬½ñßl`Ðsx¾‹<€Û÷—Šàžh­²eE޽üDÝàÿ�¦e±`�ö‡ëXN°oÿp'ÏaÕ»ôû|L‡î˰)½E"5»†ZÐ93šõ"§_/);8fÀ>ŬÍ‹–Õ ×[ÎÑ%¢eùD'‡h  €ƒ I­Ã[òÆuAZžbg|pÊ=955‘[ùÆ]�oh-^ˆƒ³­³šÅ͇_}^¤Æq\º�SMbÓì¢5ô»öXÏ­ªM‚,²ÙKy ý¾ŠFÉ‘¼VŽ™*år«\I[BîÖ/!–ÖìªÌ_Âó%È-Lqâ4zÄ-é?õܾ‹�ÜB¶d- ->ý^bžäÍÔ¦‰œ!µò7…«KÈ\y¹¼‹ ,JÄ5MÝ.¾ÏGnûŠ×l)�#¤ƒ_�ÐG“÷œæØ)º.0îÉã‚ º5ž”$üÞ*4¸x`�(ÄÎFë´5\ŠÊ·WÖµ½E?¯ïòpr¬'dãÚðRèX¯Èw§"<OÒT µÑʨaoô™Rpi`]žRÛ#Sgg“3�ÏI{CÚ3sßîG¾Ô.tU¦ºL¢A;‚ÓUÝìÍ̱ߊ '2|«Êàò`�$˜%äeöð(Ñšëú�ÚP¢Y€ò0-šu¹·ïü3I@?pâ.�y©æ!®¯\1»:ˆ–è¨@.àòB+×—iõuÙíúÑek0¡²ná<ÉÜ6›Eʳ¶ùðÓ}È:˃  jVIû~p©XpQf“<½búýŸÓÕÞì� ‚¸áÅÖl$¨ µ“O‰¿$åk;(źÖt!Ü¿?¸íð{—†˜cÆÛDîŒ ¶X²Æ(gª«ª8D>IûH·/¯U_x=1«Hõ;ÝwñÓ‰¤ÎU™1RÙ—«–=Ùn&K„]ËÙz^ñ;€8Z)²›ëó:‚õ0ÊF³h Ç½ÝØÖVgý{�_&0Á Ø&\Œ»ÎØZ;„Iš ™ôÓÿCóáÉD ɤnI”“ã™=ÓJ ·½l߀˜Bn’õ«&+i:áCpg,žA†ž½ZwÉ&Úýó…SŒ×Ü­ðƒ[³f�rݹ÷»¨�O,ïþÁe¾Øü/CeÜUÙæ?vÀ5Ϭ\¶…£/§¦µ£zÜ“Ì+ã©b�Ϭ®z��þõÊ¡¦¬b ‚µ�‡¯“†Âì´½³;ûûPj‚² »œ­5/ýDêgõO±�ÎÿXÓ´™¬ò&�P‹X¼� è‰NdøÎäN´Ý¢B »6YÓO,2J\©ÒAÕjþËgc½VJìp¾íœ¢þ„#LüeT|îó¯aÂ_ã¶ï Â1`‰HlB‚agøi-» ä…£LÌJ`üJ²A�©˜˜Y³JN14´©rÙ×ê$Šì\E”¹$ã˜ueíR‰9(Wð†vÎö™ºÜš¸�q´Õ¢‰§Ím0•¾m|A[Mà`ÓÑ)ꄎByMæØ×�‹�G,µï”¯1Ù# –¿Våf»†�ñ#‰õ­µ!?©Pa¥"2c!$@±£|ÒÎj1šâ€dyŒIb,²q!ÔÝêšâ3UœîÃý¼�‚º­ªÂ‹áW±1:H*vÛ¯Ó3É7$^šì÷¬®”o¾áÜæûC©¤±N^‡#ˆ¼o°6Ûd³1UŸ¤=>œq;†¥Jeï ŒUï¤Ðò«Sú jÀ(I!S]Ò8’‹“-æ›`–ÈÜ@!ÿd!¹¿ÉUáÎò‹RɹLdz«÷¶1ïŸëÙ%ž�û2�;ÀØÚSéÙý™úï§;àêÌRP“�ŽÕÕܼ¨YR�çeBepn†rÕ ¢&¥¤“WÍ•–;pj‡ØüÛË—û´£×SEÇò b'ÌíúržRHáØ#gH§Îü^¹ÄSvÆýÖ‹÷éYxTÅ SAÉá è®w¤¶A‰•.ó�.* ³ª²ø�[;sKbÕ.BžÔÊžážõNlÅÎé"L*Žß}K›ðºÇ¯€W]RQm¨×`E±9ñ°,{ùÐYEpM¸ã¬<¤í°Ö*žç¢‚½ Ô:r3{}U:�3è’ß_ÅùœR~S—?¡ò‹Ø¡(éŸÖ¤­'hS¹³%ÐÃKÄ—,¹1U+€z›5xH‚ KHIéW]Z!�ÖU÷¼£ŽærgàSYÒ±­£Û³ ¨ÒÂÿ3œ¹€Œ�}›îsõø j�ÑÒ¯¹»·æ±òwa ú¥ °�©»Cú‹î5´«ýþî» ˜ïûE ØøõG �±Q#Ý5w ±àŒï•E«C+@åXÚ:7ÓuA Ò~·cͦUš†˜ ¦|¡{—¾9]’O¦WU˜:uvñ/8UÑ®øóY,ë…5qÀ„½Ðí?/Åz^÷@$zØ1oSµ ùÈ~îu�àÓ6>+#ºÚX�´Bå´ÖÞˆ“}{‡ ºù$°lùþ,ü�q™hç¹b¾ ºÁÌ)rrJ·‚òJ¼ÿ"÷—·ã“Ûòçó1þn¼Uzô¶óÚH<»XnÑ|æ=C#i„3 u|hw&|€ö d;cÖx±¼z7ÀR^ Ö¢‚QÇ 0Z›RA<ª—^¤,¢�ÆTi¤ò8*‰ÁâI¤½VðÄG�ÑÃ1�b´áD‰t“ÿmì÷ëŽ 4ÁÔi¥IŸÓ´€{y< Áºž›¯3ý‚Å`²cPÃE“-þ þÞz„« 5]Nó"]�…�SŒ¦ �/Æ3buGÑ@"86õ-{"þ"oU¹ñ žJ‚TN“9J]˜Ò½œÛÅó[„^ç<>òíâÜîYK_¢'-Úy³8æs™'f_œÜ—Ÿίá“l.‚B‡¬™ig[{17“»\û ’ó ±,·¯DÀÌ×Í’sA‰Bˆƒy3#(Ãùœî};ŮúîŸ8ì$m6¢ÃªGAÐÂä—Ì„VµŒØÛ䤣¦ÏŒãƒ…䄬Ë*qc̹N>®�ø@Cð΀â!æ“ ÒDq¹ûŽõÄ)2�'½”We :^{—öpf|N§°ç7K½{mÓà$—{�\û.§&Y�ö­GXá©”ƒ rÝ%�¼óéRr�yŠ‚Á1ÜpLרùßTXS»Çn¦kS¡0E;¬€fgŒñ›vš--´»ž/Q±W8ÎÈûFÿ`p D_C¶Wè¡°ñClŠü†È¯òàñij˜£±vðT¡Ï�äòÙ/§µÝ¼¸ÕY>ΫO,þ±QÇdž—nØ“M·ZèNO„‡â—:ÝmN¥î[vg˜(Ÿ~‡›¿ó…Ϭ§}Æ'eavQx 1ÔåG5'6:�Oë/T}HnÊãØØ4õ«Êõ«Fð¨yk=�ÙÏ7« Skî©)s¥ü{‹ÔÞ •ddÛ‡‡Êz¾Ÿt¡[4u¬CH. ´o¬í²?æ¢@$¾Du¶c\6œBÔ(^rá¹gÝŠrôd~W'.p%X~¶Áük+4ò�¿µ¸ð*RlCHZ,¥¢ë¢Ò×ç^ªT-E"ÈMÌ3l‘c5x{ž&¼$_UÕ¸Áð.¶ºh n'Ì�¹‰:ºXA.PÅ|ÈB ÞeþéyDQì\¡4žÏ9~—‹+El•/ôÊ8 i¡‡Ù[2¢�—FvûÁr€è¸ÞÍ�•¾À… ®Q"igpÆó«Àκì§ùí##*ªîÜo3‚–îñ2×ra¥˜ÜØì-¥ñJ¹Û;–Ïu�’S—¥à]C]Q@ÆWr§ ’âX´pd§f¾£® ƒœ¨5M[1fë"À¼3ÈáVBì Vªª}w›S‡ý9¯,À�rg»<çJaž<¼¡ ‚S/¡ѤÙÙü?µFa›}�Nˆ¥yqF�W»µGó�õ“n®ýð°Miˆ‹MhÅk )Î!þ­DâñE§ýÙÍ|¾äÄáŒ^÷¾÷q'p,Š�È‘[ì.Yà}èœüÊ䟫­ÇLD6î +?/™½ü�‰Ÿ~ô•ÐH`ų…õ‰Iû’‘60yjºwžL‹1ŸÍþ(k¨^Þ\fv3Ià�w~žæBºã~»¨|$ 6/�¨d‹'a\|%7ŸôšBéái¦V$bCåda߀8§éϰY®Ã“Ę[wxÂ) E?cÉÎÚÂi¶é�pÖµÔU©€ÚåÎÑ]ì§Zƒª'¹0clYL î~…ôy Cþ•"60y.½Ý«­'¸•;ü&V?ò1NFV£¨~ãßÂ?ÃÛa¸½6R¿×J±çÇÏ–ìå:æS\0¨Ô8+Õlý¶J»RÇSÀ¡hÖ6 Ædð‹×±î9¤e5fºîéævt¿ö¥°ˆ§¼]v¨$ øb ÕwS”ŒØ•ôaÍêßt7ûB]Ò¶@õ\ª\² ?Œëh7×�jW®ç½}XVýOÃYIs:_Ø¢øð±U·“lÍ'+Oæ[+ä§È2�5z…)¯Ž”§ƒjÒißÂeì'§„àϧ ž¾ÝbÄÿW\+¿R/ÓzEûàLxÕ+t„xÙ­Š�†·ÒQÇé³ïôÚ³]*èÄ¡*íTä¨Kw„ïNEâGT*±Íˆeü:ô,_0ìÓ2�È]-©xË6Êý'œUšåÊtâ<‰Àjâ 24N–V²Ž@ö¾Sí8Ж vMC-\8‰Î/<ŸI‡ñ> ÕbΑHY…?³ù˃•ô¬Âˆó!D+oÃåq»˜%ˆT–XNº»ßŒ¿¶�áìŽ_ÖàrÖ”MôV HD#Õs!Ü¢Ÿñ•›ö»¡�REê�7ºjÃ�GÞ%üÖð¦ÀÊE‡”¬\-:ÛŬ®´llÁWÜÂ[: ¸·v> R&YCû4‚ÉŠ•Ûó6ÀQÄï=fªÐ�]ñ|ÎÄùúæÊÌѱ¯„à;žÔŠ'ë#%_U�“¥t’jОãÄ!,Äm£q·fþ~hß”šì»üèckÉñå ‘ÓˆM ¦á�•:6Ò:•$‚ïyÍ®#`Aº×ÎCdSÒ_<½%šwø•9èÿɧ�}+ú3N÷ƒ)T`Ê“Y_Â\€{Ý™ó�æ%ýÈÊÖÑ` %mÊŠÇKüýç}LÖ~QE3HNCÏ`�³ðß$DÆ—|Û'„34LM�ŽæÅ+avÅ66X4³Fý’›¢Xê¹íݲK—³¶1÷H±:ÖLª™yv'¼Pö²³±5Æzf/ë„ÒÇny¸ç,c&ÛÙ‰io©±|¨™áÉ—çð雸3_k_ðÜ�~/Oµ–üÿOu3ùôË~ ·àÕ~~—à úè²ÕÁ¼ŠyP¶Œºßm´3¦ÝM·X&5q33$bXì)éTÜ- &¦÷ê¯5ˆX†np@}->\7K�2‡eþ«ØÁVÓ|¤êuê°Â“Ðδ4GÊŒùZÉÇ@„ ´έRÅ%ÅŽÚc< ÇêÒpÜ«�Ø3öùÕWf�þž.aÔüPu>Ì5ß~ãÆM:±øêéˆHã`ÍËuë×/Åçà«“?çá“ ±‚#{+� #°ÉÄÀ;f†û§þ2Ñò¬¿h# 8âÑ�Ÿ´°UÉa0³ÏD´ù~Ë=±"Ýõk9‘«=Ï.zˆÐφBˆ¤i0\˜áõC¹‰Yš(cc$¼_e‚>~CµE%ØlSÆÛ¸i¾lfжZ] ÜŠ0»p"ZI›â£,ÙªõÇA:b<#žtãG͈úþ"ÁzÓøÂF˜q±_ïQ¨]#ą́-‰DØ¥nYÂ$ŠF ^‘Ú·vgIÊ5À8¾Q£¡w‹yÚr/<Ð+o–cƒ]¢É­Î2$àgü%›é²4„º±³”ñÈÐÌÓ­î@yž17˜cO†§j¯† ’ê%ø©<„ëùQ©(Úbn夾 ›@÷u¬×Ô*œ!=‚åVc¹ƒ¡L5³_þBT¥B¿C—­SÂ?ÍZ<:hÌäl’ÐûÕ�6›õ›7N’T¹„«PžéòþEúräDBó œð§ÁÜ’“ÐaÑH³mX… ×’ÆÚuô& ªhtßèk-[~ÏESàÖúötžõΣÉ€�¼÷,‚Òv§F1¾P ‘‚x"‰Êë°]³¨ë6!7ñÔˆqD�^Jî+UñNÔEàùi0ö ô§-| ©t·•J°§Ï6~y8÷”·(QÖÏ2άkpɶh7¤îêÿ[vXUï’µ7ðzý Æ¼Ë0ßR÷róM*—òN½ tªhü«"!3ÁwhÔdéCÔ)¹'¢Æ�è&GÕK9Ÿl�xÇÑÛ‚ Î¡N#ÁWè�ÒáöðÌÄü‚°S§½ üLä†Kº`=¡ئvƒ»�dO"Öv+¼!^¦VÁƒÐãj8ÈÝP®BåÇdÔåˆç펡‘ß×u…g8À¦'Þÿ..ëƒ/á…N[H�nIæFu£©t¢Ï3Œ�‰.Øz$¨—W^‰Aëã¬àŽ:þç?“øŠP¾%\�p+Ôܯ\Å�,o9yé ^ÀÇÜ�ûžËÙ°ë/þv¥f9u§íR|G×n0)càx×%)×+Û<®ûUÛÞ‘k½­hƒŽ~¬/QÛ$ð”jká¢4ÉH¸Yp ç¡Ú*Ä1‚ÐW$‚+Ôä¶v§‰Mcˆ? �Âä/Á©þ=¥gcNßÊP�h¾tè�Qw³°�”’ãt;x£ï± }«_YEÇ2»Ë<ÞgãÑÃò¼TØ,î Q¡§{ñ†ºÕR ‡)Î[óÂçKø�›Øu£`æÌAûâ<ƒá@¼ö.ñ̬‰hÑøié2'¥*–`‰èØŠMG¸í׉CßuyXÆùF±NÞæ–1æ“hïøá:­© ËHž yÖ™S¾¥•V{‘UU…Û¯ŠØ‚ýb¼îÖà±—å1îp¼§#|¿Æ| Ñó˜\UéÛ‘íDø«ææ~·¿QPß1¤¤…T)„Fâ °éùÞÛװÏ“ðõ+s+i=¿BøÍ�¶ØÅy”9ñ�. sÚ?sÝÉ‚.t m'NþfÞÚ!Ã_LSïÄ_§J �’夃uu·wR¶`ÀŸY4ﲯâ®�‘‡ PA]Í…xÅpó ›qê`/ÅmŠÙ 2ȹ×�r:@�–ƒåu×®ÙÌȪÅý9vïØŽt ˆ5åàÎp}q±Z"Š�œŠõ7§¨-u�"ÜrǷ䋃àÎc{þory6G‰2Pp±:qo _¿ä!²à¸€A%wéØS)V½—YfH$ÚF9Ç *[7ÙXʪéž"µïï�[FŠ£¥ òþåõp“xó‘?ÇÍÆ"½ßuåOB¸$Ñì°¬ñÓ†AÂ�Ü•å*kÂ�•šßâ$‰ë‹ ¡ù”ô»dÊtDˆ´¤Q·%ì�þ­.£º€ h7Ó»è·óXìõS ¦ÖÌú¤Ì†bŠ8ÆS �°.·­ãE]nlHáõ¤áhWÅ ]^:ÎÛ� 0,DÓD†$1.MnÇÑÒuYFÂ].Âç^æFY#Õ2k}Iñ„�“–L‘òºæuv¢=Œ¢“DEáP­#$D,–°D¨ø-?'zÜ•öB©‚ôT¯Ãm�’g�"áÔü…Hó¼Ù|E>< X+°¸i�yÆìƺ:Ñüó††\-0£r¥*¬•C‰÷”s¡ÞÚ–?xœøFººÑúO?s1OÒJâAYS%RÐ: �Ž­êq3:D1¼u´²*ÍÜíõ…S]/Ÿ¯ï˜WôЯ¶™ë¦vÂÖ—ßñoÈ=F^¯q°™Ä+c£ÿ#ñ'±ë#@rÞ_;W¿7 ñ]E_�, À0ŸäE¢˜äNhOÎØob‹â&5s^Øsm©Ž³¢Î34fž<‡ ÑS#Ä.JO÷™Ûz°k�|^äÒÔÈ˸W�G¯ óŸÅs8šå¹ýì@®Ïxõ*ƒkúyŒl^�fdFÕ5èéÐ}’Úiî‡'â½xÇè¥éÿDU13�*”}§~sWy®ý$õ v"°/|‚!úæZ ?1·çÕ ~+ �œé•%GöMŒlÂs=ñÄé›þ’­zwÔ^Ê5yûÐOŠX•hKöÔ!}Þy¡-É&1ëÙ½´u·½ÏØ›N”P–¬I‘ìrY¼xN2ÓY0ú5µqO²Eç!숺¹ ¶¨C€E”sÖMÀËÿmŒ/)Ž1q:× V8*ã$êúü,¿ó{dQ<Úmð�ÆÙý0¿–LÓ*¯÷�ï ÆNó(ô»ÿ"³àžF¦ò”“0B_«&éyJ ¡_dñ½ŒóƒŸ�[‚a;k¿sûÁŠ1"dOµKÅ[l®ÈŽPÙØ·�¸ÙUôy.Œ”X “ïöêV\W› °3.Å °ÏÓÇ*Ê`ŒO<'æN@eA—žá*(Ö[4ÒM{óB£‹ÈÔ› B¨Î%ÇÅD�¨=sû3O …ÊVB¡|ˆÎ¸Š—MVp~Êï}®Ö<{ õ“+„5{âó]¨Ž¡:ã¸c]ÐîÙžŸ®mUk‡¸ ]ám:ðOô9ô´L´ó/p¸š3\Åf½ït A¶üþåYmS>!G<ùðïø ¯ 1Råû[Mÿ/ ]™}ñ @4Áödc~oú¯Üª0~GmϘ·¡=·Ï„J¢çH7*8,uÈ­“m fÏõ¢)p(�6•9ï'NÎ:_:î ÞõVFm¸œÑ;ìÛ. SŽíÍ3…Ä–L7)ØAÏ7‡¡ŸRqÚŸõ^Ô‡ÞÐó_ÃŽÄw� q•Õ¯Ëó#²«à]�CãÞK8QÝ}ýË;º™[ÀõЏ‡ .Ø¡y°÷ ‰Û²m(�»ßâ• \a×<‰¶À˜ÌA°]RuõZ‹n�¹ª8ðs'.w‚[m2}3­¾lk“/éIW»>üw°eQýÑö÷káI^k ØÂ·Nšë–%¤½�°Þªû.Ю|ЧÓÏ—l{ç÷‡ÄÏè5¬IÀf¶,+\þCb ”©›Ü%Æöƒ€(¥w‹}éÝ%¦º·Øî6è^^”�ú@– Û8±Cdˆ´…mòC$z !è¬Wè•ë«w»12}P’sÊ�e³ê{¶o?À‘þ¼JÕ�×’£q±8ùš~¯k‘Kßjdº1j“Ûƒ=Â9ÞÌŸåNÃd™O&ö#9ù¥`#k“,kçP-A¦ëÃ�ü@Tê¸�¤,áv7¬Ÿ>6¤ÈbSj¼ ­z` Ç ã'¤1rA§Ø¢/¨ÑCªŸ†`3b€&oüµŸ%ÁOè&Ägò­ àêšY¾€(gÁ «ß†SÙ°´ölA/=!aĹ„SR\‰/eI¨&HräeÓ7áÂÀãmªÍY`ÚYŠI¥¼§K‘ñÊÐqêåÖyCå¢Ç©/ZRc¾÷*.½Ýí¸Odú/j@®ëÑ IÊæq[­¡Lniîfó€ ,!D7 ãÕÁ7DÖ ±_ŸËωÿ?¯Ïj¥TâÚKéð,Ö„P*"#¦ c†k[•RÚ�ٞ׃ïí‰ý(õ"%²Ê_Ví×ê'mÆzϾòLdé¸ÀÔ¸oºCïÁÚY t4ñD*vŠúQ àïÝ…ß�j”\�/€Ö=Í1í®a™è~±‹›çðqží[JÛìØ+X?�\�§Kú®2wt›LÂê ûÊß.Ûˆù(ù‚ÄÉÑv ÔÍ7|¤½�BÓÊVWz<Å1¸5©9­Bþ8%Üìy+ðDig+RëvÑ¢|ž"ФŠt¯Ç@™2„µé1­Úuy! õíÜv»�½f¾�Äðôà•[èö»TÁ9Z@b–.6O—¥Ÿ[éOKÀuR™ )ÂÀõ‡$&Ñ1O léÎÏÆ†…³›!š1Z.tÀµÐH©s×{ _!“>8ž®Y:ÓƒU蟭¤ñ˜<6º"îbEÓø ª•§/Ÿ³>UDeKC®¨¬ç¥ëbÐ+óäþ說©D‚ÔûÒó¸¨Ñf‡ÅIP7AöÓïŠi«(·ÄüLë¼Õ{_¥‹NÝЧç^°Wj1ú@¡}/ÿDÈ“eqô‘úkÉtRÇ6I=%W�€Q›nëÙëe(ø67§$ºüä†<*úöB·àT®b ï—ÎG�ÝÒ3<¨°§ÔdM3¦B×E£•D£4™?¸*Êá)›tR�ioÄâ䞂ѩýK}‡‘.¢=ÄæÈ£Dxý û¶7„º:q#¬ñD×VkA1X:O.™ö½˜Çô–õpÊò�­4± a‚×ãêüðcsw„Ð;·D‹Nn¶b�›~„é3I¤rµ“F‹8ÏY Ž;|ÃýÀ'¹³í$ éÑ5E¼xD/Bè—¬#TZø�®Ê�¶m\.Ì2µ Â5;¹¶Z<Ó�ýD?–zœ~BÅ”WØÚ?WvCP\§DÝ{|wyB‡–„©´ó٘ȜDÑ<šƒh¡òTà7G±®Ìà ÁýìPú-|�­¤`Žýg$•êÛÿ!Ýô€øX·üdZe÷Cô³=ñûùÉh³»�ÎÈ?Á'(œÙwÐkè=Ù³r*8ßèf• ÕÏT ø¨ÅÁßc{žsykZG¼îy”Þ4άÊÕŸôÿ¦ "ç0˜¸¿x³‡ÄùTðeð…KÎ� 5|lKD'v³ÿX4ç=ùø†`-ZrÜÕW6,ÈÔ˜A&>Žør-ìËÄœÞ/NÈÆ4Þô[ÊO{ÁR=H$“˜Õ4ðÀl%d[ƸÝÉ�YÏ64I‰?§ã�~N3C^¸¦¹ùúÌÔ©UÌ)¤ãåIÏ<1Ê „à5޶†dGz:]G¹wA¤yk ò>­tÁ’ZzË5#ñÛ^�2ò;‡ -Ù£?u,úx‚•v÷Ž^£&²w Û@ÈX&šA~¡B޳“5c æ Íãën—ñµY {uîåoßO„è(¡58FuŠ�÷ÄŒYGçOŒ©uHšý×�÷IÅ­3ùýf³§+‚¶Z�ÊePêz}¿B­TG�¾8[y¶©e'ahJÖefÈZ#�ûJ Ù¶ØÒbŸ1neJÞoé�{læšx LRl�¸-ó–½´m¡™šMAð‚¤åF÷Vªàƒi� ÀÌ6?“y¾á.ý} ó;­”¸i3˜ºCþÈòDŒ²\5Be:˜ü“E&ºs(ž®È¬yňÝ\+�-�lYã_­%Vžàq´qß�?d>]•®ùçæ/“[­ÕJóî{¯øÖó’Â쀺`n3±ûapóêRÞÃ9÷÷�%óR¦ýÆÜ»%€:ªñ¹E­nöß7Œ Ša eãµÜ²-·iç�㨽Úr¬_Do i±Õ´ýIßÔo½8rÖßsž^f)½�XÌÚ#9ò=]Ù›~U‘ñL²Õ?IJ^›TeöxÒúE¤=p‰ÔÕÛ˜¤ºJF P´lPÑr(4y›_nö/÷ Ôt¼Í¡Þ˜¥søç¯lìmgÎÔoîí‚Ñ-±‚R‹lÔF $ŽvrmäçúµÊ×÷öžÅÝ ÷2%gA–²6±ê¡P¤+”…sO¢Ä·DaÇå!v´WQ X³Ô*WzgT³âgŽ«Ú\¼FݬmMª™þÖJU·_{õÇk~Ð}Ý~\Ö's„÷`!aƒ !óôü^GÄ…«°z6èvu ÉúÉö¦«@>&�9>gDÍDÏ»í!¤Ee¡J®ùÅáÜfä)`_®Sjšëæ¡RªN)Ê�YÑÚz‘W+þ +!Žõ®WÉ=³‡|´ƒ´¦ÊË€vmÛI|^{qëev�øÇt Nö°œCr}Õ¢:ùLzh9ÞDù+5Œ‡RYp”•¿.~v2Jã"GyF>>ìâ¢AwË’Æjà ‡-‹Ó]‚$ñÿ}±½up¶�?Jÿs”p›>Õ³6nÚNPŢϰ,>“ÝD¤xÅê to¨œ•R£ê ‡âö{fèÅzÀ*³hj=Lh¹7Ì9öÚ8Óî‡_îSn�•.6é.äÈ|=µNÕ�–~3{Ô{s»6WÄ›n”dbÞã�}^ƒUë\%Ì…c¯×á ¿�© Ý^Ø«:´–©ßçOÝÑ‹ã- Å~aCÁï&„ô/U:Xe–?µ—í+¾Ñì]{sÌÍÙ»ÀsXûg£àÃE¯�èâ`�4¡¬±lp\Ñ<É—¤…Q+¼•˜ÙÂq|�„ö3”"M(b6MDžHq Í®w3Fß¾þ~bÚ=ž8ŸSHgä€ÊKCLœþòoëÝY@Úsü%b¶Š&ïPxZ _¯B‘¤1òä·@,ýWTÚÐ_ÀGÔ 1EîÌhß­A´|=jC^%fPåH�L¥:ÊÒÁ�Y”9FY£Eûó—ÙÁ}çtJEÍQ†Â …•&L­ïõ–µÖ²ååmå°Õ“;Óo—¦d€@x;t>-ׯ>…i„1 ;š½uCïi?é�æSs…ÇÇÿ+Q"YýZÉ…ñ¾`ñO‹‚i$*÷B«°zétÄ¥´ÆY¼¦Ã�]®;š)´5„0°\U¾z×ÒØ�W±Üzö5Ôxœµ}³,½|júYDôòúáº�¹¡Òv±.j.MËwò°egßÎ…%UÇ~ÊLsâvGÃ*ñíð'{øx NôZ<’ŒÙñ¦¾ øcs7³÷ ‡rãá�gI¹ÎÄÉ/†´øü¯¤ï•Ä |¨ì¨³^¤b“è1;çҸ⌟e� À`¥Bê·xÛcU`*ù�#ø‚qiGy·v‚¸'iã^ªÈßOÌìÎ…%4ç¯@´ßƒæ�ÊÄûë¸EûPyOV?ÉEv‡m´©£äÎð7ã f/O1çQgµÓ6O •ÔŠ°Uà-+÷£ò´µú¡ÌV*†¸‰ùD˜·Í%‡ÀœV7“,'óc�¶žvMø41Êðe×LÊÀà:—�¬˜7›ÞÛ¥›vx«ó²2Ð<Ÿ¿ö­i^¢A~ÈO‹Ïñ!1³Ö…�øó” {å|pŒáI.àÍ\üD¼êí¢æ…´ZO‰»ÌMoÿ ÊÀÙ‚MM)xýíl¼Ð—aÀê¨Êsnnë/KSQ:cÿÕ»d'PÒÖ&o¤hóÒ¶ËYÞ�i‡O%ššvIí9òŠf†js㌚G®Ï¿9Ö@Ýã�Ë}tnsûñs*rHB9ƒ¶éjD´�_f8¾º‰L]t¥ôöt˜‡t ¶"îå÷G ,¯µ•=;¾Oæ`UL}Ôuêçƒù—îD¼k'®¼>ëÁ“?AÌ›ytþ•µ*€ ñVÉÈñD×›PÀ›ûlÕ½IÏgö˜q½ÅvOäõ±w Ū9Û@:;÷ÍÛ�‹wyø¡]‚C”ߤ™Ú#HмëÎb‰0ûáXK'F¢ëQ®�,p«•¸‰WíÔýHef›rã8ù�X¢·ñ�ì¨W¥ö®¯ÃƒÈ3åÑEýœÜÜYáÜ‚Y]F¬&YL ã­ÞØÌ9ãôç†w­.DÚ=vM§”ÄÓ:JRÄ”­�˜\A¨û‰ç^v}h¾ßøk|1J–ÑÝw5 á>[—W¯ïÁ“v#SûF/PQŠöŸ-ó¬ÕZj&_¸¬ƒò1»�²9è£=°¾G¼ã¤!ÜÏ[µÍú<†@‚ <[ì� C%qÊ4žº�%ç^;�ã®ôº)s)ß8xGæ¼â±†F/1(�¬”3RºÖ5ÇíΓÙôèïs!Mþ |Z·«4û-ѽú¬àÛ—6±4“FÖÝW?à^M—Ãrœ¹iÿ$w»&;j�=ÎZµÞ­¼¯þçyò k-â¶Ì­O­%¥nGç°;cSo²™°»ŸGü6Ê9³ÈNW,ê_KjZnͽ›lŠ𨠀“)1†ìùe6°--éÃÅõ[sþ¹"N0y¯ÏsÔu²ÏÛ½6`Iköϲyš²é;Ÿiïª+¹w’>h9`ç£ÜF[8qm Èá² †ý¯¿m}O�*û"Q,•þ·“Ú3!ýBZ$˜+ólËðˇº]ÝzÛ±&°ú ¿[Ó’Š´ÍhâA³¸–¢p‚ º¼#d›Ó®¼ÐˆÇ’ç\"èÿ#I–éÆzâµonÃÑ-Â(ˆëƒQâØñ™)}K�oå©åO¥3AþNcóÙ)¸Zi½­¸Iž2ô¿W™ÒŒ�iƒIb›Ùì¥ß©­ï®…¤«.E7’™YZ ÌM!Eq Ó [yp”ŽR0Bž¡¡vÛžÄÞUùBEĬX§Dhè8 àÎ/œ=YÁô3Z5„RÍeÞ¿çC%ô­d+´HLÜò…pbzu.KœÖàA¡ƒ Öâ༠ïæwƒC¼²!•Œq¢�…±HôF:�ÂÝé\š)g|«%ì�Akó Ùiåò½pÉÙÏôL]ÿe¥dÄzá¹~U?®l$9ŒÎ/$5J]íû|ÐìU�ìÊZ¨R6ű^vÚaHr�7´áÊ|XæJ3Û?�NDmõÝ0K(&…ƉˆŽRbªÆæjdº›n‚Ö2ýMãËÐã4èL ]Ö§È ÅKv~6wŽ]õø9¡¶ I÷pÐÑóSr0¨ ZlEÄPîÈŠVàØÜâ­øýòÈ ¥¡“ Æ)ÇBk}£34bŒ¬qù"“PÙãH›SX]ãdˆCèCCX¹y�0(i¦¼\{øŠ8·Çm`8òÿ;U] 2é±Õ sþò(vv%t‰ÚZJ¼nR�`ã:m<£¯Çž$ å"êCšÂÑ_žâ÷þãܘyÖNZ+<¬5Rʹ—T3úó:ê2ð‡%¿�y¶­ßM4W\#‚D÷Å=—ù™ÙjejÔÓ­=¡³L9ÒîZ31÷`AÒ¾§ç^ñªíbslþà7$'Òž[|.�ˆ¯ Ó B·Å±›µ“xK±ßî}`?W«�°¸6è[0oEÄ^l×I¨«…3¬N sRcŸ§­­ ÖQðA;MùX<*sç õ˜¢ÿaèµ[eGc¦�Ù*‰�á)—I¢Ê[u†ÖnŽ–*Í÷à–âN3PØïƒ/R�õ#˜jlÂ*ל&ÛvÝE"›ôÖ i§»ëf*Aþ{?P6QÕÕÚÂ1ÂC¤Úè)vôÉ×õtk²×$iY�)?¯Ý¾åC—«Tƒ¨G �3Θ‡Jl•{/æ�[Ø^-† ÏêÙC´ÐG&Æ0ZúGW)Ë ÍT|ökxܪ9j̈eGe‰—�¹…û ˈ|ñ·­Ñ™Å5½Bκ_ô[çÓ?5%ë¶¿!ƒ²©5I€f�\XÔÅ…–öÎËk­ðÕO‰ "ã,̱]žM++pzk¹Îe%U)Á´Øe`v¢ÊvS“L ÉöUš¥„y³K¯<ê®þÖ �–ò‰ÚÜ/q“õã—GÌXžg•=2Çå禆›#GÈÊú (ûNNP ñ~¼¤Ý5’¿0«äÊ£¼Ðëavc‰ƒAÕªe¿¦¬ ë ±Õ 5p–@ÝcÂÃ"׃Ÿ˜kF`¬GÙq% 4¡²øÕÂGV�”�¯&öEw°«4儨¸;¦êv)U'D••¾ƒkã݈/Í4fæ¹%A×ÖFAä—Πomàe!ªîëÑ  ­8HÅç˜Ç ^[Õ<¶ÁëkTca g”OËÁe€ƒ;üaîæ ~¥oä?ý•ãL§~$~ˆœÁH{mxv§¤Ü1:”OÞKØuüŽˆD|[ÿS¥ç=;JØmª|NÀÝbéuJÓ˜ä¼Užû`b›N©Ç¯Ìa~S‘2¢ œºDÕ‹o†ƒ�¾C}ó÷‰BÓ«BIÑ@ðàü]Ôþ|E•ªà�,ã$3ùØ1mDFÔ¤]"BÖÎ¥S#;¤¨wÍ…Cð¤Äh�žÕ_Q¯ƒ„¾gçJˆä*1/§bÌ ˜QÇfñ>R ±ªèø‘f ¤CÚW@L–LIÞ:º”–ògùÂÉ56¡duâEˆæ�×x!f DM¿Ï5·m/6:Ô+Xħ{s]¥3XÒ8ÖßÎÕM¹aS¦Œ³pÏÅéÞgÃ^:fÛkÉ¥ÑÒ…Í<ç5ÚòË�š©ROWÑí†ó¬–j„RtK˜t±,q€–gþUy‰IË +” 13éIuFÍïBaœþ[”ë:Ÿ¹rï¤Þ™©áåTœ µqƒ;µ¨¼>*+;Ýððµ/£YeNpºd›ûfÚ$Ð}8Æ.|$])G“gsmðÜ�[zqW %€Áæ ûUÖ…²·O¥¤›å‹š��´ñ:‰rÛà‚%@à©&FÕm:)Jùa³æZiX¡ÏÌ.~ÊŸÑ(Û�šyßá<Ž_c¢*Šd$›�Þ,V—…ìÞ¯ëŽË•‹4WVK‘z…_NÌ,#VÅFˆ¯Œa/JŠËÿ<ÏRœÄ42I¨ÌfØiÀ´Í�:•ôÓ1°û«±“(x9?¢øÖo‡+ÛLC-LYw¾7lìö²œ¶Ù7«q]´beR¢:"»)ùÍ·«|3ysçã<§_�®Ï,æ\ö¾Økóç{m»0V“y¾'‹Hlš6ß±ŒV'o´‡®^‰äËp×½Ê02b‡PíùþŠÍ³¶¦yŽüèyK0g8úÅ –?Ò”…œR(c#‚߸ýþ7ÇÖ@ñæT‰X‚›]€Z›cÉ¡÷‚ˆk,ú!d—Q´Ár…¤[z1”Þ¸'rÛã¿'§Y»õ{ñ2ªÛðú¬â äí2œ×í I@rÆç ݢ3 ä?\woŸ/ì±iOjúuwÔ sDÐÌúÐv!‡àS#r6ÕÚ €R�žNâú›L誠QEتäu¿«J© %—ÚË„A.ã$PjÁÆô3l·G¼§SoÔÀ£ 4['Ð@)þ;Q0| (áð]¹Ó'‰Î¼x!Dž%SLA7ìÊe�ÿ=@*Æ[˜í)¡êœ,Ôœ^æ'�&о…OÜ.wþã®ÞÍhñvéH†&¿ÅêDbèU> ÷:ëmd”�_ëÈyA¡u’}³'ôÔ\g©ÞkJAfYæc"¹hÞÐw™+øéTõÕ5k­™å3<¦´åMºa}:%ï3'&˜�y†‘ÑyeÅ凉ëBà¾óWT^@©ëuòPˆ_äú[Tqk©´+kâ[Ä;¡1žØ|}IlÊ]f#wÍ©èlT˜¸Ép›W=4Õ%�ßÅý�£ÍÕ„¥¹(ëC½Ò¹@º™ÐÄ®�«Oú®Ò¦X!^Î4 ¿Î”Å+$Pé-š3¯†ç\‚s¶^cGcH�º]gpL] qO—ÞáT12‚S˜l�¶ñ}~c>½3ð|SOaë�e耢ç@nã Ü¿ Oè’f5ì[‘~cJŒqR#£*?>€â‰•Ø5wZI‰Üíóß\’�E÷FÈ� Évj `”¨[lÐ �¡¾Ë18å­ä˜ðƒHRòh°›2c\_¯F«­‘)0èXbxB³Neßý¾ËwÓs#ØÁ`þy'+êÄÎMçN$±Ya—BYo*÷Nð+�k{<íMxèãK饇äÄPY.–CÏOÃÞ�N£l�2ôÎXâUižè*Ú£T9Iñ6ùb8 @VÎí‡eZô&C¢É¡ÈØ"ïíVX’¦Þ ªR<>¤ü ‘Ïs•ÓÌ–›ovˆ�tà8©|ûÂ]@ÈÓk£ÄÐ›ÞÆ‚/ÙÞéMÂ×í›ÉímùŒíËV!¯É�ž±iCóßDÔ�LYV2V¨çj£§ Þ»¤�ö$=Ãg³ôkMë/]é}3‹™%Gý–Ý�t _Òâ¢H|,M?kçbêÒpD¬YmñXâŠÅ Pe>d"¤jÊè¨/J4Må +£1T´ u9û·óW eŽ5<û‹xûBì›®)Ÿ³Û”!W§–¸�£ D̸Ps¶ Ç¿S_6Ïܽ>X)E ;—.zÓ.Qq³¨ û‘â7S œD9Ê“–õmÑÍxhËa2ì³Ñkº2rDí×ÝÛÑ2°ý…À­žo׋Y;TâåÍòt(˜L;y¸Ì*ÿMT�м½Í ›�_#±rjÑyö¡Çª|Màâ‡]Ÿªª&1>Têù% ¸³ ”ä&d³’ÑÍ4þ5ZaÉkO³­'ƒåoª6°h½‚GQJýWÒ5Q½.›zN•^w§èu¢å¦2m�&{ºúá5'7'`ʦã QØd°r½–‘’Í�&§”‚?>ÝøNв˜øÍÔÐ6^”´@è$”€ûlðaXœ‰li” H¶0Ì8EcfÄí ÅtÒ‹…�B-šíüFгh鸈ú‹GDµ›ÄaýÎIÅNâÐL!%”Aœ¨"êÅÖ9èhâƒVÉ25Ûù–hÐ_ÒHÞh²¥ ‡CöJº+÷Y¶z‰Ò'ÇWj¼Rl± ½ñ9´»:Náßü »_´Ü4u¡8I8”ÊñÌ\…=h+_ŸbÁ…{}F/ïä½¥h»ºC?ãÊÁÇÝ%Œ÷-Ÿg=~ù5_%ßÒ4Cé�íí(ÄÁAZúÑ\´|€*GU&'œœë�ÊUÚïš‘«ÎæÓ�37v;*Ý9ÖÓý P8}MØ2¾Ìë=Ë’Ô KýëºK5ÛøwŽ”TõGR ¿EZzNlÄQv%¶FÂ!ÞʘŸs“ÿT Óp»åÀ}Î}þ²õ! w�K>ÖÙM¢µ&ù‰Kkãly¾Â�—Ø`UPè‡o” .ÈzÏ"’-2}”HMkø±SvXÕ)Áw qq•.ˆ¢¦:„±Sy»©ÔÛ @coC\)[Ù¨ƒ:ÿhúÉ¢ŒÉÖ†]ö&ìkñÛ‰hmÀׯU…>ROÈ~iãý=M4fÑ»Ám*GºÆ¸ŽßÞ4}ÏxÁ¶µuƒàF—B)h�[ŒjÝ�ÐT{å’¹i×™ÊJe³�ǺåÔË  VŒÆ}m4®ŠÍg.š&°  {€24žJ= Ÿ»8à𞔌Ï›¿uÃ)7/�V’bm¢f²·Q�Ìú!+Ëlr¾—ÃÛ¿JÆMk¼ºn† XP…ÃË¥~å¤ù¥kQ¤à0:¿mW ×ÿ*zÇh a£^þWÁÄ›¾BÁÑíÖn7ß Íž2Ê0/w„â†TACKùÔl`_ú;"Y>ÝRuâÉNo)fJÕ4¶èþ�ND¥†â�Œ+ýÖ»²{õÞùw½šäÆ“Û[¡œ·k*΋3,’HRÿX?´�´5œõ²æ+}¥Tˆé\:H+,=ÞûÁB…ŒWE_4]¬äI"¤uZsZâ÷Tb±Û–œÞ]wŠØù/£ôFÛ±3óôŸh”0i ³ì[Ò¦¢ÖÏ)šº³ôìF|õñ¯eç<û ³ça1*šCë³ -Þeyìf$ÙÝçëü†§¡9Wt׺+r‹žczʵÛã$‹w¦ d¡i®Yò‘æãOÐY\d…ƒô…–£'=×ß—ÈP�õ³î2¯SÒ‚ƒ!m㡜¦ÀDɲT–‡E©¿QO)>’|ÖÍýˆŠ˜HK\}º»¯Ç–h (© .û訅ûr+˜5&vè5ͯ‘k¿¶ñƒ©Ò(ÁCÚ šbþÄþtüÄ×Êäç©çxì©V’ÉVí: Ýúp1$Jª\–Xb*‹£QÑDö:Žý¦ª>dÿyˆk�—é ÿ\\ £mçyõª‘ïq¾&¬Ji:Ç4›Â¾Kìã±5Ò§�'å«5[9ŸrÕ×d•«ÞÅaù6ˆKÅæz(+ê#½†>±—F†_»™ê¥õbØÒ­ý“o¿2Ù#ºãôdÛðêcÆg”¥çÚ_7ûŠÜ‰ÓÔÄT8èuEFD¼Š |7®~�æˆ]OGÁì“>ñ~!Ï‹¨oK‰5ü'×y+IݧÙi'gþ¤zÜQ]«›ÖAUfcšš´X1lÅ|2µæjÃ⣼ˆ†ÛÃÁq} ê®\o¢^C­J¨BÎLÛ®ú†ûÀþñlæÇ02öµÁ" &ëÙ_‡Àyød»&Ô"’ÇÚüýö1„øÐíè½h¨~Ô„(¾¸ÈoHÅ ÔÀ)v²šÌ]ÇÅTm­9ø&ÝöåÎÂGä{MÉÝþ¤<vkÍ©£ÿybþâ=�ðÁæwº#¼$…Èýº°ïæ‚ú¼¢r=)÷žÍÈT¥5~RΛáêì)1Úßqr�MÍO X¿Ñ™P `Ó›”‹p'*f“a`½?õÍ2Ôƒg8�P¡¢ °]gv²46˜�ê/xr’û¶¡“sò ÷»Â„ÅÆ¾ûØëPNü+¿Z‘õÞÍN�I¿( ¤ÆP•¥êëø>ˆ”\åh~Ûœ F¡ ‘KŸ¿7ŠdE’…Ïü|ˆ XpèÎÔíËšÛÜã0}²à 1’j!ˆ0ᘭgÚ¿P§¦Ñ”0ñÒ±ùî(D×ùعnÕwnJæ±mÐz…wâ`0í¥ãÚÚ„UµWLxG��À9Í�¦×TXýÀ™AT69iù‰ÏÃð™®ì¦`9–Ø�-"Ô�–y­À¦¼'gÜ"ÀU‹~ŽoC¢_¹Z½"jŒöòâƒ]uû­ÖÍû%y|>‰|Á�e×Ρÿ tïÀËàŒ B6`‰¸à„&D¸HiD©*/pÚ dÖe+\Ÿý/>Zà¼*:-lÔ×%‘£¦qÞÜ�¿‘nÅæ·Øß½=%¼Á̵Ð); /×õBt[M7¹£ž~Å£UÒ·m}=ô¯êQþ] ü¼(›â�i^M—œ‡q`3ùÄ–r[¡ÜýÄNè<öËò à£b�_©xK� Î<æÖêJ$&çìÆXOËÈ›HÚ¼JŠì(¦�-`¶Êéço¤1ª]=æè!*Êrú€D¶š¡—·G¦CKV2u=¶/•tÚ”pÜY I©'©ß€àjÓ`ìþÿXð™sä3Æ’êf×Ùõ6‰F<[À×á‡À„ÄUV Tì` �Êèû©÷OºsóÐL›Ý�91§% ‘_çà) ‡ÒV.›ƒS]Á±WÞv„)¡*G:>úO„Y¾uß}"Ì“t’¬¥GðÝæ‰œNßövm—Q¿×0çž%ó®R$*þø1Ѐnc°©"ëìÝ%{AÎxcÜï…»´Ã“re¹ótä:ç]0ˆEbxÃÃÄÛÞÜžêw ­ 'ÎRœaZ½ÃÅÇX# Ü�»°Ãã×@út-lR]Ü:Þå1I½îì �ä¾(™u½¢~ý][o=b�Œµ’rµçÔž^—�õy.xwÙ4n&ÙÐøœGJÓXÆîF½çDSÂìˆï½m^7ßè½òºðµÿ RFÊÛÄî­Xî�†èmw¤1®[˜ÿUtnš™¦ÇÌà‰Á)TVLŲ«VÝ;'LÅc0¨»'ÊÇiðvöÿ?MÞÞQ†õ!Ÿ¼½Ñ\ýmõ‚ëµ›Àá{OZ>ÛœžHp«Ù¶¥6 ·ña÷¶VŒ±dÕåny½½ïÉå ,y–‚޾‹*×LáÃ7Cú~�½�8]ñ›5Ó`£ow4ûž¢…ÑÌ_Þ :3šubëûUâ:^ñظ…>Ÿ•Ë.»há�d>q¹Ù3ºÃè¡nƒ8•Jë7+öÕ '›<ÄVE*å9 ØPŠG9ÑÈŽY�f^-»´g“ë«ÉÊ\HfÃFØ|>Aw…OõCÊOô«üýÍHåyƒcæ·KÒöÔäûAbWÉ‚oÇ/ÊÌ:Œæ-�¶Ž3ÿ)^}�í~�¿¯ÖÃ%ŸïxÔtàÇz*ü_ÿG´s§e¸�â2lDîšµËñý:K³DnÜY»P3cZ5º¸‰…ìÕÊeÎ3ºÝ@W]ÀÛØ‰7üMÿ0aÐ!bË/ßéÜfˆß_OcèXq íÈÎh¬zaÍé’´(å¾&’F�Ú©U$Ê„ +ÐSÏq‹ *Q؇³žÇ˜é̺´[5h‰ß&F:½Í±#ˆK-¹àBtÖ¿Pt÷©Ï>™FisI"šÄÍqn²ryMüʰ²óŽÏ_eVEäÕÎú–á��#g,¥}¹ó‹äâ#¸GUsÙ!ØæcìͲ'ëF†ŒGfXÿ[hñ™PÔ‘m3š@q“C¾^G€l8¸Q!�=‚XêDŸwÝßäE+.5btè|q)§õ>&»®™•Øú(µ3>]ߢ �DŸ‰Rîùޤ‘´1\Nùø‘´¥¹£â)ãÔ;Öcº0ôå•|ßÂ!Ì å]0½^ ¯Íl¸fŒÄD™aF0gÍNw† ÙÛx…³žéñ•èVjt[4J›þΉÜ}è3ˆ>xï�5·î¬î­”£Â}cœM  Ê›Éî°ØÞDÝØ$E¡n‚7wÁ”o”w0vŒ�¸þŸâo”4u\^—ÅOû«‰�+½œ«m$ë±”¤©}¶sîpeÆ,)�Y¹G”_Ë—Œ«µ�[p´þ¡E]óúmß~ð#^ÄÈÁ”LóÀ Ñ„­8jû1‰Ð}àJv©Ù'r?Õ•Ê!ReC9€œtŠÀ.¬tû'ÍñÙå ™þ;ŸøakòåžQ�¸ÙýåšbÕÉDuP°Ó¢�®Èèì3.¼ôÍÇÕtfç³”®4 QH;µxŽÂµp~‹ž¹Ö3vTÏÈù+èÉ#"¦VìF¥7Üçâ…LFLõZÖÛ !ú4 öé5ª°ñj§5¶dE²¡°‹^•‹¡¸¡4š�k3ÏrŒ{ˆ”ê•~½b#‰ƒÂ°MìÝBÙîÍì.:ý_åÂ5 5Ú;™›ÜH˜²=ägz¢hÍØ“+=Z…”ç�Zyöõ'>M^:3±cŠ|\.†Jg²®)œµø›+Ëv/IðG‰„ðÂCþ°ù{.‘†‘�¬š1/Ûç%Y~üüi„k8[ Ž…#ÞI©v\àÒE ¸ÕÜ>ªP@1¥ÅU0J´“&O+±&ºvßθ¬mýwj6¡nv{h�™sy}F>£�Ö1�Ùo%n#£ÔfÉj,iKÜo€æÍ1:øJ635íoA†Z Ô}SLtÐë(Åý Η·ÿ<´³ÊÏbi²BY`ö§ä•RÎÛ¸žÚÀj{«eL#áÍ�%—0:‘¸•.…Xq? d…bŽš“-ð´zÇÒ†yΣ~ÕAù£�ëŸ;Üô>ÚÀ1‹¦˜/×ÿ@X?z„–ÙS–uÑMƒû–ÊôD);hñdð7И#Yºg4Åùú3ra'UKö| †]b?*†“ºwÂaùqs†J_õo-ûçãm¥“i§œZ W,ÕAU«¼¡™':Óœ½(#Œœ%3'‡ã³ˆT Ñ´wëd�Ža,»ŽÅJˆAEÞ3ƒBrqMjÞ¬ø(ùr`T}ËkCw«v¼M$ú«âC—–8V:à½Jy‹/7 & ¬ç)äÒصVß>´ïoÏ‘{轎ôÁŒàg“ç:Å„�ðY3£0:�\¢þSÁÙÖ0¯±’`gÌŸò|jXu5ÆüI¦«×R¬§]I È(Ñ®ДW–ÛÂÁÌÎ2wˆ/`U¸ËÌ„`÷ÍVŒŸ¦*t-.±,Í*õ–‚`šKTãëÃl÷ÔœvéT?ìUp³Äô7n¾xŠqµõ†‡òõ"E¢“¢tÉò,¨É°o1ÿ6V‘m ‘Ò°‹ƒ÷½h�ØìRÏ=ÁÃÅÛÃdÊêÝP-H>z Jmz¯þÛ"•"òçoÚß+ÈKðbWyL™U2;Û¯*qiz»A§~ŸÈÈyj\­À}±˜Äâgt÷qÉÏ-½´k¶)RA¶ uë²&è¦My'`·!‚{ ]mÌñÍÕ•²j(œ²àGV=.€Ý'ÿcÈIÕ¿¢7GÏÁå#4Êölrú8¢i§ÆP&BÍm ¡w,DfÆH?Йµ±á‡bÌìb6Ê›6}áNCº~Ñm*9ªM׈�;ÞxÎQÄÊɷО…΀š¨TzN¥*E*è*Ó¸?m¯r.O„o»gψ«ßÚXó•ØO?P·)Âm1tˆÑ®A=ÔzOèc=-�ï„rí'¬‚_¶mm›<ý%F¼êË~•¯VŠFÜ]Â[=1yx: ;º´Z¥)¶³ö`Çv]³|òx¼õ¯Ô¬ž× Ø´éîõ#£Œ©Š¡ÞVLj²â¬ÛG'Aý*¾±¨ÒIí'’ÿ>ï’¤_ãçj”7F~Çpß¹}<Þ¨Û–Ù1ð6@¬‰Úbz<Å‘’Ó˜¢MǸÂó‘Nû»ŠøÀ™l±ñ aãŽrï[‘ŽÃ�oe¢^iWÎÝ+:5Þ›úÆ4 É fĦ�C(Ú¿(¯¯†|Á«Ññœ’WÁß�~UT¦¥”ÐM’v�¡kÿ„`›’á;ý@v……oÇù^i¾‘ÃpÄô` m0;âЀ†U¾˜-èuŽËÇ”1•ËZûˆã\]«ÎT|%eÎN¯ªò�¢b{‹wš²VáÙ!è ÷�`9°`Ét *uqçëT£yúÉúé(ö~Z4»X|.LHM�÷ “IWvIJ¢Ì�`} ˜‹¾è2hëÓ" !aÉ�$R:¹ÿ.†—XÃZßJ£ Ù2|)�z)Õ#cìõ }ïæ¡të˜eÁ¨—d°¸Éi«·3ya`ÆUEtq½ðÆÜéÜ¿'ó³T÷í¯ºO²“Ùà™œ-òÁgÖˆœDTQíÕŠ€� ”§Ì°âoÛ…ÛoÚóÂÆlçQZ¶7¬Ø´™Uòͯýh³F~ÝUFÄM¾-dLZ¡¤äm@×j÷Ó©Ì?$#zp ãM¡µ�Ög¿™«ìÊÍg”o~ñ«m­FHޱÑßc³£!¡ž°¹`^TìÕ®Ô`ÛaacÁ§ÿ%S©ñséTëúB“²0-žÝ|=ؤì›wDP<»"Z•G̽æÿ�'¨º{®«9W·e*ôH 7i8 d¯Ò}\7ô¿ÿ¢ì/°vªk_N�fPU9oÄO„–q�#¯ˆ#ê4TOq³ó+D3v^¸H ÃÏRÃP1pWù%ËÓáö J~éÖ‘�•ª´§¬‘xs—GÏ6çø‰v%WlÃö¡†Ó->3ÁÂH˜å…ÒVhÒt…®’nŽ”ê/ûÃÞ{Ü~HF×ë¨ ®˜´|°¬Èòl Ìõ<õà¸Ð:Ø)�ŽÅb•×ͽç¸ë±+±K¿bo4[UOØÿu�]Óׯ…*‡.e.í!ƒ-åyâšÆ†v˜«Ë–Ø•#í¥ù»ÖmQ\Ýå†×Ž+ô„�TÙ!iJñ¤TcZ=4}¢¦LÝÜCºe5†n1V0’#t1[06_Ê–$ã¹A«!¿îžªñ\1£&i�HZÆY_FùJÜ˯V(Å(¸³+0‹[gÜ £QpÝËÙÒ;œv2Ï#o,†&V'€>QÔ‡y$Oöæ ÕEA«WØ«è÷.¢û^–4�-é:P9�Ķoün…õieLo±¶'Zä/äïÍ ßÝr¶:ŒkJº_ý|Ñ`º)¨^ùý ã[#~q ]„ÑÒÛÒïSÞŸv³‹RbKV‚wxÔ¯¬�+ýªÔ"tFÒM”Y‡kŒK"ùõ_Õ´çÉ6’!\i'Ú+'eSСí g·o¯ù(rOë°.ZEîT�vºn’À±ü5uÊÙ¾t"ÕC˜*k8àB.ÌëþvàɼʛáN—âü«ÒÙyní³·ÒµäÄÈk^l­5èà5Umå„_v◽ŷ®ùÈ{¤ž’½[§WÄfôcǃož»:x™×eB¥y0½h“¸¨ô] #€HX4ðœ>6ßLQÓF¿�˵ڹÝ+ÆuTkâÝs<;+Þ«œÿF�i=²:™çR0ejNªUr�:¾¡9¹R׃9 ¯Vý7lÛ—”oÚ­$ÖkÆöšá§›`ˆ>°Ï*#Dcs¼Ú^1݆TEgMÚŠøSEÓ’ýk�_aLm\§€Ó)tXqPž¼º ,N° ÁÒqšUî©–"…8�Bmî©&ê%Š£ä‡÷æÖÏ*›â/çDäÇ-ÿy¥�-Šñà¢„Í ‚S™qÃ§Í .²gFpZï¼yuäèÆÖ¶;>œžò%bè…ué.|¦gƒGŽ ‡ô¨Œ"ùž£b™g´Ãä.¹ÑüÉ?6v[—ÙyœÙü¸48d€ùÊxj·SVèrñ '²<_¥î¦=~2‰öÚ)‚bÞÚÉWŽ\‚Ìa,ÜæöŸys¼ˆÿyÅÄj‡¼ÎíÖw'GXÍÏ”&ô¤3ߥjÆU›È‡&*áæ €ÉÖp´«HS\U™ Eç�KÃ4rDåÀËósí×{-Îïã.Ù*î•ÐkÍ—£ënóÐ-…Ë}`ÄÔÂʆ3 ÃÌ÷—`W&ÿiísŸØ'9 Wϸ¥[nI²š’ÚoBÅ6á �8jUäÞok0e}´p…°u¹TffÆV‹Ï(.|FH¨çý>†Þ[OšV)0:šoŽ •/7ó¹Wˆ|ÿ@,·!ñçuãúÍÄÛ¹$A £´oÒ–Ž;2«up lwV„Á­&¡½˜97rœÄ�«“ èôÝÝÙíÚ²JMV¦Õ1†åwû”žÓ#¨eŸº²€ê¿“˜½T¸Ÿ|–•uŽv z“›ˆp–ÕÂfétWáyï¯1Ÿ‰9³»1¾–ãGç¦�J«Öªv˜¸ ÈxqÚtIyΉèª晃r‰³0QŠ«Îoª@ }ª ûYÆ|�Î*ß"B ý™YX “# a GÜèMÊÓÈíÿ¼Ã—?Àæµ QÝ�܉M·\8(G�Øþ²Ìĉ_·Ú4³:pÛOï–ñ@VèB`­`Š?vðK \NÈÒŠŽá[‰3ÔV·•çc/ú¼�[t8ÜýK”,Ô ¡½ËÂO\9×´$?’ý©8#xqïKc>žâ Û”W¿ƒgé·Göó¥{Ë—y)EoÜS¦Ñ³ à$Ðedbõ#&œM9©®C ±@v蜲- x $‘eˆƒ§¥]A±3ÝÒ0­wo%˜dx›D“dLn*´S]™ Ae<˜Ç9ý+î m¶Ò ð+Cz#¨…3nËMáXíû²�÷žvp¹ôI»KO"±‘w„#½ }¦‚ƒ-åÎ`‘ÉP�´ù4®ø:‘Š § H:…žÂôœÑMö tü—‘‘p-0«2å¢ìÒ²(ÀÖÀMo°aÂaÑz³æ�žÎR•‹4ÎÚ÷}€D“¥œ?~;Ô4êVóÞúµA¨†Þ¢&zœ È%¥)z ]G- ïÿ9LJâ!æ�nŸ2ôO ÃøKÿi¨�· §ÒpQÑ[Ü�ÇD5g'qŽƒj®E*K•^Ÿ j£rø@Ùƒ•݈4\®D²Ñf�iPBîRï¥Àb Tï^?lá9íû¾'EèÅî%ÇsÕÇB’bÀìmb—2×뼦Séåíqá­È!l˜LÑϧÿ^´¥Šgˆ±O#…4¸UY·äÚÓà¶*á ¹ ¢ý/<Ï6boÌ|"7’ç=øaŽˆà¤Y8ÐE;Ñ“íÁéX °'µý¡øk}td�_Y+Ï•mÌÓ keÜÒìAÿivWÛÈ=7¾ŽÜcÀ·‡X'—V&ô\"¶õïŠÿ úÍ.#5&ÖD®Ju‡þšŽ2¿�<sùjx�}áS�wµ 7ñ5ŽÙÖ3œY)hS:ˆ�ðAšßåAßÞ_Z.ljÐ}Û¾ A3VŠòv†ø?´—ãBNŠ S>ÓMbär»ÚDþ¿ønJ´;pø¿96ÿV.ððÂ�yœV…2¶[]AÊ©l…}}ÁÈ�™î& ­—Y ¬fĪ”·òf¥cÞ3ñžnEZð²|\?¸”¬Gø¢ Hw—Òñ{5 òyªDÛó$WKE�ð(�Z\GÀnºª½À@}Žøå'a·ôMò T³"s‹Ci©æþ¼3äè$Ízwî£ÓòF{�ÄGúüȺ¾M&+§^'ýc9Vßé"$Õb¡>k¹TãÂ8[Ä=â[EHÑ÷ó†fh«”]ýa}fÓÿ e�äö¹4§øVU¬t¸€´xÉñƒ-™>D˺®¢ TˆKä&ãÓ¾A¿Œ¼ +ØBEe6+äQr[ñb“g³Ò^þ”—8 ¼AÔ“º·žÚâÜ,<Npó‘2G¤ùÝ+ð_# ¡m3äž:Ę�Âö+Ý<ѵJUP™½Ð]« ¸–¬ò Ã¶N1òL´&lþVW¹öÆAW"§ML}2¡ÿR+ª-^Ó Ár»ÐW#Œz˜�n�TÎÚËÙLöÁBëHp»£¤þ�ê¤ÜánÔ–E¯‡ ÄvW4&5ü§0Γ‹À)ˆmÛ`Ü›æÇr÷ຜǷ›¦µ¨ ƒm “º/å¡VPgÃ'÷ö­7©lÖÛÄèé±{rèqÜÔÙþJ�”h®Oë�ŽHëè]5C1´©NVšV]�[‰F¤™ �Óž5ú¢ · i�wß™föÌÒ™èk>ÚÏÀ’¨?¢ƒKw7KKÉR_gú©ùšMz9äy‚øòúÈ~ÄÅ5'5y1Wv¦L¤s÷©ùŒ} ,ìã�ôHØTÞÔ+pl�C'‘ö¤ÎÅ#Ê ý³um–²5^è,pC‰‰ß¼ ϳ‰¸Ô¦vÄ"IsCÍ™¯OÂŽaw#ÁE�°7‰x¥2*Ï(®+žÊ¢¨ZžcõD¯J mc”E F½Z—«–!€YÒŽ/ÿ: „DY5écÆU¢:hvBœæç•@ÓpÑ®(Ñ·‹¢ž§-[¦·ÁëÚŽyaÎ%îËã2s5 &Ú^êÔ?ƒvÐýÞÖÓµÉv¤îàdm³J˜åã�ÁóÙ+MÖ«•Þ�]˜ÿ5]èàmï-ý›Ø¸MoI. ¬.‡Nš„€Fy6„h�/Rªýž˜Ë'Ú°#�o+_u =Z~vïY5ÅÍk‰—”ñÈ Šwá˜"‘ÙB” |úª�kh«ÜŽ9âf] ÜÞ‚+º?s2™võ¥ye¨Ü:ø'äÉfM¿0=0EVäÀíøû©õ¢ˆ8f1Ȉþ’Q1˜!¤R¨Ã7-c¬ò&ÒxGÍŸœÐPZ ›?ŒõëFؾ�øùÒ"Ÿ¾_xé‚ï€5øz–�Y£YqrÜ‹•êÚ²….Üø×R$é åQi>ûÆSRhéÒF³6Sl+.›2‹²@IŠì¨ ŠvŸHt. ^Ïì=dÖ4¿@DUt)¤"‚{o×` É™Ë5³l¤_ÆÞ›zó¡^vÀm=…—šY·l.þ<»ŠLÅѯc]nc¥¡y™´Ñì&�£®Äºìv 2Du§å^�g•Ycñ�Kwä9U�ïÑ≱E±€Œå…ônº,9ïZŽCˆF¦ÜN+b*ùk³5.¶³,ýEѱ�q/rlq¿n¹q‡‡nÝR.–f/¨vÏðPK=1K{;YïÙËñ¡›�+ï-"özQ(Í‚¨«Ùúï !W™›$}ïÒ µ*"œu¹N1°ñ£¥I¸ûbцIÌÍÎÆsµÇ&�©$“+\�­•eáðÙ;ØØWð”·E3ÌÂG&Œ/*.­@\Ó‡¸öoÍ•"nd º�e§œö÷­C˜]5�îÝK}à7íDÄ~Aó�qnØæR�J‘g¶9‹§Fgø®‘~,ÁaâånðÕ¬¤t(ú@»B"àÆ �;¤’Pç”|ÃSI V°Êñ9ÿ(‹Zô¤óžÃËËKëÊ~šÅ#‹Ÿ¡ÔßðGT¶Wº¤P›ª`åu³ð-þø 8‘œjAý#c“"q]á–mÄÑånAÖò”ÚÆqÐ^l©Wü=þЛ1Äiž ©À‡°•R8ÎfçîIŒë¡�^à²äýŽa:á¿Ò ÌY/|ÿb-lê�Ÿ©AYæFôõv“‰ËŽ2/�MÆÔø6p"OrŠã ï+;fUËÿDj;)L¯š&t±ž™ÉçD–Cï·4kùÔR4Àtá¬�{– °¯²øôé¢îÞ£-;¯·‡mÏÆøÖü‰")]b1Ç`åö0 G8añ~á¾�=ÇZIj éQ÷ þžÔ5[ë˜k}GS¤–ÛCCѬquÆ´»œ|i¡É;I¥œmJRç¶rCÛ1…A2whŒ,î±fmóg#!þqæs¬lMŠÀˆ’;ÝjÅáÆ²þ§É4'ox$ƒ®tñ–5Ri�ÎÞy‘EÔäsŽ¥é´JôŸ`Ï ÏÔ;Èw/]þwA-ÿ ä=�ÐÍF¿&J¾³ý¯Çk[šg(hÅVã<Çn�¦–{k|û©ÊzµšjZº7i_w0­@™b#[Τ©þg¥“mk¸Mà#÷s™¥7_áå‹I.ÿDûŒé…‡«Ÿ¤ ^„á¬y¯Göœ{Æ ñI²ÊÕÑŠ]µl”;ÎŒÄQýõöønþ ŒA�Å— þx1@G‹‹"¥U/&7Z-ÅÅC~�Åž9ièù³a—QÍ;‘´�jîæ¼Wc†a8ÅQ'lò5oë“õR^ï§J�¸o"sòA¢Ö_#®,«€~*Á’­O˜ûˆÿ:z[ÆäÜõ­—¸°…°‡fûn°=ꘉh´÷I'ž“;Á%®X­Ê7;ʺúæã“—cü»T»ô®ãóˆõUÇø�ÏÃe!és-¾¥6Â*!8Žñxÿ%·¥@|JûˆÂMÊ?¯ý臶^rñϸ:=d><†HÐû—×-" †&<‡‘’9ü£ü*^Ò9û¼ÌJÿ\8é è8"®>ó­6ØÐ•Øm«q1;úÝáXFýÀYbÝ[´L×w�l38þÄLygágëYTئqÐ+tl¬&üÛM£2ãšSØž2v•p¼}ße¯ø*RÓ™/-[ç­�„Ý^À0©áQ}Ð=-ó*»Îg}­]JµÚ ª±W¼“Ø_ëÚöo�¡ 'ûùzMdè_KL.½÷L‡KÑ.Ìèjq)ù5ÏÉ�¨B¯x�qôË’yòF¡LñFŽ40ÏÖFýS½–:SNŒd¸úz°»Æ$.÷‡Õy.Zae”>°ê–u0éEûYFÕô§32 ÛiýkîÐ7XÕ·ü¿óë<�pH¢QÌl®nDy:@ìù~XȹƚªOÔQÂÓJLGã8 ­®z:«÷¿'Þ‘Vé¿7ϸ�ÿ¼B¨¡¥<ÇÙ9æoáȠјˆ¾Ô_véX÷2ö�Þ�Àξ…ŠO ø¤1X¤­UP}ô¯6Éòað¥H€Iñ.£³¾>ixçK ÃR¥îÜwy%ü#k?dl!ýë¼\›�¯¢|vdè›>z‹¡ÌÂ]¤¨F^ëQáñÁA�ð¶ï“Åë‚SR¡ØWµ÷0ˆ$™ýÖ "bx¾@àÇ4ºî‘G;]Sýö{’ÿo%ûÌà!Ôd|é?•_½Õ5уªªˆ½=;Ç¿ãV±8¥7Ë·2ØF½I5Áƒ›5ÂþlÒ¶ò¾jîdwðRƵ+&ÃñVPÄS «ï éèk—ôkø)oíê¬X_µ 6‹öÈàCd9ôªÅºý{bJB‘Äd!ìbú«eÎ?ðÊ-•ZÀõìt¢ÝÆŠ©ÜˆzC%ê>I8Ïõ†*�lIö µcž¢ê³¹Å.æDÙŸéµ)ý/D�ö¢îX—ï„/Œ+åŽ`Õ†°ï9˜uŠæ«µOû»¤ÞùÏXѹ gߢ4)"i¼ 2?¥)u' CûF´ÊèMú\£ *4¾÷Í yYæôƒgÜ×áûFÓýñµQ÷Ç¾ë ªS3’1ÚkáOß„¿ÓV¸D6R òN5ÜTþNÓ2¸àÕj*Æ …³¿>c;§‚Å}AóóªSNþ‰—G�rôo|üŠÇ¨ýF ¸¨0=ÚäÛéh�‹ÍÏbïfyÇ� EW¨Vj.5W 9fUvÞËÇ…§¾¨aÄÀ;¶¹èÃü#L—içw÷çL(û,¸|E|×¢ê”zÒ¹Ü8mÐÔúIJÉS5Én-¶Óý>'ó@ÎÎþ˜6†7%¸fgî×C»KD%·äUõf—Ä­3Þ÷,¢*Œ´8•@¾òì-ÛÓO ÁÞ+¡†Yâ(·&ÄtöH—Y &¥ Îý©{¾xßN_"¦¥ãß—‡ô 9—ˆÜe`ëQâžêÈuÔ#¿Söò vã¤lã7æÆk‰1°To!§ê±íÏ9᳂�ö‰CVÙÈÒ÷÷Œ þž¾ÂÿÒhL|®º™› Èu&!Ǿ{”ÀΓÿYòîš´Tý'…6`WbNàõ¤¾êt×›.�žg ªIý­oT,4—ôðû§”4K±ùåps®‘¼‡ q“‡æ,çc%·%çZZA úþEövlˆÜ02/S¡¿(8•TÖ’±Àþ¼ËpcªM×ÃB +¡œcؤ^ªÍ®¹ˆ>GV…H Eg>‹Lk§}ñ4Žûdi-̆ùfx}&Ï�Aá¨Ú%‹SQ—D%³¼¯�wɇñFdÚÁveBfíÏ¥pK‡ä{å+!&mª0§,¡ÆõÔ ×Õ=4}D|Òªç\c}ûU=R˜ µ0îa >ÖxFGŽÈY*BÍÖ@,Ïn3 öSf›QØN:üÀÛâ Ë–+!ë_{ȸ,õXé’È-|Fy�À¶ùšö›*ue…/õ§}5£u­È¸szÅ{°× Á¥øà±âÚþáÔoö2ø”>€ú‹±h‚1�¦Kaf„Qr/Òû¾¹¦lpmNV1˜Íbe¾Fë_O‚wqqôíç�à³(KEöáFn{�m-S�„feë€ÿõÍÔ÷X„+>¤{¹>p̳?jyÜÆè:~ðòCR–ƒMûðt ,šVó÷͑ョWÕRï?¿¾,ä(«ÿ1à¹,‹2¦Ö†…þª\šòåÒûì�—=7 :æéz]Zx^Æ€¸‹GÖû#CãLǜ̵„ŠyJbk¾,¸ôL¤QgÅ‘ã4srp ×ãz‡ê ªõg�áòÌz‰0ºû’Aé(ˆ�÷.@­È|&ÐÕ^¬üL� Kͨ–†8Faµ )Ú´K¬²š}ZÏ›-)Ÿbuô+˜vxI‡.ÙCì‹Xbö-Ý*lÐÿ Ð&zñ™ü×ÈbB߬BbÈ “¿Ôˆ‰¼£:¢þ9Œ�*tîÃMs’î�®]Gá"в‡†È‚!€�uJµ\ZÜG¢G2{æ“/Ak'U d_‰µ‡¬Vu¥¢�”BR+¤4o“þW°Ž´�ÜFüÌ&0ë$CÇaÈ(öä~þüÙ¡eïê¯ZÅ‹�- �qН¸¡¼äh6Ö–[ô¯6&ø�Ö¥£-©gnÃnwÄd!3Ñ{éùX Y.J®²ODL¹nÂS6¿jmµ§ØøšèâOÆ]E¤c55ÈF#[HW%Ó}²�áš–w)Ó^}nSEy*cmnq3:Å•ÔÞñ©Ìÿf=ÝO™¼OOŽÇ dÁ3~¥ ‘/yÒ%>Á¶$pŒû9îMñ1†¥°ð+ºc#QþÞ”)ˆé.’wÙYƒ¿bÐìGñi’ÙÒ&V�ow–­žàa ZòU´¢dé„£‡~ñf­l[õöõ^4_Õ�¹¶m § +߈ µR�XÓé/ÔJâAZBDciø=Tþ'âÒ#<)Ç·9€eövlï—‚U[ç©èüz%¼gÛð@¢²ŽšF P�s€F@°E~<ÑøÐ Qtä¼`bÃuÈ<ŒuE×xMâPŒ¸>}„X=›– é4ßr5²ws—� äåKÆ^üÇÑè'&+*@‘“”'ᆠäŰÛÌMó:£OT;6†_ø“�t¶DýfÑEZüu…§®L¬-ôJ¿†ÒÅ2b}FÅ" ƒ;ú1y *ºñ)ß/É7]䩤Ÿ¨;…¹Z�ê? ¯<ó4.“›‹'Ž¿êÁÅQÝ+ÌY#ÖäÑD ¾9™¡mÀ²‚š¼´Õ‚ù½¡›®‚ƒ¿úßk)¶0‡5,Ì£kS7¶;±¸‹æî~”–ûùH&Œs½ZQ¬BÊeÚö–|}lµFꘫÄÃÏ™zîè�Ì~»i 9¨~ºxux ”H¨í)à²Ø2muó}\»¯Zÿ=Vg¹G¸W*Q].À(ÿP7¿3„>@ÂÞ3ÎêæŒ+7¹h€›”wÝm�,Êv›éûpÎV$Ôïrð±m_8×èw ;¡™æc?$<ÜTØJ÷÷e�KQ:c0ÿj¤µæ8’…S2E#5×¥| µ1 öô ÕÉ&’„—°çÈéß7NÒà´’¥‰»,w‚²¿¹gzòÃc€K&ÂAŠKLžEJlVØ-ƒ\2°ÿ6uôüq Yfbw™¯€ÌQN~øSVø±×®§÷늠r)Øã‡œbTìP+HN¸â µoš,Â=�%·Ïë«T±R�¿Ú‚JJ |œUû ª!±ø¿‰Âp°ï`†²DVÖ˜£&zÝRps�±É �9`¾Î4D¼�ž37Tº$/òÕB§ýÏriæ8•õ.P :1KœVÜ»öÑVtÃ~öš®‘ì^ZZH|I©ÔFô‚; Ü>z<~Ó;»$/¶qöEô‚‡�ö­ˆöp�<$òѽtEÇüÄ®ŠB2©LÅ6‹ÂXBÒ(òGð?[^ñ- ;èàF&XIóed|Œž]ä@¤œÉ"ÎÛ0•7ïïÕk½â“…6º§@…‰y™ò'Õ›�!b‡rdê9|é-¹õ8�Y†« ÆeÊ-üD’BÁÆònˆ\yW��‰7çN”rÚfo“+9ªñ£"ŲãöµƒrkdÀ˜²ÝÌÙ—èÁÉÌ#ž}%LðÁªq˜=ãFEýÚõËñ‰jÚ üºrãP\ìÓg(&MÞ�›#U�_4Þ”s�.Ñ÷8Þ¹¤R/M5�Y_åM">5±°nÈ /þX~ýÞ·Îkx#i€^”ªÇÆ›—2oÅû½˜eîª@()b”Ô0§9¶°HQS¶:× ¨ÃK “2±çð<ÿ&’ÁŽÐJéâÇKuhº&ÙFSŠ�tˆ‘–¶�lVnõ43‰EÖðRÍa‚ë÷“Äb^ØgðLB‚Ñ0mç¯òçòà½7Ü®‹Ù²ÊÿSúljÐô�ÖT§Š*mtÄÌÙ ÿ€J¤^i½:¬1›º!»ËE“Fü¶Í\˜ cÚ5Áò‰KÄœ&Œž‹è(ã*Ø¡`O‡‡RòˆL5qÁ, x}ý0]DîÉ›ç¼uLpO ey.ãmü$”�|»ó·ž,nüËÅ®bOàð}%ÔÑ­Á—¯MÏîg¹ E"¿ƒZð·kJ³~¥ƒý±`í�bÿIé{ä3™KÌþ3dðÊÑ­h§Ó`$å}Ãû.¥†)Tû7w Û „”‹HcŠwgË¡hCþ&:þ¶�wùç�}ˆ'·)”0ÌíÝmÓóô¥�‹t™Ãm_]âÙãn„ƒ®Pòh²¯ZájÀ{ÊŒMeR•£…AµÿCŒù€f ƒ¦¢Ÿå¤%ƒ oô_€¹Iß‹\°d†áäÙÖžG¶ûIÞ2Ž/kg «.òSOÓ@™Zâ"(øŒÕ9"õõïå+È¥-q^Í>÷yCÙÌ�I í̱ÐìãúÍõa·<=»šÊW%†=jhÔ/µ¬‘°�<þ•ªëŒY 1i“¶a‰šŽ¿�ý΋ë‹DécuY¥ú§†æå¶R�^7j yÂäÐÈ0Eº yøÛ‰sK½Ùµi¼Ni±­±Á;WîhÄäЮÁqu¿†Òý÷{OÇrì;Ü)°±¶|»�“W;Ú 7û:o›eÏ|±[ükÖ„³øQä¼–,Nv/3°‰^Þõ{ùæ~ DНf7´HãÉàÙó×M"Ø:uà™/רÆ�§_„W¯çP”{Újgÿ ªÐA‘Æq’²Ú»V%wÕ9lêïzKX_"Q͈Œ6‚êfåá™Óþ(ßÃj®ÔhÊ-E}:Àô#·‡·^ó•Ϩb¶øÐ팾‹Æbú‡Öâ™ Ç]êÁùXt'Ño–…È�·Ýs� .L}i/‰qÁ¢ ô$=JÁHÅ® !Š;œZ‹dºq#I2·tªØBˆ äŠ~� òƒá¢SýzægZ½Ïgͧ,›�#©Ê0>QüžD©Î‰ÙŠð‹èP¼U/›Ÿ¨Fì�’ÔÐÿAª3_ÜÜýɺ×ä÷÷AdŸÑÁ“#!èít¸�¢z)²s%öä-d»! ·h>ÁäRŸ}µ6ÈqB„ÉwpCT–­nC†\~…Wüˆ5—éž±_wΪÒ×—ÌïÑ¿i fŠQô ¦É•¬0¬cÿ-’$Ï]г;=ùól`_pýFl¶›^þXžOaãU~72¾ÎYï 2¡‚ÌKL×Üíë8íÿ*kÓM³²N÷Iµ©ö¨,[‹rPfR¿åŒ .ã%š´½þeD¾œÔu¢À%ŸÏ}>+ªyÆ#­è1I¢sˆàïXàWÏH©AÙõÛ�kÎRð‚8¥Dw±±¤àý]Ø}òhVXùœÍ3&>.9w;9ûg™uÇ ~3wÉwÈÏÂÀÌóƒéÈ2ó(]&{Ç�ä²¾ ãÜ`¿Úþ¿=º–Ê÷.-„Òª9ûl0N¦´^ÃE¨ Xø.üy ’œ"ü&w/¾×tJýÜÄWÅ$`«£1ßĦ]W?„ã3åFáæ½ëà@bá'UB_‘.½È•Ô›œÞ- ËœLà }ÓœGßüºYEÅßWoN ¼y@Ï�ÈIO¥i>Ç�sÒ¥Œˆtj½WªLæ…ÇÞl"ilÀŠˆÈo©@Ž£+fð¹­WCw":C÷8Ìe“;@[‹oYAï÷+ã솷ËÏe K]ufÑȰB éoÆaöÚ€�ñ÷WTÛbY·ƒ¤¬ô•£ [ÿ+z©“RþbEËÃc� S8éõÈxB'€Nªb)éWò&�ô¯ƒœ}iÒŒŒŸeÙ¿Î{¢ªÊ£QkqÑæz™Ë]:,×¾”Î-K.™¼H+ƒóv´¥ZfóUÖp:J¾·"ƒG,d‰¨c¾[*q64D µ ó6õg}f�eG·½¬À­*æ‘ëÐkòíBænÚ�Qà ҃ál8ÿ$±)3Ápdq˜”7oâÓWag óla�áÇâuŸé côôe¾|’Ž«~€‚™J_ÍÜÌ�?%ç÷d[¶ðìòE[Qh ªÛäj6]ËÀ$8 â¡ êO2û¬Ñ Ì‚™ê²K:[> cra„\fWÚ ÂÅKÂÅeoO!“T� äÉG²ÔšÔÖŒwT´É.+Ùۮʯ֭yŸ“o<ÍËW!Ô)øÓ£eÊ¿¾sÑ{†_*`¡" ô+ì:–°¢‡¨Õ0<„œØèšÙ0”Ñôµ|?kR‘ÊËvÎ@ ^ÁaÊ¿‹(ý› :\ÛR¢B¨óT} Ït­½˜i9h[„Õ™�ÿ?KÆŽ«gü+S ¹nÕÂó,BÆ3þ@>áˆ��‚-ªX@‰K¦¾}Y¯�]­‚‡oF)�žÔœÙ2_+ºÖöžÏ„Td˜‚ü ž|gôcˆÌ2t$' +ñtó@ðä©T¿òÚܬ0þ®˜üÔâÒöäѼÀíÑ ë 'ÐŒ„÷uÔúõ¸fl~[K=¨�Y |¨SCò.F‘$ìwŽÚaxwˆïH A…¿€Ü|÷}qUò8/ÿ<\©x{Š|¤¦,þU™<×û�¨1‘^ˆÛçãE”Ђú¼ã4a æe$Ÿ@nâQwüÆg®NÊj¬¼xï‚z åöK¨Í]|1#¾‘n×͈¿~„žM"�×ÐÆ‚"bêÔ2I½›‹`ƒEb¸Ÿ¬ö¼ÑÒ1iýp½fl{ÝVHÄn±rºº Žü);€©@úÊÓ^…g“‚ Ö�ßK–ùÎÇ)cxŒ¼ýëˆTŠÔ—ŒNÝUÞhÿMpâ�ÉjŸYf™‘Úb&rѬtµÜpÜELÈõWnc‚Z¶ñtb˱Ê3z.ô=©¸¦}5_íýu(…e®ËäÄxÿQ>غGŽåt†(²Á™��°NÔ­  ;”«ôÝ › Ç û{Ž’Þb‹â4öGL¯¼†„¼Ø7œÀ="½ÿ9A6Îúeôåß,H%n¸mãq½^ªFŸ}¶\�hÍ8å*¢Ø LY O“ Óì…�ZÝn�n°z�‘6Zd°cY´D_m»#“bÝ�À›œ…Q·ßZËŽòõÀ41Š¢f�Úfׄ‴°»B5Då\=|ôÞ4ï ¨øoòº¯oEWôK#oŒK¿§¿LëˆÙóõ†ÜRzëâåĸÜDâ§ÕLyïˆÆ: av ƒ—Vž�qgàYÂÃp½Îa�ÅË=Ó5†X_IÓ–ŸVƒd?�‡ŽUªÐö<(§­–³vPºb¨e +®¹ÐŠËª¶ßÑ sy‚„U ü ðÆgü†±^ AgÊÓsÞ°ÀP`¼ËæX˜ˆZËS�@ý4oú·Ï –u(4þ" pž²dPª¸îÊ¢ˆQ~T¹ÈÊWÔƒ^ª%œäPö¹¨^Öý †Ø~ÛÙÔÕ‹!´ub¥¥_¹V÷4ãæ†)1•Šô2‚»óæË=‚ÜuúCwœ¢¹Xz­Šq‹Y:hÎK:X�ÖÉöéä„âÙüeåh„dÂ¥á§'À²%Ãê0Œ¯_“©,§¯ qâ�_&¿øHÅéë–?wÌyß²à‰”á4dq ÂÕÃa.ñx‚šz%º»pЭ65(Anÿ›½!3¨Ù›°B¿CíkKÜlå}­þóžqÜØQ[l:Ó�#05D¦Ì¢Øßà�¨ ÛBk�Çe�PÜ™ñ=ðÇ3™W"fìªùèÖ¸);zñv‡ö¥/—(µTiçõ¼€ºêÃÜ r°îR55i7ÔÐqYùÈ;¯Uó¾,ˆ›aK K«TÕÏ~¤®—$T­Ü¥•˜GµÐpPt˜®QªªÍŸæ}¡0 È#w²¤P0ôH�¦ðë™þtÃ…’h:c%:Šx6aB.¶¬­Ð¡Ákx�Bë¸ëý¨3Ò† "÷JCâøÉ�x‡¹kŠñßo{Àeê¡m”‰4y_1žùW¹âkQzzGµ_¸vròÍÑæ�øïŸÌçç0‹ŽX>vÜ&d,„0ÒgÌHšÿs+å°ÛÉÉOr›¹Ã¥5b=c‘#N×M» êÏ{¨'A³Eü'ØÕÈ$8€LËðX�ø�Ÿg&Mx:›4ÍÒ«›EÃ/q¥é¹¯ ÆHzÛƒ@žÊša?(•ý<Ô�óqÁ`5mžùDÁ¤Wõ+ˆT%Yâ8Œì»ôº^kõø·0\Tãð�P*õ>z!wÕdP´a•Ò Ô&¤•cäU¿ ¶Õ—�L¶ ·µFù(cfâ¹ÛEÀU&Ç!)ŽO.Û=›ã:Hš0ÇW «IåúŠ£Ìá$&�±V¤A{9Éæq•eKæ |HY„Í ÷ Þ«ªtÐF¥v‘ì_àŤ�2‹Û<š‰~¤5*Tr^}4!{öÊ:£dB0`¦Á°Z˜•Péc¥b ,ýLGs÷ élåÖ7-Ô|«ß£Ôß²r»¸ç[ÚïÓ,SèQ ±‰€îN¤²Çz'[–ØuÆ�¨!C)Þ^t‹fBrD¹¤œítä1ƒ+ßÔ/ýP(1È­@iÕÛ&Æ»€ï5o3;~·�‰¼z —¶%Œ�°-@Ù¥ê!aG¶ˆh£~œÀ\Œ�#éTLZt˜N�쀋d˜µøÎVáQÇ>>^×!â+Ž‚Ê!Dta«¤¿(TB‚ؼŠ!.¢ãè_‘MJB“Ÿ¨™¥ÁªE¿ÛéÑœ3Öƒn–ŸRà}¹ Xz;”� Àx¶av-/à³Cñº'mh’˜e×Ò/ŹùûÑ®Á‘}d®Šõëè·(ÊqMâ1¹´~ø‡­{ž6—Æ»<óܦ÷ B¬ÿVŒnø/--½ MóØÊ]eHi«•Ë‹ëø6³wÖïu©±6YÒ“áÿ H¢‘ó]Ü¡7zSþø£µƒ¼†²G½U)t:`<µfÆÙ°H eAO-´t «ü´´M¶´>üÃûÛ eÇðl;iYj†g”�%ÂGp>^Z¦<ôíK¤�ö*‡Dü‡; zNóÝðö{a?›2X�SA×?o{‹Í‘_–þ7fôª¾ê>Ÿ×h‹Âs’ûb”bU-=ò¤u4’,øRœI3Á ²O:ÒÖ‡õGÃík§2Mj$ÇÂj†—U¤K˜Ø>ëiªMXϧƒâäý¢Ù‰óuX@AUÙ‚(¨€ø\hØ3¯}ù¥…Îê½zOÆ£ØIEÒ™q´Šö‘�Ue³L§JGT�k-mà|j%==†�ª¯„2 Ù¤³G‘Ú]í¾ÑºÏ\f1]fApiéÆÙVyÚ¯Ǿ°ó¾3WÆBÕù…tJ¦'uËáT*`óK’âò†+ÓFø ª¸çïslµ<Ã�²îáõuN’Ø›;Pç!v�¹2‡QÎkÝ‚n¥ÑŸ,_KŠàòó�±õB¨’x,ï¸b,*ãH� ¼é>"qJuJóïîg)^Ö¡)ë{”6êR×à˜ï¥N÷üò—Î× ~IÜ;ãJ¬ïÉ‘Í߬ÏB‚uÔĆpbÛ7ü<¤R¢�º¡~êu¦}wk¦¤¤‚­œ‚ø6±äè„ÁRÆžE­Ö´=®VÊMñ¢ó7yµ©QºÉÁòý�‹`ÛðÜ� †;6a>﵆â§ëÅL X$Œžj¸Õµ¡£ uÍtÛÏîj9+Ô(EƒÂè1¨TÊ1î !šìí‹ù÷ —|!¤mK4„¦£á×ÄïíhÒ°V4ó†Ò{@úpízYˆèŽa1†u‹«2ÙWĘäízã-«„zÑNgq¨Š TŽªg¯áÊcyè Û3®ÃAŸ­ù@jÒ8ã ™gÇMÆ4Ð]#u$øˆÍ££çÁ”éŒÿ)t„nˆ-"T‹ØSÍ�/X»¯¹n@ëŸd|â;ƒ}FZLž!KF‘{ÐÇ`Im)|V-2úªÃàb^ºG½ (Õÿ_i¢2B‚RØS¹�¨ÒûÔ\bgÂ]¢wF¡2ë<‰!_Vvz!—Ï€>;——BÅÜ¥p¸RN†´ãÄ]ÇÕ_)5Cûsþät¸©Û÷bïg>‘(™t< µÑ@—ípÌkV¢ËdìÚc«µyŸmÎ^úÐø!Þ”%+v(‡ûS«â++FgPaCc.óEŽÈ ¶šJdT4”„u•ayü™ÄÃ\k9#c ¶žóÇÚ5[|�-ÃÈ6_äy{ßɃß\a_§q³5+«ÿ#±tF&¾2H‹[‚ÆFòKâÐùQ—Ä6í+3-äœß±Ñ˦K”×5vuÿ7£Þ”¡M¨M|ûÀÚÐ]wÇJ¨ 癀m;ºÞæöA¤Ö-eBxÈŽždùRPrŸÐqé‡3kìÏZø0’ÇŸ�òÿ+Ç/BÄs¸Y¨kh Us‡?×ɛʛZüU�'ë1HòuN ¡x@Ïûu7:ݪ0ñÝ?®~;#�—mAˆ¦èNû窢\ôWý�xŠ««Ú†ÍFsGí†â_3§˜û—Äê”/¤x+"/õbP¢,›“•ž—2@²9Q�–¨è'A‚Ñå€ôh_¦ 3Š7LÂÈ™ãççsÔœú-ÐÎRJ'úŽ3Þxð |Ṏ -±^H�WRôÒ¢~‘rb»sfäãç×­hž™ÖŽŸæi䎥&Šÿ Þ ›+™pXòÆù“Êé07éLz¢û”ñ– úK®&IPTä"õ‰²éà÷ &A-fmË:‰ó®ü|E³•`šl0c_×–%4­#= zéWW£š�zÓ£]<3$ÝÑÂp2|A§ÁÊ�]`T¯¾ÂçË!_ƒå5]´òín|Ʋà~vïßçÔ®ÝZ g$ÎÕ£®Ã^âÀ…iØD³f6¯L =….èÍÜ¡VV@V$+/­ÒÍ“R¦ÜbD,…&µŸ…Si\©ìÝ?Òˆý®\ôèZôGr&¡4»=Ü:8Ç�Ÿ=çßIܺömð ®BÛZÙ4 λÖa`{%Õ¦“ZeKa 'Ç !¢?/6„\¼×<Æ �‰í‡»˜%Os[ÂûÙBdRð: Ð øÏ�—�Å»»?çÃiÇSÉ­šnb¾?q5)GBøð¼§qísÀgêÛ²ö”™®¨m"jøµ;3Bÿô÷å<šq;b·‹%×-¶ñÝœZè[‰?±¡aêÔ¨ÀÁm]ªJLå ÷&¥ÃÏVs«j5Á &¶Í^¹?Žñð›}7‹Xä ç"ð2™·´VÈÊ õ­~�*ž*W­ha=ÚxEŠ}Ã,üHvz’ðY±ªb§:=wŹI%ûr¦’³9uƒ©Ž4ïкK¾/xjÎ�²3Ÿ'8‘ó¤=&Â6 $í¬øEžü+›×'kóÔ ¿=ªžì°QŠ�YmçæCÒ—÷Jz”7Ë.�þÈÏ œ‘�ÀËÅ:ìÏ­ä3·QÞDZ‚Î�,óiír9ôœèDV�çz~¤G�âØj2ryÝžEš¹TDÉ4ꕾ•ÖFjõ| L2ª9Aîí œNdhì j(6p€|GÊíqÿoiH숿¬’*6w½ ãíÎ_á©È�hÔJæ 3…Ü¢Ì'´ü?ë¼OšG9@”‘ üû  rN†º ûíüñôE®÷PÀŠÃÝÆ.i˨W>kåÞRÿHuÌX7}³´Ègþ/�Î=_³wS�@ÞÎ;Õ“’ Þ:RŠ º–è {4xø\Ö*�Xð‰‡~hlɦ]A$÷Àwü÷ø`×uÞª�öè¹ð;w²­6à Jgh$ݲ"„LáÞÌ'ø˜ÅÇ[ A$H*2ø­rij׀í§OÈÙ¾P¡%1T�ïFp  0&Ó:ƒ ±dŠsEXYÍýUmé&¥“aÊK§bHT{×g¹L|™žtI”g9ƒ‡ðþüNÉ"?:©wÁ/ý㌦¾!¶• à™©SÞ×D𑼦ܦ=e%^�Ú»þ|£Éh=�Ea;Äü¯\ïå–çÉPäK}o1#î}#þKwuþb* ­6iŠÂ´²ZUk’Ÿ '•øBçè^D™RaÁÅÒ€¢ÚÛ`ëMÓÙ= „‚{3+()ÛÝATšX.? é‘d¶"Ì<‡â§EÛãá‘4@ûgÆk˜lX 36vP@Ajz“>š³® Â�ÐÇÕy{:l÷l>¤£vW‹0Ç;e,]ÂúW bçŸ ¬ÖÊÈX0Ö“n ©ì+gµSøßâ¼ã¢ûì(ïž’3�*d³ós‘G �ÂóýcGîžD&ªY¥� ØmC¨o“âŠxÅW]J\qî¤/7hÝfþ ÌéëèF!Æzs,zŒ"–?Ðg4¾¤+ï{n)¹ÐX®×R¦Al…Þ€Dªž»™Ëÿl°í„.ÛÚ›§¶‰®ñ¼J ôr8‡¬‘‚-©žÙmür¸ imûŠNíúMŽÁY½ÂgËk{Áº;¿Úßb¬ÿu êpzÛq'aÜQÆ‘;€ûžx²Vjh­>môpvköný âÔWgz2ñX6±‹ã 9éèX(‹ÓlxM�K£ÚkÙ|ýKŸ8ûËVP{ÕvY±”·­|“˜ÎßµœÞY…Ê]À5„c3¡�Ê9TeÓÉgédî„2yö¥ Ñ!B¾§0«PkÉuÒÒ¯I´RÖÉ« \¹‘Si�[°Àm ÑíùŸVcǃ>è㻋"÷-ò ŸdÉK3å} nA@T÷£¬ŒYð…2É—ßyšQ´™¶Èd�Y*øÞJ5âvo‹P™/È%Xú£.êq�ÍCÞ”‚×'ÀˆUn¬5åõU‡-é»?ÕŽ_ùç-¬ŸoÉRé®_"ú›ÐÇ÷Ò›¤ý=èžÁòRÑGôœ¸¨yðt tjÒŒàfìÍy…%8ÑUƶC q×Ò+Æâ¿O‹¢ê¨[¡ZFµö+¦¡µ:ôâÑ6n“«zÛ_ÑÑ»¬»æhõ¸k€óJÚêe0:5ü%bQãCDËaÌ · #’'‡¤V©MyÈõôçD9›T¸Ô'«|Øämxk\„dË 3õÅ€Â&B•Ióf'äÿ#0?.¶íå´U 3].[É�þÅç“Æ¸ Z•1rªÀóu@†&……£=®¢ÂJü™Ncׯúu¢‹T'rÓÿji›á•’P917M¨–¢m $e’ ‹. ¦{‡Âå±8—j?‹x æHéû€§üŠº.?ªUOiY/Ëú«:I~› äÑR�ÃÝ¢!·”ï£5Ÿµ2[a%emjÏÿ$—“÷É¿Q—"°ø"ÀíkËŒ‡S£×Ü ûªy�ª:•Œ�ÁÏÊrp ¿é?EtlÉ]^Ë´µô+{3_`´wï„f–¡¦S¤¥ü²ÞÎ]íÛiÆ(¾ˆ¯‹ã >Þ=颈cå !Ho£ØÛãÜ™¸l�©PžÚÑ”�t“¥¶ÓŸ  ÉbG^ˆ‹ÿF÷“3–vK ²}é}P2A¿?ñf²ƒ�Ë+¢dxÞŠË÷Ö¦Ïs4ÂêF0•œÊ],^øÐFk8[K‘1ïÌD—Þµs‘%S³Fë±f“CÚÔ0,/¹yê¸nà^^úô^ç(t^xö«ô÷³vΈ‹y º  IV„þ’ýòeË\®Zt£)œ�Ví$¯¥vž³!`—‘É>:_)à®ð}V�öñ=sÜF“/Ê«A_L¿/Öœ ;§h¦‘ þ!¨µb¥×Ê-4ÙVKêÿw?”C[¦rmÃüOä‡Ò I³ÀNÕŽ¸ Èù‹NÍÑÛƒªq» wíRÌ#AóÖ7Èžw:ßüõ¯ü1·ú¤,ûz+šC¹”÷wDÙ5´pû§¿�B†áWÂûŒ*ñ:ФL½PÛA—1*>rŠ€Òµy$azòÀ–ñê'»Ü3y64k+á+Û hýW›Â¢]jŠÕ€‚õ[hè5bÃl¥Ohø³j­7QúÏcÜ$u¬Ç ebÐ|°“êý),±„·Ð6oNiS°û,÷�-3Î� ÿ€kR”V@U“ÿ[}ªGvûO»ýå¢fþ•I�fMCŠÞ†zh‰ÈÙç- ^œdèñ„Ë‚ÍÞÚ£(¸÷}Ç+>�óÒQïSèžU3Û,â´x½“˜Ù¸O¨RžéⲊш�ºCI±\˜—p¹ã.LTØ.®dm w”ï‚Á‰:Õ{¿·ÏÜ€~Q¬~ò%ˆkqÕ…{yP‰ïW–ÖcHûà§ýÊàúüO[øäH9èßøùš¿,ò`úaŒ'ò,ìUƒX–†šsªX_]GL€˜÷†Ç4 4ÊQµž„ò�ÒÈ#¿äÛÄMÔC J×�…º-Än°Áí Xá›~²­¥m“;NØoP™…ht3Í·PµPny©³‰éýõÊã{v*¯g•hÛÅ_&Êg2>ËKòÎßl FÉ£ôÃÀnŸ¹=�½M˜2¥LígÔgÞ‹�í¢ÜÏÆáºÝO"I»Ìi–îUêî'¶$WÅJQ ÷7µÛ¦�Q%ÔÆC_iè‡xÙ.g¬ð÷¹Ùö1ö©˜Ö3. ûDV޾à¢ä™(¬±±ýyú@8 >Üâ�ºce5Н�—ûâÍT´˜ÏkÔϪXÞþÅ6T<«¢ß–cqx² CYV 41ð·îvÖNÜq6p[Ó4÷—ä-uÐøî2qš4IëÈ¢0æ@$ulŠX^®¬%}§{v…‚­º û…|€ Š2{쎻èe§Û²Ö‘›µ°‘¥Úk�²Þ^øJ|Î1H™ÞZ«ÎyXRÆË,g á<:{¿Ã Ûq"›ÀÇ–eôæ.}pÛNŠ9Ë*3§Ô»ÒŒ¯E]Ø»´2ÇåÀV•½M&Éߣ ÞK@§Â>ûëjFŒq„ûç•o(Ó .NÙÁ΂;½“õ¼óÀ¸YSî Ûáb–—6`Jnx q¬þÀЖA{Ò-4ܶ<ÝÛkwµ®]å7»›×㣗w6Í&V0æ¡„¤Wáàn-Ä�5;¸÷ÌùåoÎß©fþ·ïJܲÕÅöÒVÔ‘m/P©u_ß2ЪÀ�¯êöêzÑÊ4;³4íÌËhôúùÀ]$�Õfœ(j¤KÍšç:r£Jij�ªµQM´‡¤­nó³ÐO·Àe†mÜ# C†�~>®=Ëmh6MÆ é <ð")*#•¨* èVzÿ"î ÂOר»Åb„Ýcš^]KÁ‹5‡Nж¿tX �Æòi ]JNÃ=Ú‚u&¿[{“¶“£0¨¶*�g•Ê-¹‹<"*þi)}®m#tZˆqãàE°‚Zœœ„$ßi‡%˜©¼Ü5ÒI47´-]9ñaO p ¶ÙÅicòò‡°´ã#Îý*j®í7;$‹ê[¹x–i_}¤Vˆ¬Š4ŽÇ‡YZ†Ùs¹�çy*.TFO67ý% ¾°ÃJ¾¿³‰N¬J¼¸"ëñi2ðyx×n(ÙÏ‹k\çµÄY²KuÔíÝ^0"ÒeÚ¼#å°1Fô C8hî@U“-ò¨Û&Ö°ÕeT$®Çå’»Ô¶Œ°ˆ)ƒë™ãŠ¿¬¢³Ú­^{É÷JÐ~C¿\ìÇS–~¡õ˜·]$޶ƒÎ&È!ëîæ=†M /)O¦±¡–®Q×לr™ikS‘ k?‡ùªÕ¡�¢—«/+À¢p_’ð¿Olþ-e��ËšÁ£Ý®'¥+EH>™‡.ÚŽjѧK!.�%"Ûݶ…éO´´)�–tqzñS Íiè§b/K<ÜDÅ|凟rÖ�sh[F3üºô›KS–P¤»L42nm®|ëtmªùÜz’‘Ø¿ typ�<7†;~Lhè®·G§Ðë¦о¥´Iˆ•ùzC$XŒ.d:Í»D.sD]D,¼`šîŸ–®CbÙYßF@6køzQ;°X©�>ÿ+k ÷OK¼áß]‰W¯–�-w2ÍoŒÁ]#î÷›)ÀEÇH{Ø-WüëHç 1œðÊ?D´aft•úr�~2_Fp‡’s[”�£1óÆVþŸ«6¡r¿"´‚–ØÑ?I b±:׋’Gߨ\&}ÈRñúÂáL²ä�úú„I�€`±2g¥xÜ¥nWcpXŽFp9AýY³ë;Æ(€\�Fiƒ?:ã��Ÿhnhä„Ù97 rEïASDìðøCjãLYÑîYª€ÿd‰YÞ'¦Vã!õþ¸SÌ#páLÕAÁÿ}œàÐVbª·»{c« ¶©®íþ4o[wŽá…lzõA10–Ë!»¢q3²fî½­ [Š@é¥ÄSùe§‰Aψ§Âf"é$\­¼__,9ág²æþ*Ésê*±=„×1±ä—E„´€Üý.Nb¸�Ð#´.ÚÓ¹¢­/Q„05Ÿ=©â}VÜ£¸úµ®U°e_ îañ\¤ GPÝmJeoËtN¶}�F]…Σø.Z†o>爿éù.R>P�÷t~ˆk™2ׂ¬€?Ø# ´ûora¯q‚>S4$j\xïÿ6¿X÷O©³9vµ@}‘?ÌCa§ÚB[Ô²Bºáº‚·Û±ø½%Ó<�D}ࢲ„ÐYý=¨¼ ‹Ÿ°¡=@Y@¢72ìQ¶ðjÐÊ|~°ÄˆO¶K«€÷¯�­*Q$ɤùÿ&4GÛï7wQ(‡ì,�K_¤«€m@vAJ§•19Ëó/b\@,Z,$fÎ…�D}­ÀK=8Ä&öÕȵ® —G¸!ލ”ÿ4úø�Üg†D‰â )N ‰½oÓäêe¶\ãªÌ6^ïrár­6¾;Ï" «�Åe%R«��™ÀÝ1 m‰ð5ôn}“‘0�"ú ³ìPH2$`�[ºâ�Ìë š40CjˆWa¦ï_û»×KóO¶Ø™…’03aŒW&eŽÄì¼ã)iÉv4®ÂŒ†“Ye“ËĄն�ˆ%NÊ*SâX—Ì7J´}r °7u îqB‡_�O^˜ÏŠ` l_å=�€�9Ãu« ï§hí‘‘e, ¢ðtð¨ýÑÉS 9ná>ØòwUsŒ?Ñù+›€y#6iªC½Y´�¦ÅÝ/Df…ÚcWj^¿žæzßtÝúØó©³ñÚUa´É7ÍÎïãöñc‹óôI¾´­Ñ&M&ŠúgÏV» œ1j§b�Joé‡MŒ!5½QiªGÂlu£Bùë×éA°É�É7Ì}gºáÁ3óäü ØØq’Ä“M³lˆ¤tj1¹6Љ­Ä•+„òHü«,qb�—LÑöO2\FÂ*é ©ŽCù„b¢®Ž‹‰”€¥ÚÁ[ ou¢—¶½2ÖœÂED x?àQüá8 €OüÅö«»ÙöÚGe�N¦mXâ#lw4%ž\v†WÊŸ?¤¡� x‘ŒV,ëáJ>Ñéûf3x‘Žçy$Iyv#aÃYö—F3ê/P7�ÔÔsˆ…çHp€Fõ¿k.Ô\�„h{2`¬T×`õ}_-è§¿?̯ëLú°,�üHÔ˜A7†f �€e}Äú'ÑLbò©“-×õHtþœö$†:¢hóUjk+ÃwwžP C#|dù‹ voO)5;©y*<åã:ÜK�K5£JõªÏ”T;ãìÉE�Í{aCÒŸ!¶;¯šÊX»†L z6#›Öh'ÏÝBÝÙo‚ðÌNæj|¨á‰˜Ø!wš4ô©2è\ÉáÄý~C:-änVâïÚŠ°£êç{K3:[s·à¤àüMÒƒ«MiKD#®‡„“[5룭Ö"\™5i¿Â•€]ÌÚk0sæÀêsŽî`^÷œ¢GuÊ"D3ÙúªÕ`ެüAÚ¨J8÷õàíÝ)™‡‡ìâ’Ì í1Ö·ÿ8ÿî˜x ÕÜœ²(ÁÞ_ÌÉVðòJÝÛ_žü®Ì’eˆ^ÿ8.PÍ*a–Ü>âÖ8ü¢S¨¹On%½¦õÍ¿·4ÕŠK—µ!ÙeÛ¯xÈ!Žuêû¸‚«ï6í¼âAPaKV,ˆ8*ýséÜiŒ»Åƒ]‚ýžÒøåéünr]¾îhó‡s¢=«Ò¬§ñ×H–%“iŽ“BTÐÆZ»´Uó±d¿^ÿjù´e¹ÞÏâ¼?ÎÙdÀµŠ=víwC§EücñL²ÕAY9»q: ¹æ¯‹]’�d â·|™V8¦£�Ãã}tU»[Ÿç_f äEQK=àïp-A;vl¬#îwáV&ä®QÜm�4Dp/[U „g¼›Œ}Þ–G l„Ð;p<%vtã3Ñ:)ÎbŸ~›ÊûKq”3=t| Ú Î¢�Ò/6ê’t õ‰2ãâÚ}ÿ]Jà_ïœå*©ó4Ų—Á‰ãµ£Úo¦/U©£›Kì=Ô§*ŸçÀÆ~Á`ÜD² Ó^>δ”g[üj\okxJãÂÐ`¥¦ú–#†tµÚz�Úg¿¦§€M(í Ó ž¡É˜ú§=`å ÐtšŠ"µÏGž Ø‚ÞßÁ¬ÃŸõƒ …•™Ð�ðïz  9†Tyx°ˆÉa„ßa�ò™5‹Lm§+¾º}!ÛöZËQ�© Ý^Ø«J‹»‚aÛ¦z™_n: ÜXyÖ׌"ÔñkѨp~~ŒÓô]rªPfS–'¢Âs³ ’Sú»8Ë1Æ‚(n…øŸ!¢¾q‚YÒÀ6Líµ€ø6ÔREp„ë*ÚSÙÔÉ´tÒšëÔå² üj“+òæ¶ÍN4ÿaÀ_ðxôêLvrlûó3ÁÁñ̒¯Ç7AÙÒ‡»¡ÑhËØ«b¤-2�r6B9𥚯~4!A8üÜÉÈaЛÉÛ±ê5ÖÐPÜm4ǨçþØxß*~ÊEáÎZË•*ç‹z¾œ"í¾%Ù†(î‚wd³ŠÒ+×Ôhü±u‰›*•’yßk�¹A{ö�¹ZÅÍzÖ_\þ³MLVs¿ËüöÛgWÌövX’ì}­´ºoT„úwÓéC‰¦ýÄí»ùÀ>�H/Ê\µUfI1ì5¾¢_IL õ¦«‘ø½y3¸—pRlO¾~ŒœÝ¡ôSx”8 ÅF:sy­º…¢Û¼RYVÃǻޓ‰Ø_¿šhl6b˰ÌuTê‡ê÷ ›é±oCÖŸ;]™Õ Jµ÷v¶4_„n!zò p…Ôòä0À,l�ÿLI”Î.ê$aÿWü{§ï+TƒÚÒ˜.ñ?M�_<ùðíK&’¹OŠ[)FBHïeyÏ©�­f5<ÄÙƒG Ö¡éËYÎNô®ß•a¸A„š4aŽ|ñ‘b¾ìlèߣLòZó·bñ²î�MbÉæ9§JQ«RµØ®‚ã8?gG*ÇàçÙÚúr¾ÆwœžÉ…6A©dþn¸“@÷ RΛ¦P¹ˆñÅ»»«W²`—æN­ñìhwxÐL£Œ±J¸aîÀ+_WP%عTÆêÀò)$8þÄAÐI#7¦íKž�aO+l9CýfQ©ÐÛÕ™dwa*ÀI9Éö­i]aQp~x£bŽ‚¢MMñBßgöãôM‹C¼VªòŒZXЦòNd÷ Bá%ßæ}Þ®Ô*ÿ …8<&P¿änKeÆ�/ÒCÏÔŸaõÏBpßB͵ìDÄšË�á–P i”Xü¤–^$Šv8n/�ö†c®ï(aj èeóaèg05sþ¿ÕÕÙ“ƒ>~¬m²ˆÇÃEŽÓJ—¸$óù aö[CêSŸÛ|�)ýrG$yi†IG€8äãÜ‘�rq)¿Üe¾ÛŠ”ØvHbõPͦ;y\ev=Ǫaoã=øÙ¼¥[Ž&£õosjDÛw.øIyÞÚÀ³„Ñ$¯/4ÞzÄ´Xa£96™ÛˆQú¥*ÞANHL8æB�Œ‚ƦÌëJxÞ¯+ MuoŽÍVÄû¨BÊGñ"Ò0¼M %,þéKTx¶R¶Äæ… ñ½Ö§�ƒ‚ �»ýa•“ù¨�e÷*FyÜ’�bèž$åûˆ'3`aûôÑz§xØìcôd«ñª^5·šKÑ·Çè"H#&V‚Á®ûJñDìAÁ•h`m–»aùˆï�s]OæJ@ì¾HSNÌ׫\‹Sû»Ï±×ÃËÉWî…QÞ6Rv·pªy=0БÛÞÈ;Ÿ£d!eœ€r×u(jÔÂø ³Æšâsq{„³ &çeù§(QÿA°:èâŠðÐ�ŵÈt)ÎY:}_¤Ÿ�:?:eNŽ·ð&ñ�Ñ̲yÌMô¾X.³>öºg8C äÞZ9!d7¶£ãÔsÛ�Æð¯ír8íuhBL€[¿ÍE>Ò°½XE=K”\Ñ=æÙà»’•MŒS:T>õ8O=V×q Ú¿AÜ6aóÈ(ë`HÞò§Íƒ ‚Anôêõ>«±+ÿð˜Ç�M1»Øó ¡Éï]Ñ•<@õ“¤Ø©£°¦È5Ç`�=® ΰÀz.¾hŸ4{˜åWY¯&&?)Tþ0Ûû|7¬åŸÕgvÊâSS¼âµð2¢PÚ¡¦"æ{<‹'Ý:oïï ü\öO›]GДgdwC06 [¸WdcSÈwÆÅ·W dÄô<ÉYNØS• y7¯ecïtË:|£ìb;| çXZ14oï{PëßÙšXÍs)Ï—ËÌÓ |Ô¹�ø†Ì¢cTYoÇøvY±óm¡âq“Ü ߓš€Ö©U©xªÉ÷w:˜ÊŠý²£ˆØ«¡Z—Q„ƒïÖ†ª> ƒö^àÊ^(.P®míY­Ò舰HWm 2‹g¡ iêê6*ÿ,nü‰a"’ù ¬Áòó n�r‡BxíÑüù|é/?Tœ³èNYÄ~ªž4uÒm9�8œ[§¯²$›%;¿b–¹0G7YÏ”^šA�ZÎ1Szr4oÖ﫯” Bu¤ìÞh·QñÀÌMhi™ï(‹ »Æ¯å¦x¨ûË£¯m/øaÖ>ï·Å› ÒÇ‚©Öeõ"„ M'(ÌïNb[ ÏÃÏ�´!‡r›|®9z@qnŽûoVEI ®�BøÅVágÛZ¦Ã‡–’´“Xµ L Ôî4X¬ ô{©¦mÞZç®kædS!»ÀñrP%Бz7Ô$-�¹÷®6þ˜D†ÊØâÊ£\¥eø?LìÖß:øE^=<2‡-}úãÖûdÝÀ�Ä ÅŸ}¤-�×&oþ{N kr�zƒ¡¾y2  az<1²wh�üE ­BW-¼‡ÚßÚ·œÍ©Rž– Ü�ÖíÞÐã¡�¾ÿ@¬úÎâ^6F��Í웊?`Që‘æ¬4ÁT/Í¿�A �Š“á_D’_Ÿ<ÙµÎæ)/X iÿF¦þÌ·(§$ ÿdéê9;Š;¬½Ù‰Õ¤³ØiArs, HJ3Ž]l—y©¿“ö+ß‘ûÕú«œÝ¸©dI3שŸwOACx-™æfé%Ú]Þtbð8¬¢“ÆÞ ú[ì·›ùÜ1Ù{vÍÈg^ÆÚ�bb+î›-É5‘û#âÎhŧï&½xeŸ)"È'‹Æ­)g¼~3ûóOаLÀ.*Zm)=3в{„<ã 5 ýÖúO¸©w1ï£õ öÁf/4\üƒ§^MV»íÄQíîŒÃ¹:Ô\††p`ynÒ,óDÞÝ‹†,œÿ[ÊôP©?: ©Þ%-ŽZçß)E8TmMZ _²’àúëÒǦEšÄw¨ó� ×à3/ÎHƪ>þÄ’þ{¤º=Õ�4À�'eþÑâCY^Õ÷õ³ìùÏ Ã®`¢E¸ Œ£2…;_õk§¾ ®hEÕuÉç˜1bÉ—ŠŠúÓ8® ¾ºJà7+/F±7ù]~=äÑù ă‡0ud_ÓVâ™§º-Ô­àv0iw5ò¤+ù$ÝýÝc÷ôÐ Âè„�ÀÒ8d!òj†§|0xéÜ=(üÕ´ØN�#ŒRÎÚ€Õ~TDÚ¶�$UOǨ‚*wÝ#?HëÀB¨CÆ~Ò�|‡‚ZqM¸Æ+¢ 7Âí’ðzŽš�=ßÎ+-ºîrŽ7«] Ç�gŒuÅ­¢°#�ÑN'Rµr€’y¨ðš¬÷´WäŒzžÜ@xÐÓÍ"[6ħI,†¸’º#”>?§§Ì¿ëSi!Ÿ¶7‰“‘¹¦ÃÙÜÚÞäþ"¦~õ0 ÆËÑ/.Eåê–àiµIЉ1KÚ,nÔëRtw¡…œÜKÛc­‰MÓÜ»… é5kg*˜šÇQŠwý~ó¦·uÁ+Û¸&¡òæþ ˜h Êb®cW2õ^îöŸl}êÛlœ {ÃwPê—ÀoÜÜh¢ iç¦çœ•÷”›æ`žÏo’(¹µ¯q`€$p.3¬ ™Ç) ‹`¸]BU—o«­^¦¨—k_u‘4œ^KÍÃRdš¾é#ÉžŠ¤,6�ê@%�ÂŽÙ@ö}o�—-SK¾tÔ´ßÃh®uÞnAšûhÒž£Ç—[ ¾Êå1#µ(;ª+¼Ð‡ã»DÑÙÃP±ª¶}ñ^»÷‘'ýø• …Ÿýéâ��fjæñؙڕ~ö e¨@p7ªÄ¼«Žèûüà{]¬*» ,´ÙÅ d2Óûû©YpÆÉ°L>‡òo˜S§0‚5ó~3+¸ÿ .¢ÿp �îœ ¾Þ¡U.x3|À3ÑøÚ§ñ'š.«:3÷¤6ðã€K}Ùˆ–Øè ?’`0f¹/ã17-cÄ¿à-”ÄŸßnM/ŠŒy»ù´¿RÖú\g~`uHfßã┡ šÏ|¼-˜?¸³ñ�•6]Z»©9·Ó[©¿¾£ ¼ˆÌËÅ­]®À½m�«½ÉJ!Þ<Ú¹vÞÓò¸TBl‘bT{¾€¥k8e¯T™œ=ýÉåªésÈtW“” ˆdf[°Üg‘8¡ŸÏ'ª½NºÎ:k‘Ël¨0š´Z³¹ ÕÉ�NšùÈÑø7óÎù2J¥̹”£F§»õ�•©^†àÁÖ‰þ›ñc‰Fx,`ì««t†õsËÊÆ´'v§<.OnÿÎòð¢ãÊ;á’e…ª÷cÒ(2few7*#ï¼é/pŽ&�3éÅ•màžîbE—¹.ä€ãáàoœ¶:ü÷|x:møF�9-ðܼ隌ü Œ…\¡ }ÍùI±å´vˆ ÍLb…JìØÉ2QqSò^ù¨ZV[!Ü0%�âÌo+–²5×§,)Ûb†ígÑ�oo|š‹ÍCøwóÍe…v ûÁ€½¢§Îe}qõ�ñäà iÈyèàO§^fÔ­äåã]%çHr*ƒpKg²âÏ$#“ŠS¸Èž^ÏÞò6Å(N’¤ÂiÆGˆÆ/;^�pÊÍ,°šÁ®ÇsM±þF"r^ßIÁ= åPÁ´Ÿ Ú�e…@L(Ù™Ä ”Su¥+( ßí!•">©×f¢��s€¶Môv¾zArmŽ”#Mml÷ÿ.¿\übøJ³7ÕÃ0¬BÜ3 J:%ñ©×„´ÉN�δhͶW†ØýRxjv´ùÊЕ}¯VB5ôXPØÛ5˸šÏiÛT~:|úäd© Äßù[£9ô¸ó ØDçŒd�¹ ¤¤ˆž0·ðâL¶?ÑÀ?ÎRòþ w M³)Ä‘¡aZn�wù›Žñzó±'´âæèÈÇFƒƒë¦è‚ß÷DŸ÷Iä=@Ú( šÁ/xý$)ÐPÏð-qû8.”KÅQà&FI©qŽ/ àí±‘¿¨ Éû�ÁòuT~SËe‰_Ÿ,Å.wÓúí¶#`xö Ú%Á/'wÛ×oˆb9"†YrPzUʺ}Þo…áSyš¥ÖŒ¬ºI~-Øéøâ¾ã8ôã'½^#ª·³Mø»jÌo’Pa��œ‡Èã e¿[z[0cÛÿ]Áެ܇rxõ+ÝŸèÒÞ0_Òs±ê¼Jœ^òœFÝ5ÈJ :¨þ [Ú‰G™1Y.Ъ é°Ü�Èì$Çr£$®V›¾uôiýE9Üì&Ã$ÛZ!Õ`�­t›r9ÄÂRfÄl�Æàʾý)Œé"ڡ踿:Ó�D@ñÿ*IO·ï<‘߸´Î´p±Xõj·Ÿ²S¨Á†•ßóÌ*ôî¸+må‚v‡õ8æ-ÍVGËSÖ>R“@Qa/SìtK*ØÓÁŽà0œ,›ÊšƒÃ@Øôê>l3Ö?—JÎ; 37&KS½pnAw%ä9rá3K5+rts©ÐÌ% ½çv;*Ý9ÖÓý P8}LÕá�LFbgÛØ^†ísŠB÷æøÄÊ–ð<ÊW9Ú@|~Ójóx)  öÁÏ'7Ú¤ÀìY‚‰Íc¾“8{a µ)HaܸY 6A°‹7s«Y Ž)•ŒäÃɘ^Ú~*�U•ð×;`—ë�ÔvÛ < ø¥ Ç‚�¬F“ŒõÏ�IVÁñ…ÅÆWþ Z•m�‡Æñ\Q�ttÙWïOë VéÂx‡õ˜Ïhþ'4g‹¨‘ÔLY]"×LIoÉþC„þßì+rTU8Š6×^{*ÁtwV“ å;ø‡Œ?9à"d” F­‚F¯ŽH÷  6•½^åT–�“íØ?»fi�+ ÅNRÍΊÂ-öK–»‡%Cyci;œ¤iä{ª{\c†—nín㌥Kr‚]@A):‡ œ|וÉ N¶eûéÈÙs¨\ü=�‘µZÜGû|úl÷ •žCÀI¶ë�Ú]"�Ü î›Çp‘á6„ œ™øÛßÌÛª±Ö%Ùc?»¶pô(«ÝÄØ2¢k…Ö,pÑ‚ÇðÒ¶˜ƒjÆÓQ¦t#’$8ÔdøA}°”eRʯø×­ÆûJD•Šx�ÁSáW©&6›­æŠ èR¶ÿ�™Üyš·k=½2âÅ«§dÔ¸ôŒÇáé°©sÀdHê¨Tá÷ÞõZ¼}e+™’bÚ*ùžÀ;�.µN$ò 3A›ÁÛãXMb ÑBÏ[MX_òu”ÕOÇø7g¯˜�§®KñNí­ý‹…x+¥ óip.YµñÔþ‹®Im/ä¶o* a¦ð‰a$Ó*ä(V16“ oÅ‹ƒ:"ª5ótD¨ƒr}É[#ýgƒàV[G/›ÎÈF]'V.›S%$vþ­g9 ˜€œHßÈüu&Ê\ pYÌMˆæyË({l6ƒ—×Ã?'쬮A |ݸ¨wíû·Äúœ yíÅ~£»´«*ëÛ<(†îï.$Óq#yÿ<“ó_+“ž§�¯>à“f½9ù€à“#õ#N&ô]iÿ"³yUK `6º�™þWý¦ª=]•¢íÖ [»©9¡û‹„É|ÄÛÞHnsãxb L;×ßÍ ®©ÉZÁÕMíC¨‹,…àzÖÒŠY>®ú,§¶Æ4:‘}ªñ‡Â6B_Ôr‰˜‰ç„—QŽY,Ó:Bl¦/Zz FW%mVÿaÁõ?K_B5Ç·™@“$Õ°2Îkaö™UWP_(~òÀ��Ñõà§½˜û«]éÂÀ᫽ò;äÛ‰ mŽà¼ùb°-‡�^ÒÜ�§5:{P?}2~ã…¶×s:C{‰2Àƒ41NAôÒTíð1W}¼_—‡Ë„´"ÒÖ­dÀv…’Òˆ?‹lœe¸|£O)_.ŠÌ90ö�‡n¹¦ÎÑ^þYõûL�ê�½VO5«÷K÷ØdÆãC· _†TŽf¾Wÿk –]˜ãƒ®âwUò°äÌð�fP4WÄÌv‹ÓO_Ç<[yª••Lv’祺„�yåï2TÑ�ª‘›�EñÃ&ý®wÜñ†IŠÕMù·(Kzyˆ|®i1Ø€Œ°Åm4b{†P‘Ÿeê´õ cúœi ÆšHÇŸF$¶ŽË¿ç}0n6*íëÜôcúõÍ2Ôƒg8�P¡¢ °]gv²46˜�ê/xr’û¶¡“sò ÷»Â„ÅÆ¾ûØëPNü+¿Z‘õÞÍN�I¿( ¤ÆP•¥êëø>ˆ”\åh~Ûœ F¡ ‘KŸ¿7ŠdE’…Ïü|ˆ XpèÎÔíËšÛÜã0}²à 1’j!ˆ0ᘭgÚ¿P§¦Ñ”0ñÒ±ùî(DØ-ܬ鿍¹Yº¦8qò}Ï@sµ¼¼Ó©úL׬Ý™î§s%,îÎRIl„à Á�*ÿWˆ™%æo”#½Å0{1­l¥'RÈè6ÎY+?þOœÁ»�ê¿;¿r^¿ë8D];ÄÕ¡Dñ°e©¥júŠÅRýkYÑ$®ÃÞ ¶�÷ÀF„�©�”K ló'�”ñòiíϧØnÓaÈkR‘(UC1Ÿɬç�Ë.‚¢Î²’³‰G»uÒ´hj&ðHøïcÁÏY(Ládl¿*†Ž­×RÈ–PuÀ ÙR’<ÿBL¶ ã“çß•!G»êQþ] ü¼(›â�i^M—œ‡q`3ùÄ–r[¡ÜýÄNè<öËò à£b�_©xK� Î<æÖêJ$&çìÆXOËÈ›HÚ¼JŠì(¦�-`¶Êéço¤1ª]=æè!*Êrú€D¶š¡—·G¦CKV2u=¶/•tÚ”pÜY I©&»›Ç…|®7$æÝBoM¸zñµTp–y¬eÜR¨Z‹iªOª‘¯Ž¼Mø“Þ§êâ°BƒÖR¯Lž JÒF¢™•É´žÖ8Ì6ƒ~AXŸïßµÿ—Ï/ŢݻÁÄ´&ç‘Áh©i/�!x)e™¶Ô-7‡ãg°–±,n‘n‘29êÈ Z¼éŠwõâº�ZµÈç.ÃJÉPŸg±#{!Ù"ï^D¸pH|ægtrK^{†KÝØ•´.*ëH8 vfÁ”¼Ày>Ÿb½ãJÎf8yc¤'QL?«æp†w–§Ÿ¿ç°QŸÐp.koi /yëk®©7·àcž·‡_{º�c‚¦P ¬¨ÕQ4ãº\­Áø <ýÎÄf¡¦LÔ¯|R@gG1§VïŽÞ å=Zz úàûü,z½ÏV„'eW+U(+Zý’º¶ãu²&Xbf¼Nb�/MùQö£oÝìÊ–±ë¶É8 xî¿8µmÓ°tÌQ¶3 ‹²|¬r+ÉF›šË[šf?e5@%ÝûæŒ gëo¬]¬Þ Úz¦Ì–O$8UìÛR~Œ‹ñ\¬§{†]Ã÷)|ÞÚî®t,«Ø)² ÙÖ« ÿ.Ÿë²‚“>ͲQ¡eêé¦W¦b­§È\ÖŸqdV8®„Á Õ-fѨåôÛüT?ä Cƒ‡ý~§ �Op-¥G*)X:“@Œºe¹OziÌ)ï³—Í—ã·NkmÒñ¯›lZú¨iô`/ò)ĈE¦â®q¬o®¯Ðct�ÎI‹Še±uâŒ)%bßx—òÎò6g�sU™ìàÙÑæIZ*SïL…3 K–�ëk/®Âüƒåõ�['¨àe6…+n�àx)�ò/y¥tëÃíðmU[n{ žû N�˜…Ë  îÀ RÈúßýÄÝ)d‘ù …rœtûºG’ã´8Ó7ƒÍ‘»jB�ÄšßíÑrúH‘ü¡a™©txlw8”Ã’öeÌh2ç�ô³ï �( ô³tad˜7I øñiÛÇâ áÉ»# Àÿ=’¸¨“ž`’Ö{çáÑ8 !·‹™Î¥¹•Ø»wãCžºîÉé{”Ty¨ö;hû7þ6ø°XÑÁ�Â'<¶ê'&µ>Ê¥ôlÌj¤e9�æŸ ¶:}'¹¾PƒÎ|uÖFª·ŠÕ{‡q·šŠ.w¼ÀëúÓª«ˆ.Ôôaç;^Qõ Q=A�h‹©t™Ç/^ý.ž�ûkÍlMÆf3”2¦˜Ã-ãüϳ%¼Ya!.”ÎÛUÈј¿×Ø�$¿¥õ ��¯Í•|œ$ȳÂÇîäJF3À¸`\ï¹`óGo�'8˜¶·XWŒ5­ µ?búu~*‚ûD«dùÞ™Zp0BŠ5�üïEÇTdìÝ-¶&®Œô,œŽ$ôª§Öʹߙ�óÜIa+?~lŸ3J[”‚ÔY|ñ€¼þ.)ÏØÍ{,ˆ«‡ß¢j×QH£éPyEdû‚?[°¶YgW*&Vv:sùLÊÚù!ÀG"\´ËfjŠd±ØŸÿ&Þ ‡Ýaé^…7À Ñ„­8jû1‰Ð}àJv©Ù'r?Õ•Ê!ReC9€œtŠÀ.¬tû'ÍñÙå ™þ;ŸøakòåžQ�¸ÙýåšbÕÉDuP±@¹`å»ûXƒXAÕiö}c©LødAMX $0�¦§Ã:<[[¤„äO)ótê)”€/ 9ogXª”¶ ¸rr_{¤‘»o!÷>ÚäTéE©šjb-Otat¥–dŠÅšIWéfðª%¿™&F$OiÆc�Ç&eÜŠ_eîÆ‡Cœe®ªOU=7¬à°á̼£~"j2ûyQš`Jâ1;¢;L’:'~ïØ² IìxÚ�˜åÃÎ",èIÂh‰q˜d;)E¿×Ës�Oêµ¶ÅÅ7Ï*Ü7‰ZªÇEÉÁz †=sª­†õ9f2H‘ƒ>ÎìšH'AÊå8“yä×™àÀïß<²/î™Ë[…ý±þ#û&ì5 k“زvËé]>²R4 ð‚Ü™ÔlD=ÇGϺ62É\$Çy‡|ˆ@ã)Ocúm®tr�®˜¡ï ]Ô¢HöÌPN@$Ïw‘ž:õ0M¾’2Úýùwâ…`ÏҀܙ�—6I‘ßhÇÁ~ã_OÚ�¿T¬{ñÎâéH¯Û½=ER_bvÿ%ï#Ì·Ä;9�öx Õ¬v¯ƒñ; £EeóÁR‚üZãî·¸áqµ³°î-,›³í]y§¹”] ¼¥a‚ü¡7f}’×í×養çp¯ëø/*ÇèhÛIÄ÷¤å ¶bt`gЩN4Ç“IŠç­aDR¯_éÃû�˜¼,Ö¥å' ùï“3ÌC_TUèpò�0�<8 ø³ ß3µÞR™¯i¢Ø;Ró÷mhpžvñ±ÚáT¤½3"1mŒëœ¦|Äî0�“¥vN“øyøJŒÜ¨òœÖ­Ê nˆ‰ŸW;+k¬>¸�ϘJH¶C‘s¥»ê0À…#ïê‹"k>Ò¿“:3¨ÕÊ $êm{\ví4}i*I²eÇà‘-:í«¸f!rGºR|ÀÌä+§ºÔ�öŽ ÙYò˜÷2Éú¾µÎv‘“‚XÖ(”‡/Ù÷É¡/=þ(­öÉõ7[§�7VCô›õR—OODKYÉOÈÉ&9�´FJÉ…® àþ4ˆ%*(H�–ÄÆ |/€�><‘8�Oñ¹ùB²…[ßy¸l=HæßJÀŸ½�tRø‘ã8üxL Ö"gmèÝkkxtΛ˜ùÞ4¹×'_ÙÞ•£bÕ/fÓÛ´=gHµÖã Gø>�íÜW“â²ÅðÖ�ßDÂÍ%#Ú=ŽäCÕ&‡�¶>ê%Ÿ:Gcðh{—•�üe ¦C©Jž¯•à¾:èïÅ}€ÄCÂTI©ÚûAªgò!¼*Á÷½FÂ"ƒmCÔ_i8ºÍ” [x`~¬cJ›ß_]Ã5iZ'Ü€d1Ô’&–WTêuuÅY·ëà7ok©ü’�'ö³š RæÄ¨ ®‰NLÕðMRß *ÕÍ=÷ûòçï†>ì LŽ]i„·Á€BS1y¿O÷ÌP6¹VÀbD®EߟéÜnÿ<Ûb Á›³½Ë¬ “¿ÙMM\S¬m‹øÌ›ÀÇÂv²b²†²UKÚZв1Ü� ðI²ÈˆV6>¡åØkMÆék{-Q˼ᥥCæpýë°ïÃñ^ÖЈÜFµè7xø3"ª`ó9—�xǹZ©UFøÞ‰äe4$ÇŸ¨²`5_c÷Ý” j¨M¦n*¨€ñ½æ«ðrjÌÆeÚ‘iÑtéº|§ž¡"T}ý–Ê%Ÿ½§ksŠ�¦ñÇ¡óºœLFÖõ¤¶gsì8-}@Eè=Ä -oU²›ºìÊËÃø~,ª4c›Ï_Gb¸Š³v�½O—×Vò ‡dtjcWŠJ•&g›üÂt&EW£aÛšˆxŽ$�ªøL^ûå§SÑE^W?âÌH*š ô£f¶9Aöýù ¨0�|›#pÙlX’ÖÚ‰�µ<‰©\"®È˜Óù§hË •¼Âƒ êpݶ!²Ê�$MhtÛŽnÐ]ɲ÷|"®©ßCÝ—6cvàC=`NGì°…ãx|=L*š#]TiÄzêâØ>žP>‹›€(xIQW*§É ¯p¶ùYîIǸûªO·ïX!GhñZ0hÈ÷„ŽËüÔÒÆŒš²)!”cÔœ¬K"`†1l’�ÕŒDP‹!Gš²¿'ÂE;jŠÇúx±^mcžÜVÛΤ˜êñ|üNÃnÐÞå"4Ø�þœXEõ\K·ª› IzsJp“·™ËFMO¾]/)beÇ2õhº×¡aàoÌéM¦/ä¼çÎ;ËúùV*r*&'èâjŸn“ àébÃg2®«0#§a¡M{ðùþ*!¤' þ|�OÎGúeJ•‹ ÝaK|IʰÞrVФ.ïêãÌYú^6ÝFDeŒ�ç�ñ™¡=LÉ…Šù6“�gÎoUDÙ�1‹: €'t;DU(Œëßþ:ß/O¡¸ÄwÝ?ß^ˆ¢hvÂSiú`L‘qeýfš3ƒcÃ�†£cå[žû®bL(|IöXŒ¬s,&Šx½·Ð‘ާ…Û” '¯¹åùµ4.O÷ÝdµE']G¼¥l®H£˜{ÙÿÀöðþ³ÐI< Î2*#Ÿ˯tËݱ¼£Ü;f‚õ¸p¸3¨±<ïqá=C$z0© }ÎE½¹�l0¿Î$òÐ~fôäLACYÄw—ç7¦~‘V[W©¶&¬­GIG›»:JNŸ§ª^Ç£/ž�ö /"Ã2V;㨖V‡€1|ZÄ–îtn.¶Lb ;Q»ÖxXEi©[<ü!Õ¥®y¥a´¢áO¸7i°^z(‚üI¹*?&° ñ2ºV˜xèRܶ1öì4ƒJ ÊO„ÊËìÇ…³þ86Š�|qW¸ à…yðº”,IJ<!k4S¸?4ÝöÞ�ª0ÒB"Ž–Å)ïŠù°jm±ú«*,’Õç “%qCHŒŽ¬�±hš^<³=ªÓ¾E¹ß¾9Dú·{!™?ZBØ�•Ê I_ î¬bñªn-ÍâC÷�™…2Ñ£WËe™î­‚‘=ÐCðQ””%wúÄ@§)KNûd SWùEjŽªàÊÂ; ©¬òÚ8¸½ ~ë/Æ8ûAë3W<á%ds1ÊÜÜqø•4f·áôϨ÷EuȶWÊ—N§º �ØÔD\H4̉q�˜imp!J™ïã�6GB7ó›¯"‡ÚXHU pÈûÇ·³&œ��ܶ¶R{GÅOž»ùìŠ?Á-÷*/Q5¼áhˆGöìp}è5©‰›Z+î&ÙçDF°±ãƒùpÂØUöÛ³Ûzœt Ö�ïÆÕCM}Kü*3©%õ¾ÀBiñôõÔ½)sæç‰X?ù�T/“PäUºc›œÂ£±¾Îôû€[uÅ´ éåú\¬”H›nq'7)NzEª�×|ðæ»Ð^ág½ÖDô­¢Õ8K’G”Y•ݲ� ’æ’ïl¶™ž/°q(…¸«Uª-ók ¯ »0!‰ûM´V ”+­ó1×n»øÈ´Æx'gWzí`•™æˆËc)Áçá \æÈ/¹VåSìDò)O“+Û[‘¸@™ð&¦èµ#Üù�[ê`ôÂ|ü¹[Ç.fa"u+‰#›Ag$¸ŠayÆšl$k�bVŠÈ,B]y‹ì?ó=3¯Ãï…!¶LMã* Bé°´Û‰+À 1–ÝhÊñ›˜÷²ÈwKUâëðObÑB×N4rS'+ö¡‡®ö<û�‚vAvîÀ™cÓœóÇÊN¬–ã¥à¨g€Žd1'»î¸â}_›j‡¸Ä/òíYB[è�²3B \‚)�­A¬¹�8ÙÔ¸À‡„ ¢U@äÁu$5s+Ç�U  *ÝÙB#oΔ¡/:€ÎCJºë•¸Ÿ¾PåûÄ—%$�6& =_SŒ›«�£ié’L@`Ëÿ,4>*‹GM#zëQÀ4 Uy}£=óF$Å+æÈ%@®4¯Üà û%„›ÚÐQ-~/Õ+’¹ÝJäºqÎ&*;˜�T’�M¢Q«t¥Ö´jj]_£¼íZ(cƒ6¯”Ãî &ñ¾ëßtiy[@9nWÉ¿qƒ–Õ¸n­½�D‡ŒA}¢@Ylÿae ±]'¥¹¸pÝÏÔZ8‚7<–8¥SÃ/j©ïhÞ¨(%ÎÏÓŽÒÕ¢»Õs]I¶Ba7ÜÌk# )³#C=+@*úQ ¸’Xm€Z÷M\-ä@oÎ,ñ¥‹Ó3æ1n t0U߬ЕŸ-í@zíWv�ž sg¾)á±[¤c–ÎC¾¢ --e²_‰«6Qa t&“ÅÌZuø#–阈ùÄ�x¨ýõ  ?«,\7�³x [{DJÈð›hi’ÿHæ�|äê&Z»o}·æ³DNm?=/?œ™wÖj­ZUi¸�Z#±Ì?ýUÅUûKE '‘`§$¡ÀŸ&Âve•zÑDƒ�Ô-ËŸÐ ʼn²µ¢AOÇ5s[å'>éGòb‹FMµá×4ÖžéÙÉQc8%à³áöPB¿R@a€f%þp"ˆVeÆï ¨ªa̩ԘY–¶š5?È‹p¸€•ð !×_—¥Rz±OiŠ,×ÉÁ%×­é$µ�àÆø[.g¶ÉÚ±§¿¨ÄÎÿr9Š›ÎØ0c">šèXÞÚz‹© ~YZH†ni­H/ƒY+7ž¼Úf7º¸)ÙÁåó‹ *u& é¿TµþàT–ÄR(–¼m�Gf ÂÁp%Þ‡Ÿw�0‚ #„´HˆÝZ•×&ç_™r ÔË, ~1AgÛðj‘}Qõj& ÄÞ¬{£7jÃj“:­Ñç�AŒ¹—9ÞzQÝÜú°·ß ¯Íu; ½Ì>•cžÛ¶€ÌG§ñ&ˆ—�˜êu.Èj忬i,xüZè¼mÈ�\ÈKÙÙ‘_ùH?ø:X|ȼٜ8h»ú°¹Â—ZÄöôÜïû°vY}ï«éÔðJ<3•Í}ûœ3O„´4>�ƒ Òaß ÔÜ|Ök�&úœ¦žuÅÿ!Êç<à÷!å^´m Ù ô‡h,qÑ-”ž�Iwnªi Œ%1ÎØ!üPë*ÂH±ÄõXc}ÏÖõ‘Ñ\/·þ§¼ë¸VJqðW„ÌXÈ—+¼ŒµŽ®®égL�¶Gø”€&ʼnªqǰðßæ©-êÓ¤UlÚÞ3cÉ?¾nÝmCçˆ;2÷ß¶å£â`#ªR ;0 1´›â;¤>1‹¯ñ‚ö­ó(¨AÝl¾Ö¾ÉVªí'yí®w§ÈŠaIô[W‹üÇÓÓ<*lmÒ=àœþnåäš�°<ÎØ@d†TNµÒ–OZc4©-Yêî÷;)Z+ÙðÒ•ª�Ü.:Èþèu#ç"…ºâ¥7>qsU¥ól(`Ì`q�þ‘oµ×/.k4øŽ»ÓA¸’�z™¶YËé-QÌ߯G[Œ&å”`1Fõ!œÙ¼d§ƒô1µF—q�2àv�äGð3Dî8dº¬ÝG- ®t”è>ÇBåèáç9B©üMh‰µ6sÆPQ:: S; ÃË™í'c›¾oÝ­l«TCO„2:»!äÍÏ“ºª×çäivÜ"„ñˆf �”+0ŽNE¤ ‹­¤Ê�%òêŽ&Pˆkå;ð�ù¯DvàæÆQòÅ+€9Õ:"T'eÑá”›™\nmº wêúþ¸À>Ü5^µÿYý$½GõÊ�òB>ƒÍüüzûPƒ‡ð¡0(yÓ�ÚÐÙÄÜ„Y­nÚ= m‡¿Ù�@b³)£ Œf¿„º×\Ü–å¯Õ#©é`\ä!ÏŒ“ÉìfX¦¢6±H%DKéêBOì›U_ˆ^ÚîÆì☚Éw†û™]Oå�ˆ§äâãÐÛÊH(è²®ç1Þ’ò †ÑE–œØ•ˆ|Ù'‹–óæüãT|ó*Â%÷ÊðšÈ§kçŸç€°d$eIÒbu™Ô�Æã]V‰�!zÞK‹‹g$*QÂhî1âŠïÍñßí­Z¬.eÑ7Ìé!EÍ]É]\ýÛ"ªi<˜n|Æ)i�¾¢e˃@܃YC^%ýÚxêä©%')¡ì*ÐÂo¹„P«ÔÝ«Sn“ÍÒcs:È/ÓUëPŒÅqíë¡€¿ž5F^�*s ‘K§Éí‰)�ý4LÄ¡›y¿2 %ÞRIm ©®  “ ÿQXø3.-«(W›‘7+bbÐuj~“ÍÄs:‡Ó3zío›·B\{Ö:„¶€¸0…/?‹ÕÕÌÔPîwì�é2!s\]1EE¾m½U›v*1¢Ð/&±T^sÔöº<›(K%´«'»‹³„ ôie�ïäŤ㴄v#ðèÇv|¶7Jô¶¨ºAÅADOËwÞlH õŽŸ!®¡‰õt 1º8OÝïöfÑB6äL»†Ño:܃fÅ$iòânBY3d�·Ž¢²¹'Wm²EÆ­ú§[ZÐ)I}§€–-šVÄ$V/{AøI8®eG˜zcÁÏ’ ›]2Š”ï ë¼m¯&„M>ƒL€O¡`ˆpQÅûcF‘�/&?ºøx€š,",ly­•Dó³d"à�Ü\8EE¸ÛνtL^Ë~Ó�ŽSúWíÖÉ-{Ì}ÌAב4ÂÄŽÊÔˆlü5ŸÄ½=�5ÁGêšÐ1œ‘xä\½OTô‡ÉLuüì¤Í¡sı‚H=±¤`z¿A°å‡ž.5'�•:çj›,¸¼s�éûëÝK.€V%$µ® ¡·3 M ’5;™[åâ‚ý#b3¬q½¾½zwF"ÔΫ¿Ê±tEÖ]³a¨{”›äâXÒ§êHƒŒ‰’íiùÄ&µ|T5Gwë#næåTàe2 渀óúØ­'“Eu—þÅI¢äW$ï1‘²€à�(K  UÚ5Ýæ#g÷»9‰Ø¢Ž;Ÿ|Ä ˜ëÓå΃y[ JWu8�`j%Õ]a߆$Ԫ؂ýe(EU.–~…ûf}ÓÕ(‰~RÑïÚü|ôØÕEÝØrD}s*ô5UC—Æ/�ü"šý£(†ý¯ M7$õYsz —»°snU­6? (ƒ°�»bî›-åÀíYÔÿl%,6t–½‚FJêìÔFP#w~3¾ª«ZÏ|ñcãõU*Ãû¾ n–í^4ÎR#egI˜Ó°Ã‡%¸€—›öŸ¤¸ËÄÍYÉü¶‚°~ çØ/³òèÕ|�Þ€Ã1_àNÊÑ˦­ÎVçèK˜%(¦ 7„¨½{cRàn·ls’KRÆ›y°�:Ê…qN?JŠÔ@ÔÀÊ;‘xeó} (yµÔ†a�,Ê\0*‡5gŤÕÁér�“ëÆ¶{³y ù.+\Äé°â±&*®çÐı`‚Ðʯóùoø’!Ý–s÷ü-ÅŒ47Ù† Ñ‹šîùóŠëö"òiá�Þ§ x7Á°œ®”ZØU }·Žîç Üߨ¦4ñv-�Óý04àô–ƒ�áŠÞD»vÑÒƒ¦ ¼¦Û¦Šm“ $`)cÛO“2~“� 4Þ¥*Û†”N- ½ù�Žæ¥e†92Yn%wÿd¹L8zvúR3Ló“ä_[.lÏõX¥Ç9Ìbë—*sµ¹^¬¾Dæ¸"±/.“å³ûϳ„{…Ž@8šA’…ÜÙÁëæê¤€£"Ùz¦©Ø2Vߺ9æ�eV¾fN¢-@¸Í­Fmìw ˆ¸d¬‚9±ÝŒ%ÒC´÷ïÉý”f» }Ã~)éèW¯vÀò|É`}ÅÛj¾ïžE¾q}q ñ]À®ß¡+^†MÖè pÀeâHh A2TWlÑ,|�J°çZկưXðs“ñ²f±'ýkX�†éò�h?Þåq„Ã�ášÈ€7ý—Ù~7Õڄ˘+-9q)¨jˆêy•�;ã¹±Žê ‚ÅÙÂäÐåžrÕ9஌ûÓ¡18Ž0g·$%�ÓðÃ[VSÛ»m‡*Ö]q»•=ø<»ˆÕ…£ƒYœ&ôàï ¡¬…ÒÕñ²Â›ì' õØ~:ˆŠõ§ŒøSè@l.èÑO·pŒüËS9;¾§µ*ȈôºOŠnÔP„mo8€]`Ã÷fmúû_ùê“ü>’¬¾N§|Êqphg5˜ˆ.z§·òóc~cK' ьѧ wix—Z�%_‚Ÿ1«i?¬Aj÷‹Øú0]ƒ©5g 1*G/Mòäö€«û´ÙrP&Ò$É—·L®På«ý¦ÚyY‡ÞØúª!o{ À¢m‚cÒ7ÉÛg=è5 /a^šèâ¨ïH9çc¯ü™XýÞ)s¾bŸwñÌÿ1àTŸW-¦u÷؇a#dŠû�“@Á†b|ÚÃ<´�·óäâ^ËÈeÖ Á5�ÿ:>Û±!˜Wbo*ÑÚäÈ´6À[÷ ïa0³‹ÐÕ¯õ��ž·³¬Ù¶{‹õøQ+‡NÐ šÅðBÞcY±t=sìd37‹ØÙÞ)+jþ�%ne˜ƒµÂSz”ýî×Õ°|Ëdð3È´nóûj©QFHÇ¡X£ÝT툣âªÇ$fQãÅç1ü³ÈønU¾%¯vœÌckÃV¾Ž©¸¡Ÿ679‚_åîYû�{”¥Èbðû²…)»#RÔ¬å°Æyƒ¨ËÊ/w)H´V˜LÓ!á…›�N5ŠöÂ}†}L*‘XRÆWÛ KÓœõÆv }&ï>.|“ß6rÖ—’ܰM‹ß`›¡±S}ÊK>‚Æhí©Šß<m—`ò¨¥Ð3 Êú¯¾C·öo™"¿ß7é/ÙW!²÷ÞUë³ÿ|`Çáj¾š<2•T¾þü2;¦M×q¤êPØ-üœœ—™€¥ ç”0AÛVE“)�>1.üg}ŽúÂ[-9³…ß¿ù&ÁÜÆAÈ Nɶ 8C¢yºÅ g£ä¨½o›D¥èJ(Þ”Ìð²Vþ x_¥`º�Ö8»Õ±ŸfŠ Gt YK’ßµgrµí»E,Üqs›ª­ÚûëŽÿ uû¼™Ï2vÛêÖ¦H™ u»ú¤LÀáS€_6Xß3·1¡žþ¢ýÙÿÉ^©G„¦Ù–l,6rkšÆ‘C�t‡á-ç˜ÐÍžž ÓÕ»†�放–o—m©³> Ò”¹7ʺ_¯»?ìá7åÅì²ç ©€[MƒR±ztˆ»¹BM¡²¤4Å2{½øgsä™M!Ò†‚e’é°¾»k|‘ñ´êâ"’CĺvòtÄ{Á’>?K×Úk)ág ]ì9–õ9%¬œMuur†‚!µ=ƒ’„½–95³›Ï‘'Üe|õFN¸RìÉ›Z,ÂBlF m¿ƒ[ jh¡+ɱDª¾¹oÏáúÂ/¥˜V+ª�¯jb)ç±Tg# Eº¤6TŠ‹”F¦4:#ñšlA-6©›‹pºF)Éli¯cl…P¹¼Ãaaf­ ›(Á4 Ú±öª�5¥ëc“…´ œ‹å”(E7]f$�1£òâsÀ§ÓßS“Ãa艺î°…oÚ™é ­=~ TÒUo µÔ#lò®Ê&nºzJ«„é›áßîC%¢G—R˹o ‘³[`9"Ô7¦€ ¼ØÚ"ä¬ÛϨ]†)šu<|¨íÞþn0èd™èC:Ý Ÿø¶]þéß¼PØºÍæô®6pÕûX§¯à÷#Í«'îˆï‘õLÛÃ5µ�Úùú ì{öÁ|ã¨sÝjü!È3¸ØŠž¨ƒ¤£ÎmG.�"Üö1£ÁQ+ß_†Tz õ’àUŸ² 6ÍË%ÕìÔ¤½žÐÚüVްN,Ñ­9 å}Â�È€B©8Î_Ó¾ ·sˆÆb,@–éüPÑ’ë·Ol§/ñ·M»©'ø• áWÆc䋬 sj±œth™õ³%´ÃI_Æ1T†Èž]¨3,j)È%‹bÉ-½uIw0ƒùó%RÆ€\¦*–Z££ (}EÅ[¿_ál&ÝOû‹DÛÉBޱ�ÝÐ`:½Þî=¯w-¤÷÷‰r…8×§’¾ƒÈè& @š´%ßm»êêëɵ§ÈÙýˆÝ\�÷?áõk%ôCg„/´�¢’O¤{¹>p̳?jyÜÆè:~ðòCR–ƒMûðt ,šVó÷͑ョWÕRï?¿¾,ä(«ÿ1à¹,‹2¦Ö†…þª\šòåÒûì�—=7 :æéz]Zx^Æ€¸‹GÖû#CãLǜ̵„ŠyJbk¾,¸ôL¤QgÅ‘ã4srp ×ãz‡ê ªõg�áòÌz‰0ºû’B§9¯ê2¢$H5ÔCŸc+¥—øìxyY ’ƒ^Â_l¯æŸ%qõ �î…Y(ïO©%’ádáRä­iÒ� ,Þmn¹ƒH°è;¿. ²=vbÒ{®ùq  8¯<É¡­¶³#ذ}¶q�|ô»1¼¼­sÊÂ–Ø —@'¦�#³Ûì™<øƒ„¬z¢$…´ˆã’ÅåfÁÍ�©9UXDT sqð�_OçB¹»×^ƒ!6ƒkN•ÏÿRþD2·å¢ß(·Mïf çüÏþ¾>Ý©ªŒvTüÑ­¬´cÄ×6&ø�Ö¥£-©gnÃnwÄd!3Ñ{éùX Y.J®²ODL¹nÂS6¿jmµ§Øøšèâ�ä7@Ö!c´}‚|êzÚñÐKÁ-ÿ?í»üÓÁ$1 d©�µ¹Ä¿O„é¨èâÍ¿ÕW.'tU³¦Ø­€ßqL¿ì•…cÑtÊ~“=ÎR·¾%¸Ð$6�Ã#:ŽÔ¬3®jÕ¿…«Åõ¥Ùfl‰t§Pkó~YŽœÇÆ[UÆ®Âò5†ÚpÇ^-j¸×8"Ûê¥+•_Óܦ‹*IͱC”0!QÉWJቻ^wÕU6bœÓÅ|ËÊäî>˜G\m ¥’oj¯Ríw„ÄçA1>®ÂšzÈu•Ó Dñü âÍZØ·ëíê¶Ò¿V6çȦƒaL0 ½qÊ]¦Èd˜êî<½¤¹–‡Ø±�.meͤaµ_3J�»vKöáÌú«Ä£íSjc >PLST©2ªFº¼ØŽ_¬OßnDd‚ÞgÚňb†v=6¤H†~ŽòÆbò� ,”ÐIvˆ=¸Ñ¥g.Ú�á µ;Ï•þd‰�6.ELšk'5*Bñ’vÖ…Tú3õ2“=ÇzYG ²†Ò ÒÎsPõÿXŽÁOöB g‘žImÅâ‚iÜ¿+ÑH–ÿ&�v.iÍ„Jó(Y&du?>/!%W^%3·Ö¦ï%M$ýAØœ-ÊÔï>ÞgЈ£¾¢‡ÈÅ\;cý¤Áæa£ò�ûn?3ÈlGI”œ0¤cl¯9‚ê?t6ÙÅÊ(qA—s˜¦2äÁ½¬càÆGyuÀH_ �ŒûØ¡5±û~ ȬwµÞCr#P[æÀЈºYÀ¤†Çòƒ&äŸG°à¨ÌP0æþ7ò@‹WÕ€ó´ñÂ�ª$¡v’Öµb£�KñÇaY+ÒÐÜ÷÷šLO¼+©œ»U>Obi@CµÿG†x…x)™Ü9“ûË $Aó8÷]ØÁz±[U–"‚ï--u”ÆÙ`�"¨MZ-©]?B8Ú�"‹:.ltn)>{½El{±Æ%Ed�WÝ=jø˜\îÊÔ:¿Wƒæ-¥éÚ\’T 1 beŽî–]YÇž¦´)€íÒ~vdGxê÷¨øIªQ¹‚(ÕÃ+’¸r¥YÂÂY®¶M–«ÕB�UÌtÿV¹Âø§o• õHYÑo [â~Ò´ª¥ß¨9ûä3<-+ªÏAÕIÆ0øÕÏ•8«þòº Ê¥®{²¶Yj/F Â~&ƒ›s´§ åµ]F¶É}ò ¶$w2¬‡a‹à­�Þf¼£*wá…b¥Ÿ IÊê_(ÝË×ñÿ|r/Æ^„zÿcEÌ4 $l™Æ¥ JÄc„_™?c:3â°…4ÝU¨J xÇ@}#Xg¾räö_MØ„ç}1ˆ ¹) Ç»'‡P®UE © _êßÃöNžé�WbVKqE¥9kx@·R½}“+¤åzê$åå&¼JÐî"®0ó´¨l6Δ¸Àý…QþÓŽ �›¶]Úïx¤áM®©Ð!b=˜qõ¨¥½š3 Ë?…ÐŦµd�Yã-0a~ú©â>ÿp}ÞÏi2kVo+TܪZHãÍd:±�¼ƒ3‡ù²«SÓò¡î[B}Uó£¶¼o6ßâÒòda燂?7H~¬xÖ]sÔ)0/é�§Ô>Šã Dû½ÑÙ§¾!r•èŸj[òc£L<…~-M‹w©†»µšmïˆ3T:í=«žåM-[�>UÕ§–@ó Uå+ ƒ»5o+Ô¨�‘F A„Ó¥·)·±Ãì~¸8"üÄSÖûBbj¡`Án�^W TÏ»@ËÊ �&͘)^VYóØv„ð¸/¶ô^ �é_°ämé;¶Þ±fÝÀXˆbI”�PcóÙ6¤-Y9l£ªe4x3xP,‹Lç˜Ì™¦À-¿º*'CH¤¬¿ 5ÃÿF¿ò »–Þ” ƒ1׌1iD?:y’¯�4 ¬†‹Bžº¥©Têb�">_Ê© Køµ¬Ù@yL¯²0 ­7©/"€ ›¥_)¯–Ó•ŶNS}‰=ÒŠÖ!�oûPŠúuŒM–÷Qú Š™ût“•Mêkðo—ÇGã1¿GÍ’žW=@ ¬HD&˜ôüÆRí{sÇjZ¹ÂuG½¨29"Ý-P®>lºYkhqºwô@¯�gé3ó±øwJÁf�ó?ÍÊcUÞSÊq 6~F)¿ˆãOfQ’Æû M”#ÿ`ÎR [¼4#ƒÐ´Ç™ÀÆAYªE‰²LuŸ#o§k16Ê Om_½Bûzضa‰« á3xÕZÇÊŽ×xŽZ¿ýÓ{0zÄpž[Y_Ëš¬ÑÒÜ\næjL½Ž°ø×`yL¼rù˜%[%&òWM>?0 #¨˜#kÙfÃ�Ëø³©Oe 'ÉEL·â@ë¥þû¶�&R„cWz-OMZòÆuC꿵­Aû$?M¥UÞBýë¦¬ë¤ p=sk'-q¨B¶AOÉ©á_á^06On –,ÄJ³²£ð, �­ ÖlÈ—€È-¤«8GŒkURÎóŠnÎ�V¾…Ž%ÍtU'¥Ÿ0`}/Ì¿{ZŸKžÐ3MˆhÙŠ�ƒLÖ°é8D²ˆÒÆ>j?ºµcB�ÐC…3&ÂéS¬5`OáðÖP,èdýÐv†r�ÙâƒqSôlúIûÿ| �E·¤a[ÛIqת “• Á¾ø¼�*Õ^�ãÜ­•³e‹n٢γ¢£ì¤2Äl—–ÎЇ@àív ˆÓúúL‡"ju�ÔzrLÕ¯ (‡|lÕ³³ Ñ�rÇ€ïf³xš)�OÖ{c÷SÅœå)ð­øÄŒ‹ÂW�Ý)¯¬T±üúiWpP‡b×oõPìÄ-™Åè·K&Ò�¦Zwâ´åMãûcOÄwÔz›Ïép Ää³^¹M¡Ò ¢'”Ý­«S ˜Úã»iA%ŒåŒ@Ê [¨–ÞuIÏcwqE3™M`L·W†£ø�ë¦R½ ºÿ ýZqUÛy´o…�Î?Ëž�í5DÄ ³ïòÏ£R`S‡½¬ç‚u—4�7 ,Ù:שàøÞ¶" FLïbY¬Gne:S¤B¬˜¦‘°NÛ§+:ƒ¡ƒÂé?™SÂÉÄYë=*ˆ¬æ¥Ã_ž?ÎTþcÏK¸º[W p*’{WGÌž†,{½úF?Ù½ÃfÞÏuÿ‡~ÂM¯SIÐ�æ«{@q ÙþŽ Û_=cÒâÈÝÕ&×­Vðx–÷¥ÒÅë@´q™X~ H’’�íË­ù½J%T³ŒF¼¹µçT1@l]¤4þÒ¹Žl©š©€%š©ür¦rs)–D¨=ÒÓT“«·Ø,”@–·#ʦM[Í)Ø]e-üº´ŒÌ7x<c‹ðDþÕh `��¼ß%=id†PɪŽ+I�@iï”éÅ{š&q�ÿ7vÇŠ=×Ru–9w$=^XUÖ;¿F¶£*r™½<оŽ8ñ]8Á‚ɯUfêA $ š{˯&yuK6ÉÈ®V“'ïzà}-„¹Ëûx¤Ê�°�~ðG ÷‰Ê¢j$ jÄ(N´,*‚>‘Ãd8jßøªÞÇ–®Ò×èáR>5/Õ ‘UOùŠ·,/ɧ•ëÕZãâ*çÓ›–,î^Ž3ÎtùÂÉl†…¦Ñ Õ©v,|wA… Ÿ�ÊÛqš@‹yZ8­!G4¯öW®Ì×}à|>£ÃÍ<£k’ØS:-=]JQùG£¦ót$D�1Û¯¼Zi/úJéö‹:iºF]ïrlm&ä4?…ÁÁýÿm§@:´ÿ&å 8ã³8H�“8�®#U@>}ÛÂ{‚.¤œq¢°‚¨á½ kY¸\'ï`n�Xµ“(o&á=�wË�Ä„2Ž€13ÉÊuÒéô ±r3=ubÑéjkb£Z0¦ \D‡•œÅz ˜:ÚÑ—Tê´7ЉŒÈñê�ßáMûâ¹W;‚ÉøjsÊŒM Fã7”F¬"o1¬DÊ—ù)Šm^…ò‘-tÝñ •8ƒBSíP;ðao�YãúsÉÉIó×ò XeG=ÒþV‡“Õºzx¯Ÿ¾¥v[‹Y¾³aã¦/9²�M\ö§1?ñ꣋Ž�Ã~‡~‰r ÛcUŒ/}Øv‰¦®sE@T<º)®¤w\}a5A`vûP˜±›.zÿ+Õ/QŽ ­¤Fk¼Ž þ»Ç¸û°É—,tÛd¡»?FCËçãÌNbÕ4`¿��rù v:É¢�B¥|Q4Òô�Àl¿­û&ëws .?‹‰óú©'˜Ï}—9'—‘Xh€VÆs[Ý™QÞZÝä|�ñ®ä°Yué}%cr¬•f…!p—*‚� <|w?rr’Bïq†}¯—ùlÞ%çX+ô4ÊTˆ·-�$Û¬¶ –›ÿ.ýµ·vÝ|Ï`N:g�™õ£P™ w 5©ÏÌ⪈�êÂÚ\šüÃ`~#Ç‹ï0ô±ms…4¦/iž(•;”±Ä)PðsÌ*ä rÿ?É£h�Ÿˆh-³)Q @èH}Þna /1ÂPh² }aEkôéǨ=7KâÖVÔ:K/TEA™]ð†µ‘¨™A°7‡¦wß.™v(rÈò©†[¿‚/¨†,uÎÜ œƒ* ’²èßÞsÉ$möádcØVÖbü¯eòr%f,B9…×'ûÙÞÝ™ïHGÎ0 wÑ¥—�,QÌ¿$¬ÿ_\rdìvfAÒÔBè ra:K#΢;e¿»CÁ:-™Îsƒ‹$‚U4A_ÆPØu¨Ø£•-DUÁWÛdòóük¢*UQ |qy2æ•SÒ@G;°•Z¼ÓŸY�æ½·¥MXRjÞÛrÕYÉ�8k·)ÍƒÑ Cwü’ñšp�Éo0‹z×PCaÝ—ùaZ6T{ëKa#aÇKOÒe6¥˜“µqX?6‹ØU¶Ÿ†$�WJŠ�ùi’˜XÊjÜ‹âw0Åp1¦Â‹V¨+@ Zβðzr'€þvìÖ÷¢ZÒ§›Ïñ¾Mùø¼±6’‚ q`O#.l;a;%ºíýºQ–µ>þ@æ‹ÖïIo,š{S€ruJ¸+%Qac¡áÔúõº'�ݶ©IÂË¿§ôšøuöò[¡o7Gð€%H_UwZ]yœNÞö³fN7*«“Àoa`ÝuÔ–4"û…°Æ‡�èœMY† ø;™ïŽª]6e‘飊õu>‹éy‘ÒoÐÚT¥t=�ö×Öö Ïsòg ×eVaÝaâ´*î� ¾F8iscjÀ÷‡öèÿ3™nj'æJp,bÙÃkÙ–ëIU‘È€LÈïà­'† „.¥“árÝõLÃ7+ÅG "Š?µ"#�r ÆWùäVÖJ9�`y„�ü#8ôŽå¸n°ïŒÉµèxú½45¨9d]°¹‰Y‚Žùx�„C–>לˆbÎÆ_s>ÎÕA|<¦p¾OV>Ú¨¯Ã�`Qm™üNjo¬šñüÝêH‹`µ�eGŠ{�_ŽNóx­G4(¨÷ê1–HϲFˆÍÕŽ¨Fa<ß6P”¢‚=÷ þ,øÛÐ>w¸ô„7ر˜S”L­®’*ß¹&‡¢�í÷%kç-¤�²~óvõ1IƒˆZŽ»ö¯Ïßo6´†—c|.*J8X|ìû¬–9É+N”¯�†ÐÊm¢�lPèÊuh¢h±ÄASK–ŒEW»þâ¹rÅÍ=ÚM°9þ|Xz„ÔoÏN¦3¢�øìñ½cýÓî´Î€ã5§½Xe`"õNô#Olꣿ®f€ªR§È„æWÞû6¸û`É̾¾Íð\Œ!åÐ:Ö†*®¿èÝòø¿¼Å�zÀcfúØÍ‚W7 òʤ£”Ò¾ØÑ>Wè¢"‚NÏ=Æ8·¾`ÂŒLUwÛ‘¨dÛùi^]{ä“ «<ë°P›°<9»Z;ií!ø‰–ÐÉÆ^~tc›ìN©ÈŠÊ–†#f‘RWÙ7„¯�­êj­¹úŸÃìzÕ¤€£»fÃïßßV±«ph C•*sGÂùÓi¦OŒA zÀ‘ÇÜcÊvœk´˜†`˜‰m�š�ÌvuT‹:õ!ãjû²}/€@�í.pj¹œ~Ùñ8¿#üÔêDrNâ¡CTÄBS¨S¯¡Ž£¸,Ð2¯E ,u­,Ú•nF\š^çÎíE„)’\5‰–z¯öõ „'iø‡ö{Q¡ŠJØvµKü *íÃioÞ\ „õ�ûl¼+»aŸ´?»FEäþ™G/Å�’Ú3áÙGÅòW.é1‘l�ï9§�àF”à>Tj9ç5Æ+Y?àÕÓmIHìU¿qéÌ� ú±)?ø3�bQ&¾&å�½0½±tÿ?ËDW9¼mŠüXóÑ“Mýþ^çAJ‰od’ÍY÷®jTŽ¥ùbŒL‘—qw͈ƒ¶>` Ÿ²«g¦\?H�ñÇO”š�d”7k�@ÜÛÒ’3ÕݞÀg2ŒÑa%% _¾“»ï«ýË1¨¦ 7³*Ô\?Ó?Qå°Ð§Ê†ªŠõ{)Ô¶{™DE¯néÂiò7¯ß0l™h¨1V"„ƒ3G½wªËø»ð`ò?³Žg(�´�HØl µÊÄ;ÔÒ§ØI�ùÕ×âdóp¯ûnò¾Õ ²ýöÍcqfdñq"äUÍå°}¢³!wÓ©o¢«Ö{)éø=ßìY)ð=‹vÂJZ¢Å¢Q!Ït�š€ç§‘Ï*\n¯ÊßA›ÉUWrWÍÆïC›ü'¯[wÏ+òQO¾hÕ™üMÓ¬ T=úNMåÍÚFWÌq²­()Äbìü_UH„:e#Q<Çu;Û25�½�+—T}0"Áõ顪5ëµ�?ü.„ké ÇôÐù#�(¦såµq)—!õ3ÑazžñÊys[¼‚uf¿ ÈÏâÄ®x b¨ì†iÿÛ.™a¹œ#ö {~ÿ­;Ó±§¼j™vŒŸEZ‹%�›’æÜqà Š@€ñ˜øKv'Ü™\oã)#þ¼ù«6Å‹9õŠn.2‹×® q\ ɈßvÎçÌÎ5÷ïôм6˜KH‡P”5ý+#«i×%°ø¶4+(lnF?1Q¤ÁÓÃ^)/(;À+ Tfé]ÍÔëV¾´|ô¼õð*_$M‹>ÃPwª«Lï‰2°La�V˜ç�—"«vxKô›Ë�0"MÙHGõ*Ph‰ÌJþ&1Þºÿ_Ï©Mä9¬ƒ‘A`‚€ÉrÚù‰ä:™W@Luœt(ì Ö34!$w¶iˆ`üÁvÛ÷»¥É·ü¿€}Ö‡‰+d²‹§ë�½{›ƒê/Žðw ú{µrC3YlD¾ŸdÒ[³†úÄ/g— nÆÝFPÝLJ{]¤ð™`Î*|tøà$¹êQ¹H%šÆ²Ð‚¥.ÃßÈê¯8‡Hô>:‘­-«d¤ä»ª¦XCq®Ls0­¹ F=¨£8rè, 8Ò<äàÄËàÀIWèlƒ¤ -ô¹}vÿg(êT¬< Ž_õ)%ý©l�¤MËåöÈŠIèU?³œÚI„#ñŽöÄDÔ”R³ÚúšÏÄT˜ì¶™fÓÂF|p¨ŸTnß–¯TEè¶Üí7)Ç%§·ÓçÏ’Ð_%”î"6)…8 ž‹Ed&{¢ ùÍ£ãñ§›sáS(æ¶éÔY6ƒÈl"Ïõtb(§C¿"]èõèÏT¡]Š¿º1êe c@X¨ 䊘w‚'Ûhš 5+×oÅe‘Ûh�Œkzô˜%˜R4©úîÒÖK0®�žåT€&"U .É~Þ6>µæ§„-×♵³yËSrB‡¸Û_w�fØ,,(Zj2æqláˆDU!TÇ<§”ë°˜ØlÂ* E¼�ZÚlo¯…à M˜ ˆ©‹°E¼éǾÊÇÏ–¨Òp°Wâ/S¬©:­šlœµ¼Ã‹EoS‹?ý�eá× ŠÖKLGO”ç±ÂœaôŒ;tz{i˜œ§ÈE¸�¢Ç¼u ¥”®UÔ“d øû»®.÷æúLW7ò$-è3µ¥h/¤¿æÁÏ#¿«WI.Iòk\£‚Ÿ”¸E=|ù–™‚HHí•—=¤uù$©Ì­ôÕ;ÓSi~~¹õkŽFH£¥8/\Á/ÁM-Ž…ÈL¡Ð¥':’¼¡ÍÅ®éSëcAœÇ鎂ܼ?Kì3‚4ì+«Sû«¸V[±yTƒ&è¸ba»h êy*Ë-Å—M>þrð±ØómË-¼âQLµÇjBaîÙ8m놬|ÔP5ô|µ8¯Ëó¿t(©Hïø„Ûù°'¿@äÑiw_s\‹Ÿ+—ƒÖ¥ï˜+q¾.ÄØ:£�Ä*³çØØ"Ýâ(R+ƒeÁ?)(*©Á—Å9ÊçÇþ�ª?ìn ±:Û>#Tr¡øîÅGgYŠ¥XSA»ª�‚Í´ƒ= ÈîvÇÒèÕÉhîvÃéú¸ö‰èòꎷõs€:8ê"¦¦ŽÔÞÉPø©ß#z+««|Ä�ƒ µý‰õKmµ¼†—¿fSl/°×"ÓC)+ŸZòØ�LÍîxðs×ñkë,½ næ4˜Ðèø¿¹¯&<ˆòú0½¦Ê™!ZŽÂÑÿukœÀ+ÿ ¤æ’¹ç²ƒ^;i£IÕWIù¥+Sûæ3oq·D"ƒÝk…ØâȵìÝFY.¹vàFAæù¬†ÓËAS“Ýê~€é5Ùh ߯%þŸ¼+ŠÖÿtŠWç�N»Ø®Ì¨zbð(/ð°�ûªª‘Üß._eí�í­Î—Äø¯V½šÈž;éw´O��tpô"+cKÞãòßš‰¥ð8m™”$¡·íþ[­åŒ&=í*¹±Œ€Žp)JÌù?ËÆ£æÀYHb•‚¤aïE¼–~ˆ°§n)²röÿqúÄÝh…¢Ëºû�Œ¸[nÕ¾TnëÎ�e çÿhßcÖ»ÒïªPÿ=z»\ȧØàœëd¥¡wÅS ²˜�hˆPº=¼l¢wÎ(y—º_Üþ—>~Ë^Š¾ÖžëÞO’ Ëìý’·– -hƒF²†RÀ7¡Še°vèSž!0‰/hs­w! ÖÀÙ§Ò�´òÌÈ/ç– ØÇ,ülÊ¥Œ° él2Ú"^‹HxœÐÔ;s9õIpE77¹ß²‡VÀE¿8–cƒ”Xöª]�ã�–ÓÎñ¨ ÕlA¦8µý ØŠ¦¡;ƒÁê°ëÛ`»Ö Å mÉôÎvÚ£�ê-ä.|CW; 茼ÓÑ;D³JRE”+#E_êê ¢Á5Ì.4è\ ªPé©àʶ#Ï–^=Zf²œãm‰¶'"ƒkåŶÒn½dPv’þ¶ˆ,q×`ãÛƒ¦þ¶ù7ŒAƒ–j­®ßxÄL·OJ¶�'�±ÍÞÊØw¢ôVãBþzܘى¬¢7»ø1Bü˜¸IëåìRé»nYÀëšÃ´çGæ†#ØÂ~7c†�äEy³íÒܘòá70¨ãéwõ×ÏAžƒ‡v¡ìX‘î¯èDô,t2Š¢±òé‹êœ!½ “huòZÑyjL pY\AD!© |­Çò¤b�>™�öÞ3 û(A塉**X>PЪ…z:ç~rú–ù~k£-C#÷|3Œ…`˜°ËVXÌͪ`Ê}ÈÞ£O÷uÏ�¾ö�™�K»*ø³°â)ebô�ß~—fm¿w' À(îÈÚŽä†ÿc—�ôí ÷~�ÂU¦˜IŠìúÛZ�~ñc1a�E4w‡_p+L´]?°ÓÚ£îA3vñdLµ’d^…ÚÂ"…�h©½ÀÉ %œÀáB ›ïã¸ûIg� 衆HçoòÄ<euŽpÜh3RøUÔ¤¼Ú�ËavZÀÏ}!7Œ¿ `K —·+“ð]Þžï†ùV?©§¬Q4ªlš%�Ç{¦uÝ•†wÑ ãéÞ!ê'@ÌëâÖ´3ÝúšÞóÜl(ÖäýÛ6ˆ%. ,…Úï6¢aÄ _  ¨¼™LßÔÆ ñ–¸+íd ZüJõ«µ|ÿ@�¨(«mÛwÑ ¤ ¸{1ÜÏŒ>á`ï�^Dyü÷t÷ùèWQ›3{„bë‚ñ�—\ÕÜŽ[_íL†Z×=¤‚�²ø�úš‘jñârŽ¡ó÷—O$�ú±ú ’© �½×§b®§6j$Z|âb^¾Éõ=ïÿu âu¿ YC\Ø' -ØTáØ³ GqÕFú“ÝÁ¦Öˆ›Ä A”J²k (ö‹¨jÚÿ ÉSýö?8ûËVP{ÕvY±”·­|“˜ÎßµœÞ&±ÓÇ©Ï�&Òh˜ÙÇó«ºv[†1ù+�ìP­ØÁ2“zΞ*4ƒ¦Ú›ŠŸ8j¶ôƒèÁ§Ç0àù�Ï/Y\Ì"õŒý'_ÐqŒ@"â:Éè¢ü#¶Z/‹6T‚îœ6:_aÑUê§uP´hÿLRè»Vns$üë–ÕQS‡¹Zy³5¸¯›¼Ü<âXq‘�hØ÷âá›0BÚÅŽÿ &¦lpùüǬ -ðàXzo, ½‚² *$ދħÆèùƒðøzŒ7w3Ùá\?�†OXFé€Ý—¥Ñû‰Ë¥!'°C¥bíùs™l„™×š#¼Ã&ˆÝTx´x¹¶Õ#Ûñ'¶» -µÉÂZé¡V\«h[�ý�‡»Ô·úîA›|í¿lè…àq¾Øn´Z¼­#Ã4œ%0Z.RAíö‘'aÄ…u", "Êží®ÞÚ¾ó¤EtË`ãßÀ`ZBùeÞäcüËY;ûáô‚p!^A†Aœ8 rOmÄ\m[íËà 8>« ¬á�àð‹a({7G¬Ÿ+ÆÏÑÃo«Ï+Å,ùûð·ŸþÅÂßeÕvsÍ2;ÛýZ[ÏÉÐÖæczZàðÙK J‘ L#7clmÃÁ¿-�~õp[â )1P÷ YÏzÑ- D_«eD éàòªÀcsc:Ä„ œQÓLyÄJû!b’}ð˜xYò°jb÷ɤ.û&•ûˆÒj �É µÕíçe§p“lª;…Ø‹‹LpV�~ô¾¨˜ñU„"Èu0“uù‹aëÂOöõË¥ïX+SKæeàbÎhú‰èÜEt÷øùš¿,ò`úaŒ'ò,ìUƒX–†šsªX_]GL€˜÷†Ç4 4ÊQµž„ò�ÒÈ#¿äÛÄMÔC J×�…º-Än°Áí Xá›~²­¥m“;NØoP™…ht3Í·PµPny©³‰éýõÊã{v*¯g•hÛÅ_&Êg2>ËKòÎßl FÉ£ôÃÀnŸ¹=�½M˜2¥LígÔgÛ Š½ß} þ²'Q…W²ú“L';+N‚EsžiÃ,ê©ÊQ¿\�� Þº§UVa”_$ôb `1×vR-—ŒÓ¾ý(æ€éH—b�æŒü3_z÷ç/ÍEàèÎ9—ýã#\&„ïµ�û‡ÝM“ÖE¿«sšóÉøâä�.¹JÕ×õrÑ3òÜùÛo±¸š›Àô4‘.rpþª+oÁÿy`Wi¬8VGžaüÚ'+\ûG¯û0wÖÒàÀ*awªÉê×Ý*ÇdªX ·jOƒÒ&öÔB«8OIX€2Ò6 ëøÙUŠŠ§Ç!›NÍ…0¼–%C.§RÆË,g á<:{¿Ã Ûq"›ÀÇ–eôæ.}pÛNŠ9Ë*3§Ô»ÒŒ¯E]Ø»´2ÇåÀV•½M&Éߣ ÞK@§Â>ûëjFŒq„ûÜqª~hl!ëK£DMQÿu"œ~îŒÄSÜB¯.F °àHŽå@c¢IDÊ� FúÑ9ðf�oà á)R~ýŠTÌÑÜ?;ÓÊow7®5Ç·2îo|$ÒÁä–s|$›ç?HÏ-é˜|‹Ë³Q( Þ-´MÑV#?ã?>ü`Ÿ¬iØ�|WóÇ��–*ŸWêVùN»WW;dEÞ>©Â$}²G 1;Æg’çNOAU5L¤î[÷eé#©`÷jÿ.{Õ�»‹ ‹¼ÔpÑïÇÕdz‰ “q‚ºH3‚pN7¥¢|K®ÿ8V1[/‘à;ÐŽ$�‘ª²T«¤Ëö¤ù?³~º%BK…¼=íŒåŽÑW4ÛI®sxêõsÙ½±Â%üìAuá@”Žçmø¢7ÿI´½`v t�~�ÆÐGg£ÛŒ]˜$ûÛÜD=ÿv¥Xkóëû•£*Ç ýÏ[Ð�®[LõÁÛç!mÖT0Ô.Þ�U'ËPå€r˜Àä&ÎöNüùk…BeÓ†ã£Ö?öŠNG-ÎUYá®C™™ô�=s«À*¤%oÂ,€âºq­dÿ,¦µJ„ðˆ6}ÌìD(<9°#WB_Ó¿ô¨\±Ð%9À�Œ´cJý'"Ÿ ¾<3WŒnu5‹‚ …Ùª1{ úòÛ•lIõ§v¶ÃÌMäÛÙpÀ#§)¤•ÀÙg¶÷À³úÁ‡™ãˆ Ø‘TŽX>ü<<÷ožºK;‹}ÈÏ÷•»YØÔuµqH�ÿvjçUïëdà£Ný’jÎ9J#=·•”ÿLâ哌Q—ŸçH4³íMuÌõÐàGÈ•·á¸âý¯Žé�äM% §âv?ì¡JÕ ?§GòOS[:¾©¸†|Àù'š¤Í@ ¹cáÅJ�®�–Ìa=üågÓ(mœï�j�0uÙ©0Ñ™¿“!ŠÚÖêr‡µYïP0£ì`{‡g¿,Çèð½{‡»Rd¤0�xš¬Ò�+¬"—�ÈúkL¢R­:7òæócF‰É’�mïÝBMÔæéÎe 4:˜­ßkç˜ìÓ¯3Æ"½X¶VwÑ� šþF Ø y��è\V©o+�9þ»=L“öxøÙä–¤O±Jv™ýƒŠCcØÉ2äÃoHñ(Ž7œˆË‚w”•àÆL‚Oˆôf]YóJ2¶4W²¿Of¸¨§�ܺò銻}ç…}"þøówØUj2¼sá¥ðÖ7Tš Ëg[{hfÜ£DÊÀ³–‘tBÿz«eTáÜ×}xÝ4Õƒ»ÊX…"ÃŒ®ÖËWé­SÄ·ÇÜWÉ¡"¡u¾è€Ó0úÂ7Šï8Ù-?h« l2©W]ƒÅ| "vc9�òŽÍÚ9wóP· R¹Â7¦HsbµO€V›¤i³©ñý¿Fmõtó'ÏèSöý2ÿmé±_«©ÏöújßU_Uùû}G¹þDdúºl‘ó÷ºû~—©úº“SõtÓ¿o¦¥õS¥õ]·Ô{�ðú ¯·¦É? [íú¦oÛÕ"Ÿ«ªÞû}=¯¶˜'Õ|ÿ©øBÚJY|3£OBl7™ G#¯ ØhB‚¢R?O”¬v‘_×s�h…rŒ X0lÞ<‡§£µ+3uF™fÜH�€Y|ý‰¨op8Ô‹Š¬Š…ì'.h† ~ÝáçWþ„ýà ©F´ÞûÖÞ‹ÄÂpjÍé|{ Ýò›#8TP‘’߈õf`j6çNYz$”x6Dµ’Jáh”„Øòè1äç¢ù¢>),�îÒyµu-;òZš1 G5>àZ¹Cýž;_&£ìŒÕÉ쇭4dIbVé6$BáuÐtâS¶Åo Ã2u£U1$»µu�¹Þ|ƒÝF\ˆ0 dÙ±Ñr^¿‘ æ>Et%g] ˜ýÀØR£H­ ‘h@Ì÷¦Ø†pZ· u7?QOí}³¥3v¨;x 4Vtêêo¹š“˜®¼¸ äsX÷h@.G|–ÝZ¼‹¹’Ow ëÀ¡ëOÇRùG»0±QV5ÉIfo°3©Ê„d¼- “õ×Ä:Xâ~¯î;ã*’R¯�ׂÙƒ6AbV}G4ýOÒ‚¸èò’[{×þó‚]÷ù¨Š'­›–jƒCbòùTm]\ñÃ#)sáR5Ø_Ð)Ýâ‚éû}£Ž[nG¯ñ`»+¥ äÔxBáô]àôa2†Ô&Е3'ä:n2!ænîKRð’{êy³µ¡ÉÔw� ·˜³_5Æ$]txÒ^�ä㸘¦.o!άQ6Ë@$4Ýoù�'FÊîŽÜ\ˆ3LŸZÆÄgãñÉj\¯¸ª.‹Btûj˜{,0W#ˆ9D¢Çÿv^BSd4—(äÂ}¦í÷UmÄ·—DQÓdw['PMrýP¹m!ßÐ(~F ZwÁÈ> FÃÀ±|-n‹ú͸Ô,¶v1ô­ÛG¢hkQ"�å †g„Ø£a9YÕ0*«rY@Æï ‹O k¨ÅÄ)Uó+hþä¡ÿ(âPÛŽ^¤Ü|ì ¬švªäAþo½c"ŠxÁåø÷¢½Mîe‡ /ÍcëtWê/Íÿ=$rT(JÉ}b¡NÎZö„ѰÒ6 (I]2Æhëä1ÑdùÞq0OÕi›Qá¢þùœ•‹à‡NÞ’¡.lb¬K+SkPdGã�J]*=ýËêÔ?0¸ªÜu‰ðÿ�!Ö)�©4=¦—ij�·Ø¤æOŠ„ƒq­E×¶¤¾hÂWÍ@4÷ò9,EÜ?ãa Û³YtçEh¬¿byaãjÏÄØ3h—ž²àCZ¸±wR4Fç=ý–VŸ’¥ õ´šÕ³¬Noº �`´\N~÷„«fàðù¤„d:X¶ÄmnÙu>+Ël»À‰V�ø<}—‹W¤†p³ 9zÞÖ)|Úe‚{)Ô2FjÌÐ�_'�'ˆ/�dž¬œŒfä(¢V3"½ÙP�»àµb!®æ7¼à £ ¤Eщ5�³v͆÷nxü M÷µÖm)1O¸‰LžÇ;oÛw\³Vœ³$++ÆÉ|Nâå²[›¼6_Ó]öÎÖ-[£A%ÅÇdvFôâ¼Ì’»cNP"¹äEó2ÌDBMXCþ"篴Áscä’2Ðö®ÍpnQöQeVeîŠPû� ƒ›5ž¥i[©3lÂfè_ÌVû©ÞM‚¼ ÿa‹ÓUL?8üw‘å=HŽgî³O\P�(?_Ó~,ÆHS]ÙªLÚU�û‘ê7:ûH s©¹�55#[+ØòÂrêéÜŽ+âMŒý¼à" \e´ð¬q}Ú÷oY“$?˜xîEhéF3wȳ¤fc“òÝØÎöC=ù>]�¬º²È?à�TޤWûó™ èM†ã“@¦èÐ2䘳yï'Oµš¸vÔçàfCµ�³ú¡ZWΧ]æä�kO;!õ¦'öêî0÷Ý?ou±ÍÄè8H¬ýpjðCï/RÇ1T|)¶¦í‹¼âÇwì9®™’bÖÏFE÷{²|¯TbÍ·ü‡ eý:ðÆÒ’f5œ,ef¡aèæFO,jåéêÜó’·é¶Nž¹e È¬¾ð`ƒ¨ý „< ùìŸW;Ëcï˜ø…²µˆÐ"P-[Mw�¢ÍUY¬9òÜ�x?ˆ÷IŒ¾ÅìĤy¬,êÙYí"uÙ[ÿVbóÂ„Š‡ó¹œZ¢ŠØ0·ŸtFe*|ýQ¨BÿL®§k²†È·ÎaØ" Ѐ۞¸¼´úUl‚œã¼² ËØMªô^/g1Ëä¬1 Ñä¡40Šimë–)Û09KºS$¥heL�†v}¤Ö§�ƒ8¹é.ÿÿ-¿5iƒ¹Üæ’MÄ�Uº}”q÷P8è§w•ô›ˆMG~  è€ì°[^ä=¾w.×ߊÐxÓm²zš…”u#èF°‡Øé A'RnЋX—�Cä“€‹f-) ¾”�¿8„•ƒ©ƒ$ñB]‘¥q3,Ïðúç§ñJdŽ» Ôzî/@íEí“X—êàž©ã;µpÝÇ@†ù;ŒÄ�4�Wô­•dÄ:g̺r†HßàÚDµ r¦ þÏ&cm:ª¦X2j·þÅ|üÅç,X úi(ƒ^“¾¹’®ÿGJìye„™¦‹~iÏÂÊ$ª£=Èå£tÜ$Šûv0µ‹’Äh[�óïÒ´„íî!¬Ð>Ç‹ÜÆG)9A̪ߟÓô‘Ò®§¨Î’MÙM¤Ÿ…DÑí*Z¼"PMc¾"„ Û}o*½b‰á  Åß>Œ\íy%cÿÙ�)°\ý4J”’K%iŽt<¶ú‰8§ø‘�L*.È š3O›i­WòVi&×A¸^÷�ôJú)¥ïÑ\ŠrM@MÜDŒH‘ëGt«�aõ!õ†æíär–‘a’µ‘îð@ºq«F)}^3JŒ#�Ókó€2Uà ÄA ‰n"{¦HŽQ}C5ˆÆ.åbÙ©•bí(ZÎw�Ƕ.Z¡*Ö‚>DÁmBû¶UçKä_é�ßþ‹C˜¾�`ÌïV¾[–= “ë¡2ð~2$˜gÔÖ9d¼þ:Œº¦¯ÿ_ÞÀA=9¿Ý£™Vê©�L„ã8&h¯Iº·SJIT¹2”¯ûˆC(ø])d”×Pp(°Ö¾'¾vk~³WfáŠ"‡“Åûi¼±K¤�ØyóÔL5ú`y ˜‡›ê–Žj'{tÔ"*dw7w\šJiwP+LÛˆe)n¬vf,½I‘K…�Ѱ¨¸OÆTGö ˜g˜A“õš²v¦̸í¥Îc¶£7äÀÅcAædÉØ‚¹lŽûÏ�© Ý^Ø«J‹»‚aÛ¦z™R4‚ÿ9ÖdžiWÄ¥Ÿí´´P“U‘ðÖ…¥Úµƒ& ½ZU¼:#Ów£l¨,—³[ÞGÉh×_;ÖžÁ€t4–9ˆEØ-'ÉÄe^x… .EÌ𩹱¸Ãî„t%’š@^Ð{*`ë2⢤ýÛ´À£ÁðÏ; OÃ͇Ñ?ûüÂ5÷ÂdÌÕ†#?œìòE³ÆÚí*§”Í ­EÊ�ªcX6Ö¥ÔeÄL•¿tüÉlYÉ{Óï&Zù�fí¥yˆ‹ýGÉp- #'1wå²�têÀ)ãÅÄgÃ+¶*-*âï ¤žr6Jœ¬32?ãž”Nñì€YÎÆ|&â³›I³s>š©ßb]wFÄÁ$Ê£ƒšŸEð9ÚTº"Û,`Òù… ×äi·Æó¹g(Q>¬Þ¨÷×W(¤ò*ÓöþìÖ­·,7Y�U�ÜHÑM…dš¦;�GOmÜðùf5Úì¥l}L[sÆD" îåÙ+1†„Ë8Ó‹Œ­åkZ©ÝÈLuH•RS„¸wAÎöýQ�GBO[Æ µ3åfÔyŒ¢ãûȉ…¿ú� *æõ¹%”Þ v¢`ÞéŠBŽá“‚v:‰­õËw—)˜Û`y�ÿc‹—ÐŽXHÅ.šOXrk‡-GRß#Lßd…‡¤14uÇò˜¾Çs„{¥þ*âÓ™šÛËá‰õÉÏo™¨ëP àWÜùiîº.Tïµ~ýôÕyÐZ‚+,臆Ø7z+~øÛciùI ï쌘V'Y¤t€›ìý DÄšH§ÂWt. +ª¸Û®ó‰1 CØ©[àªSP.‹‡¾Ž÷{_n±ì0‘¨ÌðÚ<6ï‘UPÅ üù»Ü";X]êø ¶iDìY5Î^ûB&O±óÝ›1?7Ù@á©ýLJdÎ-;üÁ;D<54–$˜—N�J.ÇÀŒ×_ÝQ âõ2P#Blsô|¦_Ì6u cÑßÛ]ÔsCwt W¿+¿2V0S¥ï7Þê!Ð| GsÓpÀØJ.ô¨FV¹–—¦Qp'äÜÖPOñ,&õb ?£Åt@´fÜc?@±°H]w)ÛÞÂ1x˜tRƒ˜õü£ð4@g2Qi¡§ŽçSRS ôcß3é!æ¸l�²‹)6tPܤš‡tZìš2ÑüøbN�¹\�ZqMl¨HPûçV‹ó¡3·Vd?{8%z­aúJÝÜ8}†y&¹qLO —ôT†ÇäÎ�äù©(•VivÅ]r¢šæG�k£•ª,3d®|â •H�¢X‡â€\¿Mé5ól#_Ô”[½áªÇ°ÜÇóm¶ ¼‹@ Ï2ý×ÌÎ�“\€Õ,ôщß�žcÙ-L4lJª"SÐm½ìµ­Jæ'5¿Ár2´ðá÷gô>  Å�nϹ ëKdÓnÔ#>È»•´úhÝ¥2׈CôY­VÍ›yh?¿üöçY<ýø1,æ<‚8<ŠÊ7ˆ…UZø2=ß¿›ŸÀJìëa*¬-hý!°úZ/ñꃥ©¥v!9þI래OIª¹9o°[å'.]¾såãD+H2–|.'ÛüÞw±\W�I:²�ÿ#å·Ž+o_‹8HÛÆäÐãu†ÁV?ÚÙ¢ ÏÓ?^AÝ“­cYïBëGš_d¸pê Mc–.¬¼øid5tæ ˜ùÕòšP²ZW‰R±¢Rcr‘+Oé­aN`½bc_+©ò«5[w“~$1'sß" ÇÅþ'«Œõ¤ûäWÚ¥d{óvÿwÏu½½/GÄ­,u7nZÞ�¢ª5öOò «ýÊ«,k©Ì–|¢Œf™Ìðubï“1Q%$n7ÝX»Z†Õü?Hää�}ú\IT¯|üܛܙÍôªf”‡ÄÑžxö:™¢w®*Ìub•ªúœ+�šë0ý1Á—Ï¡u*å\‡x3g見 /Ž{£´ª5s~™~P³rLª’`ÁüÈtÇ•-ùàs‰ÓÿK¶M¼^�eGõdò‹î$A§�„5LŽ«/6­é¼²lͳ\åB0]žÑ5'ÓD9RÐQD�Î Lmöu?žò6IŠYV—éAÐä-J‰N¥{åÿzgßñT”qÚÎÄs·oTNí¢ž‡fˆ èª?r)ÆÕ",Þ¬Í [\ØK±Ž  ƒgcšÊ[Úë‡ÔP¶ã±r|` 5.‚Y“¾OÉæÓ¸7ôž™s ºæP?}Gñ8h[õ]Ý�º ÈÞ·²ƒ²�+îiÊA°ÔÅÑ"6Õ2¶…®<Ü?â/(핚�×¢‘L2–û¡•αË�%áã÷¥Ò¿˜„ÚX•nÌ�ÞÁŸ¡U×ÿË9sïÎð«]’ά xkŒ¸[©‰ßœ•ÇÌÜÛnF.Xi=O‚rÌRl‘âT¶jŠG_½róˆrŵ©‰�–gP#5 îG�Pe³ ë0Ï–]aêræ® #ÁË5Õ³‡sâ¡*£ðš±ß6úTÔ œËm’,Ý~œË\’HÖוqóÔµî Ï~tËÑÄbBºbå½ Ï°(¥Nßg¡ ÖeõïyS¿¾c€*·aåÅG'ŠL ¨§“³VèC||/ÛÇ9¬<ÁR„ãØw1”òM+Î ±k‹c�v`˜^rÝ1:ø^BþŸîGi07'÷-f�ds\qSDIÐW¯Ú­¿õ‚ÒÙ­Ta��0ZÛ®A³ýLàgx9tÕ½ƒ²4.�ÇAÍßÛÛ&;Ö_¾5?]¯ »£Ä#t’ñÖÑ_†Œxžã{ Ë¥Ú?߉HS‰ÿ ‚Íʬ¨toˬYm0Y¨v Ë„­ÖízJú¦JXr8Ëq‚™� ôxe�X1$èhþîÛ±63®4c—Guõ&2“tÄ$µ£cÖ¤Çcâó{Mr»Æ<§·f Qëe½·¼,ˆ•ò¬±Éˆóo´5×$fALù…ç\ÌRaÔÑYXŒ,Ÿ{þÞÖU5ú™\o8á”ÿ-èZà*K>ß*„(ÔOe×§©Ã«$Ì(^C]2ò[L ¼¡¯ãjÛ¤FÏDØõŒÛ•d¬¬ÅWDïý!ÒÊŸÚãS¯ÀAËÞ’§7”¡@”�­aÏ 4Ñ�W/Õ`ÌæXáR hÀw›·z…eÿd‘xâŒá4ÍuúÔ¯ ›ZøZá]ÇÚYšâ.h±ëóOcLOJ±U XÐÒÂתM¥~–æšÓÌwTeЇ™‡˜ èñ´íMˆÛïóŸh ýÄØÜy‰uë&�!Ûćd&£l˜Í3£k_Py-j“|´‡ I‡<‡�Ñ…sòQ6îXA¦ûDØú @åîÉùbü³æ##v;*Ý9ÖÓý P8}LÕá�LFbgÛØ^†ísŠBù6"äÌB{hÝØ­ñ‰ºÄ�>sž0xHÁÈtgÖO,MÙªòÇûm»êv«*Kº[w5˜S^°5ɸÄçõXNª>u v+xÐG“Tà ”Àl.kJ'2‚C£Ž‘>y&šçȦí *:�ÇPâÖ¿î؉ LIÒ|v V_ ú“Ù¨ÐVoNƒûõrŒ‚ûèjBOmí½ðx–üLÌ™œEV0ÐÚK�Bü�î•„ÿY¶­ÊÙÀ#q!õ´^ DÒkz57æÆ†¦%0Vfx%è]qý0u|rG½´® §ç‘ší}„¥63õqK‰Í ÏÃ%Ê:bss§Ê=ˆº5Í{ŠY¾'™Àú{ ±ÃŒ«ç‰ �$Az°ø­¾Gžtç�¹õ.ȇ¾�V— „µ°ôİ2™Í¹ƒx"œøO�cñ]¸ª‡c#“ÄÚûûÅÕÁÈ¡‹Él]â"–õ æÐãN–œÑšàð�’¢´Ê"=£ˆ?ìÆ'¸ôÉ{/¨ÝÛ/ÜøÔ)™c“ÉÔóîúØØœE==>’ Ëõ?’öWãƒ9I[¢gÃÎñ”êm0ËvòÍ»ŒföAÒKkdÒ.ë@$çìæüÜ1´ÛK�Gpô�X Ôˆ @7)Ðê/݉¢g-öQ†iò§ï;÷’ŸeQ·‘C1­r»¸•vå”3·üª/¿Ë䟹Ø&j¨š@D^¿‚ £ÀY¨ðV‘º M¹#p²ÖûZÄ^ƒ^+J ÎióËPؤyí;}2õ´½¢ùø’0£A<æ�ÝøŸ®¬oÛ‰?±_Ž…4m"™ã0#˜*‚õ2FÀPÈí~ò¾mõû;f4ñ§áÁSÎÓT ì{@?vƒðÒU‹:ÄÆ’ŠâÎ}ºâ GáÕ+皯šˆêB#ç!Ã]I§1Ef½äP€­s³\ÓNÙs‘ÄGS9ºåœ-6È~tY >8Ýl ùY×¶M/Z© 3¶ô§[g ‹Yˆ%u›³°ûð­›ó¼u®)tï2ye_ÙïAò">ë2�à’!‹oÒE~ø±G©ííZÍ”‡Ž¡çÅÇÞoÑ<‹¡ADÂ[FtE0zÀž•Ú\q–r ¤ÜÝ«nàxÊÂaâO‚€h¥å&u½`�¤È½ì  ³¼1raˆÃ°=4¬H¬rfOÙÙ®|öøœáeo]ž¿M«‘U�ß¿[2YjÓbK3¬tÍ8;*¢¶²jy¹;»á>:WídmMÿK÷ÓŸfM‡L f‡X”â N½¬ùÚ¼=RP1¯�ùJEs‹ÕÑpÿx(nvßMg:·ŽZeSâŽÿsÿiK;Èaç�W –3?õÍ2Ôƒg8�P¡¢ °]gv²46˜�ê/xr’û¶¡“sò ÷»Â„ÊI‹»}5ü,V%~µ"=sj •Ëêâ«MJ|ƒ�÷=ôi£ ¿³盟•ò—?ª•VpªÍúwÚô‚œE§S†€Qà’sIú0|C�›n‡r’Å;F†bµ¤¸,¦S—¦îÀ£Ž•mÏ­‡ÙÕ±V¿] ¥Ôþ²–Bö«)¡Kíªó¹Ô¯ßïêI´/0J´,s•O$!ÞL*œ6ÇÄ¥2 t¡ÓlÛ¿ š{s©›l =z®Mùn8ÊÖ¾M*jó˜MV gÊ�€á0óLbD0[9™æ~=Åv®ÿ@ÀjV®%à¯Âhçʾæ=£óŠH~f~±ùSA˜¦QJ|\îê²�Ní vÆi&²é\Љâó?GKo\` �°qÔG]8ÿ¾À«…§%�-ØeqñçJ„gözB‹á´é¡ü¦><¹šàGÊø?¹d@ û´ÁE¿-wodêõýmÒõ-O;Ã'��çá4ñ§™Xš”1=ð€ÑeVòSµú×[Vü’“/ìâÕ·NÀ Ó1<éä´ ØNø}y(Ós:‚…mÄÃW-wæa²p$é–_}`ºíYïø^ïô/¶ÇEÌ�SR~ˆÄ0¸ÓwçF˜ÑL&cïv££Jo/º<ÙÊ=Í}+ó.ÓV7ïàŸ ê`ùÛsÉ‘ Ç*ì}s éžeùâ�û0Šƒf¸Œ•3'ÛG}n ­) ûšÌ%ì2×s1›-�ôø`ëÉ>ê°Œf*³þ ¸Äþšc+Š8–×WŸ;h/Ÿ®P�(èÞ†ww&XNùÉíZívü dû^³âq2 Ù™®‚‰œ±E¬×\åß…!1bŠGk5K†™EY@¥ñF·ŸÅ‘úq40ód\5­0¢ž y>ü¯}©ëã÷ç1ýXWÂ̸Š¿ï%û ˜É@j3’›ÊG^ý±X‚ù–‹w` ’Q{ÚàA¤JY$‰z{º±˹D[;»$ÐpólÎ$vϤ(€�ëy蘺á<رq4mõÃÜŽ% E 鉪ÂPc "ÿ )�ì„4V™±xšÈl¢�[®Ï«8e[ì Áj�'ó¿x ¶+}Ñh6rs˜�#X¬Y’=4˜ß�åÙ ªU;‡øÎîþò"bæ¹ßÅ� Ç»Ît—a0¶Jªš§JÓT}:í�7‹ô~ Üxn�¦ÈÈ ·˜I^Ñû2,ÇÚ�ãt:EÐDM£QaëÉÕš * £ Úl]°/ ‚=Bé–ÄxÞÌzÎ-ÝwnvIç¦aþÛQ1ÐÂ?¯r‹‘Ž‹dXªËG†ˆpý ¹;›gÞ43,Ï6Ó¨÷Ÿü. xîk€l€÷Å»-ºä7i裭UÊØßÃ6Z)OŸa.(›í‡‹Q¡E$Ü#—¨ƒX'7ïFMÈ·ÔDß1ÌäDýI ßý]5ÅûÈQâ„�p|Rº¸"}H¤ÜvkÌνJUЂ¯ÑK/Ê…,W„)xw52ˆ ÂP€nÇÊ1ÚˆÊüSyhN¸yߣ;_YiZ~B÷v°ìtçò™6ÑOù¿*ÁVÕš"™,v§ÿi·ÁžŽT>äôQÀ Ñ„­8jû1‰Ð}àJv©Ù'r?Õ•Ê!ReC9€œtŠÀ.¬tû'Í�ppK-{4¡!að]�¶.–ê-ÔÕ$û8û© îÜD³–±lŠæ/éþm˜ÚÊÉÈ&°Ùaü¸8ßwÙ+–`1+h�AÈÛIQÑ´}ƒ|Ìzw:d»7Þü0ÃC1œïl2ó†×ðìÑuñAü8ýQ[ƒ.@ëÖJo”F 3¢½ÜàHÔrY&�w€…fõêÑì<Ú;ª@Nb©Àbí ( …4 øœìh P¦²g³ÇF\5-‘6ÇþËò¹*F_Ty‰uª=¯´ïv«j ;H¸ ú`Yá>ɦŸÍë×+áa{LiÍ�ÎÓ �/a3= Ã#Äþ`e&Ö"|ÓzŒB‘°)¶D�24˜7ûYnk Îþrþ´UUraï†El9Fˆ�Xgá”\ÃØ{¢ÝãCÓÔ¶Þç;JCÎÉDqå'Ç+È(…,�ðÌ/æ–‡RF»nâ{k©î­•0Œ|î5 ™œAgwbŸskw—J@…x~ãbá[-&5Õëël`åº-ãÝ‹Í1ñŠÞÈsËØ°Á²”ëGÒù‰Qßã:¼ÔÚ0ÚÊÃ;ÖØ€ú²R"øœ–²yGœ6Šš“©¯_ó GrðÁc”¾}–c?¹‡ÀiÆ šqmFtÄ—áBP™Æ W:z”UäH:ÇSþRa‚Ýüt á2,‚Õ°‹Åï°ÚŒG,ëä_cI6‘}¦Õ]ƒGëFD.KB!ÅL,tÅ|“¨ÜåB“pbŽj”ïôŠ›eËúÙÖ”MnV»‚î`·ö0!-­~æ¤oSƽE#C’×µ’a³ôú’ñ´pˆ?‘~Â/îÕ ]’ˆ�ÏÀZüÓS•_å=€}HµßÀÚ­Ñ#¹ª³Äýò»– ‡Ì|&àVcñq®0*ɰý ‰±‘Û9(KÜx¶�‡®]ãä®ÕyóÜÃ0�Arî¾Õ{Ui4Ì1(.á¸EjŸ¼ã˜RªóAÔc8™N¯>ÚðIØäŸ¿¡ˆjeòaÆøNògVP&n¾ë…äTUÏgôxœo5Ÿv¥#µZEE³,úð„lÒÂÞdZƒ\O†Þ E>¾LæEŸÙHNsÃeÖ©Hš^äj5×ú§é÷w�§þ¶è!ÕDO»b³lýwðá•–@ ~ðP^æ>±wêîÕ!!´‘R{"%L/ú\ðµw�ªµÊþ>äÅuƒÁP Ÿ3drsîÜ@ÖéÙ1æÚ�$‡›©‚?QZ£Dа’´µ †(×J¡w¨Îâ�ˆ�)¤µ¡(¢ÜºxVMÿCÝŒO8ì ¡©)´„ îà�:[pÃ-„ÃÒìòÎgñhüÛ)ló7OÅ·r9â¢BK e¦¥™9¹¹N^7Õæ2ǩ۬˜#Ò5kêå^^ôóEqs„Ð"èq”,÷*á5 .Jw@ÑÈ÷M|@§”u·œ•4Oêw­¦JÆO3'ŠwçŸR¶s¥«&ôS�†Âµ@'q-è£ü!Ó-ÆðØìI¥ióÉo.…RGéå¤ÛݪeA¡:J²´_ ¢šÂÔ�)¼šÄ‘¸Z]£´¨‹Ôã•¥$ó±¹dŸ@àµ_ ÚePXÿø Ìj„9‰l° [«‚0WÊ|Hÿ]O‘™üï)ÄJë½²¬ÊÀˆ ©^›bÜ0Ïžƒ aç©a¨¸+ü’åéðû«9LYÈXçàW.®ªÀÏdGš ÖfL@¤ï¨B†ÜgŸoðA½m” $ÌÌŠã�›ò[ó —_ö7ú$P˾Mö�,#xõw€ª.]÷Ÿ$ÿQ¯„ª?3ÎÂV«ù¹+Ät"rOš\6ý¬:ʸQ·Ó÷×›â¸ùÑJ„hHïúå= Cm/�ñÔ|ãöSÁöLAw0J = {ì©~RBô¹ =â^€Z§¤þ0#p^Šk}…XKŽËÝÖ (6Ò…;É1/k]þÂ:ö¨û�}m?L^Vý¼R�€ý(±Òv+EÚ\ºNIð’‡Ñø¿4°œ¨‰kHߢŸÈòúD«=›ÔJÍÐ2ú:q*å4ϲKlûØ*ì¿öì4¼"�Ót0çáHà;—š…ï¢ÌFÌ~Ÿ£>rg=J’�§â.„iúߌ�.ž“߈ìç ‘Ë{%Á'Û< «_š:ç—5œŸB2œI¬·¬‘iJuÚãZ»ËŠñ�ª(<“‘ùa^r“™ï®[{<¯‘¿½Ž,ŸsÖÌ+HVC¨ôÊ¥e’ˆ’ôÉ®ƒë1ŽÅÍúLîæ£ðhÓ3�Y.,™‹l2žd#ÍÙˆ)Û´'ª<öê¼jià|K .8¡w¨g¯éKZ>V]¿8Ó;êêxR'µNçÛû©üÖK±“0£Îç´PZÙÆ½Ê…¾M¡€º”7} ºÂú4ߣïÝZB|»¶¿Ëä+¦èûª@ƒïôÆW›+qQ—pGUtÒî-TÒ,(­;o[Lf_ƒùhœs1dZk=pýk‹†¦*Ë’�ÜμC\”!}3‹0�ˆzþÐ_‚c8ëgÀ5«¸œ Ô¨ÓúêSžº£§'Ççé‰ WáŠ5ÌIÐ "ª"u¶=½ŽÎ´Š�sÓô:csq ^œh’ãít‡õôPT“$B¨ª˜Cˆ¦àÚé!hÞhNª–ËÄ”�l7àÞÙYÉC Œ6Ï[·í~W(Ü24̳­�,™¼ý.í±å>zú…(YÛ¥3 �":é„-8Ò�½w%wâ`ï IÝQ—ýÝ´·«®‡}@ìI �áUü ØÄD±Ø*bãôrÁ]3Ï3OËÞ^°®ø¼Z7Õ‘j‹:UŠœô|Ÿœi¥åRÐ;YË<±í†G(•Ð1Ä¡ÚÐù…ë¬\äN;ÀS \æÈ/¹VÃ~Í&Þ‹K[òîC©f >#ê �û${ \ScÏjÒY—“/,2z>YÉ(ʵ,cõ¹—�EÌx£jUÈ8â”ïì— ´þ8Ã,m¸SiN«£¼ç3¹æ|ÌÆ…~Ô?”úêþq·é,HFè@:F­ªXqxŸâ¸šr¿‹âš_% ÏÄs©o¡È©Î%PÞªQ/‘¢Ä Ê(è`§3ãÞŠg´nñ5�ÕÙEâ"%¦3ÝÍ�£¢äW¿"QÚ[ºü$-m­�Œ³=û±…ÙRîÁƒ¾yH ¼Ü$qÝŒ<§Y¼¹@j4ðÔ0O»uÿ :ÄnÝñT Rd, ƒ¡B½„µˆã?Ó'¼0$°cÂpeª�LŒþB¿7*h5?[ÅC²æ¶ƒÚBÖEH‹OR0ÝM;ÇçÕMquiÆ(Ó??»}>gI6OO} þ ž+ 4y2ÏHÂÔлH'¹gÝ|ŠMÀM=®æÈÅ ’ÓEž5c¹Pg¹CJ‡¥Gd‚梘Àö¥Cc8è¼–½Ï °‹Z/|?ßíâ4¥”+)÷£ªEê¥@‡ÃG ±~)8•—¦ÖŒ�–ò0|wtt.�BðLÞŽŸpIÑ{&k¸äHõ›ÇQü ÕK»öª»ÖP­*‡òl6ïd­ç†¤’KŒYW{K;e¹j+²ß9ýš½ž‡ _kðÝ/¸¼¾'óÊ¢‹P.:pm²?•â®VŸó˜þÞŒ8‘&ÀþöÉΰWʳ%u¦÷·¦Ã”פ©HR1„žÏR ]«p±².=Øs8qE•m€»u?tRä)ê‘ÂË]®à'öª©ba·¹ËAbb;�¤å@µ¦ì|›”/Tk³#b†%ƒó0{>[ýJ™^Ã¥½½:«ÕÔÑ|oÌ.÷B„&LŽe�¿¿wõKydד˷+p¸Š|�cðŽ«`k¯Ž§~uøSVG¡>!À˜*#ËQ×M»J¬¸ù€)Ð+ƒ�Jƒvxˆ&.vÐNëL†Pvس°^añ_âa3Ÿ�ËL[ è}J%1pé!É|访f4lôï9ž‡�UÁ\T ±—2Òª ” 3ê@<³ãCН²XnBD z�êÍK_/^£ÒLtY5Mt@—ñée�Ø�ºV“½Õã%;R˜çZ8rƒà¡øÑ~/ôuš¥£ÏU³Jö Üí9my?PÓ·ËVÑ<† Á¹ÁL÷ ò³iB…è1Jf¤{�Ýg,žQc‡ Ì[«jDÁæÂpJ rÅI¯—÷ovíòø¹¦„ßà Õ:?N âßàHDĎˈ¨Ø.– ÊõÚºÄOÉJÆ[˜:â­dð)wæ¾KP’î É¿aK } ÏÇQrY¦rŸ)ö?‚í$Õ¶I¥Vûèx°¸^F+$Ldn…7ó�±UñIv'èKü[hŠ|,×àN-a¶ã15fB­ /3™±ÒþæóªÓëuóËíȘ3Eå³PÁñê›�Œ¬Nªïs„Lrß(2$“²Ôãþ3;¡Gë%:�{“ð–¯$¡¢¥ñìŠ Ð°/ÿ�·:�" àÎOô?yØ_RiçQ ”W†žáÐPñ~c •éúNó˜mñ´î¤HH%Ûóö Ji'¿“�@Q±êVŠ+Õh�[ï÷Tóôú0“Œ�¨\èü¾Ë¨ÕT¾t¥'‡<áþÏš"‹+‚Þ/ù·\~cÕÚ€¡iâÕšzF "B èê°wŠŒØ.¶"þá[.žõÿRK ázxåÏÁAz"qQˆÕ+)þhÔ…üû›3çBÕsRT/³ ޾©&øÑB{“8\kœÊB›ìËyh#Çñ¾ê©‘¬ z‘ñl¸8(†jLj�ÅxË âG_nÌNÓq¼u\ÁNPŒ88ÁÜ6eªôDÍ‹¿7´#;èm9ÿc»À6NâÉ%øxMùin7¡s?•¢�OGèUçÊq~ —ù#Ñ»¯ãêLeÁÒ¨Ðmƒ¶¹Êïå™ó�Xæo?Of%÷F¨ÿ<Ì-Zê®R `{>R%žÁ3�ƒ™\ó× Kw%À•%.{X#±ÆÄQqÇ—"v6°¶i²ÑK¥e¥l“[…cn[–§Ô®Ïˆ¬àµ\i0ñ%�z¸U`%§òX#¬otk=m²ºY}]ÍÆîî¸zq¡ÄüˆI_Ñ�Ñ�ãF—�+¤�JKQ@qœ õ]ˆ÷å† F *RõsÐg³½ãÉɇ`!O§µýU»›ög¼n½$Ýy�¶ëÁNáˆù"y+>�à°ì˜¨k´8Üˤ‰ÂóbnÁõ^Ê£ üƒÂH‚ªš6SBÆ8kô÷–î=s×ÛFf¶j¢›š( `ã Ëž÷³èXbs•0‚y©Ò1úûþl´¯“ë °‚¤dWžÔñ¦'¶¢ Sˆñ\Ó£!Dþ¬¹;ÈŽ5}�ý¿·B/ñ&´yA1+RBE�žæZ¥Ë´y¡�¤!·¹šÊoÀÿ¢¥> lÀ<~û°7¾�ÖSï`§k ‰p̮؉ ßܵä…LúœíÚÇÐN³ öó¥¶„J:iÅ{eG»/Aj"åN(!†·ÊfQ¨,hw¡óYÅò&±–AûGÓ£Ö®×ÓþœwÎ( #Öõ<´™Û®í ¨Q }XZf·Î;R¾°em@ØöÊ;�Xà‚MK$bÏ 2ï7:H¬ô¤LõHLˆæ%¥%½À?ñÝrS£ûhlJØF]Œäj¢A²MeÒœÏ?wÅ9‡=kl5¿l±rí/‚Òqʈf´ŒéÜ:ûX±¿O”Kø…#=¸m3Ñ»Ï4òA’ýØå©êÔz,n>AOû_â3ÃCÈ™mvVRºŒ.ñ°Þ™/”˜X.B‹(ü˼ãÉ—Ý�®,ô}6I9– B~ è ½Ì)9Ú9Ø£éŠ`Óõm>–csœWPÓkŽ{ R6CŸ!�÷ÿI)(Ζ8Wçô»æý©çxS&b¤†¬M'2ðBϦÒ(hKýÓó'Ÿj¬Ñ”‘ÒÉ †²š!'ï*Fz é$0Tð¶¹=CjŒ†”x”îey»ÂçÚüáô~Øbê_`s`ŽÊ½Ó Òë%YÔmœ¶–ƒòƒbí° Âö=£êÔ¾KÚ¹IyÛûn2Ëı]à¾CÁAgÕ�ÿ""ð>¢ ´ozní©§zO&ôƒ4ƒÍÛ^! èB*Í�t½„v%ÎÑ Éà ~ªú·%àÏ©l¤zÆÆ‘ù¯YÌå 8p Ì/ f2ܭ˧OÒv%ôzTPŸFaQ‚<­P¤ç™ Az/óI“\hG¨*Ë¢æy¥1ž1éÐ$ó3�™èÓ@?%.Ö¦ÀóÍ: ØkwœuE`K¤ ÃU" Ľ䩡KV<þõÝuã7:¶¹°Ï4aà¼æVÁ‡´x@»%%ø©âÔžsÿê]°2Sî½úIÛoÜï·B™Xæc•r{“\D(]¦|”rΆù�í³0ÐzÆá\,Öbžës†ë‰ ØjÝÆmçd›Y¯½?V&§°¹P±pàç°ZÇé‘úùV +*—Á.þþ@Ÿ“ÊÇ5[ëâ÷oa„môîz¨Ç·£(ò¬o¶À/|J¦7r†%ñçÐÁ-â¼&vóS\Î�^`“àpë‘õµÿEåðo§%ñ FgÀè Õ ý™jB�ŽPį˜KZ±‹�,Æhf2�Ayëv›ÁF¬€öˆ‰%ífÄ•( Mîešý†-ø°Ð <7:Õ©W•èÌcUâ¨${ OŠâq¾_ÿ þôÆùÐ;ô:ÿc{¸«Þ(è–š�­0ñNùñF§˜ßÕíT³}ÙB2¿A‰‘Ø¥Ôú}ø3ˆ»Î!v6xƒžý¥Å­,:¼Ö¡%ó¦…É’ œ7²¶Ý–Fh~¡Šb'Ζ»{nI÷p!Ñ\�Ïf· â„R‹ìP‹Öµ®K§§¯—dG#£÷ ôv Ù×Ò¯§xjIÑR¯ýÓòêËö8õÙ «Y-¹Õ…Êi}|ä�b Rq_ ?–»ºÐ‘žpß¼=Øé‰­ ¥,OåqŽ1ƒê%¨Ç€–§ÜÉ%zV§©â þÜ®]M‘2f4ßXÈLWò Í § l+q2ú Ø»'vS‰NóɬىF£�ÄÛý:„ÜM‚ÂÍ£“ý�4†‹‹³›õ³'˜O�¬Ý…6ÈdŠót<�$}¸ÞÈá¶­’�Äu�õ4 Crޏ�=.ö:Î6B0‰—pÍc™l—ä¬Roãü–É7ÅümØþÝ×BÆeÔjà8aŒ ­CA´­‚>ákZƃzE5‹_?‰LM,k—�e°–æâ+òÖ†ÙþÃaŒ»X™–,ÐàÞó=KÖtñ�RÞ|lp‚¢¿Ú4é2]Å’£gåÈH âà»gŸÔx²Ïx|ûƒÜÊ„Ì ~ž‘Ûn—;�Ÿ¯…‹DA¢…žßé3D<|Òžiäò˜‹ïê{rzè<� eY€©-� /nÔè‘lÂ|®{P7ªü(´Úôï†÷ QÝl}Ðí=�v¤_�†(þÑ�ýïG'hW?‡\³8'OÈiÔô®Ry»^€øßì*¾E‚ŸÁÙÚ�²“d%ÛN ¥$ƒ~ñæ\j=ùæ&¨UX×½Ÿ,ZÉ¿ˆ«ÎŠÙ S‚y ¡/K�¦ ÐÀàhlèÈÆrmDQ¤ sˆ…ªÁ,ÍÜëàíÐÁgüH�Äa%<+"$Û2W«y�_“Ÿ{e·tyÀý/|$”Láz~Ww¾-6F˜�*Z¡:ÑïÆMsÀ0¸Dpcž.]Rhy‰q…{þád‚Cgòe1’5éeõe6/CíU™ë*¥�#nçuA¼ÁÕÂæ”²ˆçÈ¡S{…Boý��îáL®ã¬W€g¡©8ÐóB„,Bó÷¥®)=¤)Ež°P3Þ0’9 ÇŒÏÍBäNÒ‘Ñ3ÂÐîñz±Õ„ë?áá¿…_§Œ‡«Æ/àådÄZÙ“fB� W39ÙØ·¦Wk‡ü5¢ƒüy¬T•!ÿ7…Ôâ,>Ë ¤Çµ:ŠÇêènñP"$ û‰S)Jžê£ÆoýËêâoö{½:9ë¿gR³WdáÿC߇ÎP$Mû�ÖÛ+@{fi¬^žE ’Hdçj­eä/äÈ›{<¥÷øB-’òIˆ(ç¾…€˜G‘@¶œ…›àC`õå'3“jÌÌx‘¥4Gãý1´ÕúüS9æoáȠјˆ¾Ô_véX÷2öšŽ"IDÖòqCýʯ Ët�‘;!ãÆžZ‚õ‡&fA » MÒøZ‡iÇ¢1þŽêmr/~ÂUøhÏk ]˜u§»qx¨̧ô¥+:’ÉñîûÊ[SIeµCEêñøXunpN9ö$£‘V»#(§%qŸÒÓ3ãõ^ÅAãw˜k7HÌmô©`Hh�4žuGôB6zÐþ^"ãÜ1ó’¬à³À¢(ÏIkªJjãÚCÜð—©6¢CE?® ez°À(¡¦)âçR{øÂærIâ8}4¿mâÛ¿ðYj ÿ0áýc#Óⱡú#6º½üú®¾ÿá�} UQ¸“¤†²ý ßö—œ�>‡>ý= )Øë8vuÞzo¸'¾En“ ¥�Â�F>&»Ð$om؈KS+œ[ç/ÃãB]ZæQî¯ïÁ2‚gÆe›)Ÿxoëº,Zp¯Ã3{™ƒ�„Ã'Þ:×"qQµ™§ë}£ Ž^øúØ fØr‘D…ÁqÜðºÁ -÷N�^A=ÀÊkÔ H=HÇ”˜GÙ 'dô‘Né­�§‡Å¼ßtS1„—¡ðîÉ s_B~Z­<¡&ø1Ãó?ñl»ýÓ¿Z³ ¢M.³Ð¸ÙÃW°å/D•ÌÆt¶‰mëÁEOœ‹Nuíc®Ù¾vïÙÄòúiø¢íÍ»ÔÈÛ2@µ©Bª³Ý;GàdθÐq¹(Ãù[‹Ê¹ UyÞX+hüÛ׆%gR´ØßcúOÏ{/6®V.l!µXj@¯É0¨cöMáà|%ÂÀp—cëªcê‹¶êÁjéKb°¥ß_–t±«Š"Þ 04e.�ÍWí½Uþ¡Ì�2µdçËå`-*ô]ÀÈ w+”œ3B™…Ÿf/ØÅ!|k­”÷&™Q¾ŸËÛñ“´=–U!�)P9–ˆø]‹�cì8>µ“#…òo\L« ×¸=i4&>W_ç4¨Èt~¡=¹–­ïRhªÃc=se‘eA™êÂ83„8&üèt·÷éËÔ!K¢z+P*ïÓv‰ç=šTýQ*ƒ&µøomò}ÐPúªã8™£Æ[]ª?Wÿ%…'gúJd¹f¤²Î,žñíð4ä^Aߌ2Ds>™É�é|€! =t˜· L¹Ž°¸déa½À�NÙ¸³¼63ÂZŽ À›Ïɨ,ì$ž�¼-¦7Ò¥yùX%‰ðÖ¿Ë“[�ù|ª” MÅ%l¢©¯³¸?ª bäoÌÑ GUÀd§y0Õr*‚±wð� &G½9Wøb‰PHwRÿeFóG¢%�áéHKqò”dw"|Q^xædÏi&­Öi¨9çA¥q› S˜H‚Ü™œdÑüž.·ƒ—ùÍ/bo AB„3(2‡T!-¸†uËÃPñØKd2N >GNàz+ìbÙ#êJ³CJ%ž­x^ŠðfÝ’4÷ÊËÓŒÞ(øvߤ”G¢·¤lXóío’t;Oþµlï2«o¥�ÍÿI /¢ëw¬Î„¾îŠÄ¡ú q8:CÔAÅY1£]ÀÞ8„L¿dËñ¤>E‚Ñ$�7—Qø¦n—Ê#àfÜuö²Q¶rfÚPZõÍÔ÷X„+>¤{¹>p̳?jyÜÆè:~ðòCR–ƒMûðt ,šVó÷͑ョWÕRï?¿¾,ä(«ÿ1à¹,‹2¦Ö†…þª\šòåÒûì�—=7 :æéz]Zx[j©¬v�gÖû#CãLǜ̵„ŠyJbk¾,¸ôL¤QgÅ‘ã4_IYËÒöíÔAÙ5H³üï“Ìz‰0ºû’Aé(ˆ�÷.@­È|&ÐÕ^¬üL� Kͨ–†8FdµXÒ=/F]39í¬z~´I}}X£zŠÄÏ{§ßÊà‹rZ¶ÆÜ»báœõì±D'1íf©³ù^&|?•LaBé®9ö !œ½ìôÒÕxò²{P{<‡/P2fµ€•´ §Ê³-Öö².µÕ7Ç­v¢M¶Xˆg² Ù�³â ¨1“Ü ?Ä0™-†1ì°}K5x—Éà»õ—)ÙþŸ¡‚͵\ÚRgÖ>5”ÄX�¤úR¬4úw–~ç#Љñ"5Ú1‘x\6&ø�Ö¥£-©gnÃnwÄd!3Ñ{éùX Y.J®²ODL¹nÂS6¿jmµ§Øøšèâ�ä7@Ö!c´}‚|êzÚñÐKÁ-ÿ?í»üÓÁ$1 d©�µ¹Ä¿O„é¨èâÍ¿ÕW.'tU³¦Ø­€ßqL¿ì•…cÑtÊ~“=ÎR·¾%¸MníǤ�I"c/äD#>>.§åkB'ØÌëÅ:ƒ›Iù$ê—ðBÿJëÞNCh@ž·¾g csPö#O%ÜŸk% `ŽFÈz÷¢Ê£Ôà—>~ªsLí‚?”vs3N(㹆n)~‹wóW·D±LÈ{‘6Ÿ´Äñ©{OÌÊ_ª°¹30tÂQ’Pb¾Tòòxî&ópš9Îi˜>d=ê¬8ß“c¤Gf.®ˆò°Ÿ7¨«ïC?§Ô�Oµ‘�s†é.s€.ñ ›4Q˜¾ˆÄ1¤—žì úŒ�¬;Wyš£>~þ͘â“U‰Ïk:÷I`�dî"å•í™÷ë¬f( Åéÿ<Ê "qü±�tÊ+‰÷§Ï·IÊ#™m­P°ï]a�@{‡tãÛ’‚M\ÖÕHB³VõÀuçºf‚ ‹ÛðÊJ˜½ãyV =©é^í…b=�9þìÂý;8oÙÀD¹ü˜Tr‹À�¶ŽF5”Òë8Ì �Ë0ÄË€hSzí�Úcæ|{9N1Þ PKFt ÛÆ']&¨„lrïœ\8æ°&4HRχ0ªôµ;K|'‚-&ÆYvY�ö ¬As¯mn|«ðÒðHÐSLX¥7¹Ï 4¤ ™á@è‚�PW˜¾€h7ßW~¤g�O¾GkPèzZø])™£…Y{-²=èùz÷?ºvÝÞ"y¼T K‹ â�*B�Tô¹á掩žÅŸ&þØ<À·Á%CàI¿—ˆÍY|V_­§q§ìÒ�Åw± E(έaŒ|]B¢ØJçU&¾Uj³¶¸ÓѸ[á“Mþÿf®†u§G¾%¸/.Ý÷˜È®°S‹ï“¡ùõ^ÚŒf¿¯°wÉêÚ¾vî�¡�‹}R õ2ãP]Íà4d/‰@iuo±`¨o¼ÍyŠ�´�UËY긿–¥«¥X‰+W·;š™/Íýoë#0ìÚ@ŸnYl™Fš¡"«T×´ ÷$—0hRMRæ/3È,›hþer£/šäëíù#Ù€w%õ<±žô»gBS©­ìV@›5άԱìW–IvZo® ¾ºêôkØN$fýúì>-ø ÍAä4þM$k^Ô!zg#Kx,ú3|,ª¶ÿ –I¼žÐuÊã[?ôçÊ»X”©¨�¨¾°7ð›xóðXÓŒ½Ê^B?��J@&÷I!z HõFÀM¹©Þ\[¶èNaH$[éæ<ÝKåM-[�>UÕ§–@ó Uå+:-³[tqÓ½tíØ6¢ò¤øÕ]Ø i~)(ŒŽ£÷=™^kîº|VEVÞF9L¾ü÷´’Œ¦>ß¹hàC)ÄdrQ£ŸŸ˜n²øHI÷AUÄ.i— ·æG-Mu.¬÷š„ˆ�;®@£–�T´¨O–*RÙßÒdˆ ƒÝI>|Ýã'ºGŒ€>Ø àæ¤í ¦B»?pÓÅï{VTJN.Ë ‡'¤¹$+¥LÌ‚¸³Ë?öIЏÆ0¡G>CÓÛ›b)ÉPMî%1.ÒÜ¿þŒ|ëÿq¤É»!Â}ŸkG]¬Gü îÒM¸É2 ³Ÿ/}Òü ‹QÝVy)üCªGŒÍº·?E�ÍLø>@”4h㼟F�hgsŽNZ׌ñ¼AnEâÖSoy\œ“hŠþ¥Ü©M4KLyœ cÓ|/—¾sÔ/‚*áx:™½ç.bà·ôb`nâtª9rHÐ)šjU³k>‰ïHcá;Ô2Æê5á0�ƒ´Ê8Ô�ã‡ìW�k܉¼·ZŠ‚ t�M~–¹ç‹˺{.ír´ÿF7jX~_¶ªB¨Êm‰Ôal›gyÚ°L—¿YMA΄¾O Úì?2»”×jAœlÃ'Y(ç:šŸÙ}t$SæF鬽ì¥ÔC’ud½úÎÕiŒe"œ‡îéÏW6 *õçÄ‘Yu9ÒJ¸<9ælÈi˜R±‘˜—CHt']<�ƒÏXiz “¬cW FFÁÆb&CÎîLˆ;³=3;°Ÿ:‘€ËáExÂÙÕ†QÉÍ‘T[â‘'_Ц¢ïxëé!cœœÌ¸”ûߥ2vÕ¹¯"PE 0ÅvlY^3u¢G½PGys�j3² = DTÈÑ÷~ú'âÙLÑóFsÓ†d<�̆ÑúúLBy¿U0ñby˜‡X£®H�ßp×Àôº Jip˜ë{:v8­ä°Nʨuñ �‹ÓÎ$1z.hQÌ`‘#¾ç�iw_pïýê‘%)„Z²Îf‘a�‘Ëúõ*¡¨œÕW„iÈl4ÜÜŠõ‰í€Í LÞêøiƒ€Ç1)KP±àrOæ§A¡$A*GAs7!9rÄÏ÷ BȆèc°‰L@€äúùí+þ&áy5ƒAÍ×5—¬xƒPäÁð¦A…øºÞÂ}³F÷¼©ôj"(~8†údÑ�Œ]þF×àŠö­Š”åc¥Gmb·];Ý·{"vº@^!¿B«²_±y{Û`ÑjrÇ!íIÐuGã¾äªŽÍ_°+£~RŒ0ìZF³Mݱ ¶Åµ+¾öìtBЄX{c`Ð<ÙB5®l�¼ŒPBS”S¥9”!§e—µÌÙÒg+ˆ…™Š§¤öZ6Åd§.f+DðA�ÖQ»Wa¹» \ i˜,—Í\žÝÊ·º9Ô4×D"ŸŽ�)oæÄ‹´dnVKØo²|43%FØÃC)œ�¡MŒ «ó?)vJÑT¡{?ÿ3!jµ¨æ?¬Ñò¦.îG[}óÁ¸•z`u~!‘†Ÿ‹ïGLiXšÉ21-1ÿ$v-` 6}È8FÀ¼áÓ¨~˜ÜÏåÇbÆs Z“&äÀ?9äµ|@ÌÒHÝ$ŠNÛ—BºÐÉgÙà-A¯æU•æí°@8šTÑCX¿¯÷æ(úÜ8“ÆcèÖþ¹{KídR€^ó>ipc+Ê—Ìø)Þ©¸Ç<™ÿ‚ÅÓõÚ»C8¸ðç™éÄ«ý¯Z ­æÈïuAnxåÏc`²÷ã@g$ÇC›êÆ~ÛŽIÅ{ÑÌ0v)ÈoÔàÞÑ×5ðí­Þû“r ÝYâG [|mD%«’¬}ŠpvH&yÜÌÅè‚ÆñÏã¸bjÛ™$ž‘Ç_‡³Î•½&°9%Ä!Ó€ˆJÕÆDœ 'Ä 1„ËZƱ+`¦…SK¼«Ïkž.–J2#;²íò•™8ŠÊœþåL¨|ÿv3ó�r'¯�ææÅ?>¨8ã šuö›ðu;¸ß‘ä¦òCí«Šœ®‹íØ^‰Æ?�æŒÈC5å$Ê<ƒÊ\¡ù ³›‹$®ŽJË*Ñ[AžM²ÖXåÇ”À$Æ’5ŽGYÔü·ÉÅ]f²ï›Rˆv›ÔʼÄJXKÅ\É*kh6ÖM9_ÒÕvú �h¡ëÃÇZõ ¡n.‘AœBê´î5&¸T‚ �›¾yBÊÑãVçRT¯üLì£ß.m¿"ž%!h4á7âp‘jäæ3w�ú£ÛÛš§Ž`'äR;Ìm’�&²¶;Y•7“˜J@8}ËFðÜYÒbª„7 f OLuEœö5«NÀCç®F4à:‰·RôÿGŸ†x™8°u=n—ñŸfXÉ~YÜ-?<ìõ‰4¤QÞ­3Êœ\ [îõpê˜o¦nݳªØ”œggEl—/,P*ú@s½g=ªF@ ˜çÞy õ‚ŠñÞžªÛ¾Ch0ø¦Jòr%f,B9…×'ûÙÞÝ™ïXR— ”Bʉp,›f‰’T±Q{-(béøÕ«ãuT2šúR5þ1Z1÷°WÉÑU$÷3Ln'~Dó×Fl§½Ø;6.}îÓQINËb?€Puã5\`»ÑÈ £Ìáö(®h! šÞ™{›¸[ËÑ\ñ üi8žÖa4§‘ñßQÒÄ=ÌQ÷ óÑdùÿD² ¢ !•΄&”ÀЋÊÚŒû}fD †¾•LÐ` RJÓ[o]5*¡e I…`”hòùOJטÚÈÎ8ðvb‚±“'KdëÎ}Á.P¸ Î_· ˆÀJ^Û�}i8®ò®½­æ‹Zï¼%ŠÌ¦âfåÇ‹ÅÙóC°k5ªyX¶JÿFòOu×é¤*‡“á7Qœ¾» q“µŸïþó’3½Š5Óº—qÌfË›¶^q·•šJÌ“7áºcEÖ *!Jˆµ„|¶tdK&�tBÄŸðh¸ä}+¦jw$2«ÍFJ7ìXR;½všM¬—a•¢ÅT.ƒüœ±;;› ì'rA Q'âE·ºÔêsz aQ] ¹½7µUï×I=„ÌÖ¯'³Zòø`7Ÿªœð7†$ÞýÕOº?©`uPŠ=Sô'€Hb�ü·ªŽ†~g¢ßðÁ¶æX 1[)Òy_ ‰lÁOÉ^þ’>¨{Ho(uD)S;§iû'êzƒôïl ‰ÖŠÜ´³  ۆ᧓g«Üä1 ‚€°´ö>~˘üû2TûqtkWöIÄ0]âBjŒÀò|„�,×¥Mâà»ØÄÞhåšë®‹`¹è³ªP‰`¼z £ “ô]›«�@gb—³¼­ÈŽâªE|(}Âa•dB,F·Íç ,¯ŸI ìË{쑤 6ºíTª¯¤$Ã�<-ZoÑaóT < €-öI€œ áÇíÝÁ2Èj�Há±}ï™~DÍ"j_²Öÿ* ¤š®ÌƤ‰!d%0å:+yw�×Wüwpú§äZ UU©n]€´¥�á–rèz2�ÂJO¬ÀAM…[¥Ýî�*2°–ªGti)Pen¾‰#³�²V/e¿8Ùw‘"ÐÔBê€â¯@æâ‡®¨!žR9Ç�YaÊž†(ˆ ×Aººwá ´òpn«~P¹gyj0q²t3;djZý´¶ÿ nXp ž´"W})¾�ò�oÇ*&+Þá˜u;åëMÓÚ¸ÒqÊi"üÿ_7xõÞÆ]…ÔÇdè¥ôñËŒáÈEšÜÇ[9vöoyM½3˜c¬Òu¶¨XõåŸʲ¡"ŠSBnÙÜ#Å˼Bºþ¦èà‰_ðÄ+¹`ÖÀ=¥–�þô]Ü\iïÖÇ ;˜‘÷/G½*[ ï|¿VHäºD š›�þÆ`°\D õ\d-=Á[!�Ñr,íg(d Ÿa§_R,^ƒâ¦{e<ÙXm©%äö¸TXÙBt¸f¿õn‹-¬ý㎅­«÷�c–6Š~tîÏÄLR�¼i-žªIIîÂ)áÈ%W®¯GÕñx{6b×/ÛŠØ—égÞ2œSÀÔ YÂãké ›ËNü¬ïU‰4sÄeY°)ÞÔ¢¦C;çOÛÇLþðýCµ ©,r峆 „øÅV±œZ—ÀÁzõº0GüSÏ’×'†½k]‚t-lŒ!Nå”÷J£?›RÃ5|–•„GÆtªqÝÅcõjzÑþ�t€Ír¸g�Ý Ðk>;]¾µ·5�ÿR°Eâ EŒlüì餻œ”�`ºN¶Ïe­íþâxAZWç¡o5®�ë˜$QH¢Åœíþ9a9§@õãù=õ˜6Íö\©QÖl­y'[œ€ð %w,Ùª^kˆ4ÝÿOå©gt_nÒ GY¶ò†–ï$ˆ¤×":›]Áž2wM»Ó¬$dÚ^uà ô’åâÛá­˜ g>Ÿ°¯+D;¸â}|�ÐU ÿwõFé#DµD£~*’ Çw&5EƒÖ¡Â*找Í“_(œ®€� ºal߀×⛩u ±!Þ˜v}Uð”�æK>¨NkÚ9'$OÖãa¤bÛMæS€e³-ŒñöíàAù)ú: =qÁ/¤ŒŸ`JaŒþ½ÊëG¤,zâìk Ÿ@O„º!CsO.ñͽjuÞ³¶Û\É•ŸÑl!Hu©AwáJç8Ëîá2rJc´¼|ßÇñ©iÿdP(xåQ&,ŽÕ&j€òòŠŸòÌð[†ÙA:.m£jþ+o4Ñ:Cmý®×fî\t³½Šù8˜n¿9•¯ѹ~Œ„4“UÕßSÌ,u‘æZô×4<ؽ+µ„úL¯"'&Ûõ–Ĺ’ÿ7ûVä¹íÂgfã>�a”9£c %gáDéI;â�lúŽ…%‹ ¨êŒë‚â–4ÖØUIä#èÙÑ®ŒÜÜ™ð@v¸õtÕgI÷:SõÓ-(,{ݰ—Øð²"@¿½�‹<øÕ•¾=3 (ÕšÞ’Ä‘L\Qp"¿æDrW™écM1ÜäÃuÉ÷at‡®FsGZÒÕ¸gAÏcÁT§Ñ�ÃQËvºÊñŠpÊs™òë#ûî D×h2Ç2ŒADB¿ß³÷Ò6ü!Ü4÷+1ÞÍR䂚²ŒU¯×‰]àgd㽆¦9Imð}݉yŸyÕn±&DÏšâTØuî¼ýÞMjZ'Š'3F— ÍP„t‹pçߦ¬†=€ü<'¼Oضê·Fðµ Ô)æì@eçûÿ <÷ýË�‡PŸ´RÉ¿`I[&Š—m£Ð¬í‹ËÛ ïp à7(F×"e3‡‡Íh4-õàÙxOñîˆU%˜ jéòö'„ Ð\R'ñø3�A]ï:¢‡jyÉ? )ÿQ½BëË+ðzù‚uëkÐÓÞd/xú­–U«WQ±Zs÷ BÞ–›k.J¤8D8pÇB/WNò‹eßÏŸr^ûÒ€`4rÓ¾xêO(„n#;¯ý�|«ÂïA;Í >ýtl Ü1òÝ(ŸZ±šÖ^\Á¼%zŸrá5x~f3’;TœcÇZÞ‹CÎ_±EaíšÌ“øgDÎ~ÝLfóȼ é>•Æ®àòâ¾ç`èqÅZïMÓ}„&Óe¹*â�¡ŸŽI„;¿÷(悈ìòas:F7—Å“k½i(3ž‹_ÝS.ícq�¡çÑý“,ƒWUØjMÜêÝüÛÕé•&q³ýL(Át"ßù¦(ÎÙ!/‚#iñ9M�”>ÉKr¡îO™º¢÷lí¨k±ë¡ ŠV‚<{pGžJç†v›°ÎÞ}1›Æ×t–áæ 8uq1EäÓa×>�ƒ÷£°çB¹3ë§ ¤ ö3È"SU71”Á™ß¶/;ª×™¤õ~¾½ºÔ©³ŸËÔ@‡©nBÕó”ü$@ÀeÓBö[ˆF¹®WiòœË笶 ½ À,GÃØß\A*C :ì[>‹œMø�n­Í — S¬ôL÷µbû‚×M²{໫# }åq¿¯Ì^q²>¬<›M>.’É 4§o®(áAP?›!RQ»O€–“ÕÞ ¸ ¼ØVØa}�gž¿}›yæŸs·³±f²m1üj¢Þ¢AÏ’¾ú1eò´IÍÅÓIñômÄ 5íAº:É¢öðYìœHèH˜„¥}|™Õú– áÚgB›@‰xðümb�ï=×ý͵ÏÏue7Þí·Ô¢g�yûx]0'­+®ÅªE!~y[¢ñfž�¤¡[Ëk]µ/¨”¿ÁüDíŸ}ë…žÎÜ›'÷µÒ¼K”€ë¹Ò¤ØWK~{=Ù�™"_%h… ¥œæÊköq­º`Âÿ ˦Æö„ûä>éqînÕG4Q+Ú„Ààô¨²n“Ægï$ø~·v30ˆåCˆÅv\�o¶@“Ù]0m?D„)[vÏ2ß8¯ÈÑÞ9³} qé}P^ö0àŽÙ±“Œœx‘F¤8~�é{,ý5Ð@>ƒ-'¡AŽY YQÍðKÈp;ñë܈ÁøS�Q'Åô“©qM·™Ð¥’¶Ê Gò±` Î”ˆfÀdáI¸3^¯�w¼ó¶(é€"Y¨ÂÖ_±+ÚDÇ¢¡ƒ#È¢ðêúHè±Øh)r†ŒIù´ya™³"ÇJ¾%óž…²¯ü±‚¯°¤ÈáQ¥Î°á×oÔá�tïPú©2| -þíGù,}®UÿGçá C¨8§üÆŒ­?;7êËjí�wÂrG[m�Ø×£¢—ÝVö®À0roeüï±bÓ:¾.Í'5uÑY¶eàº[À,Z¢tAÛ`š¾Y7ëÎß&;2àc9Jžy0ÿtL¬¸G •½%ñ�Óê+YkŽ\¼§\~S @„SW•ÈïqÇTüךªn ,ej[DçØØ"ÝJ#µÞEÎ%+ÐÑÞÀ¥€É`ÕA>™âUzê�6ø ßl¿d Àó=„6ÿẆé5Á‹¾GÔi,º2ëÌv��Ž)ûýo­ÿ*ð†áÃTÚûË\7ÄG=aó±|x K8À1#–§[DÜùóÊ;2«RŠs®(5ïJôEïM'àLμÉ%¤>éò‰e‡UtEÔ½Vß)¼+ȸ} îZr£Ä]ÿ!AßÍÒïÔôë}êBË<+'á+âˆow8\´3¿\§ÙzâØÒx —À'¤¹Êò!ûÕÓÚˆË׺çÊy4âú+rzÉf@¼?Ôël�èž| òÞãÄfó·��’¶mt v6 ŸúÀù'1~§¯]ÐEzºˆéCËõL*ƒP'LOþ°$‚aúvÄå©“mT¢ÓµÇA—¸úý&�ðF# tØv:Õª0RÍÙˆöÞLhJ.x‘i´~‚(LDÓgÛ¤(?ûŸ=e"JqC¡.ÁLô¡=«¹s…Zw¦øc¡#£T5ô®R(t­.$B ªÝ�¼|õ8r4M³Œ`Jƒ•.·äfZÉ”·D,ÐÖa�¦ N¶V)ÿGE £É‰žµõ^õ´[ )/RBü Ä)Å…óOŸÈ‹Ï°ff¸l)LR[¡a7Q¯ËyL�iÚi9Íw�ò�l]°1�Ö†–ñ�­¹FpYáaâä0bH€YEÒŸPâ'»dÈ×{>xfº!ÊЩl�ÈSò)bT§uì‚ 9tèí;Aʤ}²Â`­o™ovJ �™{ò#}ˆv¦›ÊwÄà 6ÚfëW1‹¤Â^C qáªÒ*šÛC?çrò*¨�>þƒ��p/U\âÐ'šÄè«g2�ê-ä.›�&¤ä ÔS�IU•?ÉüocÞ·OõÇùž²x·×áR1€€p®Ôe�+²D!×ܯRYܶ¾Ào¡)5œÆ¥¹%Z‡F1gcL²Þ?‡±zå…úôòõË/F °ÔËèe”:È¢ÏqÒ-俞@íó¹zÍ”ñó™e²‹PcÉa¯¸.ŸZøuLA­X»ú Þ¬I÷B�I{00YQĈ”òœœ†bOÞ+Üè!ï!Š–dÔv"_K5ÈÛ¨¤£k9 ØãKňrå‹Nhf­…4òIèfÿ€5ôèè_b%•ûZ† ææ°(<68袻Nj+ Âê`’òWK•r*;}¬!sY¥X><»^T‰¡L�ŒÛäÑ6Iʹ–Ô÷:ç’_çC€|Ç„E ’ȧÝwª$„\#SQHF-ÑvÁ°"ýýÕ¬š_JÑkÆŒr™à«üÓ§‘~å°;ÿ9œ©ß+Ðd�×(§±‚úÐx/5yokR—Gnø†Ú�.Ë;úÈB0K$ÄðŸ u¼�|Ev¸=9#æwC&Z-½g$熊—šû–E·ãågüZ³ÉñâÜ`7âbÅ1§jUʼnñö ãDë0[òÔÙµ2VYì>t°RݶrR°&ì×ó>:úDÚzâmÚ±ùî8<…2¦ÄÌQ¯ÖG Ä“S|OºoøÏÄ\ÌSòä›Û‹}I]}ƒ�6Ä€‰^ÊÎ ]›�-u@Uû…¬c�IYêUš{J±ßbmîÁu€{ïé×A}(üW=ÔS°µ‹¼‘K—á–3\˜†Œv ]²1-„Nânm)²a(Óé©ÚÇŽž(0=fãcÏÔZpB÷%rjùP3¢F”= …y8ûËVP{ÕvY±”·­|“˜ÎßµœÞ&±ÓÇ©Ï�&Òh—Õ �ub·NËldì¬$Å;ùϧ!� ì9 bÙ‰%Ñ´¯HÕ’›°»¼D £xóõ!p(pj±Hp<éëGÔ1~R_ð¡‚2(åÖgšÂøm�c¬ìýÊY;—åèèYQ¿Va|yw£LÅýã5ÿV}áù5Ú¯±uyšîó埪h¼_gõj.=1›ÞþP¿q Uù8~œ¾×°´NåÛ‘G ˆêížäJÅWÒßT+ƒE>¦"ÎvüTç¿ó÷yK<ëûUŒà¼Uz¹H€þN-Mx}û©JÓ…�ÞH䀋錞»$ß!ªì—‡D{}È)Èb6 æÂŽ[û�©i*óã7è¥7Ž/!%LXÚ�«‹€&;µY§j(¢]NKˆú®Ìn~A+aè½Jü›eÎl!«_•R \ð}Z™¡éùqù²ü[Øfl›¶[ þñ§håŠÎÐàYê3XàT+|¡/²œÍt¼…«ð˜O‹¡ôè#†„˜²jk:ÂïN0¤Cºx¤€¬`]øh’]«¼›ûDm— ¥yŸÖGh¯Ä>Ê*ÄŽ ¸€MÞ¥ú¾£t,vØj$ÃÈ™–‘5ÇY™#Îi,[h;¢‚9E‰­¿û.AD. U3%‹uœžtg Óð_6„ Dâ Íÿ„�£½d�×ÿ‚*ׯSð•kHNõ÷sñ—›U`µë‡™°vQøK/³[›¢øŸ_]–•ˆ‰~Ûì÷‘jy³³#²vfT¼3¬ 쯽ÚÌ4Qr¢iAØýMï:zö[)ÀçÛ°¨é*­cOe¹²M�2œ¶¬.àó¸PÉöÒsÒ�"l Ù�¾ggù6ò7¼a‡Õ&�À(Ë›õ,Ü(oÉ—5Àéç$bê±DFG­™ÂŠ-;/ìòb´BÚƒæìP‰’«€&%+åØ?X¡~sHNÒäz£vëm8ÑZ@9Ž›|ß5RC“³š‹YåO—æÖz¼“ÉÄP§[}P»ý7Å/CP´¨Sµ1™êšs÷ž¦X4–hé³F#z£EO Gb»È9•Ò6OaÈ�ÿ>�E›�lZ™ÉqFƒ°õC] !/�ööƒú?r¶C2g�ÑKã{r{[:b‘w�òß¼M“eÁV۳½½·<í–¦ûŸFr¤‡ÌÒNóõrl¶'‡ã¬Oµl´†÷–�z£‚G8ñ …æ8½Iº³½’—Bü�s¼9ê(âùÀ|KH½þD¼Š5ÀŽiyë®'«Ä ­›ú&�x¶Ä¿‹!þ1dz|RcX;Æ!Mü„P£‚ñ~°TæN-¸˜\Ëã `YÛ"…»¹Hi=ÂÑkr˜Ý‰Ò2üeâÄî‹:{Šˆ­d Ä‹ë«E \ÑDlõý4,°<|¯�Ë» ©0,ɨq[Ñ/£úƒ’’J‘jaÙºhSÉgnšÒŽs—­JfY›CsƒÝÑ~ãÙI¬]-6>÷‡$x"�mhc<ˆUP‰Ý5÷²^g·M6”˜ ­�ºÜ=å\:ád1Sw À +ö¡,± aëQÀ ‹#͆BÙU!¥|òÊ•–m“ΰÿf&¯ñãöxä£`JøÎA‹z"b¶4‹_"ÆÑÃøùš¿,ò`úaŒ'ò,ìUƒX–†šsªX_]GL€˜÷†Ç4 4ÊQµž„ò�ÒÈ#¿äÛÄMÔC J×�…º-Än°Áí Xá›~²­¥m“;NØoP™…ht3Í·PµPn{yzÎÚ’{ë” ÆöìU^Ï*Ñ·Š¾L;”Îd}–—å�¾Ø*e£ª�ºƒ'ÿ¡z›˜2¥LígÔgÞ‹�í¢ôÏ.!êL}ŠÿJ L.KUÐ(á´ý—ºrx¿±c)4&Ò/AàSñ¯rÕãÌu[?+cQAse Y26Ÿ’XÞÏU# 'í�úö^È ~/¢÷QøÊrs¦Õ'µñ‘wê 7VM|—Y ¶liM#ÇCzõš³––’ôžv‰:ú"nîRÒøñ†ÂER�sÕŒH%Ø­kkœ‰e`t�ñ²>Qäeý@öç÷¥#‘ƒ½¥|Çö…tÈÒý÷|bµÂŒ<Œ‡/íêð#�¸ojéF™;ëî¶*¿«•B�%lš}CERÆË,g á<:{¿Ã ö Â×%:åÌß8¿02©Îpò"ç%vÂËáëx% ¸•HËÁcUÛìe‡K‡TF9†Ÿ[PC8�‘ˆ\ŠÊ¢PAÙ"¸{aÿ S/§`Ýjµ©…ÃGêñtë–ôöC¿Jø„I��Q(œÆ b‹¦^r©kFÍÞgjß÷Ìk{. ^lå7’<ÌØøTõ¥¢èrt©‘j§Oîgw™¦ªúû{|÷=år4—#xzM]çDå–�[he—^ƒ4Ç0)ïÿ"â‹ð¡XÏK¸B¼È׿~ x�÷*JãBŸ¤ ûõ2ÇLó›±Q“O@j#WJN—»füwû™ÑåÕ),OHµôóG¿-ò§ÑØî™ ^ÐærÔUð/¯ñý> oðLäZÞsý×íC²Žž òl·Òv´Òwk†þÙéÛ14ÆÊaÌ“=äzÕÛÒñæg«�[�+ßøl¹´ÊÝûʦÝNOƒ2èä7Š‚qš1û_§@îÕ\�ÂRGéi5ëC(ªí“iQRJïtyp©Ž3sÀäfåõ\/T3Ñ�ÍÕ*Êü¶+y0 gòï ¸î$-¢ßòö‚�Øã ¼Z•@vð×ôW‰´âŸ­IÆ»ì‰]Üîhî> Ôû%Õfh»LQR3KéÞ¾>Pl8Ž—)=µkÆ -83Û´k÷­ñ+ÕØŽ3Ú/[EŽ`˜W\XûM÷´-”bÄ¡ƒ4¼‡éÈæ¬ª„•Àٶ€ ;ä¯DÀD¬_ bEHj£.mž& ¯oÜ9šÁù…=ü&àh«a7 D ECL¯x˜ ;FtÎ6Tã'y|@ ë3$M™%pÁäCÍ›w4æ(ÅT¦Æ6ÒÎ]ìüQÁ}»ª\6SŸG‹ýgŸàwLGRRÎåÚ/[®ìµŽ94"‡Þùá€4‡Üv~àYß)t_,Í€ÞŠP Ù_ÖÿPåá^Ö,ö‹ #YG­y(:¤azP³ý0sCÒ» › ²Lß´¹>v¤8< x¾Èo Bh¯Ùå‡U-Å�…ÌqY·$ \‚9ÌÍÝg¹†‡­åÐ<àõ)&@MoôÄê:~‚ïPV›îPzß0ÑÛ‚Bƒè€Ó2“íþ£€Ã]ös ìäyISEBÓH‡\Ý—Xõ×Ò:t�¿KŒÇ^¶Lëé WÌØ¼‚b‡¤<Ç�ÔïæádõØ“ÅGæÿ ЪkijgZîA 'c%±¯ÝÒvûÎFšî•“j�[ ¼M«ßhºr Î>ÍvýdÿtAˆQk+¾Q€Òv\ý¤ÏÔÇpÓ uÑ^PØBÍ1ö%ÐÂÉÞQל¯H£oé‚ïÆ˜(ÊJP+a0NTVY'›1KYD2$ªOvUݺçÇLýŽ•ŠÇÅÀ/¨¦¢ŠÌC‚F�ò”I‡ÑˆåjÎéP`Å«Î[ÜCPY�Èm‚å]nnG³ ê5'>Ë£Jê][Ò­/œ&2Á³J¢ "“_ÇÿoT)BìχHiâ¹ë ÕhŒs£�K:yÎȯ»�üÏ‹õæÂ §G¼N²z9ãÆþÜ&ƒÔŠl�^6ȘÔ�1Óñ¨¹”ÁiѺÞß�Á\óÖ!Dˆd«…cå=u7yI¬qH"QÕôðx³ � °#®ˆGHJᾄ?fÛžr,€ñôTYR²X£œ³vv—&"è�›´8ñý½H~Új~Ú¯öºmT¿¶¯ÿ7B/©\ý®_·Ry~Þ¢mO?m9}N“õTJýµ‡}º>¥¢}MßÃQøÿL·ÛMKí¦oµªý´Ú¿mK¿mõûU�ÚÉûtˆ²à­|é¬B�äªê-�‹Inï{À/ÿK¡‚ŸjÅgC¨2*Ôˆ €¨‰³³öY ñ—›ÂsÚùÊu•hà?ŽFoÓ›7W6]17“d g˪üÌ2™eÉ©)ˆ@ þ]ä~»�–”ÐÛ_F`“ÄŒçéÁ­óÿ`ÍW ©èÿ-W2ç) õé†:îÜÞÀ¤t&•Ú-ª;xºžãSPu^©z¯æiÝ”ZUa÷&_3E¬ö:#Å�6H˜y)ÙÄ3ÿ‚Zè²ÄgðÍéöMXHßí—õ\/¸ 4ˆ y1ÇÀf9=õ�ÚMmÈ’_k�t �¾ Šø²¾�?ú“^'îð—œÕ“LB%Ÿš6Àß|÷ÍÎþùÈwz…¨ÍMDª¾“¿ã;r(Å¥AÚ³…ç´UŸ�Žs’-ʺ‡„éÁ'õaá¤Íìé¤jÚb„{Md³&+¢F“6DõÖ#7œj_E�‚°á/¦G«\¨ða‰˜®^”º®ðùõr•*Á´Vñ`‡Ò5ä…ÑÒ‚R{×Ç17ÏÜ¿½¤¹â­>NOùOÖÃm<ÒÔÙ˜ªòþ ⯠h¹T�ÅYæþHj…X l+NVâ]0"‚^Ôž¹ÂŒ^Ë1ÀUqz3A>*ÒÙÅ«²2ÜZ1ïX—ëé\2Ï5ùñûëû÷ë½€7¾Î¶Á öŽZ¡ƒž:‹\¶ ,6y@ÐG\l·)Wõ$ÀZú äÅXÒ/ *tyDèm0Ï™µ8AÉÕÆø]Ä+›a$Õ#nà~+\R¥‹ô¤ëòv¥“äS­x+Ž!QuvÜ?L?æœÑ˜Á‹pŠ/ó°<.õÈgFŽŽÄ‰‹"›Kt¸ÈN»!öÌŒ°ÇÉ·†}Á+â«‚sWº¦c)¬®—dA°àÝÜ�˜ùr}×2“WÏ:üú ‚Z˜p„3ìïñ¨†Ý(¿£!‚"Å\�}‰÷ÃÀŒ'–ÖÿoÛ8Nÿ5‰Pj¾ï×Ñ™˜¿‡l�Ä™Gk¦á‚ûƒHRÝNkÒA⚊^è à÷)!”ã4.±Õ íG'8eµ¥æ÷H)ÖÍð'È #YÆ£¡fâ�¿ê»¶6)Ÿ�ÝÃ%·7…]“51r$M2«á_Uó()Ö?8Ø‹ê#ZJP Jý£(c79yC²•lȵdf�FÆzÚøÑÙOþi«„*j¢9óGƒ�ú&šõ'Þ¢¦ôÜ®|Gÿ?øZSáݰTE¦,¶Ö¾šË‚ÿE•9C˜#€G¢m1…¹cEÜY€…�Åþ­·Ï¸b ƇuŸ0Q¤Òöújrdu;ºŸb �ò)0Õxƒ÷zfÓÛ6ÄRÊ…- !é:v™&�ºÀp¡|tã[½äÈ¿õ-êJG bôW¬)Örx:=Í$åÁ“,Î~ãè»/n¸4�“C[¹ä2øY/ "õJˆõ@k;|ë_Ž¿3Fº÷>€ÜDÔD€œ¯„ËA¢þúlϵí¸Ä;ʹoÜÔƒA�Ò>qMóæ†z‡¢)£åwäFÇœ¿Nb4žõ<–ån+DT﹤�ãš9xÜG‚{:éª4«p¯ðèUaäØÀ,çRÂÙmYËóà^T�nøZ„–^•úÛž²ÍÓ܆½‰†co»ØC[šH¯nSWBpוMmUTeL_ÁÖ½?˜m=Ž!rÒPÞ2UD VÅF Ùõw׈¾?°‰(V¸® H£ŽøæÜÿo"º»¶wUU1õÀŸ˜o) r ; ¡>�㆚ƒh¹1 Ѩ`b[„-³ŸÙe˜¹¾/‰)¹�E9þÃLloO…ŠöÈSÊ€² �y§€èfaG�6‰Y+ý ­�~Ôc;Á¹¾dŠi:À6/‹r÷ßþàè­Mº¿›hŽòÔÁ’RLÉa”-'ŠgÙ€¶ï¬Éøƒ�tœ§®9¯SEôÅ{MÊN{’Ž£QØM¤<ºâˆFhÂëb,»€I¬ßPlcG€i0ÑÒ-ÂËxu짘‰k)Í3ÒÑtÞ$­S#8nÒ@ôçv•¼]í¹1K¹V°Û’àÿ³_ ù¤ãè;´6ƒ=b¹HÃõ®‡`ÎH�«� b )üV^~“Ú÷ÝbÈ2¬%�‡²Á%Hë£ûù¡{c53¦0»˜žS.¨ü¡Kñ[É{óz=â‘ ÌÀ @VD»Ï}ð¿(ªAeØ„tæIòõ3-w¼N*òÌÅbÌ-ÄçÔ¨¨ø�s·ÂV)’dJfÍó$"ðÞ£2&}R•w$çóû×OFF£§k½ˆ�Cª-U¨ŽHEÔo|»-vû¥Dà³:T>§8nc:M �׎?»‰”'ö ¢|SÚ¯%3çÇÑ€Ò“K¥:{½Ò­¬Õ£xå¼" ±Pº£0>ñ!Z@êUZÁ‰†±Z 0’o=W”ðioü\íp\"]ú,\­æebÒ!”)R�ù�ç[¦DÀ¡ðD1­±c‡,d:¤õfÊ7Ù*1ª�¤õeÕót GJÊqƒFxˆ:ERn» ÔEÄ—ôE·äW¸ŒÔÝjÛ¤›$>›øŸ™W�Jƒ.†6·jM¥ø¾Ù�F³†îãK¼ µrÇ.Müô88‚[:ÀüDðÃx0LdÒB9©Ò�°‰ÈO�ü^ðÜni@Ú�hc4[Ê ÐÑM^ÜÿO\k‹Q¶f_"ƒhä7¹`X‹XT?"¢‡óv gÞÅì&IÍúÉ fJ0XõzIU{ž"Õ{5ë�¦Ý{LÈ`G­sâ„:]^©³ãqÕbOÅ£HÇÔåž8ÃU®ODôÌ�U¹A$£=XT€­±»T¸‹Lt«s%¸�EkêGjý—‰˜“/£b{ƒ©’Ž$a¡\͵YIäÙO1w0m,@YóùAË“’‹o°É;ð kÝódÌ-QwGÕ!2]€ª…7Ðb ³‘�c%6a•b„*L¹|ªO;×WÔ¬:˜ö&pЍ@kÄœL–J(É&�U‚Þw –4YXMxõõ†C«,ßðJ£_ŒN’¥úП.ï^ @Å­­pžn ]ËùW$‡ ”ÀÚ벪îBg¥ªˆPJWUÒÝ»Ì?èi¡|¨vh�¦‘Ë‚gœßÇ©�ï˜ÂK€i%{*~ð4ꕾfHÃëì^„išØøST‘ƒÛ lXÿ,5à÷?ªûLz(ý"Ì”9\JÀw+6Ù ô Åg$w�Õåp�p ЧP;L“= MÀQ1쯅ýÄ™ÅÐ~É«)3Î#α~™Îxý$y.g•h$KB�}±ÿ-ìȱÛhæå1>Ú ¬Y–ÊÛŽ‘�R­aæ›Ú?ÄäŒÄÿ[‰› T¾3ÉhIÕÄ1ôÌ2%¸~#Ë„C-à_ëæÇ¹z*¡Àhº;„ dѳÞú-äl°žž#¿¾^Ý÷6Å•†i:ÞZÜAV9‹?5,æ7PzFªT�Ù’¯¥¼Žõ‚y©¾© Ac©)if­)Âø#Uç?XV~Ó½¡tYî˜Ûà u&Xë�S8 ZüÑæ*z0Cên¦ü‰B¹šT&ÏÝZ¡Ü)ŠÌч$O·ã‡ÉÅ¥B¼Æ·µ±[¡34wÿ‰¯@^x²Y^Å‚½Â€ÄXÍG—�X[ŸùLÎùÄ^/�!T;Ú¤R-'÷iò i¿÷öa6@Ø036ëNGgl�M÷ý�ÝÞâaòÓ ·4š$p�”Ó8¡å}ƒã%„|1iÏz«ãÓ<Ü,ö«èS-&ÖnNÌuî#ꇴ_gó'H¥¹·^md^·`޵ƒõîŠ ðXé”Úx*œt¹‹Ûvö¼¬UéªSŽ_6ë~ááÌ…îâ¼VÇŽÃ$£ßÛ¬ó5q±¼/^™M€Ç\CÑ‹‰i+ø€Jçn�ãÆÏõÇ(/²œDM„¼—ò‘ �æõÿg´\5‡Æuι{(Rò«:ÉI ‚ÉáR?:¬û €ä~†µ˜­ž“Ôwô <»½1HÌc5Ø9ІOî' !lŠëðϲÑ8χ>jÃÃZà´£Ä9ÁY‡ÃºKý£8+5îìP©·ºU$žÚǹÌ^­«JÝ•Þ;@ÝáÉïQÜ&#QY¤6„7S¦0ìù§¹&¢´í��»¬Î›"mò�U¬Å{­ö>¨,V™dy�©ºb�"蛥rp¨Ï±N1þN½Ÿ±I½j¡‘ÿ~e�iVdÔð¦[G^Õ@—u¤#åµLçsDEÉxíY`0R9õ©�¥Ã?ž½W�Òèˆ)ÌÿA¦£…/é|ŽE4ЋâQÚ èA I ¾cÕ§çn XÝG˜q�ì*Ájÿ@vÕ÷Eœ€\�¢FðU}Z‘?òW±~W„5  ^ PµSÇ[dÒÌöÂ"»®Q¶;åX¡Þ�PÄœÉZþá´.Fùe±)|µI¦g:éÊÛŽjÍEiü²ê=u ŽY�Ú‘ #ÁP0Ùß�›E±ò\%0«�Ì��eþ½¬ÿ/9²#6«p£n‹�”é@/‚Ÿ†esÇ/¹F;=ó]� }š)™|¾v}-0Àº•hr�öPf­ Ê %CùéëvNECY ÑÙE™XÆÒö&¹*tú_ø�pöXd½Ü"ø_y\‡¦Ô;ß'ò4Rd°]jŠ«A”Dù®R:›°ö:;Z‹Òž÷eÓö•$°_íý_&ÈŠAv7žsRj©•ÁÞ:çŽòOp°7Bœ¡ÍíÀक¾hi¼T¨eÆÚŒ›€�vÑd|[þ³e'ªÇIÝâ…Ôףب–©ÆËùପVž¿;¦‚¡íÊXJñÏÒü‹kî).j“ÒI+º•ÄuyÇéŒø_»ÅÑO„<˜GÁ‰$�Ê?nªKçùáe]˜ÙD­Z‘¦Bâ¸Í’ÕÞºÏozÒżéwd·aðÆïÆÖä TÈJ\Øì}eîÎNïZviäñÖ�Ày'1ÑÚèœ:ñ?ÑqíÈd5Ôš„∺;±§e‰ÿ‚ÕÔ5u”×9N�áFóA59·�ìá(gmMõšË£øÀuAµB±°§"• Á™ØqT3\ݯ}Òñû¨´9Ãf!,jÔÇvÜ&8Q¢A”‰g âŸëý!»Ï8]®ñýP܉$˜¼`A…±)D}p`]¢�‡I¥ÝŸxr”ævjÔ—Ã iäiÖÖ=ñÄf|ÍÁ‰+‚¥ë zƾ®ðNbÿ^?úôJ®T+µTΗý°Z ½6}Ý1é;'G蕞 ºh´j/_x½f ×Àû°X‰: ¯9\Ðëc·Œ*Åìë*¬^x•"¤²þìËž^äƒsYï²$$íÖmÄk+8»ÂM©ß5qªZµ+k—9k 7ÍJܹ¥Âé6[»o$ªír|×ëM-}à §X±¿r¶à«˜ûŒÍOÉÓ@D-Nt‘í'ïU¼ÛXEz'߈,WûçW=§êóãú펆±&úc+‚;üp0Ô/Ç„w·�—Ý%ä¡D^‹µ@Yž5q¢uHš}†¦)èB*Ú°€+¸UO.ÞÐ ÁåTͼ�«“Ù&Á åKêQ“ée ʘàQö…qpnÒ‡cdç>„'=išK�e6­´Ž¢¾vX4´"¨_=v" !8®‰”é,º¦ò tË #VãŠÎ@x®Ômé¬Vð bÒúä|™ëœv¿)qÂÓKY“jžSçñÆm_d_6o׳–;ͺ½ÌU‘ÖŽ{ ú¡ošMÃŽH©-Oµ8ÿO¥7äØ`.ýW[?©K6…3¬žkûýÒp­‹ÜHëš,®¸; é’$g“½ñ9Rvzú óìð?Y¤Þ ,ç»™£~ýÇ÷­+‰ÆVËð™]…!Ð�›­£ÒÆLàã-×ÞkÖ&>uÀpÎ&~ƒœGo|uLMDàqjçóbEÐËŽm’©$¤w‘�$Á‰•Èqa_©9~Çå¤Ç¾Ü±[ 5Ól[bÄ?.£'¡öñ-ÞÑ&ïÑõ]˜X=LŒcgØÖŠ‹í·Çš âèÆÏOâ¯47†¤Ö€" ]´’;Ó ¢%ç¹Ú%Õ`±6`�œˆ2ù{µÂAì9°õ—þCÖ³ÃÔÀ#ôw²?PqÈyFá”"5U³û–è•k?¿É‡Aú5§Û]L _A,Ÿ)º¹ÛÀ›•�ÅÚM,7ЪAW¬±B÷Ѓ6Å(ž~m"½Þ³ zÒ¥eDxïfZPGs&ïul˜×A@’ô*qXcœsú¥Ÿò/¢VšìuoÔ4ïYë®Wcç±Rgü;÷Øþ±b²ø~èž¾›�21Ý×tÂ^Íž� À^0µ=)2þr'å™�ªÓP¬Ögù›á»Ç˜¶kéJ]î£òò‰ô Ió+'ÝÉßo7çb¾ø²\/óÛ·çh]¡i-ƒ’óÊo=Ãê÷-c–”ú:tP0®BU;ØÕ˜‡òí ˆ _ÍüÇÏÒkcUˆ)9ª¬”ZÕõÜTõ þÞòŒ8v É‹;4álàÁ?'}Ë;79’§zÑ&&Š(v¨Èx{ÂsPp¼œ–¬?Ž ×’´ ƒâº"]xw !£ºÓ_gTæx1Ž#½ó¯ÇÚ(³û,ÑÔgP žLv#n;<žàY…K^ëU0“@ÄØÂq jLJEpV‚»©ü»zr`È›9€c‘[Uk²R¯@©´;Ç<“Ò76L•åã.,FW�°ÿR´Ñ\¶_½„íŽ-efåÓT|Oß�¥\y-EÉз\Š˜4¯mOÖP˜ôT£þ�Ð}m¤Ám@ÓÆy“ýVn4¹Š¿´5”ìVÑo@Ã�Ãå0+B·Á ”(\^¨Æ]#ÕÞ!¿¹“Õç©¡ÝXšlÜûÚÚ÷zÓHMá¨"cDJr]A,ƒÇLG¡VüXH”t¾Üò�ú0­¯ª)E‹7«70íQlêÅ£z@o¾]píLHvÙK¦õ<œÝ†Ž5D›5§j‰"£ç ÞÃÐoÙÎ ¡Eãfm0ÝònÅ˱Ò÷;,‹“ñò8¬°­ ÃöNáõ{ÌQ"êPRÚ…g!V9øq®µ~Žé-ÛCúI1!ÎçèãäõÝü?(ÄlÛEN…V\ïªIÇ­¼­¿„ޤХ zBòhzj>y¸*ßûвQ}š�Oïõ‡®^aènÙò$bæoÙ5ž>¦œÚ_?C°�°î—†„äNK±¨ó&hd»Éà °ÊÖ tð¼Þë’DáÏ3c¤ŒYÔ·­‹Ü}Þ–$,+Ûf+Æ-5¶H½=.ŠÚO¤íæêðÊž#Q‡°ªÿWtâþëKWRßlتm¿›WßÄ5·Ÿµ aDs*ARÐßêDVF0ú· £FñŒÈŽνéä­³�z¢æhD”t(ã•YÑ=)¢Ù`ÀW¸­•C¿¯Ë°l‘8œ·°`ƒš‰Ýµl“ÄÖM퀽èÿ?tÉÇI Ýø˜t|­±[ò!Î_8Êc5^¨Ã˜;�• Ádö̹«ºZªÿÙqjackctl-1.0.6/src/images/PaxHeaders/aportlti.png0000644000000000000000000000013215174607203016775 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/aportlti.png0000644000175000001440000000031215174607203016761 0ustar00rncbcusers‰PNG  IHDRíÝâRPLTEpH@€€€€€@ßßÀÀÀÿÿÿ³)òtRNS@æØfcIDATxÚ-ŽA€ E-ÜSkÆ;Ø’8îÓÑî„Pbßÿ¸V[µ¾\Ñya°‚Ð2¯Ú)©PpHx3��;µ>…„ÚÙ{J6re¸FŒ#seŸ9ŠÎ8“ýGí�bóÙIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/up1.png0000644000000000000000000000013215174607203015644 xustar0030 mtime=1777536643.508914341 30 atime=1777536643.508914341 30 ctime=1777536643.508914341 qjackctl-1.0.6/src/images/up1.png0000644000175000001440000000030715174607203015634 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®Îé�IDAT8ËÝ’Á € E ±kcØ™ìLx¢"TŒñâ¿�–þ—6-ð¥–Ù%g‘´ÒÌ"°´kéÎ\ԃЈYƒÐ¨¹¡'æÄ”$3ŸŠ¬µS% î€�ès7¡Õ B�3Uó” â1˜ÞÛ¦·çÑ› åÏ�lakðG×ÿoƒIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphColors.png0000644000000000000000000000012715174607203017426 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphColors.png0000644000175000001440000000256115174607203017416 0ustar00rncbcusers‰PNG  IHDRÄ´l;8IDAT8Ë�•Kl\g€¿ÿÞ;sïÜßOÆã±ÇqÝ&NB¡T4›"  ¥ˆR‘J¥›n`Á‚- Ä"b…X TX!RHÓ¤-A}ФMMó°cãG<�3¯;÷Þ¹ÿƒ JÚZâHGç,þÿ;gõÁ.qõÇy1:S·Î7L¤uÁ¸ä)v'$¾°Lç¹'|m'|æ´4÷ßÙ Üúw*ÚíN9·?x¬\É=JÆ®Ki2ƒ¾ìêá[§Ï…úÅ%½ÈÿüÊ)ËËÔý‡÷LåŸ.–½/ùžS² Ž­ CSµŸhöô‘£KƒŸ¥°´Ð0é‡öG OÛ#þLñÛ“³¥ŸŽ�ú_ôÞ‰ ꥎ­1‚²#ϲ<×v{í¤vnaø¯fÈʳ_p“W•Ùuã—žr|"øN}vôGe+SK~Û;¯v‰ûŠt5Æw!Øç¢‡š45^4doœ’»ÑÔ�/hÝm~}\Xùñü£µÙÒËS…š^ŽEûb‡^WÒr«ÁN¢P©"Ž¥¾y[ö»‘NâԘ߿�š]ÁûNxc¥‰üwóÁLâx"ÝW!úô[E‡Û‡sXór´A5ƒXGJѶ-à#`ûídÄ©me«#'‹ªß»^;ZüCæ$ 1NiÆFLœYAm&K9°J#ŒY­œx W£�y·^¢·ÙGß~î«�ÝÆÎxåÂ3òÁû£û¸õËæ)þº|ŒÞÀ0?½Àt%¥à‚Ð-5FŠ9áΔÄþ¹šxàØ8ùýEvbÉ`3üï§txœÅÆfÆñ�z,söúZ‘è¦Dmk–††ø`ŠhŒ4h¥ÑÊ ¥Â¶…˜™òª“eûÉN;yÜ÷ä‹¡üù冹$VñÄ´–]™s„òÆeƒ¹­×¨_?ËìÚ Ìógò¦�N5FÞM…–K¢Pj¥ dFM:_û䄸~5Ï^ÀrÒ É@¡u*)ª6_^æ¡O½N˜M˜ËtØc)´4 5JiŒÒ¤‘2ïߊ¯]K#®PŸßïÔËy‘Í‹ãÀA`Íi]xÏJ¢¨—†*NMÑת6¹D Z6´²LÄ”ÁH�j®­DƒÓç£Ë¯,™¿M4f+kÕNLó•©Që¹ õv¨“…†ÙLm@Ù¿zÞØÂ*™0pÍáʈý‰JêXfÓðÀšÍ“ý*õõCÈ7N2XŸB¶Dµ4̪éÕ¼5ŸÍPUJ‹+ëúÎóWy¹rØøŸ„.­šè¡@wG]ñÈ´oï9’fÄ1eS×ÛŸçö›ÇYoxÄùU‚êºp,åØ˜Œ–Z¬ïèøwï˜w/orFjÞz÷ÚÍÄ1Û¶VIÁanÜ·‚¢ƒ@iúqJ˜ÙB�]#7y ßï‚ÒB¥Úl´uòÂUsóÅE΄)ç�5@ݧÍ�>éNO/‡¹mk5íZ¦”µ¥íMá�/Q¨ÝbdäF)ÂHË…Û¦ûüUóÞ_nr¦“pxHÄÇxÞÊ;ï��ßÜ7f}.ȉ²çàeD˜hÙê›xqÛ4/®pe¥Ã?)¯7€ð®�Ä.—In9Ǥçp`¢ =S3†l+"Zí°Kš‘dXZÀð^Ëí¾W« ûA½û^é)á~³üý±Ë+™ºIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/asocketi.png0000644000000000000000000000012715174607203016745 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/asocketi.png0000644000175000001440000000137015174607203016732 0ustar00rncbcusers‰PNG  IHDR(-SÑPLTE #%;*+;.0;<887$=9=:>:?;@ADD=IG$JH$LNHG=IH=LK=ML=ON=]N#QP=SQ=\[UT=VU=ZX=^[=gfa_=ggb_=iieb=fc=ngmnhf=nojg=pqli=ffftmnk=us pm=uvvvso=roItq=trIws=yu={w=yvI}x:}x={wIAœ$}|4B�$z=…ƒ �|=‚~=€}I�}Iˆ‡…€=†�=ƒƒHŒŒ�‹ Š„=‹…:‰„I�ˆ=Žˆ=�Š:”�$Œ‹E‘‹=’Œ=�‹I�ŽG”Ž=˜––�=œ”›“&˜’:˜’=—’I•’Tš”=Ÿžœ•=Ÿ—:ž˜=Ÿ˜=£œ=œ›Y¦¡,§Ÿ:ÿ¤¡Aª¤-ª¦1¥Ÿiª¤I­¦:hÌAhÍA³«Iµ­:®©j·²1¼³,º²:¿´-º²I²®}Á·-Á·.µ°|º)·³|Ľ*Á¹IȾ:ÀºkºhÇ¿I¼jÉÀIÎÄ:ÇÀh¾ˆÎÄIÑÆ:ÓÊ3ÑÇIÒÉ?ÈÉÕÊAÔËIÍljÝÒ:Ðˈëà:ôèAõêBªòntRNS@æØfÕIDATxÚc`Ài©I±áÁ~ÞîNöæ`�”éS{'÷´55W˜j�¦2¶N›2±»‹)Ù,ÙÙ$'.ã�] éÓí›1!G-=N,àߡЧÍÂ�ªðnâšÉ2kGm¢¯IÙBz¹à�µUäJò¦ÿ}ÝSx_5£qƒ–bìœ`˜°I�PÆÒÿr¦„€Nr*‹]Y‰iÀ�Oð<çÓtúBàÞ‚¨³¢¾ˆòåeŒ›E3ÀäšûåN.œ ÐåBj Ÿ=vÚ^ïEö#½®¯ËÀôáILsDªX,).>ù†µ'¼^ ˆ^qr÷Ì6nk¥×.^ÙTRCøÛÆù¤Œâw,Åæ¼€ð<ž%18 Œ®*ݨ¢ÿ¨�ÓBBVÂÓ9bu*€Z�ö„ÉU FN’Ê z�Å«6•£Frô‚€Œà½€Þ Fþè+Ðvr^ˆIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportlno_64x64.png0000644000000000000000000000013215174607203017650 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/aportlno_64x64.png0000644000175000001440000000343715174607203017647 0ustar00rncbcusers‰PNG  IHDR@@�·�ì÷PLTE         !+"!/ "$"(&3"1%&'%*'/&4%()')+(.*)1,>*8)+-+A--/,F-<1231=4675796A?9:8F<;=;>@-R<J?;?A=?@=I?/`=AB@LIDD=HF*DFCGHF[IjEJHLTH4mHKMJ_P_T sMOQOdQRTQaS9]ZfWTVS``r[€WvZtY%kd[]Znbg`2k\B‰Yl_3d]WŒ\xavd`b_k`Oo`Fjj €fbda€f`egscCueEur”cŽhhigzv‡mkmj‡j/•mnlp¡gyƒtmol�w ¤joqn€oN~wy;qsp†{�q0Š~~}3vxu�ƒ”}xzwS²uz|y‚zt–ƒ‹†&}|”‹‹}f{€ƒŽ� €‚�‡>»}žŠœ‰•‡?‡‚��Œ3 Œ„†ƒ‰ˆn���…Ã�Œr‹�Š œ™•<“‹…™˜/˜Š…¶‹/��‡©™�‘Ž’�”¡›;˜“‘”–“Å™­¢°¤¼™ ¥¢2§–‹Þ”š›˜¿¬¼®²žŽ£¥¢¿¶§©¦Ä»©«¨ï­Íû»_ö²ñ¹ÎÀ:¶¸µÉµ¤Úͺ¼¹úÀÔϾ¯ÇÅ|¾Á½ÄŜúÂÄÁÇÆªÈÃÂÄÆÃÆÈÅÇÉÆÉËÈËÎÊößÓÏÁÝËÀåà<ÐÒÏçâHÓÕÒ×Ú¶Õ×ÔÞßµÚÜÙéémÞàÝâàäãåáéëèñð¿ñõ¼íïë÷õÄñóïðöøô÷óÿûëþýôýÿûkôöVtRNS@æØfÖIDATxÚå—{lEǯ3ëÌ.$u\¯Ð"­ê!ŠEÝàEE8]_ÄøJ«¡€ÖÇ©5XÝ‚NPÑ…j]Äúl4p$V«¦”ú¶kU¬<î&{5D,û9>-©ÝÞÙ¿ÿÇ-îpwVÍ´u× \¶fç]ýûúÌJêdž¬S_šÌÁWlZÕ÷$ãi�žŠW7Ì(¾üLÿʶ®Ç2?í¤=Vt6A%{?_~òä ßü¸­]}-Œ´÷öXº^],ÿYãß~Æÿ–Éír�˜¥Gç̼tÞ «\_È×  £çûo•ÇÎ�ýk"{õ˜è›¤? à×úåsáꯅË?"RÊš?¯önç¬vξ³s1À`wR÷ék8$Ç×0Ã]Ñ¿ëuwÜ-{ž$yå™îI� q>$´9Ú´ÐOšˆQÊ.})³ðek\K/“3KÜtJå΋že3³$.¯XèZ·_ëMjXy\ a2Â�ŸÞéW¿sŸ330" 0A=Ý—øOéÈé$[›d€%±æ[…xf¬ÚæBÔk޼fm¤Ûëf¯«C5§žÕ±›=7¬,£×“àm5ÏŠÏzTu·mn£�‡¢Â“¼Àe.i¡ –hÝ�Ì3¶È©Ø`Û[ôaÊ�K»�Q.m±ã­¾|F]4¶çµâtÔÏmû8£dm÷ ?cÇÏLÀí«„e€ª„¦z ³h(#£Ë+æµ/{.;Ìh*gÎS�‘9êÛ¦XoçŠ'Ž#øAù •: *õ£ÖÀ �IÌ ÍnÇD�tçüZà·;'cpqÇÝÔZ”B°!fšWk8ÃÜ÷¶¾çÒ ð¹ÒrT±ïƒ~N8œ¼7u7üØrÛ«Y‡Z€(”–b-Ó0Áö`,ÝY´~ÑQ?HDÿa�2h8ð�  †Êòå�tÐýâ¶üÌ€Â1ÆYÁ¦æ�ÿ0gbž6M,sY6´p*A¨¾Œ¦Ÿ^Ì�Î±Õ ÅyXõ£µ xZà$•UWüHNØ JQ^Æx€›‘?Zä¸ ŽnY('fØâ òV7 [Eˆv5ë#  Lçb~�ÄoØèöò0~��¢yÒ…d¶?=c•ÏIñ5ó±Š5"<;Ò¡´ ©e¾˜x(Æ,½a:C ć‡òl µŠ&øN©—´–F››Øë£- 1M º4 C º4—Þnˆ"ôGI�]Ë©B=ÍÄ(X£^]Q_ƒ"¶Y¯ #[,ódZEeÅ¿+3”ð„¡åòÄv‹³�`¿À�oû½#�dyö>UãS¸¥V(2F¢z-éó c¦(è‘p…” ¿%‘klâ{I¼Ê RHÐfXñ!ETó •$¿ú8ä'Q⑾}qPð±júNÅç§g§—F IDATxÚí]]“,ÉM=ÙSwwí �#°!xàóëø <ò+á6 ŒƒõÞ;U•‡‡ªîÊTJJeõìzŒ»7fçNVU§”GGÒQúçùWþò׿Ä_ÿê×ø4=῾û¿ýÏßâõóï±¼=ãíõ yž‘óŠuYAf¬ë f‚Ü~r^·猼ÿ�sÆš3ÖLäœÁës´àöo\ï÷�A€8î‡xÎöPþæþìý)Õ�Üß Û{C{’öšê\_ÆòÿRJDZUï�nÿ?¥xTÿ«:Ïà-%í<ä[ú›&õ|y{ïöñÛcÚ±Wp|FJòX]îãcôM݇Suî ú¢ØÏI^ãtœ •sI´.týù”$.¿õ,Ÿï>‰ûÃÉ|J꬗é/õ·ø»úüæ7ÿˆ™Lÿþox�?áÓןðòÃH—gÌO¯X—H3ÖuEÂÀæ�3�.2˜Òį́œÒÈB¦÷YßÏÛõ8Œ¦q´®aí ì®>}C%©Ú[J×kQ¬^Öu«ãì^±æOƺWíoÁ²³ë9j�WN.ùÇ]]*åû"S÷û@µ#IíéZÎ@~oÚw«|Äu’çI.±ö|コk0³+ÅNŸ¦ öíÏð÷ß|…üǧ¯ðtIHiÛÙ�ëOäÌ ìH€,vX^×Y>výòèlDæ¡·»!) ¹ùÛpTká <Ç¡^l¶nn[L©^·ÅÄÛâÞ§úµ3I¦FWU»ûâÄj³Nò=‹PX-Çìù„$Öß«¹/&ñÔ`D»•/K*âSÏ—ÎUküÕÇZ0ÇÀ×ÏúETP�…¦é ó¿À·)áëüâÛoñ4Ÿ›™kÎÒÍÜ o‡ôdÞÊpà°àÚëìï‡Ò‘°8¹kHQx–«üfHgà�ò¸áh¯TÅH·Ï®— àíˆÞ6Q-j�°)5�1¤…¹7§±÷ë¹ ór0ðòä#ÿ}¸!‘d\×[TÂÛw@åo÷˜é æ’õâ@±am›@²¯1u‡p¹\0½ÎOø«Ÿý)%|"ñçß|ƒOŸv4ÀŒ¼kÞyÎùf˜›ÁgàæP;‚ºå.ÉÂTࡊí¡8�ÛK…S8øèNA º£j‘�°›*|¾9yó=#Ÿ1óaÀ¸¬Ç8bªzü_]Ñ#EØ„ò¸ÊHÆðíÍr“UƒïÞ™%ÿzî΂M¸Y‡Ô ““D%òYÉGº±+K6Ñ “R�� O.Ót#,~þõt{QÎÜÁö!:8vö¼‡¼:‹+ÙX8�ÊTæN�J±ØÑn gP"ˆžW΀íÎȆ¤ë¥=2¯$C£½ˆ{!@I%°±.ë ÷,”]ÔYCä¤l}ñPT/vhÃ<>åËæbi_cê.;ÎŒ­Ã)}ƒ,BkȸÏ݃Dú�šÇv“2+‘TÂÑ\@4â]+¥Ú ¸Ùr·ê¶ÈnüÜ{FÀ–±¿÷fÓ~g�¹ï¤øÇÝCšccx¹ÑSÒY�œ/˜¾ývÂår,ÐÏo+¾|!–yC(òü‡Ñç D`ÓWuâ¿Ê ”Ž£á ª0äpÒa´;?%²�’uGj{¦îê«Ï̹U¡†6#+�<¹ý�´aö‰÷1zÇH)�n„`Sß3ÕüŽâxÐÍØD„–EðòÿêU7?[Èð¬žÌ$R~CÚ“ÂWî ç|Àl%Ýx‹ûo�‹¨ƒ(+ª2 š…BUas×ÄAfˆ`7=ÙÕ�ìUvQÏ4°é¯X1ŒSi‰�E2��b$ž_ùl^ÏN¸þ>iÏè·Àº%m¿¾Œ8…>;ňè÷Äå]— ¦r]®Ì˜–9/[Ö 0þ¼æ 1@”)»úþX.�F�äY“‡!ˆ¯ 9ƒ °I6$�„â쑃%"IŠÑë]‹ ±Pì×È;Q-•KuòDDÏS顜Nƒ1²ÀÞ©¿"™„l—ïè•O3DÏžä<_ž3&®ÄÓÕ!, ¾^– ! MKPÒ‰ûW’óýËre¡‚à TG€º‡Aéblº�Р)0ÒŠŠh8§/�MÿµÇ-ØíÖùbÉî2öwí3„|'‡PÃ_ÂâÆCˆŠövª¬I¸f�,„n¥%¦36| �¹ Óò–ñBà›|÷üŠß½Î·ÎE°6Š›cȇP¦zÝGåûRV¢åªf¹óÎ@ ¿d,o/Xæëº`]¯mάÈÅö× M•ÖÁ‘K¨‚¬L¬ÔkᤖÍ× ŽJ�GÅ85¹3 QH²�MÁŒ%yrG«�£°jš2ˆDêdÔHE m>}ÒÓÞǺ8ÃhFCr<åÞ“xåèÕ )n�øÄLóÛŒ×ï?ãy^ñöú‚—·­a™36ùô’C¸¶D³ê>,ÓŒzkcí,¨ô-ˆb%z¡EÍ!´Î@¶[Ù‚Òhm}Eš|A'–ï Ÿ,¤ñ¶ÚH”S3“ºtž  ´!c6DyÙóóÂ!0ÏøüüŒçׯ/óÞØ´‚kF^·ŒÁ–v¤Zº,›š(ERQ“ T%6ªI‚d:ŽQg`†B‚­z?I¾iÙ š]$²Ó-f¡Z�ácr'v'y”�ž­ xÀ!¤ï2T¹Ø?¿GÁ“>Šaò‚'�Zý Ó ¾<¿àõuÁó—7¼¾Ì ×Ýà€û·ž{ú’ ÔÌ´ªD¡«¨¤"­ ÄVàÔ*UŽAI[R«H4Am�J-ùK4»ÿzñ5Cð´W%¦ÁcÎ"”n§«-=ØPx~í‰Âá³ÎÆ ŸÂï3,uiõ½S^f¼¾¾âõeÆ:¿!¯+¸×!¬k-„´} 79ö빪‡Z I‚?PåÖ”T¤^ŽÜÖÐØík¢Ò(mnvUå¢+ ÷d —ˆ¡�´®®Œ]ÎS60¦}Ëj�'Ù2žI±ñä©:ŠðgpÈÁ¤'Æn�¦ež±äWÌo òº`]V¤}ãM) <$×Y×Jv\†PB+ΊÂ_ yª3Ðæ0´Î@«CPBxêÌ6wàUÖ1¨³ ¾'ßάt7ø8ãÖO:dÔtȨ�p÷ŸK4Ô௭Jqò!NáÓÛÛŒôtÁü¶`]f�ײåb|[QˆTÁù]¡´ŠŠ°kÕ™!Ë*î¡ ¨v-ÒÊ¢ÍIhÐÑæ7°�ÎagŸ{¦:/6Ú‰H5¦æ€MÐ��Mññý Ê ¿¬“K®éÅÍ<ï)N:‹‘,…ãý:òvÑ&4 ¦¼®;2¸:„-å˜×«ž"Õ]ûê$ò‡ù˜æl€-T8vxTzZ s…Ô)N†ÌºQå¨ïœÂxIÕ¸Ì4[rv5kQ°Dvx:‹**Ê:$Þ:¢ƒHç(¹ƒaÎä'�î"ü>‡„©ÆÐ”×Ëšv‡°‚yÝ+ËÔ¢V²\—gRLÏUú„hº ©ˆ­:á‚*º ]Æ]Ž“×�¥ÔlÅá´µ èï„ #}Á�oUv°wX9i$,i å˜A ‰· ‡0ãä*ïæ:øãsP«rb^ñö¶‘‰ó<#¯ –Ý1ä¼"¯;¹¸§o ™/�B[GPù‰‚h9 ™Y°Â5T†£… BˆL‹n:ÕHg’C†©Bumìü.o. aµãqaã—é8>—rÈQwàýéŒO¼®'ëp6gJ« `šçË[¹"/+¶"#݆»nsP x•¤`©i�ocÆê:‚º^AÔ4EIµ„»jøŸ ô4b+jHa ÕPØH¼‡l…¶Ü£;�*@ÚÏQó޲`Üá$°j®ðž\ý�†ÏsÖ=fÄgåó†ÜXµg"1-óŠe!Àëºì�L+’�P+sˆMCSaÕ_ªBýOÑÄÔgr\Z�«‚± -TÒ“†¡iŽ@#9oꢠñ”`¸ ‰Z×3C1}”*Ê¥oÈ52Žëi¦ß<�þ`”Ódì`×ãø9Ú§7-ËŠuɯ!Šu]q¹Õ´Ó˜ÚùGÅ!výyTDbs„Äš˜Ýè jñ³Ô­�†±Òø"cM8^5�]Ò3vrT‘CïÎèûáCHì�qÒtˆ¨Œ•KX:Ó´9Äjv<ˆî)€ò†Àlu Ö%8Â…+ô?f0äªë±ÑN,à|*·ÿæ§&ɶ£±tõ¬¶ºŠlÇÇk|AÝÑæù©!8Ïí@iºÐß‚qNJÑq@á&'2@NŽíögQ\ÇÁDà™v¡óµªó>Ó°;·“Ôâ»èÉ�ÜÒŽëš�¸Mx¾ÎcȈŽlÃF&Ö3J¤p(䪣YŠnGhK¥Ž�PVjäÖË´$k^B—AwGÿ¹8ë ¦Ò‹ñ!Æû.š'¥ûÆQô,†4ÇS°ï†Œ0$$sŸàè©ÇQ£DyMØZwíÄ«†bÞë ':£é/P ;9€¥*<Òú j Ä$¨&\P´µ €ê �D¹8¼òäaÝC#µÆ~G¢:>žÁ8¶7zÞE÷òt Ã;ÄJ†É¹a9´dìÙׄ3ïïÜHbZ—ë ïá2äbªs^k ™)Ç&§Ò­u4›‘mÚ"¥w  }mÒ‰´B ÃHÒùvº]¨g ú‹ÇËj0gvUâ‚°ïÁ€kŽ }âGLÚîÇÇXrðR1Jc „0c¯3[¢S´æMÏÌ`^öVç !$QÐê –Ý†©M!†«÷5°�±µŽug p züN£‡A›ì¤s š3`»¹Ál\ê„�soqŠ™Fv} Qrpñšöµ\ÞÄqgì„(ñô‹¼×¯Žâž»ÑÉ�C ˜·ÚƒkÑQ5sÑ8Îz§K…/Ð �Œ0ሄ–‚PXr'>—Ú D¦Þ»`J’›C$T€ÝéL|¦5…5¬7h9¦`­FeøàÕöZ3ð4Ê­Ç5$vŸ|w¼!─käu!ÈÞË�‘¹q9¯»3€†í«€@–§òÂ6Y1^ê$ˆtšt2Ð{HM¶ë&lg  ü�æR81´åä$¹ð0Ù¸ûµ%üR”KT°§+Ã�Ohί,9&�Œú(¸Jy²ŽX -cI �†4ôÇsŽ‡ÖŽDo�30¸ÕçF«Ôd ÷{tŒvZö¨L›Hå¹tÛÈŽp:zÙy¥§q¡ÕÀ”®°Ù¦ZM�˜Å˜4ÉÞ+óX†-r¸+*YõJôDé‹�â(e7¤×úlö3T¼�! êMµju¥ÀnlµçéH‚SuG ^^[7 h⻩�•O;¡"5BVòĹ�“k6‰ä©ç~3¾t] ¹�5b¢žõ¨’jƒ”œÛ@Å@we¯ƒ7ÄECÔÛq{ì¾J:!–Fhw»)Ñ*ÅNtØŒ"cëÏ8 Fk ~¢ôÛÐmë :ßm§¿QM×væ2<àµrðJ›)ÅÉàJt5…‰†«Ôê”6f�F��‰ zFܨ«ÛY�šè�(;«9g‡u06¼Ä�–=ð©}íXŒ~bèkUÐO\Ï0…Œÿ½ ¾›Ž™Gè�e™2ÊÐàØÁ“Ì-ÈÎF¥I›"]‡µ‘S\g ³B¥X�Mc¿ô´ qP»øÈ˜Ld PÕiu>CÆ}v$yhÎ3Oìêd8Ÿ>rèñóëðÌÒ¶ kÆ$ÁΠ™³ÊBgØ{Mõã9�!l;~9ÜU�yÅe§ÎT-ÿHuΣR�¨å§•ŽFÕ¨„"ÔŠÅ.ig•Ëz‡p&@»ß  Q×áˆZcÏÉpœí±§5ØÝÃO�; c:û÷xþïœsy/LºfvåäjûO°Ç:�H)•F&J(¡=O¶X×CV\g ñÔç'xÄ 6P¶·8i‘†ÚŽÆ4`ìç¾éÍ È¢t—n´Z1f¹ï)ížO9Žþÿh ú}8„=þ¯ª×Ù N"�šCï@–07ai<õLHË4Zl�‚g¸Ô8wf�Ì$!�ÖGáÎð NŒÎ;·ƒ¡!ìtf‡I#~VŸáOÃð!ß 2߈ÅZä´îlTVU…e!k`KRG¡ÎZ°��"À9ñf ÒàB»}˜�û ´öyr ˆ�㠼Ƥ �ˆçµÙ˜]Džbz>Œý!ïÒg¬§)CV†cfXÏT¨ª+à‡ r–¤“�Î@IµÊ“+ã·´Ø3,:}3út=Ë@_QÙåO§öÜÞŒ€í fB¢½ÞŽÒ Ð÷_Ä€Rï@8r×D¤€ 䧺ø(ZŸ•l‚,knº%¡ Á%(S‰¬†"³ÑHÑd´úôI�0Žq š¦b_u¹7OÁ5Ò!Åߣü4L¨ —í¶#ÿìãçc·ÿiC†=\`ÞÈÄk¶¡á ”ï€2õØVjõUÆBJ­IÙõj6̺a�²eÈpBW‹• b`„]§ ëÝyŽNˆ F�»¶vªá¦×@ESð¤Fð“… ‡3ÿ6”Eka®G¶Õ­Ñl2j'£(bbÓö¬ÕÐl^’q)5„ düJBY‚ø‹`3”©FÂnÚ®g“ñØžªæêxxÒ'<¼Â�‡øƒ9„R©�»ØL]©”�):›å ½Ö@*K„Pgê9  —¾ÀJ#ªºd‡ý¶‡µ¸–ͽp€}]Æn@¯Žñ�h J.< þrån]eP$ ›Ql@›C„®–$eØeE¢ÌfÈp¡Òs¤ë ª�\QG"PSˆ¤Ùm*›¡¼pQ9²öpÇeÛϧûâõp4d¨…K áû’&hêôªˆY @ûÌÖ43YC@(ÙŠË*"�˜�[sT·Ú¢ÙƒÕC�É�øŽ:„‡½þ)’ŠPvå2@[;P¦eAszþQ“`§D(uÆ¡ç:uÈkaY¨ª9ä ;ÛÁ5L_¬Cr)J4V\Éc¡?nƒáà²@ ¨Œ_•T×bY£D¹•T+ìGv:‚ªJ’ªu  ;DˆÌrЈ<­�øDHàõþ+(ƒÖó«l€6æ±À·3ØTÊ!+%\—ý mIrÍhiH64ä"ëþ*IJH ޳h Þk®¡. Ú%¢P‹åp`¿wÏÊ#�·Ç­Ë!@�î„¥f"ƒ’+P4G@Eë}8¸�¦@hh“ŸUnÁ ŒY ¡¶4L6\†aø§æ~Ì[Sú¸}4R±Ö;Ì…¤ZYoAîYjH}ä ¦=+EJMÓÁ°äš‚#½¤YfŠZ„²Sâ! [×)4ÏiÂm¸«=N,ÔTäVÚFÿp�ÛÇ Äô]@FE¾IÒ‘JSR3ä½lˆÒT–Eö¢Ž«¥3hukY41ÁI±6 PÒ‰l&yô—Ûóó0úÇí�! êa€¨�$]Û“ˆþ!�&{�VE©LCÊké Z§Q> Gfü·‡7yÜþp±['Q�Ré`T²�z’ÐVdÛãH…Hì*%\‚ÎPpqžàǵõ‡±?n9d„*rm²U1’·)ÄŠ–ìêi-:œbR[å¥Ã°”Â"1¶—J<ë †}�3|\»�Ê]¢ ”"«ZY\=±¹—Y 6ÉIŽo£Kaí]¨xDR‰�Ûãö¸.€Ð:T: ) ¼^wP¿‡•YÐzh¤:Y9=sPmì�èA?ÀFÍ(é\ªò`e ÿq{Ü~<„ÐH®cL¥W3ì-‹@~G¥ô‰Gÿvx®HtIDATþ”ÒcÕ=n9dØ{ìSÂår�pyJ¸¤'¤”�.iû�.Å¿÷¿«ßÛs/)!]¶û.ûýÀöRñzl_ŠûÊÇoÆs5 Ûk¶ã- +ÏÙÎ'©(�±1NÅXÓIÃöï:…;œÆGö7Çy?œâG½ýc=ñ1Óª­‚IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/client1.png0000644000000000000000000000012715174607203016502 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/client1.png0000644000175000001440000000047715174607203016476 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎéùIDAT8ËÕÓ±JQгM4hc“ÆHgã/؉¥�•Epÿ&… …46b-ؤ,,%…BPQ6¤0a-\–]²›¬œê½™¹wî̼ǿ·Jz:¼:ÐhvWB=]»9¹À$H��f×xD4X ®7ØÚiã½ Œ\îŸãÓB‚Vÿ4)²‡Ç`޽Õ?Z¨`=:<==59;=;9:8CA6?0<=;FC;?A7BC>@>EEGIBA:5GFEB6AC@:J:GH6MOCGIEGD;MMJIB=ONBMNIKHTUUVEPPTRATHLNKSR$RQ9[ZPROJUV\\FXX^^B\ZZ] E_]WYVec]_;geN`_bd []ZLgYQeXec.Lfcki_a^ff‚BaïDøÎ‚‰’` ÏV|ê /ÌU2·`þØjþ!vov ò‰äoútýU0aPÌÆxêÜ?p\\Û?É›\9qiÿ\®^ò_ð7O†ôù-€º#?]‹Ç'”ŠÒåÜ–øI™1AÞ7ê1ót"ù˵À@‡â�•zËõ™1p±|+xr!‘˜û¢NYóêêG�¸+ÍÃk-Ãr¯�ñùdü¶µÿíòòµfÿ¬o v•ˆr'I$ÿ¸ÒÑT³å…€� Æð!~e.u�X|æ¬RQ^”Á( ¸8Q&"r�`O,9ÙßTõ`ƬA”¡Ê1®þ3gkÍÓYžà.Fm2Af¿ `ˆm{±(Û%©¨MR,û.«@êËàî̪�§øï™²Ýg@ØÄ9g¬JݲÅø`¶9–Á9ç¼dƒ)Æ$àð,Lóüèúõ.3$)“³D4$ÌmDC&YqÙž9e‚Èc¤ƒ°If¾%ú< ðõ$Iˆoáe¾Cùþ ™»)FÌ-©Œ•ÊzŠY„Ä dtP"*Ì#À'õ¦®'›¿’ÿùóŒÅúÚË©=IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/qjackctl.png0000644000000000000000000000013215174607203016733 xustar0030 mtime=1777536643.506914356 30 atime=1777536643.506914356 30 ctime=1777536643.506914356 qjackctl-1.0.6/src/images/qjackctl.png0000644000175000001440000000321515174607203016724 0ustar00rncbcusers‰PNG  IHDR szzô pHYsyyŸé‘tEXtSoftwarewww.inkscape.org›î<IDATX…½×mPTeðÿs_ö�…–EX¸0­.Ь¡-â�k6jh“©ŒNehÖ”}�hšÊ¾äÔ¨™(9}H'ßQQR\EÄRy±� ¨eL‘6‡meÙ]O\kÒP¡3s?Ü™gžùÝsÏyî¹ "H’ôlVVVaHHÈÛô8"ÂÿqqŒ1Sppð^¯wI^^Þg³fÍ*W©To2Æ4Œ1†QA.—›,‹Ôpñ<¹]7=Ë23§NžœüÄ¡Ce/vvvnfŒ#"ïh8�ÇãlkksOœ˜è;[_Ç••• NŠc«W¿Ÿ’’’’¯T*scáŒ1nTZGÏ b‚9AÖØØ€ææFß8ç=pà9Õ骗²_É0•Båo1Æ£ðtwwomïèpc$’¤x�½²Tl9³C-sµq“&D°/v,I]¶xìF­Zø„1¦Q€ ÍÍ߸ÝnLNŠñ™cV|´Ç+‚�ù Ò…`mî"ÙÊÌñYÁAüÆXȈ€ˆ<½½½¹gÎÔ4«¸ëªP�¢À°iÛE-¸€AW/äj ÖnZ(¼±tük:-¿•1¦‰.¹»°®^ùõêÇ?;:�Z� 3¦F!Ú ÆúÏÏ£p{û{ ×h°~óBnåˉ/è´üNcñ€ˆü~¿¿êìÅkÕ:­†0%fL�B”A…-;›PÈ„¨Âêžb:8ß$©÷ˆ”awJ pÃØ7‡xmñ¸(•RÀu§öº_á¼1€wW&ãéñP3ÂÕnê.\ÇÆ/›Ïµ_q¿ •ˆü��@Èçùï;ú?:p¤ý†ßOˆŽÔà[,"B•¨:Õ »½}®AH¦<ýd,>\•œš4V›'а2ÆøGž�Áùïû6ëpƒÑ5â¢5¸ÙïŹ¦nԞëÂCd°M�Çû«¦$‡‹{Òcƒþu1¹cÛN_ü=L!²æÚŒ2KB¼>Â�¿ô¡µ­Œéó“g‰Côã�¡å§ž„Ý?äùû3Ɔû:îW<7oݺýé‰úîý%•¿Ü–¢ƒðä”H,šžÎ]r¢¶¦ƒ®>€7aöó«¡ÓÇK*UðÛ†}bÞ8 zúÝþ¿½Ô[Vqú iÔ"dž"ÉŠK—ú-ß`óÆttLBã¥. €1¦Ä=2û Btõ¹üïU8ª‹+~Æ­xŽCúŒX úÕØ±ÿüá„Ùl†×ëèïïß`p¸€¿µá=Ýéó ÑÅîW3LÖK܈A¦bÏÞÑÓÓ³Ào4œÍ‡;¹àNZÓÆ„‰—W-KÕöÃ4sæLÊÎ~‹ŽWUÒôéÓéäÉ“”ŸŸOááávÆ¡¼ï¾2>� æ„ëä�V«•$I"£ÑèÚ¶m+UUURZZ�:uŠ H¯×Ÿÿ_ˆžáȤiµÚ   žçèõúÚ]»vRűc4mÚ4ª©©¡ââbŠˆˆ¨`Â}ḟ$ˆ ¢h$FFF~“¿o•—¡ÔÔTª««£ÒÒR2 õÆß ñÐÓ,vWóž0��E……TZZB©©©T__O‡&ƒÁð-€$üˆþ-+‚ Ø$Iº\Rò�åÓv.HŒsßãö¼òu¬«¨CŒ2Õ+^m{ qðM5€ö çù��oUH‘FÔI£š¼PTcja5=Ž< æíÚeU©@ n²Ý�9¶÷j÷Îî²Äw㉯-ë=?©Î`s3NyN&Š4â ÇLÍ5%œ¿Ùwg¬C»ýÇâœ5ÁËr°|Š›™‰M%`X“ošûåýÎÛ,_4Eýëº &“DUT�73„Ñû £oweâ?‹a±%27Yëf>\bĈ´gyV$&ç¯^>¡[\žöÒ$ë1ð T•Þ2žôÕrö\’²¡úE¬Ýüê¦\q°9kÚÿˆ&ç=À£m“ Bÿ0?Ýÿ¨€o‘ìt7vl>#ÑœÒ÷­®²×ö�€ €õäË>kQýxãÖÊajuzd›– Ç’Qb2¥íùáX{<Ó�Ä*�OÆdÞË&òD•±USlî©î.ØrYMP­i¹ÏÄX2J®S Ï›ÓwñzÞM� 2€|K…À³¶ˆØSÿØÈ?m`XÓ~]‚}·¦„tjTèU¼zÐxãoX.;„˜ øIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportlni_32x32.png0000644000000000000000000000013215174607203017630 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/aportlni_32x32.png0000644000175000001440000000151515174607203017622 0ustar00rncbcusers‰PNG  IHDR D¤ŠÆÝPLTE©œ’     "'.&!!!!"""'"###-$ $$$,% .& &&&((()))*****+,,,2, ---9-...///00(000111:8333444666:63999;;;==5BBBDDDFFFIIILLLUL}p×ò´yó*‚U€¾€*üy£xÍš5ûg­Mk¹vøð¶m ‚9bõÌ$D„8/Ÿ[ñëiÎìÙs÷O>\Twz×á-[æY –)Ú‹ °_=6áûùÔ¾¾¾ í—î>¼kÿ¦y³&µ×+˜ p±�9 1á|huuõŒ’Ó@lÙ¿vÁ¤îö=I!>.–Ë'•@qõóBhaaanû¤}û·l[;oAK…£#Ÿ'Ó哪`G^°ˆ‚FçM»¶,ŸÔÞÒ^S$¨ÃÇÃÉÎ1ÁçÇymooo×çyÛ² Õ“k²E}ùø€ÈŸ�˜ðý¼²‡‡‡›·{»oZ�ºº£¥‚#¯;+HÈ„€§€ Ü€*l2êbõ¬½‚�æs±åÕÏ�”)øþ\Û ¬ÀÁDMÅLK\HHd£<÷¨Þm/Î/ÎÏÊÊÊÉHÊHŠ‹‹ ñó‹=vo¯ 8M¾%@0xûþÕ«Wž<¹uëÞ­s÷Î ‡¤Ú•[·®ZµbýŽ�7¯^¿-š9abï„ÞJ”Äoõòé� [WMo+ÍŒvbÆ’;þüúþýóÃc›çO¨-àÇ�njj=uêÔ�¶oݼbÅüªÒLTù†÷¯�àÙ³·o]¿|ýÜå½K{UQÈ%D'DGGG€PDD„¿“‘3½óŒ_Q¥¿ðIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphRedo.png0000644000000000000000000000012715174607203017056 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphRedo.png0000644000175000001440000000125615174607203017046 0ustar00rncbcusers‰PNG  IHDRÄ´l;sBIT|dˆ pHYs & &Q©©3tEXtSoftwarewww.inkscape.org›î<+IDAT8�í”Mˆ’AǾ¯KíF®ÑB‹xpAéRìÂ^ºDuˆDºzP:ì!èÐQêàmOCr»t뼉G13PŠÀˆ" íÃ�Ô×w¦ƒ#ˆû.ívè´˜~ó<ÏügàXJ¶ˆ×Ô\ò @ýˆÐEà,àR`ã øaÁ6ÀxÃáðÝ­­­[ÅbѾ¿Õ!‡éÀI`XVY†www›B™N§¿jšvXæ™i«Ýª)Øà<àQë 0 ’ɤÇçóÝ�ÅbžV«•j@ÕšÙËÓ�ÓÀE¿ß3‰\ +n·{niiIët:x½^Ýétb·Û1M“Z­6ŠD"O+•Ê#à0²*ß܈Çãoúý¾�Fò0*—Ë]àšjÝ>Ù�õÍÍÍç†aH!Ä�àɾa²Óéˆh4ú ¸œ°Ï×wvvÃáPJ)e³Ù”¡P赦i�À³L&30MS†!ëõº¹±±ñ¸ªZ¨Y�—�;{{{ƒI6Ùl¶lkŒý{;—Ëý�RÊB¡Ð_]]} \N1cÝiWØ€y—Ë¥!èv»Cà3ðM]J­T*ÛíöZ"‘xÒëõ^°ðò4XÂápØt]GÁº€ �÷©Tj›±õ> µ¿ïõMƒGÀ§|>߃+€¬V«Uà‹ àðv*^ZA'åO¤nàpn’!P~Ζú7Y=�95$ãOÆ8*ôXÿGÌàð»¯IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphJack.png0000644000000000000000000000012715174607203017035 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphJack.png0000644000175000001440000000222615174607203017023 0ustar00rncbcusers‰PNG  IHDRàw=øsBIT|dˆ pHYs  šœtEXtSoftwarewww.inkscape.org›î<IDATH‰í”ÏkwÆ?3³ëº?’L¶›DbL‰4dm)b©<ˆ…D[ÔÅ¢èA„‚Ńà©'öб‡"%*AIR¨��ºLÔD²‰u³ÉîfgkÌÎÌw¾Óƒ³&•þ¥ø^žyç}ßyßçyà]üïCùLÖ>ï½ÏÃ\@x9UL®Âäª6`îÛ T ˆï{‰ fy¯`^%o�E﹘¦€å·§ŸH&“æ³gÏäøø¸sìØ±¹C‡=òÞ½{bïÞ½™t:mïØ±#½oß¾‰Û·o›[¶lùXhÚ[ë Û¶mû¦¯¯o�뺱îînÿàà [[[«lß¾=DÂá°vç΋Ŵ@ ìééñK)ßëíím¸{÷îË+W®üâºî# ¢®ZM!Û¶ý•J)¥–Íf9~üø«T*嚦Éâ⢒N§Ý£G�Žœ?þÁåË—_†A<×ìsçÎýì8NX¤ê¯>¾Ú¤”~!–eQ.—9yòäÚ­[·ª†a`Û6¶mL^»ví·B¡ðbiiÉ-•J\¼xñ©iš£@®z|ÕcÄúÝ»wÿðáߢÑè.!D­Ó4Éçóœ={v®¿¿_¨ªŠªª466|°ÿþ¯š›››ëëë]×9räH{ èš¼ºoèV³aÆ[ZZ"—.]ê‡Ãêää$årY–J%mnnnz~~¾®T*Õ˜¦I(R.\¸ðyOO�vëÖ-kjjŠ›7o:ñxÜâĉoÏœ9“tçOÀ®rÙB5—Ë1::*fgg ×u-`ºX,.ÌÏÏ;ÃÃÃ¥ééi©iš:88è\¿~}!™LŠ���'‰Dâiccc¨«««Õ»©¢x Ÿ½Àf�çx<6�Åööö¶h4ªß¿ʲ,Ãl(ð’ñý<Ê>¯�‡U]×c‡þìÀ�M†a`š&¹\Îéììô‹E‰DS2™|®iš¥(ŠTUµ’ÍfZ[[ëlÛF×u+‘H¤¼fon°vçÎ�_ž>}ú»T*åÚ¶­(Êk‘K)q]×—ÏçÉf³ƒÁÈ©S§>ƒH)BpãÆ�…={ö4ô÷÷›6mªËd2£CCCI@U<�ÕÖÔÔlŽD"_÷õõíêèèX_(!ªªº•JEÆb1ßòò2�?ÎÏÌÌLkšfÒçó™…Ba¡©©)*„pu]·¯^½ú#ððWÕ‹4Od-¬øP¨º>À·qãÆ¶úúúÐØØØ�išOªBòøn~/ß^ðÚ£œÕfWÕÄVÜ´ÚÀï5T½_±â¢.ÿŒªëJÞÅ"þÚ}áIã–IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportlni_64x64.png0000644000000000000000000000013215174607203017642 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/aportlni_64x64.png0000644000175000001440000000332415174607203017634 0ustar00rncbcusers‰PNG  IHDR@@�·�ì÷PLTE         !+"!/ "$"(&3"1%&'%*'/&4%()')+(.*)1,>*8)+-+A--/,F-<1231=4675796A?9:8F<;=;>@-R<J?;?A=?@=I?/`=AB@LIDD=HF*DFCGHF[IjEJHLTH4mHKMJ_P_T sMOQOdQRTQaS9]ZfWTVS``r[€WvZtY%kd[]Znbg`2k\B‰Yl_3d]WŒ\xavd`b_k`Oo`Fjj €fbda€f`egscCueEur”cŽhhigzv‡mkmj‡j/•mnlp¡gyƒtmol�w ¤joqn€oN~wy;qsp†{�q0Š~~}3vxu�ƒ”}xzwS²uz|y‚zt–ƒ‹†&}|”‹‹}f{€ƒŽ� €‚�‡>»}žŠœ‰•‡?‡‚��Œ3 Œ„†ƒ‰ˆn���…Ã�Œr‹�Š œ™•<“‹…™˜/˜Š…¶‹/��‡©™�‘Ž’�”¡›;˜“‘”–“Å™­¢°¤¼™ ¥¢2§–‹Þ”š›˜¿¬¼®²žŽ£¥¢¿¶§©¦Ä»©«¨ï­Íû»_ö²ñ¹ÎÀ:¶¸µÉµ¤Úͺ¼¹úÀÔϾ¯ÇÅ|¾Á½ÄŜúÂÄÁÇÆªÈÃÂÄÆÃÆÈÅÇÉÆÉËÈËÎÊößÓÏÁÝËÀåà<ÐÒÏçâHÓÕÒ×Ú¶Õ×ÔÞßµÚÜÙéémÞàÝâàäãåáéëèñð¿ñõ¼íïë÷õÄñóïðöøô÷óÿûëþýôýÿû™‹_tRNS@æØf‹IDATxÚÝ—YLAÇéîΦÔm±`l ‡6*%š¨klt� Þ5Þ(õŒÁ�ˆ1€Wêµ¢©«x!¢Å”x@P£¨ \  áJqS‚¶¡ÎVð™™¾ç}ùÍÿûæ›?¿ÿc‘qI_¾¹v…/Âl—%_ÆøFœi,$XH—↲öеO¾ßÀ%l¤)öüówßóq $›²J!ÜÁ&¬:œ’Òí@b¤¡ Ý~x›×!_5í£« 5ˆšMñ:<·~ûÙv{ùœ ¨Âßë°1Ë婾öºªÈ–€H è0s„ åÖtþl«zf[�ì �O³¬äñ(„R A©hšµÖ{:½×Q 4e ­g…Æ?軓֟c†,°¹aŠACZ–—Ý8äÎ7çÒ ÍhYks×.�ÈÄSÒ BÉAÂÉ!dÆÍʆ4ƒ0ŒYlÄp û­+©THBÏòÍdø¾¯É›ÿVóôtUÏ ÑM°B=$´çí8¸ál’ !VS­Urøð ¥­êQòèžÏñÇ�"Ãòb�§óó‘M/¯Q÷¼¡½„ô0 áÏùÆ_¹÷¾|zœwq Õó3Õ½ öo©h®†„ÂËÅá $Às¡5‰eRëGH¸²25‡ôØQ'–K­Õ·N–e¢åðtqXß‘1 œXV.~kozUd›�æ°·aÇ © �`C5•Þ=>aØC‡¥•Ç2ÇÅ�ˆ5ò¾»³åÌAÛžI(·ˆ˜\²õmfl|$æÊr_|å',Â! ¸À}ËŠ!A �Qr9ëøá4â�>¾ øí‚° x0XÉÕQË«§4=8µ øèûWi- ®:tBtjÁ®—/w6‹ tøÕ!!@tjâ¡ÕQ‚CÀu ‹ ê":0ã9hz…̸´ä¬,2žÙ;¼ô8ÉY8Ÿž«�Aûý ë7¦`Ë&N-¿!IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/play1.png0000644000000000000000000000013215174607203016165 xustar0030 mtime=1777536643.505914363 30 atime=1777536643.505914363 30 ctime=1777536643.505914363 qjackctl-1.0.6/src/images/play1.png0000644000175000001440000000040015174607203016147 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ#¼-Ÿ€IDAT8Ë­’Ñ € D†�Àmt ]C¦Ñ:~�BJã%ý É»pmá7-)Y0÷Â"BîFç´¾x‰”¿QùfwÀÈwíF^´c4 �\$×gc“iå1ÌúuÖÝ6ƒ žÀ5¶…¨»ƒØ¿DXk†#Û3]‹Là ó�6^LÓBåIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/xstopping1.png0000644000000000000000000000013215174607203017253 xustar0030 mtime=1777536643.508914341 30 atime=1777536643.508914341 30 ctime=1777536643.508914341 qjackctl-1.0.6/src/images/xstopping1.png0000644000175000001440000000045215174607203017244 0ustar00rncbcusers‰PNG  IHDRÄ´l;ñIDATxÚí“1ŠÄ0 EÿWn¦ÙÂeî ;r$³õvjrˆœ! 3Œï0¥–�)ƒ½d›8 »°8³ÌTy Ââ# é ØÙÙy=‡ï–ˆ>˜¹sÎcŒ7UCïÎý`­íDdJ)Í÷¤”f™¬µÝ#u[™æ?‘ @»©* ¥ÓËéô+JçD4ÔÖlˆÌÜcÖägkŒ1`æêq4Ì çܱF\«€Æ9‡ã­F\«€&ÆUsÎkò�h�BΪ:nYÜó\!"Ïñ±µ"R.oðÞ_û¾ÿòÞ_‹µÿ:éÅzX UE¸³Ü¾–áà Þ¼ýIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/mcliento_64x64.png0000644000000000000000000000012715174607203017630 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/mcliento_64x64.png0000644000175000001440000000632515174607203017622 0ustar00rncbcusers‰PNG  IHDR@@�·�ìúPLTE   #  *.2#6- ;@.6H($-"MR-+0+&X6*%S ]b!T&71,h Z& >1,76*l$T.q'x'N9+[5 @>=~,@B5E?9„+K>:z/ �.EF4PA3�-p9JG;‹1b>+LFB~8›0—4—4cF8TMGSPNTRESTA\RB–@iODWVT`SO]VP @lUI^_Kb\Ua]\i[VoZR‰T;ebU¥L›O+deOgf^efdqb\jedmf`ªV+okjooXroPrlexjf®[5use¥b>­`7˜hRxsqww`qlztmˆpb|zlµhC~b�zt{yœub¬pS¶oNƒ„oŽ{†‡i†…w‰ƒ|ˆƒ‚¶z^¼zVŒ�x•‡‚ŽŽ�‹Š”Œ†‘‘u��†“”m·ˆo“–‡Á…f˜“’›“�”–“²Œy™˜� ™“Ÿ��Ç�q ��½“£¤|¦ž˜É•|¥¨†ª§‰§¦œ©¤¢¬¤�ÅžŠµ¤�Ξƒ°¬‹®­’²ª£°±‰¯¯¦²­¬Ð¥‘²³�·¯¨¿¯¨·²±º¹ŠÊ­¡¹·œ¶¶­¼´­Ö¯™¼»²Ø²šÀº¹Ãº´Ã“½¿¼ÁÁ±Ð»±Ç¿¸Ü¸¥ÅÅ­ÆÉ¦Éʠܾ°ÌȦÌÄ½ÊÆÄÍÌœÕøÞôÑÈÁÉͼÑРÍÌÄÐѨÐÓ¯ÚËÅÖÎÇåɺÔÕ«ÔÏÎÕÔ¸ØÔ²ÓÖÆÛÙ©èÎÅÖÚ¶×ØÂÜܲÞÚ¸Ý×ÔÝÛ¿èÕÊßà¶äß½áàÃßâ¾ïÜÑåáÒãäÎåàÞæäÈêé¸ãçÖñáÜéêÓëìÃìêÎèìÛíèæñéâðíÝðñÌ óòÕôðáóòèøöÅöðïôõÞòöåòôñöõìúùðý÷öþúëùûøÿýàúþíþÿç@LtRNS@æØf ‰IDATxÚíWkTSWVDE‰E@@D^*T†žZ‹RÇZ¥5è4â  •‡($ˆŠ4š h¢B™Ó€L�Aˆ�—€„G¨P1¢ÒšµfŸ¸ÖÔúsÖ¬ùÎͽY+kçÛß>çž�iÓþW`°í�±·˜ ñy9ti»ézJ’“‰€ 0$ÌäuÖð4 Þ*•E¾GSSÏ¥¦¦žj#ÒE"‘àcÅl&Æd\¦Ó(Ô3T2ÙÉt;" p‚†jÍ:€·hÁªƒÇŽ;tìÐ÷RüƒÊÊJ$À óò ‚TJ"9*ÊÆ5ˆ€ ÐןYÞX5©@9¢È]¶û¾C"2QÄçßåò‹a1Y×PAj||llIÏÏÉÍO0Ð�QÚÚÀÓ(x¡âØíÞ§ƒát- bH€ Ði@�˜HŽŽ•ãoU] x—Êdcy9ø ¶IŒ�ŠŠð×öÜ820ÐGfh•6 nkL�Œ=àôðñB7÷¯˜gG3¯3Vï`OŽ&zÊ�Bçâñ0ÿÌò÷S�Is¹øøx¡áåãí²©0VÛ5‰Î°š VäèÐòuaó!}d â5ònOñ@V`ìgpù¸ø^fzÊÍŒT*¹ÜÜÏÈÁœ0U€ ‹'€TñÜ4 I*Í5öÀÃ½Ô ÞK" //P9L—;Èõ<ÃHNó 5B¼–¼Ÿ(˜€S8Ú'1hPþ¨DrèrGñÈ0`†J¥âU n»M üDð˜àíƒÎÑKìlüü<]Í?10Æ·Z‚¸Z�Ù³)U€zzþäá­�—»œÃø9§€%¼D'¶€:•–<à%˜8Õƒ'ÿúÔÖÙeãG µ5¼MÆgן£. „«äNÒ—Á� ›‡¡“=ý)#9--A}ééÔ¸RRÒSÒï¿{Ù(ü°tœÀi¸gZ¹�áá_5� êŸ?}†ð Ý~þågt©Q%.,˜èó>è=½=}½b¼�‹Û;››µ×74jêjêjª«ª««Q0|nÄiÍå¡ ìéíëU‡CÙÞ.®‡. bPl]µ º\P.ðàâñ~¸·`J³»õHBÂáH@Tä®ÈH4nÇŽ†¶0æðþ˜˜Èý1{¾l@X³á‹¥¿Ûx;@¿É)Èeå^JONŽŒÜºyóúÕ+?[¾tá,ùǵî¨ñ„õˆ´§åá�;×®eŸ=³ÿ·ßlXð‘½(´Î£ ™L*ëii†ìŒ³Çãâö|ûÝÇÀi=úö…B •íE ·²³Îžˆ ÿ8ÖÁ‰’ž––œ–œ Æމܵk3`õ77=üçÅ´õÜ¿_öüåøíí;øÏñá× <+/¿•}Öíó?@x èëëzÚÕÙÙÕÜÕÕÚÜÚÚÚ¨ãݾqáäw¿¯Á¡½O,îj$nÆQ÷­Áêê:øTUWó~âäþ5HbOöÕììì,ô¹z5;++ëâÕ¬‹/dÁ¸páìɸ8(æš… ˜>ë?A[{–¶úËt€ÜaÚÿñ߆sÀñGÌEÚÔIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportlto.png0000644000000000000000000000013215174607203017003 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/aportlto.png0000644000175000001440000000043015174607203016770 0ustar00rncbcusers‰PNG  IHDR(-STPLTE@@000542@@@0PPPPPUTRhh```jhd€€€€€Šˆ„���Ÿœ–   €²²ººª¨¤¿¼¶™ÌÌÀÀÀÐÐЬââÿÿÿÿÿ ù�ȶtRNS@æØfrIDATxÚ]ŽÛ€ DµÌ MÉ Ýþÿ?«ÑЧÝ,ñVt®¬’Ë+¶ Ä<£=˜0�š�°uZÀ|0žùAzÁç? ÷A‚‘H©‚«{íãBª¾hû;�¨©@—ø¤TozÝðÏùH#|âno}ý(Ž™,¡øIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphThumbview.png0000644000000000000000000000012715174607203020137 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphThumbview.png0000644000175000001440000000130415174607203020121 0ustar00rncbcusers‰PNG  IHDRÄ´l; pHYs & &Q©©3tEXtSoftwarewww.inkscape.org›î<QIDAT8�µ•¿NQÆ¿sÿ쬗XI„Ä;ÙF¬ØPPûv„ÆXPó<ÁZ Þ€‚ŠØY)!!†-Öl4t’™{Ï=»C–a•q�_yÏ™ß|9gæ»$" " ÀPM€�‹H¤>hÀ<€Yc#‚8ðÀWÓw:¿±±ñvuuuÖC@DR…&"!ÙÜÜ<[__ à=¸àU·Ûmb?3Æ„¿±B0Íf3™››Ãäääï z£pÖZÚÛÛKwww?LOO±Ör¨÷^·ÛíGyž?o4€ LÑ@DbŒá™™™ÎÂÂÂgç\%×iššâÙÁñ™Á&"k-;çB½^¯<k-—w2ê§u§þczn†ž–ÄÌ”e™öÞkf¦ÁZA1ó-ƒw‚™™:�ÎØÁÁÁãn·û „` —J)Ôjµ<ƨbŒ7^x'Ø{¯�ŽŽ¦_6›MW®Ç±¶¶vÎ̺øY€ 3ffº¼¼tZëÚ°ºR "26­î»R"¿ÿÃËc¨ EUÁ $¥Ô­ú�å‰yïuš¦è-&Ë2�$‰WJq¹¿�Ö:G)n¯ûPsqq1%"T„PŒ‘®®®ÜöööÙÎÎÎ3k×Ѫ”ÊÚíöw/ƒ#€4„ ËËË÷’$yQŽM!fV"B·¶¯”‹1Ž/--Õò<ô?ô®““­­­ó•••'�F£^¸)Ç�¡�÷^Z­Ö1€c¾¸šxà)zy:Š~8ð À7ú_—é/ÆF??;¡ÏIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/acliento_64x64.png0000644000000000000000000000013215174607203017610 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/acliento_64x64.png0000644000175000001440000000604415174607203017604 0ustar00rncbcusers‰PNG  IHDR@@�·�ì÷PLTEåп # *16;?HM((!RK#W]J+b!h U)76*l$r(x']5n1~,@B5„+P=.BB>^9&EF4Š/{7�.JG;u@]N�4›0–3�@™5fI;nO TRESTAUVRŸ@  ?—C¤DlUI„X—P^_L¥OcdP¦MfeL—Zq^V“_heX�egf^efd¢W‰o«W+wježjsrXqr^¯b«^6tqivtg«oˆ�¦fC’¶lš{—{µgB¶n!‡�>}p·n3‚‚e€€z®qR¥…¹y ·pIƒ„oŒ‹5¸pOš‡3 �›�%±�Œ�x½{XÁ…–”M‘‘u��‡·�gÅŠ“”m�’ƒÄŠ0Á…b¾™”–“´¤™˜�Ç�X³¤¯£,Ç‹pÇ¡ºž5¦ ��£¤|¤¢‡Å”{Ϩ«©_¦¨†Ó¥(§¦œÍœnׯµ³Xزϟ„°®‹Ô«JÈ¥•¯¯¦³²™Þ¼Ó¨’Ü»ܺ%Ôº¹Š¶¶­áÂÊÃ;À¾vó«Í²¤à¾5ÓàÃAÚ¶›½¿ºÌÉlæÏ áÆLݸ¦ßÂtÅÅ­áÈUÄŵÈɦÉÊ Ú¿²ÍÌœÕøçÓ2åÌ`çÎnÑРÒÓ©å×`ïã ÚËÅÒÓ°ÜÛoÐÑÆèÖkëÙSðß5æË½ïâ+ëÖ}çЯÛÙ©ÖÚ¶ðâGìÙŠÛÙ¾ÜܲÞÚ¸íÖ¬ñä^èÕÊñãràá¼ñçnïâ�ïàŸâàÄñâ›ðè€ãäÎ÷òUøôHóæ®ñàÙìé¹øóxéêÓìêÎîìÂééáúöoèìÛìîÊüúgòéâðìÝúû…ùöªôòÕüû�øöÅôôÝöòãþüœýû§õòðòöåõôëûú¾ûøÑÿþ¹úùðùûøüüìÿýàýþçâ²tRNS@æØfÛIDATxÚíWkTSWä!`„I° ¤Qƒ$j-¢V±J•àGA•RE@°jG)/�AyˆŽ&R @¬- BÚ”ǘ¢„ghijÏɳ?tü9kÖ|÷^’µXßw¾½Ï¹{ïL›ö¿‚™nþ3¼0àÓ××w�ÛLºccB�7éùˆƒ#ƒƒªo*L�gi*6þP ˆà‘HR @,îéÃÕ…ÑÞŽžööæv~¶Æâ©¸²I, ‹"‰H$‹‘%J^WW3¾r›ÕQ¸a¾Lv‡Á`À}­ «  K‰ï p'Àß„„„˜¤˜˜à˜ìrigÛ«6Àê²É`ûµ¼}½½×V¬Xppp°´´43#Ì0L&¦ÆÆs˹Üvöb]�`ïkw*+¯eff&'GEíÝ»ƒF£}±ÌɉdG"“I$';’�­5Ñ|1 a®F`bRdM(ö …¿54Tþ� gŽï=Hóñ¡R���)ôÇTHv6Ö6ÖVÆl¾®€l’±öNŸL&ëëþöÏʲ²œœä3‡ÜA‹Ý·Œê‚è …L/¶À·²²2¶ŽÃûŽdBáàÔ àg€ƒÃà 69 ¸€g²�°²úˆhRÎçk`¾à`ŒH‡§~.Ë�3‡îÜ!¸ .Hø6ÖÖVD “ ~³6„ Å$vÐ'ö½ ¿À¢�ƒèhO*…@¦��d€H$Î(ç³¹Öî‚ …2¡TúB ÿGNFÆ�oÁ@àž]T*%Ú$Ðò°¾ €HÜ?†° …Sã¿c‚ŒŒŽ±�onŠÝE]š6Ôé \ €óº^“ cí °…o‡Ÿ �Ç3:î�>ÞO£E¡F]yй2€à ZÆl—­Á ^#,˜ž<é{<ÖZ}{`O m��gëƒôôî#$¼(æææã Þ¶Q•e ?�?<éx4ðz ¦ºøuì&Ï#ûü‡.ÑÏ6•’H(Ö(Ds33Êž6x +2Ë¿Œwtýé_OJÏÏ�Ï?yòdXX˜_Øö¶ÏŸÿ§ùú|6Së@ª`8ì=~üø¹×·«„Õ‹ ‹ órûŸ–¼êO��ÃBü6úmÜñ×Esf™›èC˜jÞP…Aà0`à~) ¸èyéUCݯšÚò•„ìܹñ+ CY3111Ög¶ÔjO"ظÿÁŽ6Ä @/éÎ}Ÿóÿ±×Eàë1k56ÈåÒ,‡@x÷kZ1»0øô¦Ò¥û<¶Ý=‰ΧœŽXoN@eø††z-µ:9Pˆ ,i´@íâ(^¼jôR=½;Í…¼mÛÅ«á!~a)#±À¬ÆÆ†z�Z/©Xže¹l v4/¯�ž×4ÚD§_êö';­Yùåõ°��Ó‡àPžÌ7à0[˜Ú&D $àééé3š›GÏKªºB¿Ò¿œì´r¥íõ“ç×£W@•CC}Ðq —в,�¨TOª'œ|:P=J›Òë;¡mûÒnçù�°”�-,Ðú8�`@ŸSѨuà%—‹²L�¨ A½Wõ¥K=Ú^uú“ɶ ØØ~u> Ô40ÐV‘&‰R‰¼ÀÌ Unç´^¾ÿˆ³³ÇETÄÖ¬±±²>ô©¼‚À,X èëé¹3u’¸A.e©<†Jèõ­ËQ#!+¬­Qþ�>A°¼J€Y¤³ â,ÙÅõ�´Þ+ýѨ‘pXð‰õGPñ˜š¢õ‘‡Ãl¼ÅtÔHÄJЀ<ºûï/w†.¢lCŸŠÛ®*ú àŽèì‚X’eF¦(›èòå€3.ÂPÃæ-@EŒ`NÐî Àá¸3o±Š4F$b† ôг8V˜7ÏÊ!‚’o  ÀÝÝõ¥Î.@$]±ƒHA=˜Bv!#¸�}ò1QÉÇþÕ à¸»�CuÄ7ˆ¶vJ(ÍCì�=UúTt}ìßÝÝÝ^<Ìb]Ö8èÁ“ØÍS'NœB×»‘ ú¬{;ÜÈb^ž­°éBƒ\ÏàÈÛAõø|ðåààK%^hðLƒ[·X¬DͬY“\BW×sÕ0ˆÀGÓ —Ëã"Ô*Á¬e²€ OÑå Í i��5µ]xä²yµ‚¨±ãl*çÉ7Àø+�ü4·NÕÐÙÿƒ ¶—Qï�¬ÅZÌ…NÎ,}ãZ$ƒ;°@(ª‘ݧ²³ÖA½WÁú4Åè*¹.Ì!0ëghñú¢AA|€£ËÅ—ç^Ęãrm%ÉÚQᬎ{c�ˆÁ݈V'pö£ÊT÷naé¡Ѭ2iÞ`Z7q}¯Â|ƒBÌ]Ƽ }æþ”[hª²—`d½ÞÉE¾ž9� ÿô7þx¼°Ú]‡‡IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphAlsa.png0000644000000000000000000000012715174607203017045 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphAlsa.png0000644000175000001440000000175715174607203017043 0ustar00rncbcusers‰PNG  IHDRàw=øsBIT|dˆ pHYs  šœtEXtSoftwarewww.inkscape.org›î<lIDATH‰í”ÍKcgÆiQ¯¦‘8~ÌÂ"µÓBI[¦(T܈ X(LEtãÂEnDÿ�Aqá (ºpSÁq!Ýt§³Œq1ˆÓ(qÒŒ1&&NîGî{»˜WšÒM™]ËB‚Á º®7Oc||üåÌÌLvww×mhhЂÁ ‘Ëå8::z7??_ð<Õ… êï¶”ÒÉçó”J¥7Ò²¬Ç@EJÉèèè£���Ÿ£Ñè}}}͆aÔ-�Nã8Ž“Éd�R‰Ä5ð­Ïçsð|ª%os¹ÜkÓ4Ÿ˜¦yV,Ë–eµÜÜÜ\%“ÉPcc£fF �N7uuuÕ{ž§e2n“Éä+Ó4Ã÷÷÷Ér¹|å8ÎWårù5p ¸äSàGà{uAü@H‘�z5¶ÔžÿáÇ€PÜUù»À…OuQhjjꇅ……�B¡€mÛBÕ€J¥‚çy!Ð4 )%ûº® ¥Äq/“ɰººÚ´³³óHùT êÏÏÏE6›¥\.#¥üKý*²j!þ6·,Käóy4M«W݉P´„ÃáÁžžžñR©ô‰ëºâŸáþ<¿ß_8>>þ%ŸÏÿ¼}x‹j€& •÷õÖ?�ÀÞÞëc`œ�ø/áO ¡¡ûÍ#•ôIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/stop1.png0000644000000000000000000000013215174607203016205 xustar0030 mtime=1777536643.508914341 30 atime=1777536643.508914341 30 ctime=1777536643.508914341 qjackctl-1.0.6/src/images/stop1.png0000644000175000001440000000032215174607203016172 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ"Ž®MdRIDAT8Ëc`Tà?Ãb0ƒ=L#²æ³DZt–��!��Á���á ¥®5`Ô¤$é0“�á1šÒ0’2Ø“`ùAªd@"2Å›'ëŸIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportpni_64x64.png0000644000000000000000000000013215174607203017646 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/aportpni_64x64.png0000644000175000001440000000333515174607203017642 0ustar00rncbcusers‰PNG  IHDR@@�·�ì÷PLTE         #)/!#!2&( $1!+B$"&/!# %4-D'(,4)8&(&)+(.*)4A+-*1:?D,.,>^ ;=;IZ Ms#IJ;?A=?@=I?/S]AB@Zt?CEQfYy_bDFC\�Vf X„bp[_elGHFJHLTH4fJLJd”dxg’'YuMOLh OQO bwen“hŽjmRTQ5`faS9v|n‡qs8_lTVSu‚t²}‰~„ yuw/j†[]Z‚“k\Bd]W-q’`b_k`Oo`FƒÀ‹–bda�‘`egscC‹œ$}�|»„–ueE?xw4~€hig!ˆˆŽŸjlinlplnkšªnpmoqn-Œ’™Ã•Þ€oNqsp(‹·X~€C‡�œ ¦´wyvxzw£¬#™½¬Á7˜˜z|y®¶‚ztA•–¯½|~{}|(£§‹}f{€ƒ~€}?š¡n‰†€‚¹À‚„� ­ð³ô„†ƒx‹ŠºÈ�…‹�Š„�‘“‹…Áû˜Š…Š�’ÃÉ�‘Ž’�”!¹îÏÔ“•’ÍÙ8¿Î§–‹š›˜^»»à÷²žŽ£¥¢§©¦©«¨}ÄÇ8âçµ·´œÄÆÉµ¤¹»··¼¿²¿À¦ÆÉ©ÆÃ·ÃľÁ½nèêÃÅÂÁÆÉÆÈÅÈÊÇËÎʰÙÚÄÑÑÝËÀÐÒϵÞàÐÕØÓÕÒÕ×ÔÚÜÙÞàÝâàä¿ñðºõóãåáÄööéëèíïëñóïðöøô÷óïüýüþûùÿÿgÿf§tRNS@æØf”IDATxÚÝ—{LGÇqgoØ�3ê®W£å5-è¹ÕFí ü§Û,AÅh‹�Õø�Z­�Z•¤ØöZm…Эâ 5’æJÕQPc<1§‘¦¼¬Šרس—­ñêÉòGçî þÛ™ë_�ÿç“Ï~¿�ßL\Üÿc�i€Xö#—ys,^õšF,§Smˆ‰€4§B\°2¸¼qjÃõ’_»=¬¨8åÜã­7»/2;(¹¥[ÄVغ¿´´ß0¤1`ôwû¿Ž8\ðþWÕ ´•G—FZÝþg]‡çN�LKì‡Ï�XÖíºß®ÔV,£%ða‡ùNl4ÜëyÖE‹V ’ª–%P;‚Ýfãßqû­^6È�à9Ñ¡è~V‡7‹†“U÷ã~�ZÐòvŠy‡‚09€Å—¿(J�vIÅLèÝ {[ŠR’R³¶5ÏÛˆƒŸÁ�Køp_cŸƒÊäÀ%-$„MéÄá•—9lÉá(…‡xd‹äÐÛó×Ï›>ù”âßQ‡Esèlú£ëJõì7þýùÀ¥öå@:¾×ÛscçÊ=‡Ö ´„tÙ“G–ûŸŸ¿pçÚ±“4ÐçÀ#H\×ûîF<…ÃÂèWp¼Cvwøüw‰ÃžUcm-âyèÐ4Üa<ñÕ<|ªö³ÁtýP;3%q|v�æiïÀ�žv]ªþ6‡ÎayËÚÌ,ÛøÍš·h¦Hš¸oAs˜ ¤iíÞ6£|ò’×5ªY5¨pI !88(�ì =7*Ç&PN»¤IU5ÍsÒ‡%"Q½e»u;íÄÍ,®ªÙxõTÑf‘W}¡ AM@Š«Vœ9³ø‰‡Œ?ÐlŠó ó3p‹¢j�è2Ge ˜êœvÀpÆnjB|bRÖŽéØôHvµÓbpà¸ÔŒW!�ý^IT•´„¾ È/,A6‡èÝ~,Eú�Õ!¡ÞÄCP,6·éÃ9ÜwIlw9á§?ëIºŒ�,eÌ�ÔÂÐÇÁ�Q Ùn´G:D¤'ƒÆ6é„.ŠPõY·Xs_ûñ,MƘ±šÈE:  ’`È,`¼ÙcÓE-2½#Á­ .®†°U‚ô$tù Ä’ ©°¾‘`šÖä•õà÷+ ‘gá/õ¶^z”çéZLÏÕ8 Ķÿ¿ZÿÓΕÃrá€IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graph1.png0000644000000000000000000000012715174607203016325 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graph1.png0000644000175000001440000000440515174607203016314 0ustar00rncbcusers‰PNG  IHDR szzôsBIT|dˆ pHYsÄÄ•+tEXtSoftwarewww.inkscape.org›î<‚IDATX…µ—]l›Õ€Ÿïó¿;NR‡´MNKéD«Ri´¥‘*± PõG7ÝUï!ˆÝ !q3$è- î*Cl¨ƒB+Y›Üvij'ÍR’8?öâ„8qìÏ_¾ß]ø|­;…ÑiÚ‘ŽŽeû¼?ç¼ïsÞWbã!5|¶æ?÷:þ£,éß>K€,¦3,±ÑYïU©Ü°6ÊräØ�H€ˆéßÙ€ ¨@ÐÁG¡~ÀÕ Kjbê€íxíڀČˆ�6P²Àð“0d##åAà>!g Ð,~3�‚�3äÝ-6€Øc�=ö܉'úK¥R³®ë²iš¶eYÚ•+WF/_¾|¸üSx`þŒò.à@ÿñƒîRUÕkš¦dÕGùÂ… ç‰ÄgŽ wÃÆØÉ“'Ÿ}饗Ô4�r¹L¥Raee…ýû÷ߟÉdì÷û¥jµJ­Vcuu•™™Eq%‰aq ÕÆ@iV%°¼¼L¡P R©`Y�@€ææfùå—_~Âï÷? < ´Šk“”G�½Ñhô™³gÏ>‡%MÓ(‹är9–––Èd2 …€¸�Ü܉𲪪êÈÈÅb]×iii¡££ƒM›6±uëVÏ‹/¾xôôéÓË€hb•EÌ<ìóùžúòË/Ÿ�F£®\.ÇÍ›7™ŸŸGQJ¥ÅbÓ4UW`;*Þb±è«Õj÷�ŽŽj·nÝZO¥Rv[[›§½½�H$‚×ëõ[&&&rÀ*õì;€'Ïœ9óÛC‡…Êå2ñxœï¿ÿžÁÁÁJ*•*/--•EÉ����ËçóC"°×ÝÂ’0›L&?K&“ÃÀ& Øîr¹ž ‡Ã›b±±XL:räÈ333G‰DQdŠ8ôÚk¯=wìØ±ˆaŒŒŒ�Çþi``à[ %Nk˜³X.Å–8Ò5`AlHËÉdRôÑGnmmuG£Q$I’z{{· »Ëå² ì8|øð±?üp§$IÒØØ/^äǬ|ýõ×¾~nSB~ ÁÇ,Ö……UÛ¶Íëׯž~úéí---R$Á¶miÏž==ß|óMóæÍ›w < åùùyâñ8SSSæçŸþ•®ëßc@NÜ{M8j]8¸¨S«U¤RhÂ@ Z­çææ:Ž?Þ …ðù|„ÃaW,ë|ýõ×·tuuÉ¥R‰ééiÒé´ýÑGýcuuõ*�ŠBâJ›¸%³1ý@7°ø ÐüØ ü ¸?“ÉDÜnw¸¯¯ÏåñxðûýìÞ½ÛÕÑÑ!Ù¶M>Ÿgyy™÷ß_WDšö»�G€=À6êЫÀ�„÷mÀþ7Þxãwo¾ùfŸ!˲p»Ý‚Á –eQ­V)•J¨ªŠÛíÆívcYŠ¢ ªêmvÜn7²,c¥R‰¥¥%>ùä“¡3gÎü¸ äz�Îp8Üc~¿˲Ð4 MÓ0 Ã0ÐuUU1MÓ4Ñu˲�$ ŸÏ‡,Ëø|>ü~ÿmTUe}}�ÅÅELÓì:…NÙMÃ(•JŒ��S©T(—Ë躀Ï磹¹™`0ˆ×ëÀ0 d¹þÚêºN¥R¡Z­²¾¾ŽeYض�®ë Òé4ÕjµQ%4`iqq1}ãÆ�îl6‹¢(X–…Ç㡵µ•®®.zzz‡ÃX–…ªª†�ÇãÁëõÞ~7²Ù,«««T*4MömLÓÄ0 g_šú[¢–CÁ€ÂG¨³¾]‘š(Ð{êÔ©^}õUO©T"›ÍR©T…Bttt�Éd8}ú´:<<ìÀfU¤µ)ÖU`Hˆ ©5‚¨Jý½Ÿ¦ž»IêðXü}}}}ðÁQY–™œœdbb‚x<®†A$‘Ãá0^¯—ÞÞ^W2™\.‹?†€kÀu¡x’:Öi !ÂJ�:¥ŠÔÑ)=���‡.\¸°/KÓÓÓ\½z•ééiíÓO?½’H$rØÜÒÒ"µ¶¶"˲´}ûöö¡¡¡œ¦i“Ô‰šÞ¯‰ôÓ„Ó4’ÐM�!êÏeð�,Ë�Ÿ;wîØ¶mÛ¼ rëÖ-ë‹/¾økµZý‹ªªS©TÊ¿oß¾îP(ä�Rîíí½ÿòåËk¶m„BWCÌ™�4–dR†3¾ýöÛGŽ=ÚR*•¸té‰D¾xñâðÂÂÂgÔŸ^YY©­­­mݵkWÔ9 ŸÏçijjê¾qã†KÄPÐ!t­;§°aIV.—› Ãð655^xá…�®ë\»v�‘‘{tttnjjÊ)ÏÒÂé»ï¾ ïܹ³½¿¿¿3‹±cÇ"‘È}‘Hä„mÛU—Ë¥÷V’†qBår™d2I<gvvVú“¬tCœ¤€Á÷Þ{¯­»»û”×ë vwwÓÝÝÍóÏ?BårÙ)Nî*ÉÜlP’Ù¶�¢( 2™ ‰D‚ùùyýüùó.‰L)QÕ†LX–zë­·ÚÞyç�çt]w‡Ãa|>–e±¶¶vï%Y>Ÿgmm EQÈçóär9k``à‚¦ißRÏã5îôˆûÌ£•J%ôî»ï¶½òÊ+OH’$;¸®Õj …{+ÉÆÆÆ´ÉÉÉZ:�®äóùÂøøøàììì�¿swEÜ8¢–óù|qeeÅ¥ªjs*•ZŸ››«e³Ù²¢(¹ÑÑÑ»J²ÆÆ¤�úsáéR¢N­þ»Æduº6SÏ6CœÒ¬ˆ™U@ߨ5k¢ŽßÆvÊiÍ€üRkæåNkÖØæiÔAtWkÖ¸¹±9u~3ùßšSvŽŒ ›Ó�8ãÿÚžÿ �ÃÏ;®IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/error1.png0000644000000000000000000000012715174607203016355 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/error1.png0000644000175000001440000000052515174607203016343 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ !Ù‘/©ÕIDAT8Ëí‘¡nÂp„¿IHE !Uô†;³Ö�„Gàx,¸ef Á�4CŒÌÔí ¦Š„ýÝ ¾�çôÝåË<ô¸x'x6°_8ßµ“!ìvΩÝ@[P6µ|˜ý4›R–™†C)I¤4µ/P/•1|ÊóÌV+©,%I6Ÿë 6‚w¯ª mÌi*¼»}¿àZЭ$ˆà­ð}©(LË¥i½6å¹ALëlØŸÀõ†2��ÎA N@§îÑ>Æp~…Ó,¸ãÿÌZ5BÊIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/device1.png0000644000000000000000000000012715174607203016463 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/device1.png0000644000175000001440000000076615174607203016460 0ustar00rncbcusers‰PNG  IHDR szzô½IDATXÃí–;NÃ@†¿D¡¤âQÑBC·>'Ù•@âœ#H»gà9„§£¢¡ @nÒ%ÒRx�lŒã؉!‘‘¢YÏîúÿçá™ÀAòߥW6¤iêDcLoRðÖZ¯µöÀp´OgÀ}÷À#p¢Õů>À8ÑZOD­5"Ò‰gι f1XYæÀWñ`´é&®€ p ¼ÕXw¹+¹‹ ôÛÜ´ñ×¢"›Îµ”S(§°Ñ™BÆý¶àˆ19Ð2¿ª”o…H~¶®„M •àµÇ¹­eiw`­]œ,ÖÆ˜•»;°¥-<Ö’ï™ån¼®º»U LxQ’$«�SÕ{ØYREe.“`‹Sb×è�$’“°Vë|f¬F(UKRÝDÀýö¶¼^’fÀÍ ˜R`‡„Ã(´âf )§¬•ü»µP¥C}>ß¡¥—%Æmk ËÇt1®ëu8ÿϓҜÉÚ˜·ìõ³þ¹fß·!ðLEä¦×ãµx‘ãyX£¿d‘ý¸ uý\†I6Ü�®1ðÏümÑ9¦Á£AlHWÖü ùòÏñžØ"!ÇdIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/accept1.png0000644000000000000000000000013215174607203016457 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/accept1.png0000644000175000001440000000027315174607203016451 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎéuIDAT8Ëå‘Ñ À DŸ¥#u¦¬¡]Ùt&ûU04ÑJ?{ Ç;/~ªB»¯ÛÃèL®D€Ý0@hd‚ ÞÇl Íð dp꣺^ ;=;IZ Ms#IJ;?A=?@=I?/S]AB@Zt?CEQfYy_bDFC\�Vf X„bp[_elGHFJHLTH4fJLJd”dxg’'YuMOLh OQO bwen“hŽjmRTQ5`faS9v|n‡qs8_lTVSu‚t²}‰~„ yuw/j†[]Z‚“k\Bd]W-q’`b_k`Oo`FƒÀ‹–bda�‘`egscC‹œ$}�|»„–ueE?xw4~€hig!ˆˆŽŸjlinlplnkšªnpmoqn-Œ’™Ã•Þ€oNqsp(‹·X~€C‡�œ ¦´wyvxzw£¬#™½¬Á7˜˜z|y®¶‚ztA•–¯½|~{}|(£§‹}f{€ƒ~€}?š¡n‰†€‚¹À‚„� ­ð³ô„†ƒx‹ŠºÈ�…‹�Š„�‘“‹…Áû˜Š…Š�’ÃÉ�‘Ž’�”!¹îÏÔ“•’ÍÙ8¿Î§–‹š›˜^»»à÷²žŽ£¥¢§©¦©«¨}ÄÇ8âçµ·´œÄÆÉµ¤¹»··¼¿²¿À¦ÆÉ©ÆÃ·ÃľÁ½nèêÃÅÂÁÆÉÆÈÅÈÊÇËÎʰÙÚÄÑÑÝËÀÐÒϵÞàÐÕØÓÕÒÕ×ÔÚÜÙÞàÝâàä¿ñðºõóãåáÄööéëèíïëñóïðöøô÷óïüýüþûùÿÿèTb¹tRNS@æØfÔIDATxÚÕ—mlE€¯ëîv·œƒ·ëa€^ïZDBYãGÀ–€Q7!¡Æè­¦-4•Š`-œR5çG,[ãIƒ()1¬50‘�Ðx¤RSùhýà‚ÜuË ¸),† {?Ü»žúwgú‹ùÿìó¾ï¼³óŽÏw/€‰Ð̂Γ ñüÏ覽+Nú šÖu+‹*d¼0Ù¶“�Dg\³ÌW„c�"ó«#©Ú˜Â)ÇfeÖdÍë õ¨@¿ Y޾P¡x„düjÙ)(ˆoB–'É¿sdTZ#3�ä%D’Ó©[¶Ê³2KTÿs¶“†¿ÙJæÏZVZ¦Å]ê 2¿n;)ÈÐe²ü·�³,·þ25ËŠþ¬ë/¥ ~ϧtÈ�¿KÞ�’Bù&°(úΉ'�`®65ÁIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/messages1.png0000644000000000000000000000012715174607203017033 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/messages1.png0000644000175000001440000000047015174607203017020 0ustar00rncbcusers‰PNG  IHDRóÿaÿIDATxÚc`hÀ˜zæ?ã“/Z>>zgD¬¦ÿÿ>?{uõÊ2ÇR–—tßß©úøð%ߟï‰2€C@��‰Yă�Gá2Ë·÷¿Ù~ýÉðøxÉ›/Ïö¤000ü%äjuÿÍ­l<ºÿÿýÖ`A¸ëÏM†�ĸ€ONÙæÇ{]&²Ž�ñ?ŒÍDi, X`ÁÂ/ç,¸d??;/Ã?¼ÈÈÀrgÇs“ïïþ@ øþîÏ÷™$�ËTïîüý�‘‘@*d``øýU€áLJS þÈÈÀÀÀ ¨»Œáß?×ÿÿç¥ÿÿ¾¿¿òôç‡ë^žh`¶ÁÂMwIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/msocketi.png0000644000000000000000000000013215174607203016755 xustar0030 mtime=1777536643.505914363 30 atime=1777536643.505914363 30 ctime=1777536643.505914363 qjackctl-1.0.6/src/images/msocketi.png0000644000175000001440000000115115174607203016743 0ustar00rncbcusers‰PNG  IHDR(-SPPLTEind  #%;*+;.0;87$DD=IG$JH$HG=IH=LK=ML=ON=QP=WT1UT=VU=ZW3ZX=^[=b_:a_=b_=eb=fc=hf=jg=li=fffnk=pm=so=tq=ws=yu={w=}x:}x={wIAœ$}|4B�$�|=‚~=�}Iˆ‡…€=†�=ƒƒHŠ„=‹…:�ˆ=Žˆ=‘‹=’Œ=”Ž=–�=˜’:˜’=•’Tš”=œ•=ž˜=Ÿ˜=£œ=§Ÿ:ÿ¥Ÿiª¤IhÌAhÍA³«Iµ­:®©jº²:º²IÁ·-Á¹IȾ:ÀºkºhÇ¿I¼jÉÀIÎÄ:ÇÀhÊÄLÎÄIÑÆ:ÑÉ9ÑÇIÔÌ1ÔËI×Ï9ÝÒ:ÛÒBÞÕ7ßÕ7áÖ>áØ9áØAãÙ9ëà:ëà?íã?ðå@ðåAõêBñvJÃtRNS@æØfÇIDATxÚc`ÀÎN¶Vf&Fzj`ÇÌÄèø¨¨�€@_y�€}"KprZ^Fd«XÀ:<4IS�QP3ÝG,`›¬É¤)¨É¬) 0ËÑÁ,i°€I@P=�Ϙ' 0ôËò�H$[ , ë• )®™Ä‘¢` wã8°-)vB`Uï í˜Ô<;OO.°€² ››�¿¿‡««X@ÑÆT]_S“SK‹�, '#%!&**ÌÏËÍ`�G Àd%TYäÅ¥IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportlti_32x32.png0000644000000000000000000000013215174607203017636 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/aportlti_32x32.png0000644000175000001440000000257115174607203017633 0ustar00rncbcusers‰PNG  IHDR D¤ŠÆ÷PLTE 24   '%-.-/'&/045'(&--0/ 5625#-.68==-.,54BB7:02/AB231342-78463$=;FF685 LKRP9;8 FHJJ#IJ=?<QPMN@A? XV&LN^`ACA"QR7IH[Y9JJce4NLghhj"\[jl+Z[2WYegEPPKOQMOLdb.]]rsOQNDVUuu,ed3bb:`arsF_]7ff1ji8gg@fg5nm]_\!z|"{}Flm`b_:srac`„„(�efd:x|EttFuu‡‡VpmhjgTruB{ySy{M||mol(��Tz|oqnC…‚5‹ŒQ€€L…ƒFˆ…surtvsytsO‡…wyv4–•^„†uz}RЉG�’y{x@”•O‘Ž|~{u��:››^ŽŽR”’�~N–˜Z’‘`��J�ž…‡„l’”U�Ÿg––=©¨ˆŠ‡‰‹ˆX £Q¤¥^ �’’q˜™ŒŽ‹C®­T§¨Ž��nžžV©ªuœ��’�q  `§ªY«¬’”‘c«­^°±N¸¶—™–w§¦˜š—Xµµs¬«b´µ€§©i±³S¼»{««d¶·�Ÿœe·¸‰¨«–££Ÿ¡ž„¬­�¢¤XÁ¿¥ Ÿhº»•©¨š§§j¼½£¥¢[ħ©¦oÁ©«¨bËÉ£¯°«­ªsÅÆmÉɦ²³¡µ´vÈɰ²®xÊËiÑÏ–¾¿Ÿ»¸jÒгµ²«¸¸“Ãö¸µ½·¶¹»¸˜ÉÉsÚØz×ÖŸÇÉ»½º|ÙØ£ÌÍyàÞÁÃ¿ÃÆÂ¤ÕÕ†ãâÈÊÇ�éæŠæå¯ØÙËÎʆíë²ÛÝÏÑδÝßÓÕÒ²ããŽõó´æåÖØÕ¶çç”ûùÛÝÚÝßÜ—þüàâßéëèíïëðòïòôñô÷óùûøûýúüÿûþÿüÁ:‘ûtRNS@æØf0IDATxÚc`À–@À€XnŸP"Œ[žcÕö…•­+4qê_°¶É>¡{óD^\ ŽÏS±‹ï¾~:‡üÂí&"bŠiW^¬”ª€÷Z;¯¬¼¼ü†W·ì±иÏ_RA^^ßñÍ‹6,~µœxr½˜¼¼‚‚¾Ó†W›1½j™wÿ~­ X>¶þÍ-´Ð†Ðû}×òåå�ò½}/#[a™émÿúéòÃ�Ûäõ�Šç_úpú^8B…eÂÓ§k—?º}`á¾ÎoNÅÛ^~ÿsþJ’‚›ŸÞoß~vÙÔyûRÞ¾­¸ûýׯ?gÖ¤#09»°vQOCÙ„UŽ—~ÝJÿù¹3/�®€Ù3ÔL7311¦}»ù¶_Ï‚ÀFoV¸  __Oßšµ@—¾|ùöíÛÑYyì7lݳÌÇÂÚÖ6w¡ÇÑŸ[.=ùñóù{³ Öß~j§îbå3/åùóŠm/Ý}~ðݤ€Pih°á1²²òíïü6%¶bʶm—v¾›…Rür–,.Öí³¶Í.Ž­¨X¼eÒ›rŒØâ¶2¨Yõü`EqlqE_Úõ Ìèä7«i}piKqllq±ë m,éA:tÚ–K[¦WĆ8º†cMûº5“ïÜÖ\«hÉ„MsèÜmG�î á×òÁž{fú]Ú²¥CQBË{²æŠ›kÞW¡ÈÍW‰+ûL‹ãáææ ðÆ•µ�Ž´èéÖváοŒróî_ÍÇ›¿ÙX9òΕéçÊ+žÁIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphFind.png0000644000000000000000000000012715174607203017045 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphFind.png0000644000175000001440000000252315174607203017033 0ustar00rncbcusers‰PNG  IHDRÄ´l; pHYs & &Q©©3tEXtSoftwarewww.inkscape.org›î<àIDAT8�•”]LSgÆŸ·ç=¥ZJi»R´ŒbF4t8–‰”¸«Ý,“ƒN 7\ˆá#1Kpɼ€.[‚áÂÍÄxá¸X51).j„YŒFÉø0ActØ¥ÐJ�ÐsÊ9ïywa1| —ý“÷\½ù�'çù�?`ð!€"¼À Î9Ûê"PÚÞÞÞÕÔÔT&Š¢i«‹†a€RÊ ÃP[ZZ~–eù!Dáœó­ÀÅÁ`°<¼zõJL§ÓÐ4�¯Â8ç`ŒÎ9)(( •••²Ãáð˲üå}‰E]×I,�?÷z½qJ)3 ƒ0Æ„••QQ”Y–óÝn·÷ôéÓ9Š¢¸ä� !ìßRSÄd2Ál6ÃëõÆëêêž ‚À‰„ôìÙ3w2™,,))Ùì™LFÎ[ZZÚ`À€$!Dß§`2™ Š"(¥L>??Ÿ÷ðáò`0X÷;=Ñ4 „X,©¹ù@Soï©ü±±1Àqú&ðš‚L‰DBzðàAù�_vèÐ!éÚµk+‘È•ù¹¹¹”ªª555î£G¿¥‘È庎ŽÂÐÐPÀ(!$Å97VYï,àœC×uÓìì¬'<(õõõËgÏþrÏf³Ý®©©¹ët:ÿ¤”&Î$®_¿®�93P]QQñ€âÚ�ëÀ™LƋŊŽ9â¼uëÖÊèèè£úúú©ªªª—~¿?YXX˜Ú¹s§²ÿþDwwÏ£d2Iººº¾PÀB!›Àš¦EQr‹ŠŠ¶û|ÛI$re¡¼¼ü¥ÏçKY,=''‡QJ™Õj5vìØ¡,,,LG"‘7ûö58ø˜¬3öö’eÙf·ÛóEQÄ‹/R6›MaŒMÓ„ååeQ×uAE.I’@ž�}ºäv»©Õjµoì‹04M¥eee^]×s9çÐ4­`zzº$�Û)¥Œ1&Äb1·$IÄ0 @�$IÐu�«ªªؤ[*•J©ËËËr[[ÛÊÕ«W¥t:� …\ªªVVWW+V«•†UU‰ßï7ž?nଯÿ4rr*£ëúkÚFðL__ßO6›­\Ó4W:�Þ³wïç¡Ã‡[hwwu:�jii©*Š¢¡ë:ÆÇÇéÍ›7M���744äö÷‡gÌmôx.pfµù¦²²r|bâ±qãÆH¦¸¸ø€  jllœ™™™fÑhTu¹\¿hPšUŽpγ�·š€}¡PèD8Ü_íñx022òffæÉ³Ù,ÔÖ~b¯­­•îß¿Ÿéí=õº§§Ç½¸¸˜ìèèøÀeÐÁ9w²p  À—>ŸïÂÉ“'c##QmjjŠOL<6.]N·¶¶>q8#ápXŸœœä²,ósçÎ-èÎ&§dãbʦXlð€mx»Í )1;vì‡æææ¢Ý»wÃjµbxxøukkë÷~[—xCzSVz€BîlùÙd�mmm Ñh”Çb1žH$øààà4€ªuR¯�ìBY!„¬jD°ÞU@äüùó`Œ}Gq3Æô‹/Þ o™ø¿NöEb6y{ggçÔ®]»~°@Þ¦oüfM®l‹þ�þ®q¬a6„uIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/msocketo.png0000644000000000000000000000013215174607203016763 xustar0030 mtime=1777536643.505914363 30 atime=1777536643.505914363 30 ctime=1777536643.505914363 qjackctl-1.0.6/src/images/msocketo.png0000644000175000001440000000114615174607203016755 0ustar00rncbcusers‰PNG  IHDR(-SMPLTE  #%;*+;.0;T5.Y:.Z:.DD=HG=IH=LK=ML=ON=QP=WT1UT=VU=ZW3ZX=^[=b_:a_=b_=eb=fc=hf=jg=li=fffnk=pm=so=tq=ÿ00ws=yu=ÉMA{w=}x:}x={wI˜m8}|4�|=‚~=�}Iˆ‡…€=†�=ƒƒHŠ„=‹…:�ˆ=Žˆ=èZLéZK‘‹=’Œ=”Ž=–�=˜’:˜’=š”=œ•=�˜Už˜=Ÿ˜=£œ=§Ÿ:¥Ÿiª¤I³«Iµ­:®©jº²:º²IÁ·-Á¹IȾ:ÀºkºhÇ¿I¼jÉÀIÎÄ:ÇÀhÊÄLÎÄIÑÆ:ÑÉ9ÑÇIÔÌ1ÔËI×Ï9ÝÒ:ÛÒBÞÕ7áÖ>áØAãÚ:äÚ:ëà:ëà?íã?ðå@ðåAõêBŽ7ÆàtRNS@æØfÇIDATxÚc`Àn®N¶ÖÖæ¦Æú`—ŒÄèø¨¨�€@_Uy�€c"KprZnzd«XÀ.<4I[�QP;ÕG,`›¬Í¤-¨Í¬) °ËÑÁLi°€i@.P=�Ϙ+ 0òËò�H$K , ç• -®�Ä‘¢`-O“8°-ÉÎB`5ï ݘ”\KKN°€²;›‡¡¿¿•ŠŠ:X@ÑÞLÓ@[›C]��, '#%!&**ÌÏËÍ`�G Ýe%0phã²IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/mcliento.png0000644000000000000000000000012715174607203016755 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/mcliento.png0000644000175000001440000000037515174607203016746 0ustar00rncbcusers‰PNG  IHDR(-S?PLTE€@@@LLLÿQQQYYY]]]```kkklllwwwxxx€€€ššš¤¤¤²²²ÀÀÀÌÌÌï˜ÁtRNS@æØflIDATxÚ]� € Q<+ŠØýÿ[í¡B€ÉRJ-Ç„ãª1ÑUTb„r3­Ó0­é©� ’õ™Ìù¤G™„ÝEa§`sa�`ió[Ã!KHñôWú(5ïÖà_¦¨û¨ÛµL ÏÁtXIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphUndo.png0000644000000000000000000000012715174607203017072 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphUndo.png0000644000175000001440000000126115174607203017056 0ustar00rncbcusers‰PNG  IHDRÄ´l;sBIT|dˆ pHYs & &Q©©3tEXtSoftwarewww.inkscape.org›î<.IDAT8�í”?hSAÇ?y/jŒQC ƒB J*vßâÐ!Œ®BÀ¥o—nîB7AJij:8º„,BLJK0VÚÐç?’˜ä½wç𮱄Tkæ~áwÜÝç~÷ûsp"%ß1Ö55€<.Xÿ Є�leƒ}Àià20g𿣩©©•J¥|û¯G¡g�iMÓ§Óé]!„ÜØØ°€û@8�€rll8ý#Ð �D"ó+++“Éd ßïŸæ€K@WÙÐvÕ\Œzxø’k333Këëëâñ¸_×uÇÁ²,¶¶¶ÜP(D»Ý­VË.—Ëûkkk¯kµÚKàðu~ �,‹y 9Ž#{½ž4M³Ü.–3ÀÍT*õ¶Ýn Û¶‡€£ÀBiÛ¶4 #\ íPî†ñªÑh¸¶mK×uåêêjx<Ñ4íéììì˲¤”R¹¼¼¼ÜÃKüXéxµ{;‹=+ =)¥Ìårß�y¼¼,e³Ù_¯Êçó=`¯b† ;,ø ¼o6›?‰Ä§L&³°¹¹¹ |T ò;�N§/„D£Q¿òÖw¼Ìv�Z·Û}¾¸¸øFÍ·��:Ü]÷ú+ûiù±ÁVÀ^½8ê° |©V«Õz½~ ð•J¥} ©öÿþ„ÆI.ÓÀU¼öÿ �–ºx"ðü”2>(wBÞ‰&ÐoÄ(k”·¬”IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/mclienti_64x64.png0000644000000000000000000000012715174607203017622 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/mclienti_64x64.png0000644000175000001440000000626415174607203017616 0ustar00rncbcusers‰PNG  IHDR@@�·�ìúPLTE  " & !*-0 '37$$91;!,#@0%C,+#EHM*5,&8,RP74)/:1WM,6:,[^T( \!8B>e!8D:b@B5,N5h$BB=Z26KERM~*2b@5`DIUJGWFTRE‚,STAx8†)OWSTVS�/@hNS`UV`[^_L“-SgY™2�6ebUcdPNmYfeL�<]g`gf^efd¡@\rd™HcpefojppisrXqr^dxk,šRuselvqkxlE�_!¦Lq~s|zl`ˆqu~y~b||u/­Y>¥`^“tw†}ƒ„o}†‚„„}†‡i†…wxŒa›uMªnA³f‚�„Ž‹}Œ�x„މ‘‘u��‡“”mZ²tc­zNºt‘•…ˆ˜’‹™�Ž—‘”–“™˜�žšz—›‹z¬Œ� ™•ž™”¡•¡ž‘¢ †cÁ�£¤|u»�›¨¢œ©�§¨†º“mÅŒ§¦œ°®‹®®”£±¥“» {Ê’�µ§¥±«ˆÄ›¯¯¦„Î�«¹­º¹Š··ž®¸³¶¶­˜Ëª�Ò¥±À³¼»²µÁ»Ã“¦Í¯¶Ä¸¾Â±¾À½ÄÀ²›×®ÅÅ­ºÉ¼ÆÉ¦ÉÊ ÌȦ»ÌÅÍÌœ¤Üº¿ÍÁ´Ó¿ÉͼÑРÁÓÌÅÔÇÒÓ©ÏÏÇÐÓ¯±àÀÉÓÎÃÙËØÔ²¹ãÇÓÖÆÖÙµÛÙ©×ØÂÏÙÔÛܲÛÚ½ÞÚ·ÞßµÃèÐãß¼ßâ¾âàÄÙâÝÏêÔåáÒãäÎÏîÞêé¸éêÓëìÃèèâìêÎÚðâáìæèìÛððËðíÝ æôçóòÕôðáøöÅóòéñóðôõÞòöåí÷òöõìúùðùûøüüìÿýàþÿç BT5tRNS@æØf hIDATxÚíWkTSéP5("„𧨀@Gž#Fˆ `˨‚#6>Q;Lñ…ˆ5XQ"”  A ’IBxHL ÁȦ1Q BÀÊZ=_„§KÇŸ]]Ýß½¹Y+ëì»÷9ç»÷dÞ¼ÿ¬ôßõËW®QQQ1þ+ÕÂ1§”˜œÅ[ÀèÛñ7*¼zóêÕÌ·Y¼¸³HEÀœ‰V^ …\ é¨|TŠ –Š%°”è냣££¯¯¯7W%Å))б1…H%pI%‰X„–H„b!z ã1„+:f]øO¡›��ñ˜Lfy9³¼¤¤¤Ž÷È™ÁßÐú+Âùcçóª;::Úšgv!éŠcŽ�a‘û"##""BBB¶mÛü�‡ÇNNk×ZYâ,--q+œ©©)ÖkˆÙPÙÖ×ѶE�`ŒHhhAhh¨¸{÷VöõëgNž“ú­Ò€—»»ƒ³³ÝlSO›º‚)flÃð0� vAÃ=žÄîòÙžêU©Öº±4 ðòruupp°³1¬5ræž–ÁÙ$ÖU�ÑÈ´1¡ð'ÍÚèJ�ÎàÄie:AÁ€³ƒÝƒšÞr `îix:8<8ˆF˜IB~ ŸÏç˜yÖ3èeq²VyÜßÕa“�ÍšÕ‚^®º‚±òˆ†îîˆC›Bi)£ÈdDjN²Öž@Hàz›uÐÙz•]î¯gL(å!wëšaÕÝo¹Èìï ËÉž™|þ&»,N¶8€ž‘yÅÅ‚´ØØXYá–Õt >¬BÈ­ûïÁá‘Q¼PÈa÷׳ÙU 㛞—A¡µÈ_Bl`w™èU÷r›T &Çä´�ìÒû°JKûi)ýI±þ#ŸYEgA 5#ÀÈ>0A7ÒsýšÕ�œ ¦¦‹Û4—ƒQyù¶ëEE°…вGÒÒø„°@?›__�Щ´4k™lZ–`䆳Y ;ÛÌtIu¯ fNÁ¨¼dóÙüü¢üüüìr3ÅÏÛÓ¯Ÿ]UEg ‚<ІL&3'[ÛÇš fXS�(@ÁÙJd÷iBaN|I‡Çd3ØŒbZ^A1Ò< �loNÀ‚3¬�««�¥RÁ�3ééé7ÒÓ¯÷Çf9ဲe` 3ã %9-5!ÞÖš`°g†Ú5�Ö9øædú™ôsgÎ�íß—ÌáóÙ<ˆe45#ƒ’œD&“ˆÖ¶�XHk¨¯]ÝÞ¨R>9./ô8rN‰#ü„(tû™S 2)©É ñD¢®Ÿ‹ÎÄ k ¯§]Ý5§`—bH^âtäÏïAÍ´­ç±«ê��A/¦Ñ22)”ä d).Ji°X}}ÌÂê.5ã Ài/Š>|øð�U.ÉLTÔBÔ‚ë‰@E¦�KJÖîÞx?ÄïßK�³¯z¯ L¹@Fºžž†&¦X¿d~õ“ƹ$ŽÊå…@ Äîý(6&¢»CPiy™i””2)ž¸Ï\—°èc0:š¬'\5 Ri ngèþP ùþûo3.h&C8”0™D"ÆBˆ‹ò›t40Á¢ bt´5Yí¬¹$ŽË%…@ŠžýpzG,¦€ÿâè`™Ìâ x.p \aj Àè-ÑÖ–U·×ÞS)•€üŽ™ø`|Hq�&‰Ê åY k2éÑEÃ6j)ê ==í… `ήQùP!¬‚Oƒ¤kŸ\P`¡¡¡$0šö&c¡ Q´Î× s Æ%âBñ›©To ã#؃ÓF~FÓæQ�‹±¦(�zzKt.Ô”± 7ª,ŒK> _í¡å!Ó²E.¢í 3e ëa0ÚH€ %Q¥à�Tú3‚P¼«SPJAFB\)�D°]�53…xƒeJšàŒÕX{o£š…Ÿ°?#Àû¸~õÅOO{‹8+K´‡ õPÁdæ…z¤ÒÑ|hðŽPev„μ‡ÝÝ�7­_Oq+Ke .Ã@惙ÿëFÖœ1ÌB¾´ó‚tÂ+½Â”�P+x‚ ò1(È€£üucímµˆEÒWÿH½8‹Ô”Tôí?p>)5•÷î5äðöªG±T: £)ðÝÌ ¨ü@€ÏÎáÙ³gè|ö¬½½±¶öÚòÙ9O4  ˆÄb㞣aæ8„ÞŽ6„NA—ÛÄeq�p©­…ðÚÛÇUƒ¦ã˜ÅbÑ€è90ô=îƒ)° P� © \Íe± |¬ÚZÖ½Û7�/WvÃ�¥&:s(fA„S‰‰'Ð:šxðÄ�£€èß!lßî ‡ï¯>:x»ùÃÀÉ„Y³0'õü±1Q¿ ßâûµãªU«¸}ÞèŽ4,KD�j~º“{õê_N=ýÝöåó>›`jL.…æ‰?¨T2? ŸO PÀSælñÀcAee.0œ:~0:zå/Ǻ!8¢Jº˜””t"ñ؉11(q[|7n\¤üùSñþ¼!�74ùýåx÷ö�þxQSs'÷ÒÆOÜ_ôF¬Äsñóç}=°zOºž(ÑÞέ½wûÚéè�kpC):{z:{;ÛÚz¡¹.jAÔ€¨÷îݼvúøAßO˜øý�¬\ÀÕ›YYY¹Y7³®ÁÎKèšué4DGç»òn >‚éi -ô9=½ÀÍmÞÿñ߆¶)5Ur-IÙIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/status1.png0000644000000000000000000000013215174607203016543 xustar0030 mtime=1777536643.508914341 30 atime=1777536643.508914341 30 ctime=1777536643.508914341 qjackctl-1.0.6/src/images/status1.png0000644000175000001440000000107015174607203016531 0ustar00rncbcusers‰PNG  IHDRóÿaÿIDATxÚ�’;hSa†ßüçüçärŽ”o!ME¡‚RD +‚ c± 8¸¸é ƒ»×N+ÔMª(u²V´*ÕÖ¤¤Ô¤4­9IšœûåÿlBâ3~|<¼ßØexlùIßùɇè#O¹ä™ý£, ×] œ¦1àÙ”„÷C‚¼·kÁÎ�R6pKARûÏu-pusˆy>U «™!¸™ãäê4—:p9Ö(½ƒ(K ±ýƒðõYþÅâÔ\@¸�@�ÆÓÍÍ)§'sF¤Ñƒ™ß©âg +Éã#×ŽŽŽ]¶ëV/gœƒÀDâ³€ñÊ·ÜqøþÚg½QÜFaÝ··Ã²Ú—¸4QH׋ E�$¤²wÇk…˜Z__8@h¤õµ™SbîåsêêEרþø˜ûµ‹rÏᤖ_½â |Ç�œP++xéí“¶H(BB<ÐÄ�¹Ûƒ»JÆû€¬¤O;Í¥f5‡tÍ¥j¢¹ñ¶`á¯áyðg‰rø=�ʼng�˜[óÜ©—&ôò,ÌÊü£¶KlM¤f=+ S³`U—jÚ÷É{DŒ½b¾±ÐöŒ-”}ÉçfÀ¼&œFþ Î|ã¿#ÁÌ�ìMÍ·~ÂÙY}ÝÉ'ŠÿôòʲY-ôzVyÿƒ¤fTBÕ �öÿÕžÛ ô[+ÎIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/backward1.png0000644000000000000000000000012715174607203017002 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/backward1.png0000644000175000001440000000041015174607203016761 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ(%ÅJLʈIDAT8˵“Ë€ DZ²¬&Ô¤ÕàÝÔãü�9îdd À¯E"Véé±kf˜ yzìšoèñ‹¹è&fyI1¡'À óxi>ó¬æ%˜º?BÍ HJ£w3°!rQÏøb,’jÞsHÄYeïÄëLTMõÓ$O7(Õ¼Xú%ÒoÝNÿwÜIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/xsocket1.png0000644000000000000000000000013215174607203016700 xustar0030 mtime=1777536643.508914341 30 atime=1777536643.508914341 30 ctime=1777536643.508914341 qjackctl-1.0.6/src/images/xsocket1.png0000644000175000001440000000021315174607203016664 0ustar00rncbcusers‰PNG  IHDRíÝâRPLTE_^%a`%lj&ÝÝXââ\ìë\ïïaÿÿf[Y&c‘BqtRNS@æØfIDATxÚc` `.€0Ø: &— Ø•Fý?MvTÃIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/mclienti_32x32.png0000644000000000000000000000012715174607203017610 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/mclienti_32x32.png0000644000175000001440000000313215174607203017573 0ustar00rncbcusers‰PNG  IHDR D¤ŠÆ÷PLTE+2' " ( -0 ""7:<"-#AEI21'M JQE&/62450V97+6:,1=3Z\ 3>9>;/<=;>=6`?@.^(d 1H69E;g#ACA!W0i/O9n"?KAi,*Z9s'CKG `8JL9>QEu)y%o7HPL8[ADSMBUIt/IUJ�++VUMTUS‡*K\J„5NZPWXEˆ2J]QRZVJaNZYR[\I&z;‘2’,PeMY_VLhO_`MUd^WdY™2JnS4}Q1€M\i^KuVghUWqR£AYq]K|YG€\B†Tgpl4�OqpWN„Y£IivkD�_NŒ`J�fmzowxdK�]pyu>Ÿ[}~j�bu‚v5¬Yzƒa“n†ƒu„ƒ{‚„�yŠƒ�І‰Šu�Ž‚mš|y•†E¶o…’†‚“Œ€•ˆ�“q‰’Ž“’x}�ˆm¨�™–v‹›•’™��œ�‘›–˜œŒŠ£�›œ‡ œ|� ™_¾~‡¨’™¢�—¥™“¨š¤£ˆvº‘–§ �±›«¨‡ž«ŸoÇŽ¦¨¥«ªŽwÆŽ¬­…ª­�¤®©¯¬ž­®™¤²¦±¯”¨±¬­±¡‰Åœ³´ž©·ª¶´™–Ä¥¬º®‡Ñ ¸¹¤�Р²»¶ Ç©¸»«¸À¨¾¿©´Â¶¸Æº¶ÇÀ»ÅÀÆÂ´ÁÅ´�Ú°ÉÈ™¬Óµ¥Ù±½Ë¿Éɰ±Ó¼ÀÊÅ»ÍÆËÌ¢ÍÉ»ËÊÁ­Ü¼ÏЦÁÒËÓÒ¢ÐÏÇÓÏÁÓÔªÇÕÈÒÕ±ÊÔϼÝɺáÂÕÔËÚÖ´ÙÚ°ºåÌÚØ¼ÝÛ«ÑÛÖÚݹÚÙÐßÛ¹ÛÜÅßàµÚÜÙÜßÏØâÝáäÀÏêÔåãÇåæ»áäàêæÃåéØëéÍêëÔÛòãêìéðìÝïðÙîòáçõèöòã÷öìúùðùûø:�–¦tRNS@æØfIDATxÚc` „»¢ð÷‡Èûÿùóç÷ï_¿~ýüùóû÷o ð >~|õÞ¬(ÿõùóç·AàÊÙ³g‚À¶=ëöÜsd†ëŸ?gMžÝÝT•¨Z**r"‰�î+ƒ¼«ûñãÇëó‡·.]¿yþŒž’ ¨¨`7g+‘û÷Á žÏûñçóç{ÇŽžê¬¯+ö±oÎ r²Ô×»1á÷ãÙŸü¸yïæŽoäìßãle¥e(rýº Ø„Ç^~}ïæ�sgÞ0Ð<×è™im¢¯+'xýØ„_»Ïß;þùŽ—­žçúú6É®µHÖ×’—â¿1á÷ã¦Ãç�Ýñüá�iÇ�ï_9kf¥�šºœï�; GºüºÑ´uëÖ“3W¤×ß8u`ÿÞµŽl‘šÆr"‚Ü.€­øy#uéÒE''(¨»¶oïÞÕóøŠlåDø¹¯Ÿ[ñëvîôéÓw6Þ¾qîÔ¾ý×Îëk«”Õáçg¿~bÂíØ–––¹Å×N?4`ńΚbq ¬ÎHƒÝp9°¢¢¢¤µïøþý[ÖΛÖÙXéhÊÏÏËÁrl…Ë÷ÛÙ@Ðä¸qïþ[ë+Óù4øy¸Y™ &¸þ<§”åÜn±zcŽsD]Ÿ??7;+#D�ï÷ËúÁQ@àÑæáÉÉic*aÃ#´€Iê†ï‡ô£ÀÀ;¥<Â@ÓÆS�ŸŸ‡��…‘óÄ ?_mˆ Š ò6Q3ÖååfÀööŒ0È ß¿îÎËÍÍ+ÊËËÊJIM‰Ž� ósw÷ =qé8Uúøúõã·o?~|óæý“WOž=zt÷Ù³Ïî^:âIµ+·m[¹jÕªm›¶mZ³aÓš5 ,˜Ó e(‰_ûÝãÛ—­œÒPšnÎŒ%w¸þùõëÃǧ'¶Mé*ËäÂ�®­­=wîÜÁ‡ölÛ°jÕœÒÂTùj ß¼¹ÿæÉ“»wï\½táȲ’áá@^^æªÂÌ ôÙfŽgjêIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphZoomRange.png0000644000000000000000000000012715174607203020066 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphZoomRange.png0000644000175000001440000000254315174607203020056 0ustar00rncbcusers‰PNG  IHDRÄ´l;sBIT|dˆ pHYs & &Q©©3tEXtSoftwarewww.inkscape.org›î<àIDAT8��•_L“gÆýZÛ HöYD((a2”é()n.Ä Ü²?™nsQÀÍ?˜¹LÙŠ&&î‰É¶ /–é0:ÙÅ *uln&�¸UÝ.YI€:pX&³¬-(HKKû}»è׌9Mv’“÷æÍóžó<Ïy� 0OY€Ä€¿€Ÿ�Û@PÍK5ÿD6ð8`4€ø�Ÿj<Ï\(’�€<22";ŽYà9@¯<¦D X¬6÷õõMÏÎÎÊápXžšš’�NgxU,MMMÕœ>}:îp8ÆÕjõÌôôô 0¦T·Xéj•Ñh\e6›—ËukhhhâСC½ÙÙÙ9²,/,--}Àb±,2¬^¯WÞ½{÷8ðð ð(�,^®¨¨h¿páÛ©ÉÉ )“ÇÆFåÑQ¿l³µ…,K'ðpxçÎ�#===2Ð sÑhT!8nû>-µµµoŸ;gÛ�–¶(eß¾ú?Ÿ|ò©+••뿯¯Ë-Š¢¦­íìš­[·n�NE'¶Øíö;ÕÕÕ?e€NáÔR^^~ftÔ/57Ÿ ¥§§ÔÀZ`³N§;züxSphÈ-™Íæ®�7þh·ÛÃÀ+Ok�ÔÊùÚÙ³gÆ»»�qQ[€u€X¨äb`�^¯ÿ´««3ÚÜ|*|T)š VªÔ*€œ”””F¿ß'544ø�×�¥Š¥æÛÎTïÝ»÷�ÁÁßåüüüÏ€@/(>�QŇ _¾|yŽV«U € ¤Ü••”€0àéíí½­×ë1™L¹ �’À}"‹Ijµ:Ù…ê>WUZ­VˆÇãqåAî,á7n ONNJf³9ÈÒ”öçS‘ä———çÎÌÌÈýýýƒ@ˆß¯âH4½uþü7�ªª-¢ÉdZObâ2°â­ÈÌ̬¬­­Íºxñ»;~¿¿G–ÿÓ°€„ªoäåå9úúzã—/;"_oÏÏuYYY­—.u„º»�RIIÉ—Àc$8V©îÕ9À‹GŽ9‹ÅD›Íæ?zô“lQUíííNg·?�ÇKKK37mzÉ011Áþý~éèèø¸Œ'yNÚ-(ꛚšÆ‚Á ìt:e«Õ5�—ß÷vvvÆÜÛ}S¾v­+ÞØØ8VXXøð‚RÐBK­"1 %Š�%ÇŽ³ÖÔÔB¡N§›Íæ;qâÄ»À4°,///W¥R ÃÃÃI’ÜÀoÀ°Òµ X\Øâr¹îlÛ¶íW«ÕzÛçóÉ^¯W¶ÛíòŽ;Æ€zߥHbHò”ÌÒ• uÀ#Û·oÿÊår…�* ��›››b0–]½zÕ[YY™-˲ÐÖÖ8yòäaàà!ñ±$­†¢|Òvz 3##£HE=`Ô $IRÚ®®®ë”‹ŠŠ ---íó@“— A±^‰M²:‰, ‡Ã ÍÍÍQVV¶hÏž=ëÕjuÔçó�}€oèÝ¡ wíÚõžÑh\‰DRW®\)ƒAYøbÅÅÅšâââ Aðx<†ÖÖÖä?r/P–ÔÕÕ­3�iáp˜`0ˆÛí–¿Šÿ·LïjKt- «ýk™þ EürÙôIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/xinactive1.png0000644000000000000000000000013215174607203017212 xustar0030 mtime=1777536643.508914341 30 atime=1777536643.508914341 30 ctime=1777536643.508914341 qjackctl-1.0.6/src/images/xinactive1.png0000644000175000001440000000043115174607203017200 0ustar00rncbcusers‰PNG  IHDRÄ´l;àIDATxÚí“1jÄ0EŒ*5Ûªôæ>’H�nÂg0Ìt‡”S-liFÁi.ŒÖaSùu‚Ç—Ðü...þŸ·Ý¹'¢fRJ73{¨ê\Jyðyê†ã "‹»¯¿q÷UD–ãp&·‘e=@DýS©D4í_ºÇÝW"šZ3;"3!„C1„fnþŽŽ™‘RºµÈ­t)%˜Ù£Enõ 33¨ê\k=k­PÕù™Á½®"òšÇ!"?›7åœïã8~åœï[Åú?­ôV=l…ª¢”rj“¿§›ÛGLZi¡IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/qjackctl.blend0000644000000000000000000000013215174607203017233 xustar0030 mtime=1777536643.506914356 30 atime=1777536643.505914363 30 ctime=1777536643.506914356 qjackctl-1.0.6/src/images/qjackctl.blend0000644000175000001440000062517615174607203017244 0ustar00rncbcusers‹ì]`TUÖŠ2»¿®®e°Æ².ÿºkYuÅFš‘&R $D�$T�„>tz( !@è„–B¥HEuUì¬%ç?ç¾ûͼy™ ™„’àUïøO†ìñºÇ}ôÉã�üûquþ›ïo»í®t/m€ÙHþð¸Vp>Œ3®Hp2l´`Eo ¦®½zP×î=z©ëk¯÷P×n±}ôó�êZ…¦‹0�òÃû¡Ôï�‰�ÿÊÛ–úôéS4sæLZ´h­\¹’Ö®]K7n¤õë×SJÊDêÕ«õêÝŸúöM¢þý‡Ò€#øɸ�âö0‚’Ï È%‚ÿöÛï ~µãkyƒ‡&SûÈ®ý /JMM¥%K–(ÙÏÍÍUØoذ�Ž9º` 4œ“Fðu <†ïÇñ7b ë€ÑÜd�®~_q¾ÿš)érÛmw0¨È1r¤’íQ£Ç2ŽÃ(¾×`š�–AkÖ¬qa/ø‹øè£�hÕª\92…† OÆ%ÓàÁɬÆ1þc驺�Á;Âtòmà¨hh×.íÚµ‹>üðCúñÇé›o¾¥ s?‰ºÆ¾Áx -[œŒý&ZÇø¯[—O;v¢Ù[¸¥pÿ Ý}÷½¡œ]àûoâyE¹ Í»÷Þ{ÉŒ½àÿç?ÿ™êÖ­K{öì¡“'O*ìIßÿ#ã›Ë㽡Ü'@ïýTáž›[Àº ŸV¯ÎcºiêÔÅÔ³çŒý¥Ê¦3ÐÿŽ\ÂãåWÚç�1B}ï_zé%Ü�ýu×]G×_==óÌ3J{¹þôÓϬ>¥ìì�lëÎý½©¬#Þãoÿ&Ê^¹�–-_Ç߀|+ì2ã�ÿKˆµ5kÁ~øðá,£Siîܹê{/}?‘{`ÿ—¿ü…jÕªE7ß|3mÛ¶]5ÁþóÏÏÐ|Jg=�Ï£!C§R^Þ^Z�µŠÇ +hΜ¥4'#‡œ�+ó/qø¥—Ûç 6L�ñÄž/}½ììl5–—qŸÈ½{Áÿ–[n¡‚‚ÍôŸÿ|˲ÿ9½÷Þ'ôÎ;§hï¾Ü ©{�¡”œ²�fÌXD'¦Óøñ³hôèilšüò‰q—ìŸx28qèС û9sæ(›®`/ãøÍ›7«ïý‰'¨E‹Jî�ýÍ7ߺà&Z¾|-;všÞ}÷S:tø8x’öí?Eóæ¯g[ÿh:l·…DžèC:ô   {¤ï‡#‚op¾ÿàÊEºÞvÛíÁC† )šû,, ÿ€ü_lÏ•¤Øuyž¾hâĉʞoÅ~'Ûò?øàòŠý™èã�¿â÷ŸS£FM”Ü ör^ý�ŒuCÊ]÷6òiâ¤%l¾ž¯bEð œù÷Å¥óô\°ÿŸÿ¹ªèþûï§´´4¹/((`ÛÝ[Ü—;Æ6½oŠÉý�ýñãŸÓÑ÷?ãyÞO©aÃÆ.ìÿë®»�^z©3Mbì{K_ÏZ‹€ü[9rÃÀþꫯV¶½ÿûßÜw_®æêJÂþ—_~¥bØK_ÿÐ'ÜÏ?Iõê…)ÙìÿüçëÙ^ügzõÕžçÂ5�àœùWÎóU¾÷&)¹7Ûuüqe˹ÿý÷ç3ôÛo¿ásO.ì?ùŠ\r¯±ßÏc<ùÞO™2Oá쯾úªV­ºyŒç«6ù÷Å™óøüÖÛ‚‚û3öãÆ�§Y³f‘Ƚ٦˾œtôèÑsbÿ¾è|3ö»¸¯·õˆúÞj�pâ<]_aì‡Ç¾¬Ï¿\ÁþСCÊOÓŒý/¿ü¦Æ÷V›®ŒçÓÒ—ñ<c¿…å~íšÏØ�Ÿ�EáeþÞ[kÁpäßÊ?¯°Ÿ¶øîˆÿ†ÌácmŽ`¿uëV:xð }öÙgrÿ믿±­ïGú˜ûù|ðY1›®´�É“ç1ö»¹ÿÈØ�gìÃãÊÚ׳Ö& ÿVŽ”1üJ»HöÝQl_ÖblÙ²…çdÐéÓ§Ußž]tÕaÅþèÑÓôΑOŠÙtÅ®“˜˜LãÆ-8ŸØ£¦|ƒ3 ÿàŠ×'ë†&c¿-™ÃÇ\ü7{ñÑþôÓOû_ئOêöÒϹ�±{þAž¿ß·ÏÓ¦{íµ×³½øÏŒ}�ó%÷¨]@þÁ‰2^o¿=(xèÐájØc_|wöíÛÇc¹OèçŸVó9âŸoÆþ˜ ûOöèëmÞü=ñD=¶ØÿáÿSÀE¬RÆb–DÁ/qä¿$NYÞ öC†Só¸2—‡µØ˜Ãß»w/ÏÕ~\ûoTãûcÇXîßûTéüƒYîÅž¯úzï(?ÝÌyé¾û¡ ˆ}@þ-˜–6(Ø2¬(%%…fÏžÍë/¸æòÄãí·ß¦S§NÑÿû_¹ÿÖ'ö'‹a?f̼ ¡ó­UŒà8òo厗°Â~ðТääd5Ÿ#ØËšGÖäåëuY²öÚû"öå1tþûâ§«°ÿØ+ös37°�¶`WÀŸû ñ½·Ö8‚à È¿•;¦°`Ÿ”4¤hüøñ®¹<Ìçöâ·%kò|bÿ¾øh‹�>ûèÊ÷Þ,÷«wñš� 4jÔ\jßžåþâ`�¾%ÝÞ~ûÁ‰IƒyœšËƒMsyâ¿!~Ú?ýô“Kçÿö›Iî=°?åÂ~ó–wx>p'eÌ]Ïk¸3.&ö¨nßà È?¸bºÞ&Ø');v¬šË›¾y>GÖag?mY‹+ã;9=±ÿTÉýa‘ûŒ=ûlÉ÷Þ…}c?2ƒÚµë^p‘äµ È?8QÂ5"âUžÃ£æò¬ó9N§“í7Ð?Ç^lºGß·`¯u¾`ŸÃr?'c9FÎaìc/6ö¨qßà È?¸¢¯‚ýèÑcÔz\¬ÉÄ\žÌác_Ý~øÁ"÷?ñ¸ÿKöéì?æù>-÷Vìç0öŽ9ì§ù·ÒøêYJv^‚ù/��áŒý¨Q£½ÎçȾøk~ÿýJ×Cç÷�û# {^�':ß‚}zz.¯Ñ¾¤Ø£æ|ƒó²•ÿ†am›4{%±Y‹ðÄ¿ÿãá®s‰‡`?rä(×|ެÑ�y\™Ï‘y\ñ×üþûï]Ø þnì?a[¾È=°ÿÈøÞ³M7gõ[<§ËØ�H¿”r�ºÿ.ä?²c÷¼1c³hâälšššK©éùÔ»ÿ¤üÚ(Œ0_ÃÃ_å9ü‘j>GÖd öX‹-󸂽¬Ç”>ú{¾±×}=Á>‡±O[KÃG¤UìQå¾ÁyÙÈÿ­7_Ü0äžDÆ2Ð�d;*“&Œ_D)“VÐäi«iúìM4{ÞVê—4=߬{ÙSKÖdÊ|lú²&SæòÞ{ï=µ.K|ô�¿'ö§Œ5Øx 6t>c¿Š±Ÿ�¶†÷â«PØ_–òëÍ×ëVÔ¯W 2”K#†Î¤q£æÑ„q yÅe4iÊ*š6s=Íš»…æ.ÞI­ÛF'µï�?Œçðe]žu>Gæòd_MY“ìߨ:¿P°_ÅØÏfì‡Í®HrYÊÿ͵®Ž�®S”Ô³ïw9˜dÜ6fìxJ0�Æ�˜CãEŒÉ¢”ä%ê{0…¿32 É1j*¯•Îm#Eao�ÏMY“gÅþÔÇÿá¹û�¹m°Ü:Åë¯Ýr/دdìgÍ^]Q±¿¬ä_°�ëüpQŸ®�QbB}ö‘œ úoÓ§§ò¾ÇCiô�YF)m`%�_̲¾œ†9&ñÞ˜ÃÙ—:YÍåÁ¦�ùñ×}®ýU+?-…©ÐòߪÉßòúuý·aÛÓvÝÚ¶—‘l`¿XcŸËØç/yžVr¿oef+:!ØŸŒ§Ÿ¾íÇrϸÿäÆž¾èKG·w¢Þ1OÐ4Ö_~ù�ò×|ÿ}Ù?ýCöË~›×Ú§ñ¼P:�áoÀ„IÙ4qÚš6k#Íž»•æ-ÞE‹W¢•¹ÇhmÞI“²´2"¸Mà¬0ò/¶½>1ÿV¶=ØuÝØ‡Ñ<–{…}Z Ê�ÇØ/~žœk^¦ƒÛ:Жÿ/NÆyÁþ ìéÓÞôßñ´wC$ÛŸ¡)Ü0~?CætNñ:ì�xlx„ûx ø·ÕyÎ8…¿¢f¬£ì;–>-Xò6-]žë> ÜüS•UTHùûŽØö†ö6ÙuµÜ‹]wޤƴhz3ÊÖØç1ö;V¿L¶v ã^£/>Š£Ü/ÒgÆ™äÞû3ïÄÒ'o¿NïoïLÉCØV<æ5Úœ¿Q¯Óà6À¶žÝ»�Ñ’¥›hÐ�éª LÒ:`VÆfš›õ&e-ÛGËrŽÐªõÇé•ð¸$–£ÊxDp¡q^rùì{²Ív(ÛöÌv]ØôÍØ¯e¹WØç¼D¶¼Jì�>gÌ<ÓWéü…³Zð÷žqÿÚ‚ýûc;:ÓÁ¼Ž´smφѱÁT°i£ZŸw�}y°/�øóì§ )óhû¡�–¹�2í¢E+Ðò5ïÒš�UFP¡ä_l{=:ý[ÙöÄ®+6}ØuŦ¯°g›þŠÙÏÒÚÌ–´iQÚÎØïß ì{Ð{:;�uA ®|ÅCçŸaì?e¹ö»ÖFÒ›«ÃiǪp¶+4P~C æ$³ÍOú²'Ç'Ü>Vó< n¢¼NkâÔÕ4sNÍág¤lî–qÿÍK­3 ûr½dò¯l{�¦ž¯?æ²ëNgÛžu>G°_£±ß¶ê%ÚWIÇöEÓg'û¯ ¹ìé{éç¿Aîy�>ÜM?O¾°wæøo˧im()¡¥ŒzM­Ñì÷î=Éß‚ù÷V?  ÷±ïèn™4yz.ÍY }Þ—�û„•ÿ !ÿʶǾ[IlÛëû„²é‹]×lÓ_¨çsÖðø~ÓÂ6´må‹ö{ûã=èû¯ú°Î@ö|=ãÖùÇvt¢w ;Ò§{Eî»(�¹öÛW†ÓVÆËŠö´lV“F}º…ÐÚÕ¹Jö�Îcü»*ï±-è òë›Í>�âÇ?˜ýÄftç]ê÷T/µ,—%‘{œ—Dþ»3öãê¸ìº2¾Wv]Ë\ž`¿‘±ßšý"í-ˆ¤÷ßîB§�wWØÿfÅþ?F?ÿçè›#Ýémîë¯É|þœØo^ÞžíÆíy,ÙŽ¦�lBãШÁ�hñÂ,ûû•oWVV¯ÿÏaŸ¡yzîç’­ß+ ÞfšK.ÿbÛÛž¶ëŠï–Øôe>GæqÕ\žÆ~ËŠ¶ôv~ÝÓ…>ý ;}÷eúí¿¹ìO÷f�o`ÿéÞú€å~ó²W(sRs¶¾LÞäØ,iÏýÊvÜÖÚñ8³õïBýº×§±Ã»ÐˆÁý•/ÿ¸ñ<6d?Ÿ #¢„‡cŸ3nçó>‚ÃyQåßlÛ»îT«]WÏåawËrÆ>Oc,–¾ûOoÆž¿õê{¯u¾ûw»³Î7°?˜ß‘Dç î‹S[©þžYçû|�ýÆ>wþ+”3÷%g¶eŸ²æ”]—úr;èß�õ£ñC[Ðk¯>QÀü«¬ø_2ùwÙöÄ_—m{f›þÄ¡ <æòd3c¿gS8½·»3}ò~,}ËØÿ*Øÿ—múß›±ïC¿ˆÜ{Á^úù‚¿à.m`á´çÔ÷¾dì_ä¹…X´fŸÂçhòˆæìSL ]‚éÅTfì¹Ùª#‚ÿâ¼(òߊ}·”m¯ï“4Îd×5ÏçÌý4åð\ޞǕ9üÝû]û/{ÆÜöØŸ¶È=°—qÞ6Ý×[“Ù–íH­ù{ ß{Cç»ä>ã% ¸±Ÿ¥±ÕÿУ>½ðìýÌ·Ê*÷\tu\tù‡moÛö”]—}µÅ®›ÆþºÆ|Ïáó\^ÚøgÔ|ŽÌáïÞØžÞÝÙ‰>>Ú�¾ù¼ýzVcÿƒEîýÀ^úù"÷‚ýÂi­yÞ¸- ökç±Îר/f¹ÏœÔšöÛñüc÷.ìÑ"øç•±ïôbß-eÛÓþºn›>æòš»æðçOiª|w޼ՉN½çûoxŒ§¾÷¬óûoYç+¹wòOï½É=°/Ôr¿iQ;–õØ� %ëƒ6Jî]Ø�}Ž&1öŽ~bdì›_rì/šü‹}'¡ ûlö4|6' Õ¾Ú"÷lÓ÷œÇeßžÃ_1§%-çóÔ»ÝèÌg½èž»W:_äþ¯¡�ž¢[j] †]F× .ÿX—)¶=øëNiøjc.Oa/syz_ùî°ßÖI�ý¬IMÕ\¾Wìßc�°_.ØOž24ö)Cš²_ùÓÔ·k(ñ^—#öhÆ�}¹žwùoÓìžü�= ŸMñÕ6ÛôÍsy˜ÃßñÛŸ½¯>M Ÿd¹gÿ�më �o–{�ýñÒÈ=ÛôÌý|—ÜÏy‰û…‚}Š!÷ÉŒýÐÞû›.kì/¨ü›m{Ê_×<Ÿ#sø<——=Ûðß�y\çí·u˜±ÿ„ý5äþ�øîü¨¿÷‚ýg}èדÜ×cì?c¹÷ûvÊ®'دÉäï½ûÔÑ-hÂ়®¤õ‰ ¡[/oì/¨ü·Ò~{ðÙ„¿.ÖçÈÚ,cטÃw²ÿ†øî(MÁþ3ö¬û#ì³u¨ #}w¾°ŸÕ–Ç~ÏÓ–ûÔQϲoiîŸ6Rßüß öDþÅw«_W^“˶=³]×…=Ûô1‡ŸÇsø;r ìÅgO|uÅOÛ%÷ߨrß“ö¬�Pß{å~“ôõ¼¢ä~¥È=cŸ5­ ÷?[²�Á³lƒlBƒ²mïw#÷Dþ}°V¢Øöd=¶Ù®›.~úz>GÖå©y\í¿q`ë«tâ á«[öß½×ÃCç;sÚ+ß ÌåÀ®§Æ÷®ï};²b¿L°ŸÚ†Ò5öã›ðš¢†ôÒs—…=¸–æz^åßeÛãõØb×�¶½™cض§×h`M¦kŸý7ö³ß–òÙc_ݳ,÷ÊW÷Gþæ[äþ»£Œý~ÏïýÄaO«y³M×öëLr/Ø/ì'´äùÝæ¼n¼1û4¸\lù¥ÁÜ'‚à,sÿÿæšì·ÍëlÙoÏ—5Ëfëqe_ùoh¿-å«û�øió\°ÿ }½žäÂþMÏñ½à¾tfk–åç\¾›ÍrÏv=öé/ñ<²�}šÆ~ÌÀƼGDj{yÌãXq-Mø¼ÉÿKÏÕΗõØcû0À¦/k³ ì›óz\·ÿ†øm}À~[Ÿ³¯®‡�¾È½Æþ·Sì¹ïgöÛÙ®çrd.oQª¬÷Ã�u¾Æ~5÷óWjìçOiC‚ýTGs¶E<Ã>'Œýå1�S¬}ʼnà8Ë$ÿÁ�Ý’(r/>›Ê®‹5²>GÖdò|ެÇݘՆç[Û*ßñÙûüÃôã7¦õì¿W:¿+¹÷�½òÙÒ>;YS[ñ|�¬ù~YÉýê¹/Svú‹¬#Úr9ÚÐìñÏÑÆþ2›Ãó…kižŸùoX÷öDøj‹¿®Øu ›¾Æ^æqy¾;ï‹Ïûkþø�ö×”µ9Àþsöça¹ì?ß_:ìÍ:#Ëý˜�bW~Ží:/0öG¯ÉÄZlñßßñÙM—Ÿv ØŸ€ÎÏ5üó•ߎÉwc‹Öù†M—}õ{ñׂÎ_"rÏ>;2w?IÍá=;Åõè¶ËÛ–ï7~La:ý–ÿŽíBòÓØWSÆxæùœU¼WÖáoVþ†ß–øk~ÚÅå¾ècÖùZîKÄ~ûhûÀ>G¾÷ÚgGùmÈܽž¿í×­Þå>�SìËõýò©�Ääá/rŸ«±ÚoKæsÜó¸Æþ²÷Ê»â·%þšì£ïòÓÖë°Eç»°?ЕN¼môõ¼É½7ì]~š/{øm¨¹û¡Myýèïb§,؃&‚op–Zþå÷ÐFŒœÄߨFjGl;²&s%ÏãÊ:|™Ãß¹ÞðÛÍï¾d_]øè»°çþßǽè‘ûò`­TöááùÛ™2ûû˜Çžþ\Ë$ÿ7Ýtsð(Þ/}âä¹Êgv=ñß�y\…=ûoˆß–øì‰¯®ËGÿ‚aïöÛ0æoyç÷3‡çæÖ¸üg©ä¿C‡Nù))”6w­²íˆÜËš¼õ<Æ“=ÄC|wN öì«ëÂ^¯É£ÏµÜÓrÿ–�Ïë±¶Zt~¯Ë±úèŠÏü6’õü­øíäÞ u±°ßò_¯^£Ä1£Ry¤ ʘ¿�fNxEí¿"}½‚¥Ï“òßìÅ_ó öÕ5¯Í‘uØ‚ý'¬ó�ÅÑ¢óKľ½G_Oùê™}tá³#ó·£�ùÛÁ=eçÁ®i`|W n¯"ø)ÎåÿÖÛn v ÏëŸФÉ+hîÞcR?c¯½…­•ÿ†øîœ|·+�?m³�¾^ƒoÅþ°Øõ¬}=%÷¾±_Åß{øì`î^æoeïÅßßžWPKùÐ/ùï—7k®uY¼çŽÈý�¢óË‚½òÑ}Å寕eÂ^æoÕÞ³¿»¹ûóÑJ-ÿÃGN+š<%“F$MâõïkyŸûÞg|~æÂÍÔ·gD�ØvÅç öÙý‰÷^úåóÞ,÷¼ØPìݾzⳃ¹{™¿Ø£Áå²ë|àY–4 ûrõ*ÿQ]âóF�™BsæfÓ°�ãyÌBJ›Í{à­ÚL«swѬôÕE[×ô �¼NŸ‰a?�×XÖ{Ð/§ ¹7cÏû0”ú{ß|øki¿�©ì·!ó·jÞåµ§,ø•‡æœò×ݵƒÇ²Þ5zÍ_°†FJ¦yóóhñâu”ÐklþÖíûhí†CÔ¿OTÁqïÿ‡åÿË#ݸo£|te~þáÂ(Oìy¦ì¹²U¯ÅÃ\Öeˆ�®øê™ý6dî^æoeÞãæqʃ¾AÁœÅä?¶Ç€¼”) hÜ„)4oÑJ�’NÉQ^þš1+—öìý€ò RÏ>޼üõóéÔî.ôåaîÿó>KóÞ;bÏ=ºMüvK�½^ƒ ÿlöâ·!s÷jþÖX‹˜Ç1À+çßå¿~ý°�“&ϤäÉóø7fÓô´u´bYÿ®Z*åàýpó鵘þ™‹ 6¼Kk7 ¹½èäîh…½ømÙEû7uðôÛñ"÷XmÅ~“yMžƒ×ßæqʉxqò~„ÓCþ£RŠÒç®â=PgÑ⥹4dÄTÚÀû9†Lâ}’§ìÞ}ˆÒæ¬+Ú¾ó£¢÷O|I ß§ÌyKhçÆ~$c»ý;Оu‘¬ó#hçš×>kV�_ {—¿–Þs�×ߎàõ·}e/`Ë/Ž`ÙŸø”ÿF<Þ;~2�ï y?üÉ”“»ƒ“Fó¾—ÛhÁüe4l茢5ëßæ=Ñ÷QƼZ™SHï¼÷9m(8JËW¬¥mkû*ìeoEYƒýæj¹F(]Ás¸.ìkrÄWOüµÌs÷ÃûæqÊñ9)#8N—üOžœZ4qòlÊZ²™¿ÔÁûîçßÇšÎûà.£œµoѸ±3h|ò"Þ#ï(­Û°‡Òç®áß¿{“öì;ÅzàånÜIy«SÔ~+oêýõdßgN„Úc ÛõÅw㯧°×~²özh3µ³wL`ïœ(–-‚WùoÒ¤ÙÀY³æÑä)i4w>ï{�:—÷=]L¹ëù7”(äß´Îå½ï¦ò÷ß>Ìmb'Íœ•Åíá8½Å{%®Ï�›R°bi:ë‚nÜ—‡+?]ôõe�-µö^úù&¹Ÿ8ŒçîYî_iõ`Áeºöºlˆ�ªN§’ÿŒŒÌ¢Œ9‹hѲí”:3“í¼h@â0Z½á ÿ>Z& 9“¦¦.åñà þmõTZ¸üMþMµ½´dùvš“™KÛŽÑÛûNÒº¼÷ŠÚµï””��Os—Ó–œ�¼çJ¸ÚkGÖb‰¯Vï¹ >šËg½`¬Éaÿì�/hü×AwÜöçP.[`‡™p�ŽbòÿLã&3çfÑœ´¥´x9ïs8{­^ˆ;…uÿ|Z»~ÿFN2ï…žÃ:5ÛVÒPÞs&Ï mظ�Ö®ã½Pm§–­Ã“¶n?D[�å¬{‡ú'MÍO8¢`éÒBÚ¼n6mX5�–e$ð¾­hVrþMæ^Ô%²yA•* ïæp/ÉFð3œü»7SЦóNÚ Z±r¥edÓ¼9´fý^þ}¤1¼ßù>Z•³�##™fflä÷«Y¬æ½±çPò¤yT¸õŸïЂÅ;Šæ.Ø@£ÇgnÙO[ŽÒêu‡‹²×â}“·òXrÍš[H™ �4}ÖêÜ¥—#€;3á".ùÿÓŸþ”è5©h؈dJ—JK±lg®¡å9»yì?“ûoÓÜy+hÛ�³×졜Õù÷1Rø·6³XÇr¿�&LÌ¢Ôô�üû9Sò ¶¦�3—‚ƒ› â:°¿ˆÀ›²Šàûˆûî{ Ÿ¯4lÏï¦/ ys—Ñ þ=Û¼Â=Ô?q\Áü¬•䛑߳`ÂÄ4þ&äß¼]OŽ‘“ilJËñnæ9‚5ü{)K)mÞV–ýùù›·¥Mù‡ù»Á{¤3þ‹–ï¢%+Þæv±“úô›Pp×Ýå|Ø3.Áá’ÿ:užÌŸ6=ƒÆŒMá}�'Ó„1©¼çñ:þ Ä]´õÍãE³Ò2fëi·�¸¸^S¦Í§•ëå·î7Óôé™”4˜mKwÓç n3‡Ù^THSùwЧÍZϺ>�2ø÷2”Ü/ßI o§øž£ ¸¾Ü/è–,#8Ñ´i‹ã|å1\ÿÆÙ4J;�Öçn¥Œô\Úwðn?β½Œ²s¶Qκ½E½zõ+H™˜ÎûÞo¡eÜÿO�±�F²_Øà¡ÓiÊÌu,ãoÑŠÕ{x~p/å¬áßKâßN[Èq&M)¨]ûþ€Ì[@¸DA—ü·lõÒñ”‰2Ï7Ž}»Riö¬ù4cê<ÚûöQ¾_AžüŠç²ò32W°žßÊ¿wòNÑbÖS§Îåoø þ”Ý´.ÿ(·�L?�÷ÄŸI£ÇÎã>Á2Ja_±é3×PógÛ âzdþ�í#Û~ѺÍËJþÇ'ó÷|ÜDÍó½3S3iÆô%äÜÁ¿u¶ÒIÇO|ÅúýCêÛoXÁ²åy¾çë‚ý´péVš8ië ž'š±–feä³](Ÿf¥å°�øbz=f�ëxd8*\òÿBÛvÇç/ȦI“¦òoß�§3çЬY hbrÿöé»ô¦óõ0!×ÛÒŽ·>*Z´œ÷$k­Yû&m*àßÅØò-ËÞÆsYÞ—©ßÉÄó„wÝõ×€®¯h¨{–'‚ƒÿüçé|e¿>žçM�Åß�d;~*Ïñ®a?Ÿf§ç°m÷$c¼“,ʧo£ÂmÇYç§å+wðý‡l#8Bó²¶«ßͽóÎÿ ÈܯÏ.à{öõ:$ïÕ·_®ÓØ,×;î¨-}z¹—#p­Ü|ˆàâ;~ø±ôÆ�[´ks¼]û×�·lýêñG -¸öÏ7$y‹xVœ‡•…'O7}¶^Hu›­{Ë Ÿÿšh³ýÌcMPPÐ6ÛŸª\Á÷rØ·öîu ¿·üA]«]k«šd«nyzFyßá_�>Rç±(¹UÇý]b»FÝß5²Ïý ]»ßßóŸ=㢺õ‹Šùg�×";¼Þ!!æþø¸÷Gw�ì?žÝ÷jLT·ŽH!p p À�ÊÊ�šñ‡…‰£ñ J_¼Ï÷¢WÎu¼Ðì…ènÍ"»�+^Iï½åãmè/_×j:A{í~†ž‹l#úÎzœžñs7yÖè[õ>ˆ#TÕ§5®?aǬ£”~�i\vê°]_§¥vQñ¬WäÕ ´uhMá»®ï1|Oúc¬‘ŸÖë �ïU.î?hKª±¶š`PÅv…í«jò1»$û©ÁýñUÞÉjÿoŸD‰‡«}ÝŠï¸Ö¾¯«Âéô?Œ«ãŸ–ë¼7TýêdW#u÷_ûUm½ðËÎ�^Ì÷æöÓª¹ÍvFÞ|J•çýÞžh„9èõhÕò¡AÏGGõjÔ3&Æk”s>4—‘�ü:QñïìoÆÕ®¯5É;7Ú¯ã ã :\ñýFØf»Ò}[Â�ð)ˆß#ÿoù^Ê×EçÏ·^Ð!èêh:¤ç&~”{#6ètÓ4Ò]b O:Ä�SÓ!=7�q‡ütg5Ò�ÍvkuiÕ C<Ð!ÒC8±†›®6?´ëô¿ã{áçé"GÄGy»èxx.ù =âƒ>WÓ#]ð×Z~Ð#>èkÖŸ¤ÚÒ½µ G|П®gÐ#]”Û=âƒ>Lç�tQð×ZÄ=äé¢Þ¾èôHé¢ÜÞèÓ92äí,ß ~V¹³òé \Lâ:k··°T©’¤Z ·‘+Š-¬c¥·pu¼l„¯WwLïw‚[tÿåhRî°v^è b©ì U× 3žaã¥Ï¿Iº>µT ¡ur:¸&ÛlrÊ÷³Zµê¶«l´ ªq“:}&éñüòx¨p%®ªj'oò­Â<.À¸ØÃ5¾gUकõmI]¶º Ÿ‚pu~x£~1GLÇéðŸõßX¼×�qLBþÈ‘ªØjØ®³Ùª_É)f0B DÌ®Gø�´cëQÅÖ�S¹‚¿óÒêl¶4Û¿¬Q*T¸àâŒ0p^ªÐ‚‹í¥-¨@pè �›n3Âf\ÞÑ|á‚÷HG_½âr„ÇàÂkoéWQ©\i»Ó•�¿©º/Ê pÀzx©Â(yYl’—�[Èx–&}ƒ.q_Ý^3tòRÕò^q1páæì–—lýªWãQ|_E‡A�y—‘“êüÏ�—;“ªo€ p.(ðB¸"_KÂE¾Îæ²a#óóK}o�Ù¤Æ-‚‹ƒ;ÂÛ¹`FiǨo°¹œ�R±gã®LÊ·Ùä4ŽÿÙß4Oî|½¯îCÙ»órg?§hõŽ߸QÝ»þ±N½ÏhýâÆùwDÿý©Su5©ºÜ±?¶�Ó z¡YÁñäÅÜÖ8¦ ¯ãt%­{5}Ýð¡õYZ¿÷PˆÐ¯œõqÝûnn–Ÿ°ð¹|.C~Ï—ƒÏ¬ÛVwö#ë¤ u“sºnÙïTð{a§ò¸ ªL’î‹cB¹ ¡Ïä×í–Ð&8d]#οeNüÓÍó^;ºý©&o~Ìåu<´­{ÏÍ+÷ =:ûŠÍŸþ’VpìßqõnýéPácǪիU=�Ë8*¾¹o¤j/æ²”ö™´£Wê>\gý‰¼/wNÊ«öŸÏó¤m ­‡ö}÷¸Z=Í}tÄ1®F×óYñ�Èg: $úõ;8Š!ŸÅ㚟Hœ‡z¨XÝ¥Næx6[Pèî]Mëâ[&tò½²T_�'<ã‚WÏ·ç3d”ðûTá^¡½æ$NþªzRþÝ»v=e³õkà;¿kyÌP£Š2ÀùŽt^ßTÕ™1/ŸJ�^«®Â�sÀ¸ã@dŠñ!Æ‘×ÑãyŒ_®òݹ�¿.bѨQ#‰ÇDFK0·±¬NO(½Ž«½“Ñuvö2Ž3'®ïñ�¾Ó^éCæk ô8P�á$!„½d`z„ïh-õ ã?\¥�íÌÚªÿ‘-ˆ7©Ó”H ·f~Y£IJÒÒÑî�°5VÅ à\PBà¥Â'¾Ö¸d±¼ðqâK ó}õz±Ü†0þVï¼üéÆq|.Â7–Ëj|U¸T±Å²À•þ¨ÃmذÌyÒ¸-Â’ƒ”3�žñ*JHp áÂ@ÞÞâûÒð¡Ds.û²¶'»ìË›õ|«¶;sT�£UËÐn<}šÛÍvß<èñ²”oåÏÚÕM}޼m\ÃNÄ«°ãcãö¤aWËHôòÝàþ¥žvÁ?û2ò‡õˆ.�;=Ï;Á%ˆ!èì»�ò#=7•§�ñ@WGÓ!=ÐYíˈº.šé¹éŒ;”ñ@7MÓ!=ÐYíˈ:§¦Cz 3Û—ƒø!â�Cz «¯aB9tµ÷üDzn:·=[òC<еÕtHÏMwD5?ä‡x sh:¤ºÄžtˆº\M‡ô@g³�Q·Èñ@wZÓ!=ÐÕ¿Ò“ñ@WSË ÒÝŠªžtˆº0M‡ôÜtžüD<ÐõÑtHt6ÛP~"è² Ïú ºU=étGt|¤ºúW6Ó‰kþñ@‡xHáÄn:™¿€~�ý½�Ö7ˆ9´ëv‹ç‚£Ð#>è³4=Ò½UN@�ø ?¢é‘.òµÊ èôö =‰t‘¯/zÄ}M�t¡¿œ>ê�ø ï¢é‘nMç‹ñA?MÓ#]”û¬�üôNM�t‘om-_Vüôg5=ÒEù­ò þ#>èkdðé"__ôˆú¶šé‚ÿåG|Ð;4=Ò߬úåG|Ðçjz¤ þù¢G|ПÖôHåöE�ø ¯yÒàÒýiõG|Їiz¤‹|}Ñ#>èûhz¤ÛE·»š½þ!>è³4=Òÿ}Ñ#>è�hz¤‹rû¢G|ÐÛOiù×é€ÐãÖö�ø ¯£é‘.òïã£þˆú.šé"__ôˆúišéÖÖ¸[õ8ø�ø wjz¤ þû¢G|ПÕôHwšÆÿˆ�ú#>èkë~*Òm«Ëï‹ñAßVÓ#]”Û=âƒýd¤‹ö ¬ø#>èñéÖôñýþ§sdôÇaw°?åé÷�üñ´k~‚¯ÈO®æq´/»ÃYmwÀÕ­çÁ^÷Ïî:ŒoüÑ_T»ÃU»÷ �pAû^*ìÕîÊ^Ä¡ÞìòĻU,»ƒa•2JXñþŠœ‡p± oçËîý}ýáÔúzÅ©õ¾Чuôsp¬�aç{‡ÛQõêOV9¢�äf»¥sŒa×ÀÕÞUÛ-»ù§?@‡vêôJ_Xß(씳-a”Þûõ 5¢²ÙT IJcZö_ÁUÙ,ÍvKÑOV¹I�ÞÓ3?¿ò8á—õ�”Ä„WFث℥=%qa�pA �— 'Mf^ÖÛŠwU8\Åv|‹„ïå4žÔ•Þ¤¯×Wè„ñéè«Ì{„ fs¢{>þÉ*yUîåÓÓK¸È+oéKJf2kØü®"Ü .×r‰!o;¹PðQH6ÛVêÃí÷åY ú§Í–îùH… ¡ÿ u�þô¤u<ˆñ ô¤9ézÚ¦6š^s�X’ Λõ¡½PÛyõÕÑ]÷§âüÓ‡ ƒÜ…y£OšÜÀ(ŸÖ‡Nϰ¹ð^îQ¥-ëC\½êÃúWÞd“³t‡Gú#÷Ìüšï%º‘Š»¿\ºT½$t‘I{JbÙÀÅþ†ÆWãlçšú¶�F[ÝE»¦>%áñü0�OùžÜ«ùo]g!aó{še?ø#?Ñö^!™nûGµñ¶›¼|Ì„r/¸Èy;×Å»?¿u¯±ÒW´0pÀÅÙßÀxå¾¶¾Í¶g3êði'wØŒKoÁ.x�tôÕŠ çÓm}lãm�,½�Ë~ycc=ªpJ²öN× Wܸà=¼ŒÜÅëÅ"LòâÏå9|ŠøSZÁuãê=Qt¨pÖ‡Õê=jOñ`R pÉ8pÅ7×â´Ï¤/j]ÿ"m•ùÏ-ÕžÀ=®þ¬ öXݯ£ï Žùðêbr…ôDo¦³@¢¿ƒ_ò‰Þ¯ç²ZÿbŸÀ52¯ù¹¾÷šËS½þÅCûŽ}>ÞøZÿ‚qÆ�Ž9Æ8ãC‡öÃ�Líׂñ¡¹lË«ãÀ! nÕª+ªþ¤[‚Ç8p¼1. ÓWû`ÝáegN\ßã; :|§�C¼Ñ´Œûþa {ÉÀôHê#G-ùSp/ÓòøW¯ãÀUo²ÉYºüšï%º‘Š{XúT½$và\à \€—Q”E66»‹%áv[$ìäó]>¥ßú>ŸrˆN‘vÅ#FÐõ^õŰ+Žª»¢ìƒð®í˜:=cú IúÒ’vl=$%•²~a„­±*N¸à¦å xUœ{/‰ÈŠœ¾p1ll•o¼€ j¼ø[Qh³ fùH/à3Äxß�Ãò<(TÂ"�¹ÖíÏ%Œ÷±× y\N5ÏØ¢þÓB/G´q‘¿ÕųEZyi‘Õ’p±¦d —&�‹GäE>[ø>íæÌ5;K,7ÍJy8RwÙ©=+À5âñ=áKw ~ fŠðvqÄ;ßW+ï¥éœ ú)è·`]ú3è¯À�vlô_Ìå”ö;Œ3;ÆUW­¨:­ª‘«¹ßbæµnÎui|×c¼õ;Ì©÷ÐÃvMywŽòBò÷5äÀ|hÅë·¿f[ÁáWÚ~‹Æ¸Wà¥à°=Êz×Üo ãðÍ[�wÅÿîÐ�Ðo‘°èá^•…Ño±ó{c>´*÷[œ¶�U�¶¯ñu⦋¤Ÿ¦Û±é±º•”Ìý#l�UqÂ�à\PB·Üòn†,/öÍÆ;„ \ÄGó4Ÿf¾›¿�Bƒï£.â‡rK£?¾sדü5¨×ØH\xX½:§(Ü,Í!ýYÑ/¾p±¦d —&�‹Gp‘ùyèÁçøžÿŸó¸êœ1*v„ ý�“9kóÁ ÷U Ã÷ß7|ïßAøý`žëDŽX×ßð7]ü½›VÃ|í“UöiÍß;ÇÄ+Œõãú6ÎøN9“�çÈß×ò :ȯwúN–ïÝ<ѳ!î\ŒçÏèø¿LÊdZ™¯Õ×âãtÞ{¤q•šê,9]y ?á—œÖÃwÈ8RPÚÑ¿5¥‹.À¸ wà…pE½šqñ6ÿ$­Ú|XÃæw—òÞž`™çÐáí\(iQ�ÓÕ!Öò-Ì~¾Ø³ÔPÏyް*ÍÔžYÇ&ßÜf`Fž}Þß” ÷¡F�øKZÝÉ­oÉ—tóë<¸ñß�Dÿë§“jŸ¯—îYšWt¬ oÚ.ûòq¦”i 8žÄ�Ó:Åôu˜FÂ58Ý)œè»E}2µîÞ‚f´(DèÿõææàˆFŽüïþ[>—!¿ sOðä{‡çdÞÌeþhúÖ�c ±ÇœÊã4ò’n É=Nþ‘ å2„Þðôìºó>[P7"?mo”ò¯‰……›[òžzl�ƒË;í_E}nܼ抪õžv*üúpZÁ»¾Þ5˨ð½¨ý¡Gk§sGEàÀþën ±–£´Ï¤}ó—°àæ?æýÃþR^µ»sÛ6l’fµï·Ìsœ ­¢¾žî�o›ô±Ý‡ø‰HÚ+Î,®ûÁGês¥Ç{wLc¿„tH|¥¯ �oŽg½—8—Ã<‡°SíóesÏs}ãŠ=ÏáÚ§GïËó�ª÷_ñ»(>öƒoÕ²~l×î±ñÑ ÑÝ:Û:—i«oí#W¯S®}ÚXoÞV_§½eìÓbŸkÌ¿8ç_˜}z�ÿ·š§uy8èõ�þB¿A<ÐÕüDï7PŒÞsŸÄ]˜¦CzÈÔºOâ�®�¦Czn:ãåD<Ðei:¤:ë>=ˆº#šé�κOâ�Îþ©ÞG@Óƒîá+cÕ-ʉx «£é�èkxÒ!èºh:¤º‡¯ôÜ�ñ@7MÓ!=бG5[”ñ@çÔtHt_éI‡x ;«é�讪æI‡x ƒœ =7�q‡r"èé!ü°¶i ]m~ùÃ:~‡–GÄG;­iÁôˆú\‹\ƒÞÚŽ@�ø ?­é‘.òEûD¹@�ø ¯ù™–K�òõE�ø ÓôHrc×øYóG|Ð÷ÑôH÷ˆæ›/zÄ}–¦Gº(wù#>è�hz¤‹úû¢G|ÐÛ?×ò«ÓAù}Ñ#>èëhz¤‹òûª?⃾‹¦Gº(õG|Їé}×�.Ê=Í=⃾¦¦GºÈ×=âƒþôN½ÿÒÑù:}ä�ø ÏÕôHùú¢G|Ð;4=ÒÅ÷î¬�üôm5=Ò]m‹^€ü!>èkkz¤ ùñE�ø ?«ûHíÏ=âƒÞ©é‘.ø†zXåñA�~Òÿ}å�ø GúHüG;Â{á_:Ðß�]Ë©û?ˆ‡ö=ZSëÈâÉÕ÷>(îÁ@XgcÿU×u²aϲOõÓ®¥é`?ñJØÅ Ͻ—ö”Ä=à\�i˜ÆK…ÏtmÈã¾¼Óû¯J0ļ úï¾öAÁ{W:êÆ˜ÇÑã%×þ«UyÿUw+ô¤ð*íþ«Þh+Ò3Á%„ y;ßû @_@82�qô ôô¨] —Á«G´]\ÂÝø¼æš&UbÕ¿ŠÇ:&û½.V_�Ó´�<Õ?ý:´S‡Wú7<íâIÊ.Υü°”Ö÷ÑX7ÐZEÑŠ]\Òà+Û=ŒÓ˜oäßñá}Pšðî%ržû0óK¥o!1Rqû¯•.UK"1ý€ мXE˜×ýÿë¡Æ…©û†0Oåàõû^à€y` _ÇñZ«¸‚ùÖý7©¢~¬ÕKÚÖGÀE0”vl=¬)YÃÖø—:,¸œàB@îöò½w½ëYÒk<ƒ•&”¨ë'õNç{è3è·°yÚ>¤ûIÐku´^C¿zG»™/©^½I•¥^Öi:&ú ×°™º4Û?ý:È‘Ý+½eŸ§ré·†^KÒ×ó¤ßøç³¼®o‚~C[¬,ú 8´àe„åáÞç‰çÕ/Êï¸UÞÕå ?«+�u²Mtجß$nJ5ù[ì{È`6½»÷yjReb59‹Å-öÀÜŽeSëaMŶƿÔa‘ók™�·À>OÆ:`+.ЇÐЇvm'wéI­1îõ5~½šÛÚCÜç“c9ó¿J•¿±%ÒhÈ~Yº§¯Î4#ìœïŸ>äÎ1Ç ½uÝzÁ3 Œ–®¿w�–ŸZB”$´ÒßÓW¯úðo¼f]Îsf~©ô-$F*îþ^éRµ$rƒÒžd¼€KØ\�¯ÆÙ(RÅ]·.¸È™Â•vl=ª¨UÓ•oÝ:p.öy.À˨§{�º„+Òºuà"²•lÖãoe]·€ ô ð2*ÉëÔ bTÁ¶ån‘û¹|bÝú Ý^3ŒH®õ=–ñÞë׸¨þƒç>9¶ÁUæÚº{iÿ ÂUt¾œ‚‹wy‘D*ß:à\P_à…pE½Š¼”„ËߪMñ@×®(õ²÷±øséðv. T ]Ô'Ò~=Žû~îâñ€ÕŸëïWÎnñB²ËŸë@æ‚à¥5Ç»ü¹þ–˜¶±Cµf.®ê‡nÎÿ×à%.®Zµ¶Ô]ñß=u“¾ÚÊþ\«b¯Þtß±•OÙïHb®«:Àþ\ØŸ«ûs²?×Ñ{®¯·u)Î`®¥.k3¹dá¡&kÇ¥}&vG«?—yÝú½s÷¬XºW.ëÚwCAøéÏ¥ûõ¿7.V·¬�øw+éºuŒû0„¿Ƈ˜oÄü!ìcšÛ—|w²¹ñˆ]ìÚk¾2ÆËú¯°l£ÿéº.ÒýÑåÆÕœž·{Œ7Â4¾Óö%^èCd=‹zÜ—´Ý3l¼ôùWê#G-ù!´<ÄÕë8ðaÞëWÎÒà×[_dƒÖHÅ=,}ª¥Ëû|Ç.À¸8—j¼5^ç;ß •ÞNÝŽ­éë*ß88‡–7àeÔó¡ú6[ý-¨3ÑC¼¯Ü [%<—OoÈñœž€]e]ã „ñ^¿ÆÅ‹½2ÇÖ²ªœˆâûšt…ѯõ…‹‘ŠŒ7Œ£t©úÎïB¿�¼à‚|�—Í&ëðl¬{Œë�ýWoy#略¯Òòþ{½­A,óEx#ã<ð½‡å€YÂî÷˜¯ü¹‘Íös£ÿ<—ûÔß¹>DÆ�Ư “®hY5öŠ�Rà"T‰œ¾/\$%‰ƒÃÆóŠr\&°ìãût” æE=+®uÝY±ð�àWÖä­ëñd}áµ7FZú¤IÁ ÿû×Ão©gÍ'lB �ßA…·wl\óØŽQ­ã¢¢¬%‡KÃkIApJç+ú+è¿È;9Я±úMÁž}ÖâÇ&4ÿ#�9>Äžqå•âQk”ÆlǶ?p¥±~×Uúû–ë¥ÿa$çñro×t�{gŽú‚j,÷rÀn]ß6Þúú‹úÔ’õ˜–û/¸zí¿\Å6l9Kwx¤o!1Rq÷_JŸª%¡‹.À¸8Ö¸/Uœ¤•ü�ÜéúNÚlM\a™wÂ~;“}4fñÝ‘ÃÇ{õ�ü#·E÷¼Þû¶)UvòiЕôW0‘ór³Ëà¦å x)žT`\€YɸT¾~%p.¨'ð2ÂI,rÈuH¾-©JˆÍ6%�}¨,ߩ؟«¸=ËQšöoÄôïoIòr•Å^j û—Ó…�-z¬íÿñ÷OŸs–¥PÆ5׆x-`GÓSYŸíNÏW¯çL¨�¤NŸ®Ö ½Ü›Ó1%¸ p À�p À�p À�p À�p À�ßÄÆ°þÎ@T7À�p À�p À�p À�p À�rpÀ?{¢¬“1n¯GóS×¾øzüoø¥Ä´o×ûêýòÍ4rߪeƒ¨N‘=c¬/ü{+Q½oíÙÆþÁN}=²Å;ûž…-.ݾøU”g¨gNUlW»Jyâ�ê^üNƒøùË÷BUG—‡o½ C<ÐÙ5Òs¯QÞÀ C<ÐyÓ¨'Ò]b O:Ä]–¦Czn:ãù!èúh:¤:›m¦G9tašé�.±†'â�®¦¦Cz ;­×|¡œˆºÓN½Ÿ´¦wÓyæ‡x ËÕtHÏM·W­ëB~ˆ:‡¦Cz K¬áI‡x k«é�èøsÔ-òC<ÐÕÖtHt§¯ð¤C<ÐAN�èjW}Ay:#?Ä�+žÎ×®:“w¬¢Ö'ɾø�?ìëu:hß],zù#>è³4=ÒýK»=⃾�¦Gºhר‡µüˆú0M�tOküQ+=⃾¦¦Gº G9¬ôˆúÓÛ´ët '¾Ê�ø ÏÕôHôG|ðñAïÐôHô¨‡µüˆú¶šé:4ÿ|á�ø ¯­é‘.äÖÿôg·üCº G9¬åG|Ð;5=Ò]–þ!>è§iz¤‹ü}á�ø ï¢é‘nmzíñA_GÓ#]УÖú#>èíšéžÕrì«þˆzôC�.è}ÕñA�ò!]Уx/õOçú;X–åÙïA¹¡?¡­ò$éʾø³ø«.=‰5’jÜdôôx_ëª6{­Ãã®Id}­÷Åw~רX'ºÞX?èÜàe}'§éÌ{w Ð��’?\®Rî$î8Ù5ÖUy¥OÊn år¯=c o}ý•úÈQKþ$-dZÙçP_‹­µñ¾ÖRg9Kw˜ùe¥�Td-‡[Su.Ý¡øi¿í1õ»Ú¸ZÓñ7켯«ÂÅy&ÎcÝò¹Ò.À¸€xaà�e¬—>ñ¥�KRDó¾øƒT)¸¯Ý4.Þßë÷…o¼ïŒk_üÁÕbk ö‘ž;e÷ÝZÝŽÝOŒ;÷ê.™$NÕÜû·k\¬t—*,¸„pæ�;ì‹ùóU.Íb_¯]rèØdÈ-ðË÷&ǹþX·í3õÂCO|mÈ!®çI¥mÌðÒ> ¹s£n•Ã’K~ñßB�p±¸/£dáõù¶ºKÉá¤+Uø8?<£_Ô‚rGTw”ü>˜_‡ æq—{�öÛMU�óiIÈGðk~Þ……Ë›œKJ6›¬6Ž36¤ÛG†ð1pÀŹÙÀxEèÎ¸ÔØâ.Ž„sTØŒKg³âqG¶ ßäðñÞÀ…ÜŒK—*g¯ Ê’ÿ–”¾‘Ê•¶;u¥Oµä˼‘8`ÿ ›ß±ð×èOØ9X•ûÕyÓÖ+9ÅÕ&\YW§‡˜Þ®ÀEÞ!sô3ð�~Úüf³/³ùÕ¯”4�ƒÔ!ù‡1Hç¿”ü[EöŠ �ªÕ­cT\P£è?wÖÑÙø¸Üß5ªctäýÝãb_‹ê�36MGÏjpxt‡Ønñ÷Gvï�×";¼Þ!!æ~)8àÀï‘Ð ÷½*Jê÷È�@�¸t�rOâ»ÍÎ;ØU±U—Î�>¤‘Î÷°ƒÂ.j_hØEa/…=ý´¶/çê«užà3îøÀ~ñ6�X«WŸZe¯Ú÷×®~ï¯vMÃ.êÜgì›Wç{Ã.¶]�?œÆåõÏ$Ã:í?Wv@ô—A‡þ²Ý+½õ÷°vÖ7Ò-�=ûLÕ¢¤aL+vQ}-6Ž‘ßû›Ê¿õ'ç¹ðk óJøe=$•jŒúœÖTÖh»èÍÚ.ª¯Ötü wùư‡†}W6»(p.Èx©pãRK�[\ᤪðp®ðT]éÕš/5tãà‚÷ÈC_½Œû§VYSUNnï¿}ÐMìëzˆj!µÙ€‹¼ð–¾¤RÝDe¤ê~àX¬q™ÓCÙñí3ðq&ëß�Ûk´7…qgÏê«Æ §—׬fý ûtsãzZãáüÁ\ä÷°�ÿ÷œ�°Ó>Ñ(ÊáÜêTò…p½6­[?Û¼Ux‹ÖáÜåOˆê㧃Jyéë—%S^_ßg=(mén×ó{\wÖÑ+Â'ð| ›dð ü³:«æ!@ß²aó [ ›âÔ€ ÏK{-7}™rõ,]ͧX×cC:^s…Ý7àø>9&k?'Ý®œ‡}ñ©#'»ÅGó8Ò�ê¹ïÜ|*}ƒ2åêY®¸"£=ÉÞžrT×Zäu#èñ|_À'çƒOàŸÜõŒì–Ý­³5–ïpyéC9׆ú�­G�nÕíéq~zŸÐ—1±Œø¾€OöiŸÀ?+©»ž]c¸1…¿Ó3Ω„pyé[EvíÕ1¨™Ê�Í1~ånìf“~2ó©«—rƒOà ø6]ë'Ý®¬¤îzÆw‰ìèWSRI•—¾U™rõ¬E¡–»Nú1Ú“·ßãŸÀðÉ‘ªõ“nWž9˜å®{T\§Ø¸®‘Ý:øcXsó©lô-Ê”«g-®Ñí OÁ'·^Çÿ@¾wà øäœ¡õ“nWn ãÎTÏØø„p¶vˆŠ÷CE•—¾çÔÂß\=kñ“nOx >uÇÓí |Ÿì³´~Òí*ìC_ß»øV¦KwëæSÙè›E%DvŒLˆ,]nÞcݬùôGn'rà{×ÃzüŸÀð)l¶ÖOº]ÙOúâSlÏ„î=<-EÀͧ²Ñ?[¦\= ¯ù”êzlôŸ¼}�À'ð|r¤iý¤Û•+)}ã®ç«‘¯û£˜Î}½2åêY‹}È�·Ž ø¾€OÎt­Ÿt» »e¾�þx'þÍ�ø„¾~N�¸ù\6úFeÊÕ“O·i>=Å�oàrçM8À'ð|²ghý¤Û•g†þ7 îÂcüTR’oyè­å)K8×Ô2Ó¿jè{ð |ŸÂæjý¤Û••õìÕ+:ª·õõ9Ãå¥oQÆ|Í«É|ƒ Ãü�ï;XŸÀðÉ‘©õ“nWVRÔÓßv„tÊKßÔÏö‹|Í×6,wÂ§Åæ‡|ßÑ– ø¾€OÎyZ?éve%E=¥7ësRùŠÜ••^úãeÉ×\�1¿|Ê6?ä{oŸ%ð |Ÿì ´~ÒíÊ’”«žzÆ'Äv•~f÷x”ø\Vúú*_éir>!:ÊÛ7ÊZfk8�Ù[¦¼C?ãs|ð |ŸÂ²´~ÒíÊL#÷õûvˆ‰Š—Ö/­Â-U^úó¡Ÿ>øäÍì>�/à“c¡ÖOº]•Ì'ÿµ”'Ÿü§?úévͧç,•?ë>�/à“s‘ÖOº]Yé<ëÙ�»É¿–_^zùµ(ÿr´ÖÀf›¯ûOÖÁOtñ¨.=¾€Oö%Z?évåHZèÑÏ4êÙRY_•>f ŒñüR^zeò#?/U·e³ý”¢_¢ŸÙÓKd´'ð| [ªõÚÕ­ËKäS¯Ø˜ž]£ÂãKË.+Ÿü¥^åT.v}¥ù$ýq9À§^FÐã/ø¾€OŽeZ?éve¿½d>ÅDwîÂæ•È„.¥“+Ÿü¥o*ùµ(u~•Ö�šO[t|òÖÍŸÀðɹ\ë'´« ’ùä¯õ×Ê'éËcïÏ~Ñ|’ð |‚O}ÁtŸÀðÉž­õ“nWŽ;KæS§èofeSNž·V>ùKÏ~‰~åç™»Z¨ù$ór€O}� Ç_ð |ŸÂVjý„vuwÉ|ò×zkå“¿ôçÃî»ÓÔžÌ|êçÁ!#>�/à“c•ÖOº]…Ýë�Oª�Y&»¯Á§²ÓŸ»ï*|z£>�/à“3Gë'Ý®ìyÙ%~ïüµÖYÛ“¿ôçÃN7£ŸØáž�þ%ð |Ÿìk´~ÒíÊJ*íPZƒv.ïÐ3®—·ñ£•áòÒ#�ò\Åþ$þ*w[yÞ– ä|ŸÂÖjý¤Û••õäñ~÷(¿¹ä¶ó••žíÝýÁÅZ~ ÿÀýqá“Õ®bìÈàI>�/à“#Wë'Ý®<©ÜõTí(\üUzÆq7³{d)gñÀç²Ò·6r jUê­5°ÙŽi>á ìmñÀtŸÀðɹNë'Ý®L$êõìÛ5*!®¯¿Mª¼ôOë|­åò'|šõ“´§c¢-a ‚Oà ødß õ“nWVRÔSzà‘Ý¢ýîË”—^zâA¡œq¤x7XKWºðͧVýÉK¦{Ü‚Oà ø¶Që'Ý®WÔÓÃÎæ‡2//ýù°ÓÅÿj´'Ô r÷ ˜®àø>96iý¤Û•‰DÝ¢ž†~=ªoé†u®dÊK¯ôxP¿óu€oÖk»Ê³æ‡|ßΖ ø¾€OÎ<­Ÿt»²’¢ž‘¢{‰g£Š?ߟòÒ‡ª|Y�û™¯¹£u{zÏü�ï_¶„%>�/àSX¤á' þ9ïóÕGŠ5ET{ŒyÉÄË#w¼lô^’ôûÑ3ºÿ4ÑBÙÜ– ø¾€OŽW >�öŸæxôÇ›…¶nØò™Ð¦ª¯išKð’…×Gå¥?úi†îLÑ%„~²Ê¡¼ŸÀðÉÙÁàøgÆ[{j¦Û�§ù5óh´§²ÓŸ�y„dÍ'Ìs‚OV{¹™Oà ød�Òr‡vÕø\|Šïש´½LÌטùä}+¿rÓ Ær¹Kó ûàuKܘ®hOà øÖIË�nWަçâ“a¹5%]âmñöä½a÷-1‹s¾üT÷ŸîÖ1Ñž¤?e=À'ð|rt6øþ…5?Ÿ:FóG�{I'Xs).Î'ÿèø•[ñüåÉÛ>øÔÚKtð |Ÿœ]´~B»ÊöfWñ�›¨„ž)e?ª8Ÿâý¢oåWl/çG×h>í²¼nc K|_À'ûkZ?éve%mU¿a󆢾ã;DùÕqÒ •›¾lÙzT£›žç´ÚQxÄ2àø>…½®õ“nWVRW={v‹N°¾,E¸¼ôm8ÛR6]Ÿ¥¹EóÉm7¢6ôB>�/à“#Fë'Ý®¬¤®zò�…¥-œ¥Æ¯b——žG,œm‹Ÿ_ÙzT£šæÓú)ôx#�XF|_À'gW­Ÿt»²’ºêÙ!6&6.œÝÇ#;—R…«¤ÊK__² jæo¶Õ¸Gó Á§§ñÀtŸÀðÉ«õ“nW&uëªgdÏŽÑÞÓ­–pyéCË–­G)þäƒOa±Œø¾€Oaݵ~ÒíÊJêªg÷.}ã£;øÝøËKÿt\d¯èo3mÖ’úï×ö‚»9Ê |¢==ã…|_À'G­Ÿt»²’ºêÝ9ºcø«±û†÷Ž�‹éh�è#\^ú–’mP=Î6è?²õ( ì*Â'9À§ÆFÐã/ø¾€OÎ8­Ÿt»ò ‫žfC�5R áòÒŸ�qð)î?‰¿ÊGºœàSS/åŸÀðÉž õ“nWVR£ŸØJz1ª-n=�J/å¥oåo†Ö p¸½–»|/r‡£nLWð |ŸÂzjý¤Û•‰DÝ �²©ëtûFÅ{sC³’¹Âå¥w%TŽ_þã!^ÒŸÀðÉÑKë'Ý®¬¤¨g7YRã·WãásYé›—1_s=:ùèg†š#é{ð |Ÿœ½µ~ÒíÊJ >ù?sg¤T^úó1÷…–»YºrÐOõ¬•å0ø¾€Oö¾Z?éve%E={±WrTŸðÎq±=»ûÓªÊKÿ¼Ê7èió5×ãÝž¬öK½9‡9ª‹Oà øÖOë'Ý®<ˆ8€zöì…É`kŒ’Ãå¥oóù¿²²¼ô˜7jPöE��uÿi²®ôS„µ²ŸÀðÉ>Pë'Ý®¬¤žõÔë6üè”—þ|ô3S5ŸÐÿŸ"­•5ñ |ŸÂµ~ÒíÊJŠzv�íÝ):*Îß¶_^úfeÌ×\_ý§`s$}/åUúIó|r$iý¤Û••ôÙz�Öo­{šñ q‘ÑÝü²•›þUÙ3ˆ·£)Cæº2¾øT×ZYƒOà øä¤õ“柕í³¹"»FÅyk°VB./½�dýzì‹Oÿö’ ø¾€Oö!Z?éve%E=ygBEN%U^ú¦eÌ×\�;uÿi ù!ß?j K|_À§°¡Z?éve%E=ýmGH§¼ôõýl¿È×|ÍÑýë�/à“c˜ÖOº]YI=ënL¾•Þ\àê§|.½š¿ó#Ck8|�æS/Ë;Ì+˜ƒOà øä®õ“nWf¹·ð)>²STxd\Tdi…°¼ô­8àP?2´V€ÃÒ|’W7ð‰~�µ.ïÁ'ð|²;´~ÒíJâšW=M¾*á~ayéÏGÿéGÝB½À§'ñÀtŸÀð)l¤ÖOº]™HÔ­ag3´„ô:Æz[Uk¥r‡ËKß ª;;hÆvâ ¸£Jmlvg¯î°^jœå9Ö™™ƒOà øä¥õ“nWf¹÷èÿˆq%�/à“}¬ÖOº]YIÝõì“î/·ÊKß@r *·–k=¡+ýt¯µ²ŸÀð)lœÖOº]YIÝõtq(<&¶Ãë¥ýÞ•—ÞÅ¡ ¦~äêY‹©>øôÏh*>�/à“c¼ÖOº]YIÝõŒ‹ŠQ¾î¥å�‘Ryé[–)WÏZ Ð|¾3hOÿôŒ¦Bàø>9'hý¤Û••Ô]O¿M¾*©òÒ—Ëà«+3WóénŸî³V–Ãàø>ÙS´~ÒíÊJê®§ß]q•Tyé :«¶–²äðMšOV;Ýý^ÈÀ'ð| ›¨õ“nWVRS={ò g—™”—¾A™rõ¬ö]³¶§<£©ø¾€OŽIZ?éve%u×Ó¥ŸÂ¹WÚ�Kyé]ú)¨¡¹zÖâ7ݬCîôŒ¦Bàø>9'ký¤Û••Ô]O½¢¾ô[¨¤ÊK¯×å—kƒMšO‹tåÀ§Y+Ëað |ŸìSµ~ÒíÊJê®§1“`XÈ­±|‡ËK>ÆwÇ5Ÿ°«%øô�—bƒOà ø6Më'Ý®¬¤ÆøìY5V‘ñ�¿û4”—þ|ìóp½é{wW|zØZYƒOà øä˜®õ“nWVRk=ã"û†÷ŠŽ�~5:¦Tî[å¥oÙ7èy?ò³–_»u{Âúðé/‘Á'ð|r¦jý¤Û•}A†Ç: žmÙ´�žFPÃ`œÄ¸å¥÷R•ÿgï\àä¨Ê´_s!隀 x‰€P¹�(�™ÉL A�K@â5H4$‘|jZÖÝíå[ñ†xaX (^a’�h (¬ ¬¢F×Kôs5Š’ï}ë<ÏÓÕgªgzfr™HW~�ê×yO�:oÕ¿.ÝU3ä�ê�ï�Sû‰ýÂ~*|~âzuK½~Ê\€Ê©¿ÞGÕ~^ü–ðÓ!8Žý´oN£ÙOìöSñ3ðÖ«ÊQy÷m¤?ùóµjÈ^ ÛÝðã·ÄýRö‡YÒßÓÅ÷Kí7@?±_ØOåÏÂO\¯¦ØOC»ÙÉÚõÓ�ã·ÄýR|®vüuÚþôû…ýT¹~ÂzU˜1`?Í=ſtvÿÏœ%gŸ½èÿc 9³ªù(ê§!Çw…N>©ÑÖÌ=ÀÖÙß½,§,·;ö û©ðoðÖ«òÌûi¨»»x}rü–Øß]€~Š÷w/ ŸØ/ì§â5ð׫cì§¡ÝìdíˆÖ§!ÇÛ C¸;+gÁí£ãÐOñ•ý)9Ź>±_ØOåká'¬WÅÎûih7öï§!Ço‰û¿�Ùî¼kxüôÒú‰ýÂ~ª\?a½ŠC«ÏÅžõÆcg®XºÄ~~xþÉsÏoð~ó‘Æë¹Ú“mþv.ì ˆÛ8ß‹ãLÿ>x�Lá÷dÞó-×'ö û©p=ü„õŠå9ÎÞ/®'ˆÏiüa#�¯öÓ C{pÀÆ�×YŸü÷äñÀ~b¿°ŸŠŸƒŸ°^Åqa}8¡ëMá�'-š{ñÐ~5Òø|†“OX¸lÈkQuI>`ÇOþšøw¬ªEôŽýÄ~a?•WÁOX¯€7Ñrj•ŠËÕã‘Æk}ª7ƒ>ÿ®­OÞO½QÙ="vd?±_ØO•à'¬Wqh½åL7=Û{Ååci¼úÉÖ©Åóý~ÅxƒsÑüäýt�½| ÇŸ°æöû…ýTø<ü„õª&È`àåüÏ%Œ4>î§Áç/A’üÏWYõÓžý‹j}b¿°ŸŠ_€Ÿ°^Å¡áø§ú|ßTPs–,õ§15ò ÕHãS?Å�"߃õéÞ(n¯ˆ¹>±_ØOå›à'¬Wqhþr.�»lYc�qiüÉ Ï)ny•?‹õÉŸš&fïÙOìöSå‹ðÖ«84^Nÿc�¬G¬g¤ñoâü8ßìx'ôÓûìÃ=ìE?MÊÂ{öû…ýTü ü„õ*�ü2ÔÍ.öÛ�ã·Äv·û»�"?í/¬1û‰ýÂ~*~Âz‡æöSã›]~? !~KlwoÃñ—�ëÓîü 3f?±_ØO•¯a»Ãz• IßFý4ÔÍ.î§!Ço‰ínÖ'nw\ÆçñMfÌ~b¿°Ÿ ·`»Ãz• Ißêºí�¯d†šF¿%®gNŒ®gr÷á›Ì˜ýÄ~a?ÿÛÖ«LHúVË9ÄïXψã‡{“9`ã�ãüî™Ïüí "vd?±_ØO寇~bÿÅ¡ZÎ!_‰ 5�4~K\Ï|3úikÒö¢Ÿ^/¬1û‰ýÂ~ªÜ ?a½ŠCµœó_¸ðü%‹ý©OvÎbãoì�;Œ4~fu¶væÒðlkcF�~zQM©ì'ö û©ð ø ëUªå\¸xÞÂóí–œ¡t’U6Òøã0Ûaw’µa7ô“ÿ¾7»>½8^Xcöû…ýTüOø ëUªå<× ;ÿüxò <Òøc‡7Ûšv}×éVâSnw“kJ`?±_ØOåÛá'¬Wq¨–ó¼á]iü‰Ã›mÍbðïú‡Ùõé%5¥°ŸØ/ì§ÊðÖ«8TÏýX6¼SŒ8~x³­YŒÃ°Ý]aŸz?qx=ßdÆì'ö û©°~Âz• Ißz\úó‚ô¾¥!ߎ�nï#Šß÷#œ€~Нó¾6^Xcöû…ýT샟°^Å¡§Íœ}Ú駦O¨ã­Šþs {X{\2ŸGŸ_ëÐ>ƒó–G¢°1;²ŸØ/ì§ò�ðÖ«8ôäâ›f×=ËW‰¹óæÅSç‘Æ>‡ÁK\�ãñø~–�rBÙOìöSå.ø ëUšY†uæ2Òø-qÞâ~òë¾ßˆ.üÕ�ÚÙOìöSaü„õª6*I2Ë9äg4x]#�Ѱ0/@?qÙx\Pà™1û‰ýÂ~*Þ ?a½Ê„¤o3ËiÏÞ?·A+UkiüqÙiuöé» ¸î»ôùÎ;²ŸØ/ì§ò=ðÖ«84^ÎÆÿ¢[¨i¤ñi?�ìϺ%ô—�ëÓ.ü 3f?±_ØO•{á'¬W™�ôm¿åü²aòɘõä“þeCuI®·íΟÇz>¢ŸÚªEôŽýÄ~a?±û�Ìqv9ý L‹çqJcã‘ÆÏÆ<ã–}ýÔ‹ ì'Ž³å½Ÿ*öAaÕÅŽ·  ´÷¾}ngËúûì÷›§Ÿ0çüôR§ßz/›—m„ó\ÐH\£e¸|\._冰¼\nÖ-Ÿo&ök®á-›×¹­–�ËÃå[ucX>.wyù_Óû“´~Zòl²lÑ’á/œ¯Oyëûr$ãòm+Òõ‘ùãòpùÊŸËÇåæ¼N?nŽ-Ù"»Ú=g˜A€5%~»Êf'Ž«S¶Ü;.—‡Ë·à aù¸Üœã‰3g} «×mX›]ZÝÖ\.¶—ËÇåáòo ËÇåfy.ß…á±Ã_8«�ËÇ1ç±%Ç\>.—oÊÃòq¹9O.ßÚiç²9Úűes°HÃc_®må.—¯ð¥°|\n6:wùÒ¥d‰ÆÇÌÇ�G6^’ùãòpù6bù¸Ü¬1Ú?„ý_ú+�9‹í«khìË•wŒ×Ppƒ…¸|\.ùÜdž_™bì{’íÒí/ï·Uœ×–ûòùß«]uâ%éþâOöÞ·‰Âs,Ä‘úœæžÇ59±�1C8?ÖÏù-ÀüØŽêüÒ{.˜Cm‘x~¬Ÿó«`~lGu~§ åë-Í4žëçüX�í¨Î�#‹%gç翃­<Î_°pÏß´§ŽOóY¯¶­uÜQo~[úóVò»„òç–§Ë»ÙâÓ›™Ù¦OÏúzWò~ºo§´ÜŸ­Œ÷Sù�À™{{fOà‡ºÂøÉˆkKÇ´_¥¿³Ýð„ÅVºŽ“RG’¾’¤5ik³<´ïœ”Æî�¾âšòÙë¿ÔNÚ>•sâæ5ù’ù²ù8¼�ÿ3/ÌóR|0ä…ù m_Ú�t¶¯ãr´$Æ¥1)ÿÈ>|&ÕÙ)<1ðtËKÒy©õmK261ï¶�±÷nõyý ¬ãß—“—PËN '=™fp� ·ãdæ…y`^ ß ya¾B-É�wU›ë|óZçl^ÎåJY-˜¾c^êLÏÍË‚–'Ó¾ŽªÊÅ�굌IöEdãµæÎj«ȼ0ÌKå¡�æ+4ä¿Ì=>g„qÌáÓzÿ?�HŸ;´áa««gFÂq®Ç.óêÄ_ƒ¾­ºÇN¶ "o{ µ´Ëc�Õ:ø|·V æ…y`^8?æ+ð¡æ­7ÈcIby)�”òJëóËíåÇ}'YßøÀ<ð~çìôPŠÿ‡ý‹ï¹c5žÜvù˜é¨�%óÆÌ‹Oãü³å¼¦�8;m4¼÷¼,°†ðxè;ö>«!7q?Ãüí„ÆnM<Žª¿Œ~v²y³Ï¿hÉ`=߯ügͽpþäöTóyv[ë1  í̧þ\9åàóæÏ[8÷à¥ç/ñçá/;øÄ -_>›Úsðœ…ö�Ȳƒý�¶ûøÜ%¯ZlG½3¸9nö@³žõ=pÁâå —/š?ï ³ÜSÏúîhv@³¶iøñgX²7…¤Ðâgöí¼èaŸùñE¯O»aezœ²ÉÞûñM\\>_pÿâtz¹Ƴ1.ÞØB4ü?o´OÆ�߸Ó8bòÖTž÷Èý{ÎÂÝ¥õq\þ/œ|'ŒUÞlÜëWiܦ=ØÇËŒãñr1/¾ô±žP ¯ÇÜq<·ZæòLò�ϼÂbíz ÇýÎcvµë1wÚ;}ÕÖS�jê� yM;Yÿñ‚sv(|öÞПÏmúýbãl™á¼_ðÇóÓü7…q£u0/ÌóÂxæË.•ô%É{»Ãçų¿wî]S>ò1ËgÇì'žÇ8ûyLø;~Þbç©ï¾¢èãׯ·Ÿ¡Oî2ð¡µÝ®Ç,'ñoÓÃäüÿ½~ïm_�ãÁk²Ó( qÍÅÏ„¼¨Àz³ùXðôÐó²ÁÚÀíí!{Ÿ=�©×¼ñõ&ŒòÏM1éòÑoôýV¾1x�ÞÛŸM„ÏV`|+>çâþÒÖ ¿îð°m�~ý´­í-¤s*Ø÷-ö»�Ýá·oã÷@?¼Vy4ßo«àµBä·â¸åÇ?…í~+=PËl|�ñDZ"¤~KްXó›Æñõf÷Û'ZöN_u*Ì|Ìþªw½ÙkkýÇuÑ9;”? ¿í¿aœ-3œ÷…¿†ígã߆¾•¬±ÌóÂ60_�?n}yüZNK’µÆ‡¦ì÷øo©|ør%‡‚é·Œ¦£F!/WÙúè×i’dW»Þü‰–¯$ÿd¯ÁæÅ×ã¼ëg^Sæ0!­9[kåSÈËîÈ ÆÙ2Ãy_~&äcA²,Ýÿ4Z‡oç‡X°½­·@t߀UXÇí�Â{]ìÇQÎwžs²ÌFuö‹–.ÚbMkûAZŸ÷ã e}{Y'z?~É~\ë¯ÂÒÇù|¼Ü“WUyO+äÓ}ðïÖ }ãÒüù3+|ë&ïñóÓ©VÊ{¼—/¿ýb=Ï9�ª[ëCÊo�¦ÿ$šþ`8¾ôgieçÿ"³´/ç÷âtz–½t–Ã7…ÕòmÑôp�¹:Ý�Ö²ñc"vÛe§"ñÎïñ®?'âçF<>â ïñî?/â="öŒf—oψ÷ŠxbÄ“"Þ;â}"~AÄ/ŒøE¿8âÉ¿$â}#Þ/âý#~iÄ/‹øåO‰ø€ˆŒø¿2âWE|PÄG|H 7·�æöQ»ýŽ®íCëç#á{ñ†ˆñSZÒý‰âw�ø¿,â×EÜñ"žñY/Џñe4âÏF¼*â¯F|{Ä÷DüPÄß‹ø§ÿ&âM·¶¦ý­ý-òç6N×71ö·bìoÅØßŠ±¿c+ÆþVŒý­û[1ö·bìoÅØßŠ±¿c+†OÄØßŠ±¿c+ÆþVŒý­û[1ö·bìoÅØßŠ±¿c+ÆþVŒý­û[1ö·bìoÅð‰û[1ö·bìoÅØßŠ±¿c+ÆþVŒý­û[1ö·bìoÅØßŠ±¿c+ÆþVŒý­øÐhýuÄS#>,âÃ#~MÄGD<-â×Füºˆ�Œø¨ˆ�ŽxzÄwFÜñŒˆ»#î‰xf Ëç8þã|ÁÙÏù 8_Ðtœ_ˆW�žˆï çâußñ}ßñµ\>þŒšýÏäKìßäK1|)†/Åð¥¾×bøR _ŠáK1|)†/Åð¥¾×bøR _ŠáK1|)†/Åð¥¾×bøR _ŠáK1|)†/Åð¥¾×bøR _ŠáK1|)†/Åð¥¾×bøR _ŠáK1|)†/Åð¥¾×bøR _ŠáK1|)†/Åð¥¾×bøR _ŠáK1|)†/Åð¥¾×bøR _ŠáK1|)†/Åð¥¾'ÁŸ8^–_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿àü[~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü‚ëyò‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá|? ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Á÷�ò‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆáü~A~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü‚ßCÉ/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_ðûJùE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð ~¯-¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Áýò‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆáÜO&¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Áý©ò‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆáÜï.¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Áó3ä1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/x�ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøÏ÷’_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿¬ Ïë“_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿|5ò‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá—Û#¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~¹'ò‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆáü½_ûÒ¿‡ †_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøå{Ññ‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá—ŸF~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1üò›È/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_6E~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü¢¿Û®ïŠá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Áß»õµ/ýþH ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøE ¿ˆá1ü"†_Äð‹~Ã/bøEŒüàï+?bäGŒüˆ‘1ò#F~ÄÈ�ù#?bäGŒüˆ‘1ò#F~ÄÈ�ù#?bäGŒüˆ‘1ò#F~ÄÈ�ù#?bø_ ÿ‹á1ü/†ÿÅÈ7þ¾´ò-F¾ÅÈ·ù#ßbä[Œ|‹‘o1ò-F¾ÅÈ·ù#ßbä[Œ|‹‘o1ò-F¾ÅÈ·ù#ßbä[Œ|‹‘o1ò-F¾ÅÈ·ù#ßbä[ì®þ=ñ'“#Æþ^å÷�¦ïñþ¿4bìïUö÷bìïÅØß‹±¿c/Æþ^Œý½û{1ö÷bìïÅØß‹±¿c/Æþ^Œý½û{1ö÷bìïÅØß‹±¿c/Æþ^Œý½û{qG”ŸÎˆ±¿WùÑôîˆ{"žñ1q1âã">>â×G|BÄ'Fü†ˆOŠøäˆO‰øÔˆgE|ZħGüƈψxvÄoŠøÍ¿%â·Fü¶ˆßñœˆÏŒûƒ§º/¿2I´?c Æþ@Œý�û1öbìÄØˆ±?c Æþ@Œý�û1öbìÄØˆ±?c Æþ@Œý�û1öbìÄØˆ±?c Æþ@Œý�û1öbìÄØˆ±?c Æþ@Œý�û1öbìÄØˆ±?c Æþ@Œý�û1öbìÄØˆ±?c Æþ@Œý�û1öbìÄØˆ±?c Æþ@Œý�û1öbìÄØˆ±?c Æþ@Œý�û1öbìÄØˆ±?c Æþ@Œý�û1öbìÄØˆ±?c Æþ@Œý�û1öbìÄØˆ±?c Æþ@Œý�û1öbìÄØˆ±?XyôÊšý�û1öbìÄØˆ±?c Æþ@Œý�í»ë¢Úý•í£}b´OŒö‰Ñ>1Ú'FûÄhŸí[µOŒö‰Ñ>1Ú'FûÄhŸí£}b´OŒöݵOŒö‰Ñ>1Ú'FûÄhŸí£}b´OŒöݵOŒö‰Ñ>1Ú'FûÄhŸí£}b´OŒöݵOŒö‰Ñ>1Ú'FûÄhŸí£}b´OŒö=µOŒö‰Ñ>1Ú'FûÄhŸí£}b´OÚW>þŒší·Ê¡}Uí«rh_•CûªÚWåо*‡öU9´¯Êáx³ÊhïÛ/®ñaYŒöŠÑ^1Ú+F{Åh¯í£½b´WŒöŠÃñqµ}áø¸Êáø¸Êáø¸Êáø¸Êáø¸Êáø¸Êáø¸Êáø¸Êáø˜l—"ìü£%)|ôŽ´?ÅWF¼1œ�húî=éú2.�·ë˜¾sÄ*ÿþ�Óòâ1!ž\~SÈ'™íñÞL¯—Äó/Gõ%µõ&Fü—¨ýgDóûר¾ßDåwÍÖgË[Ó_ÆñòÅý‡ööt�ÖÕk Y¾qeÚ›ì½/_ñó�+7„q¹²8�¾ê¾0ÞtoOÁç¢áå­I2ÛèSmI2f̔֞¶´Ç’Í›“dÁž�|Ð� ½cÓú ¿Û)—ÿ;Œ+? ãU-ËÂü0¾õù¿JãVL cowɪeÜŸm~i»¿âÕÓ÷îžÀu…ñ·OëýïËãÃ$ÿo÷,¶Ò¥qRêHÒW’´&mmíIÒ¾s2¥uïôåƒì¯wåõš|‹FúÕZùܽ¡?Ÿ–n/ŒsªÒGÅÖÐÿSÚøÑ`楈<0/…Ôæ¹Ñú¶W9ω¿Î·øzÁíI°w˜êë‡âõ!/äí=f^˜æ…Ûóµ½ÛÙèüÎËNIØË†Ú²y)`{it>[»óÂ<0/œ/ó†·O¾#IþÑÜó±ÕIç¿Ûxða $r`Îú›—-O¦}"þ úC-c’}QEãµ<Ï­5•ya˜—ò/B^˜¯0ÿÿ‚·Š3òyàV~(ý±y’êÅ6Æ(Ü/æÊòûÅll»|ÌÉm+íU[2�˜ŸÆùgËyMqvÚhxïyY` á}ß±÷®!ÞÈûy\ÀüÙn  w%º¿58Úœ>ÿbÁæ‡z¾mÑ>ÿYs/œ?¹kÙäãΛ{îüdá¢ù ÖÚh±ƒÏ›?oá܃—ž¿äóÏ^¾ìà/X´|aøljÏÁsž½dñ²ƒç.]ºìàw½cîÙï<{ù¢ƒ“sΟ¿lÁÁ�ΡY®ÙÍø{îšáÐCZºøÜÄ_Ï®aþE“�Y²hÞ|¿ôY80ÿéMÊÏÂåßÞ‹ìlCÉÞŒK --vyˆOpàqgñ—áøŸÇ�…ÿ˜åÒqç¿Øq¦¼®1?â0µÞÿÁ‘ß$/pæk×58îw>°«=§à£m{§¯z5Ö~îõûsòžSà5ù‘“×ú8¼�ÿ3/ÌóRù5Ο‘¯Ðöw'ÉÅk«Ëaܹsz>ðAûðjLàýÕŸó|€ÌéÕzÒw9çÏW'´ú+*9.³ƒÖ¼ëM-i-Õûá¯Njï» Êí2‰ya˜—òopþ\³ÝŒ·¼ü\y™3o|÷{ïz_ÊÙ¼¤ô¶4Ìóò.aþu��—šëMW'--´û®éüœòvÐ>­^×ðš¯mû•`^˜æ¥ødÈ ó•¶°ô¯ÝIßåéöAÞ¼rÁºg6?q×$[ʱ¤´…幋żLŒ¦c2G9y9°åÀ¶Iöb‘úãwØ6åó¼äm/^“�’Û¿0®_ßöžÂ¼0Ì ÛÅ|‘Góx¡å¦^^Þ=/"ðèÛd ïÏ©ò¼”mM"ßcï­}å›>áëoÍÐý»sôÙË'v}⯟<ꪮҚ$ñWŠ-'®öw�žw@Ç廽rMùO7Lw~ý7::ÞüÐî¥?Ý�NÿÂ~cŽþjå‰éß+œ•ÖùÃM»O¿å±»;>òª5}V_Çw-þ8‹9×Êyü‡­.�¿Ébœ½Þ÷Y]ÿ�øCÎ8²ó¬Ë¦÷ßýáN�ÿå)'tÜ÷�‰k®{Ã�«­ìêq_{Ç ¿kéøônœnm˜Þ·ÏuGß÷éŸMÿê»ÏZcmXó›ÎŸÜñÏÏ|ªãý/¿­ÓÚÐyêñã;þãeûv<óÝŸ•”Öß²ëíÓ×,¿cߎý~Þníí9üO.¼ó×Oœ×õŸ_¸åÎ?=rußOœßõ?³ܹrŸ/uýtJogë7ÝÑvÈ>�¿œ¿võŒŽW­iI�k&Lµ–ÛˇÃlœ~çtXàίژŸÙÛ’óÍaZ©ã¹ÿò—.;Xº%Iz¿fuØ«óð]ÒÏÒ27ïòÓË;¯ÿ̇ûªùè{�Åщ|„zž}ÿ_qÛG:ã¥ð³G÷³çÕ”»véÛúànºã¥íß\}]ñ»]¯ÿÙÆ£:w½â¨µÇL=òÚÚwÍ©c:þméÛ:�Yý­¾–èXÈ�¼Ÿj?¼Ã^ÚFÂVê¸jó+:^òõWt¬øÚ¯Òu7�Óù<=>�ÏË›ˆççÍŽž›çÇú¿°cM>7o„5m|nžwwq¯ðܼÊ_p¼õóðü¼Êïq\üç0æü9ž‚çåݺÓÏÒçÄy»KÖaŒãñBù9ñ}ÿ€uç£}Kj™3©3^�õd’O/ͰX;å8]çÃz_}nÞ;‹ô×àC¶¿Þ•SÜkñ']rû‹k-Þ€çæM|mØÞ0ΩjH­Âs¦ÊÏúó¦·ÃŽŠýÅê�ohëq½ã8¯eפz|×Z¸y9yù[x®añ;cÒïyŠG^¤ç‚f[±àŽåét޳Óüý”çây†}CÏËë/Îÿ)«Ë»¯üÝЯۇÊÿ¹¶¦]o8©g朓O›3÷ìå /œ?gñ’yóçœ;ñüóžùÄñ6ÃAf1èäÏÛõ-_—¸µÔÖÜ+ÞOìöSåä ù+¿gð~:{É¢%¾þ42äõÓP⻇0¯zíyýäÓ÷°ûÉדx`?±_ØO…ÇB?±ÿŠ+ï'ûòpéüó—/œ¿,žKÎë§¡ÄŸ<„yõŸ{øä‰¿…õ龨cèèlû‰ý¢~:ô~jO^–NÎÛM±ŸØ/ì'ÖWàzui~?½ë‚¹‹.¿˜Å³Ÿ†òüóÏYrþysŸ=|��G?݉V·ã8–žÊ.Œ÷SÅ>à~ô�ö>Ú\ÓâųÎû'ŽóéÇÍ9ý„9‹.[>çû•Äœ%,_zÁòt—­¶¡÷ÖÌÍyój(x�BÅ�Yìíõåóã,Wñ8«€ãg RÝvŸìÇ¿þªwœ~aZ½îï ÎömÇYÛ}AÐæ…y`^Ø>æË2·6IﶇzwÙQW÷ž>ÝõÑÕgö|§oºëþÔÚ³Äú¤d¯Ý-�Ç¿‹�}àõeçêt?ñ×_ŽñׯO¹õè�}^gxVmjÛLJvõqIëÄ<±„ªõ¿çd•EÔË‹×ô•5g0)¯Âñ+ݾ 3Âqp¶ÌpÞWpÜ[^7ôãßËmÅáyç÷mæ¾: þîjÂp9 b ™çõzsžkßåžtéM¶~d‡RÇïþçSÝ›J×Ü5ñáyÀ/çåw/9oé’e —/9ÿ vD~Úùó‡¯ñlú½÷íg�}Êv|ÏÞg·w°];=?|2óª�ÝÉG¿sÖÙvrÂBÃsû-ÿ5œ¯rû->“w]!zß=a–üÞ{àœŠíy’kèyü³ì)úþ|ø˜m㼓w]!ÔR½®ÐX­ƒÏwk•`^˜æ¥òpXO™¯­5ÿ-U¯çÄ_õ¼öwµÏãßRóÞõ0/ÌóRþ6ü‘·Ýl�†Œ°Nß^ü5p^j�CF8Ë­μ0Ì gÊ|�á-ÿõw$g^fû‰ÆŸÇ? käºçß蘫——YÑ÷©17:ŸmUÎó’>�Ç|û_ŸÐgÌ_zÅ~B§žÇŸmï¼ 4ŸÇŸéŒæÛf4{ ÙÍhö@³š=Ðì�f4{ ÙÍhö@³š=Ðì�f4{`X=àßÉe¯;«’fP³š=Ðì�f4{ ÙÍhö@³š=Ðì�f4{ ÙÍhö@³š=ð¬é�¡]Oä³&Ø=yw dî“únø=2[x40£Óqóyü5ݱ5�¿Of˜—ÊcøÝ8òÚÐ|ÿÖÌE¶næ…y`^Êß ya¾BLóyüÙ¾Ûšï™æ�y)>òÂ|…64ŸÇ¿5s‘­›ya˜–a¾Rn>�ŸÝ²ÕÇž¿��÷U|ÇÞûBÏâ}ŸEìg˜?»5+ ë·ÐóøQÏ·­VŸóyü¡›ÿ7{ Ù£³ø<öiéãøGg·j«šÏãOÿRKz3ìVíèfåy=àÏ�áç%{3Ðóø ? Çÿ<î¬ü(0ãÓqß»¯×>ÿpF-‡‰uÿßÏ ™ä%ø~Žû=ÿПǿ‹?µ°¡ç^`uûߢª÷<þPKõ9�ÕZwQ¶úž0ÌKùÇ8F¾BCžkWð€uÕF=·»%ùâZçìsßß‚K[ŸEA>ÿ…Ï}çôj=é;ÖGôw¯NÞjÏ}kþ¥²špÏËóÚ­»·;ïùâ^Söï î(Ïãg˜—âÿàü¹f»™ÜžÏºdçMî¾½û—ýòòª:yažÌïç�—šçR^�|³Å_5)ÈæÅï‡ïÀ}÷Ù‚¡–ìóø©5[ö}Ïí…y`^ ? ya¾B«öëN&1³½ãy¡×Z�›Ñt>/é0·2§c2G9ÛËÍöW&®mè/M¬·G÷X½çxMÙçñæ¬Gߘya˜¶”ù"�Öñæ°xÞÊ­ÑÓ`7°!nã.”¢çñƒï±vxkºû_k†ÓN_¨Ï~ýÓo{ÿâÛ«ÏEù<~ùï3Ï ÿ�ñìuÊÊs¯©4Ýß'Ém?¸cé>/YsÊÊ_ôùsÇ<ÞcÞó•ýìôIò[«Ëêëx/¸ZGøÞæ’=¯™dÏR·øN�oÿá':ýÛþkXÎù¿ÿ¶Çÿpî-Ö†[âöÿtýêÕ�kŸXýëü¸Óë¸hÝ£Ó—Ûëé®5 üúÆë®:fÍõWÓñÉ+§Z{^öùõ×´sÕ•'Lï½lÂ]/}ôê¾w¬ùpßçæ>}Ç×¾³ëŒ ôv®ûÑõŸúä¤ÎçݽøöI_8bÍPûcÒ›¦tÜÿƒIkÞçwgyÞ¸ËGÖ´ßSYýÞŽ)]VGûáÙ6¾sç]l}¨úlÕšõkúîY‡ý;žÇ?çu¼üŠKóöxbíêËzþ½ëóZ¦¿ïão¿ò=ÒÖ»Ž �îwô­Ÿ>¨óƒ/»»ßóøŸ~:IžøàK§?½|üêåk÷[3ñ™£°N–:nH–v¼e—•ÉÿMެma•Ü›½¶Aò:cü<~^�äq;ýj![õyüÕn�wÞ~ù!‰?X¿°ƒ=�ÖÂßõ.ÜsQú<Àßby ÷.¬ cû¸f˜uê±sÏ›?ù„%ç.<;9è�C­™Úx¿Å굋Óv”ÿ_xÎá­¯x"pá +Óé•/…q?ÿÏÿFS#ƒ¯¿“­ çÿ;{ïí[�öØÛÜ�q,Ǹ"âX_5øÛ3‡ïç'Û˜å7q¬ÏËú°rlmË1nã]¡ßX_ˆò¸ðŽíd9ÆÝŠ8ÖǸ$ya»?“�q,Ǹ2âXãVŽ­�c9ÆÍFëc\’\—®œË1îÊ_…ü³>ÆMSÇrŒ« ŽõUãÂ;Î�å· q¬�q+ÇÖÎ�å7ë+ëc\q§Ú8–cÜlı¾j\m²ã¸�°>ÆÍl©�Ë1ŽåXyfKu~SìCn¿·÷ž �h'Ës}‹×WïW�gyÆOüuívÍõ§^<Ë3¾ˆxÖËõˆí`»8–gü ij^Ƴq<Ë3~âY/×Çzñ,ÏøÇÏz¹^²žxþ,ÏøÂÿ†þc½Ünãõ”ËÏòŒŸ†xÖËù׋gyÆ/@<ëe»WEžäüYžñW"žõ2®ÞüYžñij^æ/ÞÞ8–gü&ij^ö_½x–gü”ß„þg½ì¿zñ,ÏøÙˆg½ÜÞ§DÛÛÏòŒ/#žõrùëų<ãoE<ëe»ÙŽxýcyÆoD<ëeþc�°ý,Ïø‰Ø�³^η^<Ë3¾ˆxÖËí®\§ÿXžñ<Ž`½ì·zñ,Ïxöëe»óâ{­0�Wø÷…*8~a=l?ýG�1¯,çcß—¿ÈŽüH`ìØÒؽS#'ÉæÍÕ bÏ=2ý;&—7†ëIÅ_…q¶¾¼÷ž·’‰žq¼þ‘ßy}O¨ƒÏý}2â¼9T?ã±É¤ô#�µ¿/”pìçËáœ9ü}!¿¾îËì¯Æ†lÅ¡–êõõÆk�kÚ6̼0Ì çÎ|¥üäy3­ïú8-Ùð¿ÈKÒ¹ÄÖ¡Ž Ó.+äŸùÀë…‹£éa*ÿyÁùN›�Ó¼´Z-Õµ�eë�§µ‡õ8.žìŸ¥¶¸–mÇž—N›··ûí=ûu V ‹ëñz{m*}A”o ç=ô ÷›ñ~ˆû5Îà; âöv­5°½ý ;B -­~ëfç#ÿ�¿÷ƒqá×øžà‡æÆq=­äÆßÙÚ”>_Ël|�ñÑÑ©?J7Y¬ÿ}2ŒSwÄþ8£eïÄ_ƒì¯ËlÞ_ñj©®­�Õײí˜þ`˜¶€ùJ¹t�õåŒuœö·Í×tÿuóºµÎÇX_œ�þøŒý3è�™Ñô0UÿûµÙèû¹3Z.k9Æ^*S÷ óâ8ÿla¯i ÎN ï=/éß'Ãöö€5ªfê4Òô¹Cõþ~ãæWÙ_rÍY2ú�þ£‹_Äõ Wñ|BÇ¥¸Þ@Of«~9. ùö½Ûn~%!ô|Ö‡Ó„ã)ŽËO~?42ŽÛ]ñ·yñ§Eþ»»'´—ÇWÙÖ÷ÏåI}¸a�Åš9Îõá”1{'þjl¨©? µT�§¯5ªh!}È<0/Ì+óšóVËËÒ»ªMs¾;õ¡o¯�c}äcÅú�Ìéaªþ>´ÿû²»Û®yŒÕxY‹¿TfÀ7^¿ç0o?ji·+Óah¼VlãóÂ<0/ló•r߇lÿ¸òró¦û{~ñóÿ—æåûî³h/ëOí'^cìóòzpÈ Ï7Âß²b–—¾Ž�Ížû{8–—vº¬Å_i5þçë„o/õò×ó€•o‡‰ž—¢Í—ôåk Ô×ý›¼¹æ˜~§Ïé÷®óËû¸.Ëóvž'ó:çsœåÖ�wÿÝùÛYŽwDëŠÖÐâ¬ß þN)Æ•§‚—‹›òüÌÚ«c®¯ŒãúZþcN|gK­ÏûžSËÕjsß½§D©ßÓXó;ǹ~?ÂþfŽ¿²ýµ:'±¡–ªß«uðùn­Ì óÀ¼0¯ÌW:ÿÒW»“νÖUÛ2^ü!û°ÞZç”Ô³æC�é©ßý·„U¿÷&oký�½BÜ@ÿ{^üµëq\–7§­¡­1ŽÞö̼0Ì [Â|¥\º¥;Œ¿—Ž/ý”ÿ�–$Ùsù8l7éÔºÿq{Éëç�Ýï(þ­tüAt»ŽqDëÛ[ýU·JMàöR//q-1«¢QòÆó²Ê–›>|ÔÚ•£�~­×ï“þ¼튱×Ûn¯FêGHsÔìô×¢Úñõ·×>âñ�ø;WÄ×ëyÁï!X«_Ó8Ö¼Ë㇖–Öö¼ã‡Jkø;Šþöû…–�ÿ¾"çC2Ž>¬<�süPz¼‡óÁÎR-³Ò:ãßèlH�ÒX;~à8÷ø¡µ}ïÄ_ƒÙþÊ;~µT�«uðùn­Ì óÀ¼”ÿ†ü"Ïaþ~¼p̺j[Æwo^˜Ç~ò ;ð�Ç <qÎNO Uÿ ÇÆ8~°_´ô&¯lûP²7ê«íÿÎóâ¯#Ìí~-ÉÏmêø÷Ý�楸9ä…ù Ë9Á޾y—ùçT9›—‹P ^^8�õ`çÅÎ{“ɇ’s¢‚yȼøñ�S²åZ¬&ÿíÒ¾úÐyôÜ^˜æ…äv–à0ËËy™íÅ~ÏÞ¹Ê×Zþžýr[g}¸&Œt.IætLæ(äÅúµz¼}sòáÖkíÅ"õÇî|Õ;®ãñvûrô¼0Ì {€ù"�Ö±o/奵½ö¨=æÑ²\…÷G¿gßc ´EL&þé•GÇm½ÿ�WôûlÉîmÿ‰r%ãÅkX˜¢QøL˜¾©÷Y½Ïk£m–¾�EC©cíÏÔQêxøü;º2¤o7ß?§ÿg›ÿ¼6.—ߦþ¥šŸlýXû‘·uÆsiô³�ÇÚõëc‡KëÀ±{m½6ͤ�ü÷ìo�~DÇ´olXý¿|tuÛ¯…ÃR¯—¯L@ôÖ½ÙÛbß àøþ^›n8èàe¦N�š»mÔOîzpý Ó¹Kò8ß_~Ò�ówÙÙ×Ö´%)´#I¿/HÏ^¸Üªßu†÷Ùƒë×[¿_ÒS~’�“±¸œR¿Ô–œÒŠß‰X_}Õ''MOóf3àyÏ9OžòûAþþŠ¿ßâù!Ëû¸Ç:…ç�mm3[òÎËß ¿›Ð¸=œÿÇ í<°Œ8î§ó㟲ã'ø» ÿ¾>ÃêþïËãÃ$ÿ¯ôokç�g¶�êï®fÚo&üÕØÀþÊ; µTϯµ±yoéR<~b˜·ù üqë˧îâ´ÄGQ ו§ZŸ{¿øy¯G2<$sºêIßg]eßix^l›´ó�™-ooõWmÉzäõ×;®�k‰¹^�ÛësÏË!¶<ÜÞÖ[C ¬ãþ.†)óÇ�7~åð%ÛOÞ�öÝfÂúö²‰>ý¹x®Û¼Èçãå6Øgä=­�— CKÂûnžgø9y�ˆŸŸNµzúÆi?çåËo¿8ýݪ×αü]†Ã…§ªûÑ´=o­­?»ŸM§?îsz¾Í2e´O÷Gá~¨ß¦Ó­ý÷áþ(Ü7…¦j4ëÔ—,_¸dñäÓΟ{ö;.>WS“Í£Vá÷ϧ†å)b¼éˆÀå/ã÷�·l¥û£0ÿßYƒ¼}��Ù¾xìëÍdû�åW<$´—ËS�«½Ï‰å·q¬�qñýQ,ǸUˆc}Õ¸ðŽíd9Æ=†8ÖÇ8¿?Êß3ŽåW8ˇxÆùýQÙ8–cÜ4ı>ƽË~K��c9Æ-@ë«ÆíU3?–cÜ•ˆc}ŒK’“kæÇrŒ« Žõ1nåØÚ8–cÜ&ı>ÆÙ¯5R5³?YŽqS^ú“õ1nåØÚ8–cÜlı>ÆÍk«�c9Æ•Çúªqµùc9ÆÝŠ8ÖǸ$ù²ýú s?Ê1n#˜õ1nåØÚ8–c=Àù2®gLmXŽq,ÇúÈ=cªóóû·èÞÿ°¾ayn‡ñvåyôx–güªÈ[ŒçvÇzÏòŒ ñ¬—ó�·Ƴ<ã ‡a»D=œo½x–gü4ij^úkE´�sþ,Ïøˆg½Œ�·#Ƴ<ã¯D<ëå|ãí‰ñ,Ïø âY/ç[/žå¿ ñ¬—ýo—œ?Ë3~ÊáØŽQû=Þ>ÏòŒŸ�xÖËùÖ‹gyÆ—Ïz?Û_¼þ±<ãoE<ëå|ëų<ã7"žõ²ÿb_pùYžñ_ú�õ²ÿêų<㋈g½lw½x–gü ij^®?å:ýÇòŒ_…xÖËþ¯ÏòŒ ñ¬—ýßÏðË3¾€ã$Ö{%öGõâYžñÓÏzÙîzñ,Ïøˆg½ì¿�uú�å%âY/Û_/žå_A<ëeû'F^çúÇòŒß„xÖËå®ÏòŒçöÅzÙî¼ø^+ÌãY^Ç)~¥ö¸–Û÷#Ex˜Ûççãìý`Õûç 5÷Ï•ñ{oŽ |¿?nh×qÇ땼øæýsÙôlÕ÷¾>—ì„…y`^8Sæ+å¾'p�Ó®‹ù�Þ?·¡3I&t5ïŸK{d‹ýçy±ŽM¸½méûçè ú£ðÕàz%>þ¢Oy\•]PÞ?w’}8~|ÉÎtÂzÍï‰+¸.€qy\~ÎÐüÁ8®§Å¼øÒǰžòþ�Ñwÿ­÷ߤl'âý{ÿ-òÀ¼pј/»µ­/IÞÛ>/Θý½sïšò‘ˆY>;æzÅëÀλ[�ð2¿î[œ‘¼û ûù}qFøfrú[|+Òj'÷í»£÷5Ù yïõûµ|_�ã!®)æ¸üöf÷ÇkDÛÛCö>l•·lüÀ“GíT¿äëËçËÝkcúŒ~«Àoô�/ãã<wYºíÓ)F_²ïöØ£gÌœœû%ŠûÀgÆ.OšßÇí¨2!/þ‡Ønø=W%ò�šžûƗLJà>W€ãð}ŠOßsù}ì=v/œ¿Ø_ïÈ)j©~ÏÕx­9•mƒ�t|„<0/åÝC^˜¯ÐNì“Õï¹ãÒÏ×ú4þ®Îߟ‰ï¥®v°�~#¯ÏßPÍwv°9ªúû­ÞäÁ¥Õ úŸ×ÿ?öòõ8B-þ{Ç0ô&3sJÅQÛ�™æ�y)îòR»Ýx^&׿yÊæ…¿gdâ¼pz´Ô¹yY‘þæ1*Y}~ï´×Or¦û/'³¿w œSp”|ļ0ÌKaÏ�æ+4×óò—Ú¼tî¶Î§eóòÖÄzyéÁô¨ ró2³µ±5û:ûÙŒ{Ìó’¿½øöÑnÿÂÐX­Q ·!2/ÌóRÙ+ä…ù Mòßm/NóØòÔ·0õ ÏË‹§ÝJ™Ôû—‚}¾¯oM·}[[oò¹Üò5Á¶U…ûÎêåÅ¿Kðš;Ú±bÛy`^˜æ…Ç ÌWhæ%î±;íÕ•ÏCY˜’¶—?oÞ¼r%#òÍǽVÞ_çÅv^i~l4Êæ…y`^Ølæ+pÉòâƒ�KI_RêìLJû®I:v :´›k|ÈÛãæß�×¾ÓÌV…¸�þ﵉×Zýõò×ó@uo�iž—+mçñök„oñƒ þ{‹þC©#/Ö÷¸[¦ª7ŸÝü„͆üv‡i£áÿÁ”íù굆òü‹çcå¯á÷8/›‚ëü³1æuj~�Áe�o3ôóôãlì÷í´´ìÓþ¬ÙëM•—â8ã öcÖWoÌíŸqÜþ+/ʉ�ï?;ózB½¼þTo.áó½m9|˜äÿuz¬ß†q¿ßúùØ>v²ýuVN²B-Õó±Æj|¾[«óÂ<0/åÉÈ/ò¼µæ¿¥êõ¼øël¬Çq½-É7ì£ðþ3ä�y)îòÂ|ÅË9Ú8›ÏM<kûýgy{ޏôögn/ÌóBr»Ùþ-¸î|Õß^<~>¶cå…y`^Ø Ìy´Ž¹©——}ÚÝcÕ!æê”íû®PŽî?ßcÍ kÔ¿ö;–ÿ¯uwwÆ­^•”Ö$é+L¹àÑkoïü¼7ÿì‘Í/¾Óê³ØÁËæÍÇâ»BìðÚû_ÜåuüÛsßѯýG~ù¥Óã%Úç™?¯ýò3ÇÞÅÏÏZùçîÿØ|ì rs¼}{à%c>×/��~–·†õ+,Óé»üôuñÒáÑ�úØï?˸Žç­çÕˆô|Â6Hßßk“ÂöY-“÷ÎËäßÖ¿t|ÿ™—Èþ.¾ÄÖÿÄÛï/?$‰ï?Ë^#ÈoÉè¹ÿŒç}<,ÞÎy~Èß½ñ÷K<äùavù|ŸÃóÀ=ö˜×–{8ÇŸ—_Žó„W‡q¶¾¼÷<~b÷ÓÅrâK÷w‡:xÞ÷¦!�òxs’W’žCÚy Ç™}@õ{¹yö75ýÕØÀþÊ; µTϯµ±yoéRÌ óÀ¼^òÂ|¥óõç˜%§iŸd¿Rg¿g8¬N#ùü‹:Óݧ�™ç˜¥×³·o0ÂïêT}\ïø)œoøÂF,Uº�ya˜—Ê+C^˜¯´ii^²ß—z^góRç{7=/¦ÎôܼøsH†r}oà¼ØD;X^˜æ¥|PÈ óUÍË«ÖVWÏKàl^¾P-PóŽÛK�é¹y¹ÉòrSM-ÃÀyñ j;ÖöÂ<0/ÅCB^˜¯ÐÕ<žly™’ÉSmŸ] Ì~�íßËÝV[ Ž¿2ßË¥Ïíù†}«³*·|ÿ}~õòÒ›^ϲ=Â÷¯c´|B�1ÌKÇ ÌWâßÇ•ÞÒóùß�ýK`æåk­I²Î^Ù~ÿª±Ì‹svz:ßË…c»âŒãÓ“Ö öÓ¶v«±ö¬:LÌû¿×>ôœÔËK¨É.¬`h¼fFlÛ1óÂ<0/lóE®ŽK›íüe¥½0®N©÷î ä)ÏKÙcn>Øaçä Ö›ÒW½ÿ¼úíÐŽã1ÿ^®‚ãì ¶¨�´<ÿû­íù½ÜÀíß˵þÝ|/Çó/ž�p4ÏÓøûHž—ñû8Þß’]£ýúìWl›9Ö|³Ç¥±ŸÀ�ý^®<5<�NãñŸ;4繎ÙÊñžÛqÜþ‹G„zjBú��mÍß�‡¿÷3Ô¿Ãäýu?<“mûû;pä�y)¼6ä…ù ËX=ίòÝåï³Ç— ÂÄÄ�+|àþ’Ç—œ¦êÿ{—ý;*éùØB«y(¿myë±jÅ›ø|¬wHµÆµm}æöÂ<0/•×…¼Ôn7~<¹Í~'™æe(¿“ôÞ8/Õó±åw’ÌóR>*ä…ù kˆo/ÙßI:ïHÛKõ|lGÙ^˜æ¥8=ä…ùR^Féï$CûÛ^|ÇÓÈQkÛ~czŒy`^*8n`¾B þ�¤ïGü|ëÝûq‹üÜ™Óí|Á¦Ø«þï$må.�}�•jtðúëy,Ô„Y…C«¹Ñl¹rÌ óÀ¼pÌWà’yËOéK’�Iò‰éIé0ßg:tºÞmÈÛ�çŸ�uŽY˜økäC|>¶ejy»êÕàyñó1go°‚�lé£ï|¬ÚóyËÎÇZþnÎÇxþÅó1.3ÏÓxŸ Àó0ÞŸËò3m[qÏœbøý ííG¶äÝ·Vù~x>#ÇÅÃñ÷#†v>Æ8nÿ…Üø;±ýó¾µÏÔ2_gü:¬À“Òé³X¿�c~œ½oíH{6£¿Ø_·¾Ê»ß#ÔR]«uðùn­ô2óÀ¼p~ÌW`ïÃêßµLû÷áh}~$ú½Î}6ÉO�ÏÇìºò‘-3[´[S̼øzü±œò^S6:æì´ÑðÞóâ×’ÛÛÖ(t߀Íó#èyêßµÔóñ<ÁßÚÂ{?îÇsðÜÁ¸Of�:ëìó.]îO<÷ C94.ÐçåcÊ´ð|¡+_‡ç4a|ët0¯›ÝVûÎ.û\ÇðfX ÎØ×—É6�óÿ�½÷öÍF{ìmîÀ8–c\q¬¯\û|A–cÜ­ˆc}Œ‹Ÿ/ÈrŒÛˆ8ÖW� ïØN–cÜÄ×âyNý–óñ6�dË1®ˆ8ÖW�_mË1nâXãzÆ<ÞæýÍù±ãV!ŽõUãBžÇrŒ{ q¬�qvlœ®~Œc9ưޱ>ÆõŒ)¥?µbË1nâXãþÚZ;?–cÜı>ÆõŒ™XÓ/,Ç8n'¬�q+ÇN¬ÉË1ŽåXù¯­ÕüM±+hŸŸ´ Ìò\OãõÎûÇãYžñSŽ¬Ý®¯GŒgyÆÏF<ëå|'"ÏlãYžñeij^η^<Ë3þVij^Æõ[/±ü,Ïø�ˆg½ÜŽWÔi?Ë3~âQØ^¹Ønû­§˜?Ë3¾ˆxÖËå¯ÏòŒ_�xÖËå~¬NûYžñ«Ïz¹ÜõâYžñ�!žõ²Ýý¶,?Ë3¾ptè?ÖËùÖ‹gyÆOC<ëeû§EÛ×?–güij^ö_½x–gü•ˆg½ÑïñvÌù³<ã+ˆg½\ÿêų<ã7!žõ²ÝõâYžñS¸G=\ÿ®¬Ó,ÏøÙˆg½ì¿zñ,Ïø2âY/ó^/žåÏãÖËõ�ëQì–g<§³Þ)Ø~¹qºç¯× ‚ãž§–ÿ£ö¸‡ýG�–Q× Öçc?Oý�íüÄŸ?÷–ô'±çÏUK=†çÏq\™†ï_7´óTÆñ|¨œÿwðü9Æï«ý8ÚÞùúäG ÌóÂv2_)oàóçÖÍü¿=¡Ü¥3²ÏŸë &þ™»…Q²Ü ®…ë~2i¿çh³±ÝgYÛeµtÕ¬K\�Ó�k‹yMÙ!æì´ÑðÞóÒi áö¶¥Ÿ?G_Ðůãwàð ½{œûö¯8ïeñë\áÈ´Ö…„ë\�Âu®éCó㸞rã·àu®ÒÕÝéu.Žûý|W[O‡~�ë[Á½¿âa‡½Î…<0/\.æ+ðõÖ—Õë\‹—_ßý†³�_çÓ²×¹þæ°�×½è^äôPJÿ‡ë\æ˜êó™Žly¦Õ_*S÷Mv=Ϋ?®%æºo§ î¿ÎÅí­y�+<%N�§è?ú°pkð!=òø2>¾óuÇŸ[ô>ëûïÛöÝÒrlÛ[ržWW.âø ãJGàÊ1Có!ã¸Ý•»râãç#ô�‚ý6{¥–��§&ùÇ%�µëþçúðX»'Æ_ƒÙþºÊú,B-Õûb«5®eÛ±Ž§�æ¥Ø�ü"Ï¡Eö;’Qú÷y=/þzž½|=އ–ä>ËÖŽ÷|æ�y)Ì y©Ýnª�×—{4ý}^æåSÖû»[nâaGýû¼ÌóB2_a9íïñ–>˜/ˆ“½S¾Ö>¸Ù^»ÛëbôË5¡�Î?œ³Ó1™£ôøag#?ØïãnN.i½6Y�ÓÏ âØ�ï/ÏKþöârÛñž�À<0/\^æ‹üÑ“Öýãûÿ¹û¥ã>·¶ü×cïj{ͤžÏžñÏk|øúîO<Ó|>‚÷åhÆ~ë�q;ýÌ×£øoëúºÁúÞúÝçÉ÷ÇÏGÈ^ód™0.uLþÇ×Nbá~‹~üœ~Û˦ç¶Aòøþ^›¶O–È{™üç#ÄÏcØñþ>oømà_ºó—Ü?=ÏGàyÏ+8äù!¯ËÇ×÷y½,»Œ~<àÃJKîî»óâÚëb•q^€qñøÀ…Â8ÔPÿžo0Žûéüø«�þþkÏ-?Ócí<�ãÜóÀ¡?·Ü—tRÎâî¨Ï-g˜.ó•rÚ‡þîÔ�Ÿ3ï±¾õákÝSmêÁz4¿ŽH^=àô¼ëê=cÎi™j¯0—Áþ÷õØÏå}=ޝ)ûYÌÙi£á½o/þûƒ�ø¾ïö¾fÐH~6q×Ùú{°>ÉãÛmœýœe}ZÙ€Ûô­§yl½ÁÏIò†çæ}hŸ±íOŸ>}r�¢ÏŠ�—^¼|Á’Åõu¯}ìZ»½�ß}¸V… ¿ëˆ¿ûàtÃ(8¾öo°Ùrƒ}ƒrCmÁ\âz<Õr’wí"®%æÜJ·ã‡žÿìÜÞžuƒ}îþ쨯ßß`ÿçèo°ƒŸ-ƒ�ûî?¸?áªÏý Ïø›þ¦ˆß)±¼�Ÿ6ùñ»£qãþÚš÷ÝQ¡íµéߤ×xVØ�”ß8´ýIqôVå´œøÎ‹ò»¢Žˆ³­ïÿޗLJIþ_ßt‹µý ǹû“¿¶î�ø«±�ý•÷ÝQ¨¥úÝQãµ66ï-]Šûæ�ya^™¯t¾þì®Î ëªmðï’gïáïäδZ0}Ç{øëL÷ëÙgª¥Ï"êjýPR{µ4ª4Âz×\Ã]<íö,¢FŽŽ£J·2/Ìó¦0_)o¸#l}{ölúø^=…æõ\ÿèk»_õчl?øÀí%//9÷XÚoOþÚÚÕê¯Áëö^½¼ÄµÄÜØ¶])ÏË*[zðQ›u#kÔ¸šø"”Ù5 ?ZózÛ3õûß;ü…}ø{{]b¯wÛ‹ì圛C³BìšÛºÇ ÷TýÖJùjSx÷XáÞ«8xÖ©§¿qòÌy Ó›¬â‰ rÞê9±¿�OV¤Ç�a|kkàâ7ðÁÿ¬ý­1g9Ò{¬8ÿßY…Þ¾"ÚÃúã±oÿ“íC–cÜ Ä±¾j\í=V,ǸUˆc}Œ‹ï±b9Æ=†8ÖW� ïØN–c\ýËú—$/l÷}$ãXŽq+˜Ÿ¨VŽ­�c9Æ­Bëãüj«�c9Ʊë#?dç‹>x;ýš×þ¦½ÐÖ›´�ýÇ~�û‰ñ,Ïøiˆg½Œg?²^Ƴ<ã žõr¹ëÍŸå%âY/ãëÍŸå_A<ëeÿÕ‹gyÆoB<ëe^&Fyçò³<ã§`»e½Œ«7–gülij^¶ŸíˆûŸå_F<ëeÿ±ž8žåOï°^Î7Þ^¸ü,ÏxÖÏz9ÿ¼ø^+L¿ñ<®yŽýÆõp}�íŠóó±ÿýEv À{*öÆ‘ÉæÍÕµ) �L=Ëqqv8ÿ*¼9ç<,[9Þûr—L”ŒãqinüßÁ=ì¹åž æ�ya ™¯”Ÿ;sß\êf4{ ÙÍhö@³š=Ðì�f4{ ÙÍhö@³š=Ðì�f §†v=±×¿zÌ|X}¾î;à},Ãûx¿ï?¨w_ÔÃöÛm¿�ÉÿývKË—Ò;�³÷!”ß~—Îqå,üN}aÎ} ü]5ãøûÝò¼œø~Ï2gO¨Ž÷%D•GøEÜW1É?ïóX¿ãÜû¾d÷ økð!Û_iýQH¨¥zBcµF•lCd^˜æ¥xò‹<‡&M¶û¾°¶Ú<ã¾³Ö9gŸGqúÿjä}dN¯Ö“¾Kï^{BoòÛü•ÌAÏËR[¯°iy÷!„Zü÷îaè毻§œtIz?Ç9MÙ"y^N¶š8Ÿ?Øû<#œ¶dÉ¢e#˜#óÏ|3ÿ…!ÿ\/Â,^Ò�$“uÊ~I÷[Þü»”³ù¿ía¾ãüszÔìÜü¯Hz“QÁ3=™4§ÏŸUÍg¦÷â™é‡ òÌôÛozMgyο­ùÈ/î±v—:¾ô±=;úó†Õ‡Üž™~ã…Ÿëø×Ïž¾wGxfzå>uû7?}IÇe§Õ>3}ÞY§vZ:ßûÆ+¦éŽ};N^¹—=3}òÍkÇß¾úÒ×>ý±÷ø3àû¾¶ìÄywN¸é¾Î[>º©ï�?]Ý÷ËãÏèúãA«ûf¿ãW�¯*ôvz4‡íß}§ÿ&½·)Û’F?óõ(~fº¯¬ë“s~ù:¾çx«=3ç÷ÚŒòŽg8޽Ìßë3ÓýùRI2ºŸ™®çáyE¿�òÆ¿Ï|q<ëÔ7.œ7Ɉa”·~läóJÚÃsg¦ìƳ a\¾ÓkÍÖy~çÏçæLl«}þ —Ÿc?Ž›lÀrŒ+"Žõ±|xšHxގDZãV Žõ1.~~Ë1nâX_5.¼c;YŽq�!Žõ1.~~Ë1®€ü°>ÆÅÏ/b9ÆMCë«ÆZý=ÛÉrŒ[€8ÖǸ$Y”¾eË1îJı>Æ�=/‰åWAëcœÝ [ÓN–cÜ&ı>Æ�ÖVÇrŒc9ÖG^9¶º|þ|&n|>Îll,?±Îzàýãñ,Ïø2âY/ãã¼2žå+·OŒ¹þÅùe<Ë3~#âX/ç[/žå?qLØ>Y/ã Èû…ógyÆÏz¹½N«ÏòŒ_�xÖËöÇë çÏòŒ_…xÖËùÆëãYžñ�!žõ2.^�ÏòŒ/Œ ýÇzÙîzñ,Ïøiˆg½ôÛ¦:ýÇòŒ_€xÖ»ëo½x–gü•ˆg½Ó™?Ë3¾‚xÖËü³ñúÃòŒß„xÖËõ�ýdz<ã§`¿ÆzÙõúŸåÏý"ëåúÇõ ž?Ë3žÓY/çŸßk…¹ÿåuéâµûaÎbä!ö ççc??ìùZ+ð|-Ž‹ç…ëV…%9ו³•㽯÷%;Ð`Ïçsã›Ï×ÊéÁ­óóÂ<0/œóøÉž0~ÁŒtž¯Õeç»]Íçk±Ç¶ÌØóÒiUq{ÛÒÏ×¢/è�ÂjÏ㸞þ�=ûØ—ÖýáÃ;í5~|ÉŽ”ÂEö{­Âz<‡ãÊR\÷>hþ`×Ór^|écXOù=×[rÚܺÿqy&¥%<Ö¾×J8Ï�óI­‰_¼ó¿YîOÑküIzµõ×6#ÔRý^«ñZkëÙVD0Ì çÏ|Ù#Ðû’ä½ö½†ÅKïØ­ï�ǼG>¯ýŸýÄï5œw·"§¤Å<ÅÉ»¯(ú8œãOî2ðÁÝÔ^°œœ¸¡ÿ½~¿~îëq<Ä5Å—ßÞìyÙ`�àv÷�½[åÀ-?ðäQ;u%–Ï—»×ÞÓgô[~£÷è5_ñxkSt¼ì ìëÅy6ö= ¥±ŸÂE»¬ßÊÇž‘~_Éqq9üvñÐüÆ8nG… sâK�z¿yý“w^4ì¨~c˜—ÊE!/ÌWXÌÍg7®­.²=?°Ô—röù�~ìŸH¿‘9=”Òÿ滤óÒ6ߎǺíïHÌWàKl{I‡®<öíÂ÷÷¾=øØûÉ~îÌé‰�ƒØ¤Žp<�Ìߣ2ca‘þgÇ×�ÊZíõ×Û^âšb®Îvt¼ó¼tZ?rÿô°5ËpС0h‰Ñ]€ËžhXò.Ø¢�7x|Áã�2¾áq�3x]fŽ3âëKÞ¸Yæøqæÿ}Ukëim{´†V×oü(üÄ2ÆÅÿƒã�RÎñBÎs;e·ÓÂ{òâßûÿÙ»À(Н¿)ÀBï=ôPC—’ì^Jè½£IH!�4RAᤞAéÒAQQ©w¡G±€é¶Xþ"ì7owÞÝîrsI®Dýd`3[Þ¼÷æýæMÛ�9RoBÀñÓݵò”õò¡*üÉLÒÂw‚4¶û�à`ò� ù h¯ºÄfú p±�§òÏUÏ©p®ÄqÉ™JûgE›P°i×Âu9ΑêÇÿÑB”œCÀþÆYåÒúœ^ÒHçÎ-¦ŒsÉMÒß8Çý釖’uüëÑr¬§Q¸�4}�®zN…s�¸ ˆ‹‰úâU8Ú8/|.ÿÖïÄÄ-„x‘ßEßÏqÓÃ9n]69 ÊsèÀ}¹ï`íW€¿€ßL¦õ ö7àý)µÜŒNpÈý�þá´ÿÇqêþÇMñί¯€¯:ÂEÏI­äçŸóü:Ø>� ª‘Ë<5yžtÿ4ÓâNòï�<ªÉí·Â3°K‰‘¾?1 ØåÑß{j÷½íA�u„=öS°ß‚±?ƒýì¯àû#^7O2„Ô)0O‚ýžoêk¯ßÂwSæI0Ž˜Nû-sìõ;P[Œõ0¦CçgÚIŸÝNÛO‰š¥½¶±µ{ÖÄW¹]"9-é·`l·ßÒÔ·GÞAm/{ý…‹­ß’?®yËõâ‚8 .9³h¿…â,ˇýü9é M²Ÿ?½VÏ“<ÐZš÷óg<—çIüHyTÏ“<ô:Î=dð³é¡”a(ÇÿßÚGÄq1QC¼Èû ‚ÇM‚ÃÏ O½qö9ºäd÷9Dê7jK=zŽþ‚ýM™‚=OB¼«©ïŸ^p<ÊKý……‹Â…GCþ¸"uáÇè/ˆₚ ^ÊuþæIz;Bÿäc]¿®á><çòž'áxî˜wï|`Üò ¶y+71ÌK ‹ÏQÛ§ÿÚ(&.%ŽËŒÇE'¦8£„ºO¹yÓ’Ù¥áe üµpå½ÍSÊïuâ}ýhsq廬ãsM|¦Þ>2KÙvcÚ“ÙãòŠœE,ÒöWø¢ôwÈŸO•õk<ºtð^óÄ'½CÈ·ÙÄ«VV•ã²ÞÜÈXuÎ4=¾pÑÙ$}—­0÷�æCò>„pþSGK®áPžÊ¼tüŒÞW¼‚¹J<Š’ H,+AáÉ?,DUäÑêHùr!©ÌÕ±êj$×^„¶ «É  î¬X¡‚¿ÙÊw Ûô…´ÊºéyáÊ™^Öùyl¬ÊÔ\f2 {‡Çxl�ÿ já8û¿Üý4Æã,ÿg-@úp"¶6Ía|ä]¹.Jzô½¥µí}Û;’üæÚ9kßÁ—Ðús=/ÚôÂG„÷î:ˆ‹صo—®¾ê¿r?òßúÑ—:#Nž9™ðq²Çxl�¿¼9o¹Xƒ—7 á\Ê�߯Œ§rhŒŒal uvü¦·È̈Q,è8Óè?\ž·@~/Z“–¬žßÀûß{cÊ\å¹*Ïø0_±mœª&g·CE8˜Ã€ß %ížðuéä7bã¡ý2�¹ Bãã7Áu(y/ª¼*Ë6`{vâ“ä>ÇȇgäŠpçÉy0‰½ÈAƒ�ÄhW1Ž|ñ 1>øG�ýö,@Þõ4DuÜ7•LB¹ºÄÅGg%eºÀ’âøÝÆ&c`÷0ÛUÁÏ\M�åùlr�ókÅɹ=ûª^…bR—â„וù¼@A;¯‡%õB:ÔË´RKzEgfDfÄef&¦ŒÍpI)’8wÕk•VN ÊõB:Ô‹_¯¥/BŒ˜’•™™˜çŠR�Œúó õ |ó§¦ÕÏ�äõD½sÖ*zc~ MfBz\tlFd\zzj:¹öd@{¢¨W Õ õÒÒã&FÆ¥ŒMtÁ¥;äaOxÚSM¶Á~9ê�zZõÞ­ØóC’(zÇÆMLŒq¾*ŠÈCo_"Ð b5=èݽÿù™‘œRQçˆ5ŠÎ˜ —m=&5=6ÎÓ%@ÑôB=P¯Í«©^T_«^´€’$n À_cÔõâ©^¨/¤‘í“�ê ÆÃ ˆ±štoÝ®½cÔuNxE±%æê'Yçt—ª'.!�ÕõÔOjzÙÞ”m�z¢Þ9´Æü!ôª²é¬ú¹qvûa€%µ?ÁX^M¯-'ÊÜ:ê�ú¢þ�TÌ—ÕîÑ1™YÑIrû™‘8¹ 5äÚ]M/ëÈ�z£ž¨7ØæÈãÓ32#Ó³œz™'sËÿÔ Û{Ô+‡ö°_íÌ31®5²*µrW(~’ *1>*IOP/¤C½"h:¤Wì•D:éÑ)iÑéq)®v"‘µu@½PÔkór%¨/¤ËˆNNs›ÁÔJ�óÝ( õB=P/žê…ú‚^.6‘:M´—,{¡¨WÂ2ZORý ]rô¤È1©Y)1®U•Z…è•Qwí…z ^9K½P_Y¯Ä�饃ÑZO ¨—i‰¢ê zÅDged&Æd�Ê9>).&3qbAk7�QT—,QÔ+w±¢ê«×+�Ô¿…¡ê�zEP½P_Ð+61>>+#Î#XU¶ƒS,_¨êµùeÅ^¨/è56)5#ã�¨ÅAU@½PÔ+á%E/Ôô’«ÔäÄŒŒÄT·;€Q¥œ¢^¨ê¸HÑ õ½&¦&e%{F¦½PÔ Û-Ô×j/¥ ŠLvs�}:u°Ú‹¶Ÿ¨Ò ¾�èåæ:ÖˆiŒzaÿõâi¹Ç~†­?“•>Ñ5¾V1Ô õ@½p^õ½’²&‘n‘E&¦dÆ�M�ÎôÜðõB=P/Ôõ½2&Ž�Œ›”–šî†Ž)„úUg%FyЇ€z!ꕬ¥‡òuª;u“ €¿: ^¨êAõB}!]ê˜q¤UŒŒOLRö¦Sóqõœ¥ê�zm¦öE}!]FZRbfdt&)^3Ç$¹¯Ù~dNí…z ^˜ÔôJ">‘ãRIÍ•ùLšuYöìHîãw„)ÍNú]!¤�é0­‘›Êñ¿*ß#B¾ =Òcú\Ü“Æ�†¾B¼žõâÿÔ¦GzL_…~Lj|!=öÑ®´€o̺ÈãY”�ô˜¿ƒD¾�}ª4÷ÇÕ¦GzL?‰ÊG¾�¾9 –óŸ«Õé1½þ{LHu(!ë[›é1=�B@¾�^þjÓÓïA!ÿ›‰añ»L ¡Zý]‚\ßû£§nüoáÛ7e?’‚|' GÒBàõÒЛ^Ô~*I’äÀ�Á›#_å’÷Tx]�¸±nò #­­ßBêˆ0íuŽîZÿ¼à×6�ò~ʘŸ¼2±¨eq¬ÝWèþ”ß�-•wDÙäýÎÍЈ«“É7°§¯2gq8YJê­±šíËs›.P¾QõÝGÏaÍ_=r|røx7%ÂyÅíÏËçŠ\rÃNheçž›o�»pð b°äèÀÎí!pïëÒ“£‡Ê/)5Öòº‡œßP[þ"^p\þ`Ý€£rŒ„1òÙMÎAlçøþêÑXÁÛ®¤1Š·|ÛYà¸M>Þñ<ÊúoĶr¯öuÞ—*äÚm'áQßC>JÊ Ök¬òÂÏÓ–—œm}õ¨ µV´ßEtA>ž*/��Ë‹Êðˆ³>¶‘`yA»å§¼$�äØþí"çàçüvmý’3_[^¤ØX¨.¬u„‘Rõ5G¾ �ó Xï O•£ˆÇåH……¾üàµ�ËÚ-?å öƒ<…cÂcm ©úMyµh·üณHÀu#[È9øµ> ”'zG?CÞ»ã�°$Ù>^•¦ÙÆ2T®ÜGRë€íŒ­”>$Ù±-º†!¡“2îÇX®_ ^’„öòÓ›Œ)Å9?aáCdÀ�¼cÉ9¼ÛÓþÊë¸lyˆß•½IÎ�\ÿ}YR\¼óJ~‘½É7°ç:ÂõD½Qæ'=ql‚+ŠGDŽî‰AïmÄÀ¸^o 9·gjõ¬f\×wpxjrZjF"|MÐ756.3=®€söä`®Lï_y¾ãC)©é cp�e ?Œ»®Ê ç_ØÏ¿©”7~�—+±‰Æ ›#ýd~y T[<éJ¶üýb‘ж{î8?#ú`¾&’sP�ߪä eð´8_n3Z=ÿ€<j¤ÄaDÛKäÔ‹{`­ð¾y½ºˆ‡© Ý4T‰µ©�¹ZFÆb9äð‡8Œ|íCŽÂ ÷Ù7s>•2oªd¿BîŸ!‡æsóñTŽç(,Ú# q×ÚÅtqªf¿–ɰÀØùàjz”ìÍu!{q¦ßOËþ ^=(5f|\fxj’SÓô`Ï7ÃMÖþ”zvੳ)ì?»Ã÷-69ö꣈øðÄÇDË-âfúüZ’ú;æÐ¤´„hû¢óu×Õô6!Ÿœkz|º%¥F;Ór- _Uumøæ|âcÓ£`gˆ�MŽèÇC°áƒx >ÊsR_RÜø/µøŒD'cWÓÛÄzŸ%á9…„�M¹£í–µ{‡¶ÓØnó‡4댟ÛkÇÊñ‚|W¬ôß œñiH¼ç"¹ðâ°ãîÅa1Òalz¨ÔÓ|ý'5ý«üï—q�ã ,ìv ä¦à¸ìPE>äHÝŽ äùüŸ|²9,>¾w8³£ùG?ähÛ-Ó)­ºÚ¹šqƒvL*ííÆvŒØÒ83<·�üÐ&G퇘;e3Š4¥ˆâcº¯àc-·_iñqµr5½-÷µciÚ´ÉçÇâ<½ã~†M�‚�a;f“£ÆÇN;Fñ@|ø?i}BýÈtF‹�«í�«émÖð>O†>69ŽñA<Ó=ê?7þœŸ¾©éÉÑ.|îàjzćìà#ûOÂ/ú~àPòM†Su™uD!àï…lrÔø`î0Võ).ˆ—úõ'Óy-NC†"çbWÓ£TOá”PH8Ùä¨qÂzsià qAœLP¢øñ´8 J‹‹ƒ9Ggƒ«éQ®§p2N69ùà qAœøÛÔŸ¨_™.jqrvô�öu5=òñ¦õžûæ'Λ '˜Ÿ°ÉQㄹSõë(ˆ�éwêGÔŸøËZ|º(ß^ÛðÌÕô(ÎSøä>69ŽñA<þ7ê?7Ó->¤žŠÉJŠvú•“«é=�On!ác“ãÄñ1Ý þCýˆ¿¦Ã'!:6õi´RÁãA.¦G‰žò>¡�ÆEV9ŽñA<þWê?Ô�Lßhñ í‡r.v5=Jõ>�V»yvÜj“ãÄñ1ýBý‡úÿ�Ÿ�Ê)4S�cWÓ£@OáQHøØä8Æñ@|øŸ©ÿP?2}ÿ>°T ÍTà˜àãRzè)| ›Çø ˆ�éGê?Ô�ø\->=RbÓÉÈíTÐØÕô(ÏSø˜ ›Çø V|v•ç÷7Ó��à7©Ÿê50,Ÿ1ÁÇ¥ô61ʼ�ûæMΛ ›{øØæLćIÁq㶃OòªÃÉ ããBz›XÏà“SHøØä8Æñ@|L/S|(n¦_´øôIÌpºnÛºšÞÓøä>69ŽñA<~ ­ß¨ñ¿jñéšœè>®¦G|<Õþð‰…4þ±Ê±‡�j~‡â�ø˜–RÿA?º¡Ã‡,eLOMIvvû�®.¦÷4>�V»yxüc•ãÄñá—SÿA?úM‹�? èâd/ÎÕôžÆ'Âj7Ïâc“ãÄñ1­ þƒ~ô»}|œí'#>Φ÷4> …„�MŽc|ć_Eýýè¶}|œ}O€ø8›ÞÓø˜ ›Çø ˆ�éê?èGhñé.ï¡âtõƹšÞÓøl.$|lrãƒx >üê?èGwíâãtõDñq:½§ñÉ)$|lrãƒx >¦W©ÿ ݳ‹�ÓÕÅÇéôžÆ'·�ð±ÉqŒâ�øðµ”ï77þO->ƒa{;º“3µœ«é=�?®�Æ?V9ŽñA<SmÄ�à'j) >N¤÷4>�V»y¶m“ãÄñáëPÿ¡~dzè'j) >N¤÷4>…„�MŽc|ÄÇT—úõ#žûF³~ePÖ˜Œ¬ôøè˜8gj7òÛà.¦÷4> …„�MŽc|Ä× n&/&>NÕN*|œJïi|L…„�MŽc|Äó�¸ñ>L|œª�Tø8•õóÔüèæBÂÇ&‡��¼¾ˆ®'²®/ÚN×ÑuGü&íºYã¨@°®sUÖ#MŒ{º`¿<"£ÄcÈÊ¢�É©m�¬·f}‘©­§•X›ÚvņÈï#Ï:úÝW™ÖE�ãë‹`]”nm]'Ëm /EA>õú¢|®“¥ö@?äiíbòÕú¡«ëƒ\M¯äö2òÄ:Yÿðœ|úa„‹ëdmrìù¡í=,â�ø˜h¹ÅrÌÕâãêú WÓ#>dâƒ^œûÞ“/ ��ÿ%,7ŸøØô(Ø®/²ÉQãƒßÝÛðA<”†¸™Šiñqu}�«éQ?Ïà“Æ�/¤q®UØãëïjäœ5²ƒûÚ½•÷„r;HÛ=k;ˆûaàz[?Ý~‡í­³íN¾<.ØîOaCÎ ?ÍIÆlël}4í ß\©ç16µ í"�µÜÈ:G?åwÐõ÷µ×Ç:[ÐÚÞe¤ùÔí`@(±½¯ý÷Û*�Ò„ìëÝlrìù¯ªKË% SI->Äñ\¨Ÿœ¾ ¹z”ÞýûL(øDäŸG5ÊßÄÇ&‡�OÂë�É´~ÕK±îÓ†ýS]½ãM€\à‡ûcz~˜ùa¹E9V~´ßlåGçôü0=òÃü¢Ü· ùZ÷Û ùF~áC8® ¹à‡=#·#�wèјF(×ÈW‡雕>&£t&ìrë\9r:jWïGôŸ,Ï3aŒ÷ó¯°ûûm¶þ“š�2Æñ¡· ¢¼×$±F�–p ǶœèÏù«“©Î‘/Ò+iHOöbÿ·%à¤»Â©í øñóýd|๑\#Žúß™ �ä ÿ^¸!Îi ”Œ‘%–-«^”Α^îü};Ôƒƒ^ÃÉC,×mÉ9ê¬Nã+_x‘þ”í9”?¸†#! çdB.'±³¦?¨ÜUÚ»r�ÏÛ�sHO¼¿É°ŒEE¼¶QØüŸÙÊ´§j}´ù:ò;´¾Áú딀õ�iîÍþ\áC¥%¦»²³‰Í~ ‹od¿¾ÙLëŒQ¯üÆ›]¬o@K¹cBë¿3CÔõÍ3£*6Ut³�ÿªoÔö„¬óKöÉåýqtä×ùÅ.?t›i¹ÁÓ ,¨>w¤×ßQß`¹fÕ7J~¼¸é$C˜'(¾äŸ½ÀsJý¯vˆhOð¢Ï¡¾ž%¶· ¾:¹‚eÃÂêf[]¢¤VÆÂ×÷mcðÈ¥-O¦çº…ì¬5Kp¤ÏëoŒI6f Žòuàó¤�jeÙçÒýi!?Ž,":²s�sCûø‹!ã*3íüCãe!â¦br…Ø`–�oÙÒc•·èÓI`Ñ4?±=¤{‘˱íÛ˜4WZ ¹ðšp¤ñŸLš–?|by¹¹pìR‘%ëòÅË!•UØ;µGm&ÍôÄïBŠät67_RŠI3cË�!ÛK¾i~gûwL}BZ\I¿ò­ù@ÕµLšž—n†„O/jÙþt&Í—¿ýòENYKʯç:±òõõ¹!AÑ--*T5³hnôÚL,cÙÊö¯Ù+y἟·åþÕ L>5“K íÛ}eöÊö¯NB9¡ïøUæ±ÝØþU¥de¡Ë²Ææcï±ýká…ê®ë÷nZÍö¯ç·»{ Kðé0¥�p'|¶PÂ�>Ÿöj",+y@xu;_>AÂ¥ë7Á�}zßj#ŒSTìÀΟgv*V.)ý¾ÓΉgÂ…ú[ýÅR0ýkÀ’~•Õ>âgëfùyú«Ñ‚xïŠðy¿÷™4^Ç ã>|]˜.<`ÒlIœ$ød íçTcúE™VÓ„ìoýöv9T‡I#\yVˆmbÞÚ¥,“&öÕg„Z_¿eþ¢÷ÏL}>o3Q˜þùæŠï¼Æ¤™¶=C8üo9ü{S&ÍŠÈ ax¯ –�š2í;+¿$œýìˆðÃv¾>š¸X(½îáϵlû¬9»Th=£¸XyÛÎ1ÛW SÃˈÇ2J1±ðoºN(öai1ªÝ)&îÝ»m’'›¯ëÁ,?S&½'Ôúþ;áÉ»˜4_q{„øØ-BÝ`o‘…Wjò!aó»m„sÝk1iî,É2¿½¹§âȆLš� û®Šæ) *1i~íµ_X×þ]óêv0uæö š_7ÿü“fuÔn¡H]Ëð!LšÐÚ»„¨U,ŸO;Ì´sÑŒÝÂÅ5,^AÅÍ,û|î»O˜¿´²¥ûÔÅLš“/Y„#Oñ–}ÅØýýU_ô½bîX¹”…%ëÄŠCB�fëÍçú7dÒœ/{TØß3È|ÚÔŽI“0ócáUnþÞRtbÒ\òýDHëê/ŒzžÍgíØO…¯/æwgësñÈgBóìO…vþì|Mlð¥`®' q7ØþÕsöiáÉý¥ÄÄx¶�»_?'tZSQ<Ó¼‹^ׄàƒÄ£èoÚF ØçŸÐè!¨V 1÷Ë‘Ìòóõ¾»BÛ7¯ ¯ÿ|�I“rÑKœQê]Áp¼˜ÈÂtñžbb|�NÂ�ÕcÒ\ê'rŸìÙÓåb3&MÑýÅÄ¥Ùáæ¶Åk2ifœö»Ûaž4Ç‹Is“óŸ;vÛüQäf¾V.“„»MËZ:ô̤Ùmz <œ]Ëò}Ÿ¦L;O=ôPXRªžå•ú÷÷±ì³i7'NÙTÓ23ä%3‹æLioñNvIKtåKLš‡Q>bÿïrÍq%ÊXX|¿í+nûi“¹ÇèÆLšqÓµ5W ïȤÙÕ¡˜Ø¢^æÞe[&MÔ,^¼¢¢°¥›Ï�ûŠ‹WW/¾íÃÖgÞ-?ñÊ‚s¯÷K3eýÐÈ_lTª¨Xá.»þ1�.)6û©¢ø}-¶�¿ù²´xì·â;Æ[L¼Ö/® ž"{ß}6ž‰ûW«‰ßÄ•kLŸÀ,?}—Õo–¾'´ì÷9“fâž@ñ»y Kk”Y˜¾·6H<8+LxsBS&ͱ‹­Åè}i{š—jǤY»(Hüm[„ù›÷0i¾û¦©X©énóÑ â¯¶9z¹‚Áºåó'ÅSYͳ_=ÎÌ×ðõ Ä×gU¶ôŽLcÒ T_§Ëµþö½0öv¾¤­ÅóUK‰/œeÛgÑ¢6b̧µÄ+?¼È´á´íŪeŠoÎ;ÇÄ«ÃúÎâ‚Àúb¯�«™¸w3‡‰ƒëUë&Ìf–Ÿ×Ï÷·Äz‹�§]eÒ”)?H|ýU‹På—ÊÌòÜó‹‘âÄÕ½¿‘m™4ó²Ÿuz}wÑ%“ææí‘â¼Ù}Íß bÒôÞ7TÜš¶ß<²k&MÛŠ•oûZ‚’.1óUjU?ñ¨OmËô“fPí¾âæ�-,}?ÛÆ´sbbѶ–^í1ñ:Þ·¿xê¯æ–"e˜Y~±øøñ¡†¥âçט4Õ‰[8β²S% ‹Ï¢ƒÅÖQš¿†=&ZT{¨8>,Ô\¶C&Ÿ&3‡‰!+ìýLèɤùþÚpÑïÝBJ6ŸÌî#Åï·…gG±õé°z”8pùá\mv¾þúe´¸óùÊbù lû¼Öù)2fj,öúq>Ó†éí¢ÅŠ{[Š—Mû˜x•z#^¬P¯…¸¡Üq&îËÅTq[…ºb‘KK™å'bá$±ø{ÅÅón1i>¸d³~úXHøš=/±Ø–Xîú0al/¶ï,6G¬ßëÃNÕÿˆ`úÅàa³ÄϹ!æýW:1iÎVž!¦.üØÅž‡ìvÓ(ú>YÂ’]™�¯Ù §Š± �,ìdæ}•÷sâÀÈ–'Ö~Ë´ó½œçÄ—CKêœML¼.EM/~þ„Å'v÷¤ÉFqÅ�ú–àiß3i¾ }^ìz›Ìy>Y�Yæ»�.n|Ûb6D±ç%ž>:]œÕ¨‡9½S/&Ÿ”Y3ěҎ=§6 `ÒÄfŠãrB„¢MØ|Ü›)®ÎÝ%Ä„±õÞ�%~áí+ÖëÈÎWçØÙb£uÄZ]Øö^yŽ8ýÓ¶âÁ'Øvžü¾I¼´6XŒI\ÇÄ+cñ[Ù˜5b§—˜?ùq “ÏG-^G—þi÷ŽÝ#˜4;î¾*^¾ØGøù›Ï“æµâ¦·Ž C?fëÓvÆ:ñå%ÅË—Ùù:Ûm½¸ºEs1èU¶}þ*¾AÜØ$Tœûõ L9²QìØ½‡XºÅ &^ßäl‹÷ë*^ÿ¦2÷Ÿ¾%¦ßj'>9ë#&ÍGkރ߬*V=V’Yƒ|(ž½sYht»=“†ûi·¸`Qªm “fþ¬}bð� �‹¼ú$“¦ì{Ä‹1cÌ]& `ÒD#²Öœ7WÌÖçÃ*;Å÷«X¾)Ë3NZõ¡XbTGKëöf¦}¶þïñÛÎ},C—6bÒŒšñ¡¸©æ`Ëí¡Ã˜xm‹ÿHÜu¹·åì}“™åç#vŠm6$Îì;@¼õmK&îÛ¦},Ý!Š+¿9ʤ™¶ó¤8wpñ%{le:pJ,Óþ'aûV³ÌßK>+þYw²ðÚ£˜4eO�7.¼©M<“æùΉË$˜W‰l>{çžoD_3o[ÏÖ§lù3bïþµ-‡n²ßwùõ´¸ý³PË©'™öM§Åju‡Y¶t10iÊ5ÿJüeÚS–Øßê0ñzµúqÛ¥¡–�ظÏ)~V¼0Í`ñnrÛÌò‹EwΊ»~¬aÙ—È,ó/];'Î-wÑübñÞLšÔçÅ�µÇ˜Ÿ�gûN£�¾Wœù sR‘qL>GÖ^£&% ¢Ù|ÆÏ¹(zï¼&,åØúôL¹$öÿ¨¶ø\";_+_cº‡‹/—gÛç­NWÄFëFˆ%*±íü^‘kâÞæcĶ3ª1ñj}é[±ÏäÑâŸugâ~gy®34B|÷“æèƒ_Å!·‰oıÇ2í_¾%.¶ü.z—Ý÷+uGlÒõy¡4Ãô�e­ï‰÷WÇ�HbÒllwO¬'%™ä ùà®xxO®yÛu¶>3ïÝ�ëê[6Ôg�ïEß÷ñ=,MS.2íÓlÈqå‘–_FaÒ4¬zWœž>Öbjúã^–_Ü-{O¬ýl¤%nÖ3‹æ¿ÿ‰}êGXÞïx�IsÌûO±Ÿw=Ë:c3f™ëÏ?ÅjÁß™¬g�›jý~_\P:Ñœq/�É'àÇ¿Ä/:– ^t=�I³ëòqώɨ;l>wN?”øU¸»†­ÏÇ%ñ÷±�Ä«SØùú<Š3 žÓ[ìÚ’mŸ×¿æ s/ĈáSÙvþy»—aÅ´$qfÿKL¼&þêmèw5NÜzŠýn+ Ê×Ðäç~â[éטeãÈoE Ë.7Ûijçë}Á2ß¾'l¨Ð—Yæ;¬)nèúà ¡DűLšE~†ß{‰ÁƤ2i’×ùŠ~Ÿj^UžÍç•ë~†Üuó“ÝÙút+^°#6Ð2õˆLY)ÕKÚ ìk|ø¦} }KvJq–૱Lš²Ù% Ãj§XälbâõŠÁß°óÇ8Kf6îûý Îö±¬zŸé_kCKJ.ldé»(ÈÂòÓ J úÙÜåÜ&Í´°R†Ö!)æž?%3i®(e8mn<»öD&MçðÒ†n=§ Gdó™°´açÔ;Âð³l}Î…—1<¬×\l¸��¯€Ce 듉ý³í×¥¬!ú¹ñâÞÚl;ç>,kà+gŠU†­câ|£œaêŠ$qÅ_c™¸ÿùSyÃŽúCÄ›}~bÒ´í^ÑÿB�25PdáÕmS%Cµ§î ­ZögÒôm\Ù Ö›%lÙšÀ¤¶µ²!éɈà�E'0i¢‚ª¾ì4ÁìˆOÂö*†°³¿šé“Ö®ªajPË´àÆLY[¶U5|Pu€å§3¿0ís¾n5ƒïÔDËÕëILšˆ Õ Ç?Ÿ`Ù’=‹‰WûÕ íŸI´œjÀƽÁæê†J^,oöz`faQ©i Cß M,M¢ZYX4¾ïÔ0üüþ¯æ›½‡3i~oYÓФÆ³ßavÛtíýš†¢»¯ªù “ÏÉöµ Ef ¾ø˜wÕ2„5½/|ï@Ÿ·ƒkþè×R¬í _«-µ —8°Ï a†Ïv¤ŠØ9ðT€á·ú“ÄOg2ñ:WÇ0øZªø09™‰ûÃÜ:†ñÃİßÙå§hR]CRzKÑQ9ìúL=ÃsµÿÚmcû×¶¿ê~X ÕvL0;âóëì†�q7ÌŽôî×Ðp~EËOëÙþu`ACCƒ7X<}�iÃfe†¶gz–mçeKª-I·äneãÅU ”ùä<Ïö¯q¯Êúõ;57„¿”&:²ó‹ûšŠý6I¼â¯{†2G¸Çj!ëã¨üœè$çËQ9l<(OÿZ×·ežþUâ‹–†ÍyøWÖ�Vyú×å³­òô¯ˆÑ­óô¯÷/·ÎÓ¿jÆ´ÉÓ¿æ|ßFö/Gxý–Ø6Oÿu½mžþu8­]žþt»]žþµòéöyú—Ïýö†m/Gþ•<õ‰<ýëŒW‡<ý+tV‡<ýë-¾cžþUq~GÙ/Ž8¨Ç¦•î$û×þõãË�d>ÃÔ«ƒ*uÎÓ¿Ì+;çé_�jçé_/­ 6äÚi¿`½~³t¿^ˆŒ—£ö+þ�C¥<گϚyúWÇw„<ýkc+1Oÿ*õ�(û…#;Oê`�ý물®í1È|áÞ£Çí,FÖ—%(ûÖ&¶ûñQʵü˜�?=úD§¥¦g&¥$F¶o;©}Ûi)cí�9¼…ëâÔDAA-ZØùŸ™œäº@µ Çç�-ðØÿy ¨ë ØGRLt_^¸?µô4R/ÒXM7øý d5>I K{Éñ( 6Êc¬Œ�ÝÃÔiÝu¾ÓîzywqÌçßbX/^…”A,§5‰âöÊ#–ë ä¸ØÄè ´ôÔqäWi3‚úd%e&*÷Út ŠLŒIMÉ -oZFЄqÑ1ãc2“·Ãÿ–²ðXÏÇÈËP_À~3XT çP_œ¢ ñ‡jX÷ �{x |�î…þ}»—ô«æGNKöˆè2�Ä8xØþiÍGÏÿB¶Ç¹Û¿÷à®~Å9ï"^ÞTä:vêÐ-¸lç�΂¡ùÀàÒ=ÅŠ�ÅÐ18"¤qÿàja!Á‚!¤‡Â…†z÷àºt ‰èÖ¤K·ðîÝFõ(?®+×3¢÷àˆ¶É\¯>=#û—‹ìŸÑ‡ë7 _ì€êˆÔñÉ‘µã‡UÊÇ8Œ›8²jæˆãcùQOŽLSnlTëñ£Ã^á�Ù&öÉaóGs“¢kMŒ­5&r|T¿Ô¨nãÆã¹1±ÑÆøbQqc3b³âºf¥sKb|^LðIH;yb‘9ÉÕÇ'�›3.hi2—’”¶~,7ínFfÅäÔ¤çŸ.ñÚ8.uBŠ1µïÔiÞO?ÓyBFÚì)eMh9wj±©Ïµ™8)kÑ nÉsU'M~zÚ´AÛ³¸ÉÏ>3}ræ²æÍnøÜ´g—Ìãæ=?Å8ãÅ%ŒÓ§-œ#ìyŽ{unÙÕ/ÔX:Gœ3ýùEóÛ¬›_aæì/˜RÖ,¬¸`Ö´ƒ3¸óÓç-˜»nµ÷Ê¥Á‹çÍZ¹"hÅÜYÎ Z´pΖ••¾ôâË‹–¬¥óŠÅ/-Y¶øðJîí å·½æ½weÀëZ¿±lÞ¥%ܪWVX¶zï}Çgû«/n|}ƒåCî�-›íñÝòÖæos'r{öDÞÙÎý¶‹û4»Ó‡;?øøƒ×ΟàvïÝõg6wêdÕæw�~Ö¼ߡëØ}àÐþ£GÞÌ9xàБƒGrýøÈÇÇsŽzìÎeîË“û/ÏþîJðg_œüáZÄ—§¿8sþÃÓgN]ºüÁù ç~ü1ùÒ•‹×®|ûÍwWü9÷·›–ßþØ{ýÆÏwÿ8ôÛ­7ïÜ»}÷–tÿç‡n?�Y�x‚WæÀ¾ƒ8Ã÷gã9Îg^âu“Î_\>¢wùÐ*GüõÓMO%¿•T|N±öMŠ6Xµy|R™Š™ ü.Ukw)°Öó÷W\hjeöÓ¶¼5©NÑ ‡}–L2ô߸y]ÙÑÅ×]í9aÐô×—þtèM²ÿJ•ž›ö¿Òýï_©)Z¤˜—&”ïi.Vi×ÄYA¾’–7ˆä}й×�[�جþðˆr˽®ÍÞ~gîýÌ—³”Iz­ñ�¿n=}ùÖ„âõ«¿²½g� ûní´úå/®Ƽ¶ÞïâÔI¯œ©Ùîú��o•hgâV•êó[§à�¦Þ?7qÊÿVßì{àòÏÛZÿn‹ùÎî7s–Õ0F¬«’Û2cfÀw_e>Lzkrü¨…¿¬+µ¦Ÿïû[¿ý-pæ@ïÐ- «>øjJ§}¥Î (Þ6n÷öØYGÄR¹{ª,þj­·oÌlßfŶ튞^~ä²å;”úöÓ'~ø¢d… #Ægœi±¨FΡA¥«Q²ZØÇ¡>®{äıÙmgm9DÒ¡´€ûo7Ý2¸FDØÉßOT){Ï\î]Ÿ�}_‘†Þº�9äd‰ÏûpÛ*……ÔßñÃõ;k_Mz¹¬_Ÿ¡ƒÞ’~ïæº×ßþiÀ﹯ž,Væ·£Ï×åþ>fÁ·n½Ô§rлîî]¿oæí–%¯ž¬ò¿#‘»îšŸ�¼úé %Oßjsz_ ¿;>©[Þ™=óÀqÞ÷ðÕ’õ³3Ö·{!nàÏÝ#vno]­ÝœÛÜÙ5-ëõöé�úVZV)ÎwÃw73' ¿üR«â«‡m1u|êä!±¯,ø~ÛGÑG×mñ{¾rTx»¥—B„ÊÑgÃç¼¾ôh룇šª¶ûݼçýï> ýúÕ�1­½ý�äø¤gëóßK�|ö»Fͪ¨SrgösÇçÖ -Á¯�Þñç{WÛ^[SS0¯»w}ú¶€I-‡|zÀñ·Ê¾Ñ6¤ÃëîåÞ–X©yÉâïtÊ Ë·ÿ�åAO·ŸçŸyït�:å ™ã®­?=`zxvV@ÑÒóü~*_·“oÍ–ßtL˜<ë“�;¾ÝÚ¬u…W}ÎuÇ­[òdT§Ìï›þòkÕ®ÿùŽx¿^÷bÃ#kø®ð‰o¾»FT©ù/‡¯é:ïnP÷±Ç;¶,v©~lƒèN¦k¬™»â‡Ì{ÅKµß¸•ýF�SçŠUy½ö…Š;;¶ó£bÃKœ¸øPRÚ±fwª¿pµÖÙ>{Öìé8Ú{Ë ùñ³* {ow(óñˆk_}kQèý%~~bSÔñ†}›[êåztíÛå�°¨éÐ&Â}8¦z‹œ«ûÐÖ93:Gf�3ë Ì™á\ðT‡}Æd%§93Sfãz Ä­émsf® ´‰~|öØ�-ð´ïõl,ÌMVP×…öæÌ6ãœY8�3£ñÙ“¬zîÿæÌÈΙãœYÎã9³Â*2ÿh9Ö93ZNYsfX®ƒ‚7«ÿh@+÷شΙa}€sfŸR™9Ûž±îåý¹‡×ðÚNæœl$Ý Ä÷/�¨xZĈ ²Íky8¼¸U««�›Å2{ôéZì2_„+Y½ò9Æ(5Ï$?†˜—’I.É#¦ÇEgÆÅ<�˜™нGŸþ±-âÈû}® L:$\ºþy«’dÏgÛÕÈÛiÙý¾™ðû…%‹úGesyþ¹²ýf¯Èý¿u»5áhIÙÛ@î`û»º«ûäRÐW°×_ÀçúÇaØN3ÇatÜe‡ÑßTd}ÃУÏÀ¸”ظô€�qäu‡^l¾®ªÇá±[à±Ð ï+õ>^{4&•yð¤H)H½ªÖ+âdþÇaêtîʯ=ôM�uîWÜì÷g�ÿãø±[à¿gþó\ÍoëxÔr{_Ä*âßÔÞóé<0�s·÷VÿË'ÐÞ÷‡oi¹¨AŒaoÞ€e#‰Ö3Í}Ý„øáÊ0þaªVìæ \Uò>ŸGK³û^]ÉdGB�çÆ<}:ôÝIÓä˜ÜÎ>ÿ|‰M©rLN ]•пª¾U6|Ý øëcn²Ÿåç Ó-xŸ;²e_©Ie¬×ðÚ·ýì>–À6™e!ýÎL^Žeæ á¨‹æ×-òµ�?^Üs•»=¬ü8®ƒ9˜BZšCb*™\Ã>]ܺ•+w‰ª˜œÞ„k9†$Uë³Àkù€Ûèµ�Sò¥‹ñ¹Bl£O[WU¶»Qè òèë"nÒ‹ýÍÆr ÿ+4–ó2“ì9¨Ë�œ5¯ d}¦6´ÃS9¾rÀ>þHt3�çHÇ,�Ó× eî67³òmð–ó¥‹!?¹§Û˜¹g„ì²S9�üˆë¶Í ÁkŒYòåü"xé™ñȾâ¯í`ÿBm`¥-0-[Y/Ý-»—,ùzb=Ž+°ÝÑ�+ÂCI©&LøOËó¶UÉ9æIÏ[}�—ÍÉ�ûaµœˆ@ýoéAiçÄŸ|B°†ßbö[_ê'Ü#¹^D4Ï3„C:…^KK~+dåÊÿQVæq�„õpô›kZN®]™+ùƹ¡m?#¹‰ÏéU˜¿×›XŸ'u?Zù�×&DGÔó`/îÚ;:9ÍÞ“üßSËIhª-7ò³ä¥¬;!-Á}0Šw¥¡í¼!®ZYUµ¦Þ(ò/“ý�d‘kQÍ(Võ½Ir < ²¾ÒZÿJø(ùöÆù}òÂbeUZn�bj¹�lúÂê¢�9ƒýgDî?9ØrZæ,Vì†åñqTnÝ™»ÍÍ”ò€1òF-Q/|îH/wúSnsE/ŒYzás–^��¬Œ¸ÈdX«’–™˜ kQ£Sbâ"3ˆg%%|-*ê1Ú ïÉö"7Ñv“s ÑÓ)ôèc�ÆÊï"I} Á(ÞòmgùÝ·�H 9st¿A«ÐýWÿêë¼¶Ùp�×¢h·�¨«” ·¿Ò¾m#4èŸSȹ} ‘‡÷<(!ÞÂüafzœ3sˆŽäð^y¾ßR¤€�ÁΠѪÍe÷þæà•8Ÿ0~ǹç?TâœåÚ’9ÒOǶÀ—E*8‰Ã€ûgDaÌ×DrúcþX‰�Í“µÚÎý²2Ó²2 Ú}€’”%Êáýp¢íT™âai$ü†üî ¦VOÊxaŒ4ÎÇËH�‡?9 HŽÂ ó9¦‘ÎõárïŒ�û àE€E;dQœõ\ô׃²Òã£cœñR…“«éQ® AÚ‹‹¸}ZöoðìA©1ãã2OGºüÇ`Ã9*{A©gôs6…ý'Vÿ¢õúR£ßá5ÆF½uMNÌÈHLMAŠüÅÎ¥²ñ.Ol>_¾”¨yqè[óm¨µUb¾½6¶qÊïôOÿÿ¹•HyèO{þµŽ<Ÿ·пÐè_&jû©È'F©I©é¬‡ù¸ïjzáM† à_¦ßõþ嬰gVx®µæ…¢ÜƒÝaÍ¥M¶¿ØÇQbÄñ@|PÄ ¯1Dú()c3𺠱«émò|r®éñé–”íÌwW¡mÚD†óÉrûˆV³ÉsÏâc“£‘DÊ õ3áƒ:¹}ÂúC�KWë7WÓ£^Ð>I¥½ÝØ>‘ºÈ8SUßxÎ:�L`û6™ˆ±' ûƒØ^!NØŸÀ±Â°~@.LO)ó8o{üÐnë7,5=)/�ŠÕrL-´ó8È0=¦GÛׯŸ+ñ£ã�ŸÔUžpFòµ�6¬3 ÒçÚ'äŠ<ƒ�¦{õ##™Û�ù…§ß™��é}:gŒõ˜bGbÚYð’õ­2®³¼öÝ´T™ÏÑgüßHn"n¬ù º”^ŸÜéëÀ ¥œäС�Q/¤C½ôô —2¿911#qLbRbæ3ÈÌ1ê…z ^( õµé…O\‹Z*ö¹)(Ûæ½ñ¹^/5½<¿�™”86Á™6 ¹=£>øìóXþXó9ë»Ü�÷ŠÜ1_�¼ìÅžš¯@YüN:_±›Æ+´1Ðém…iÿ‰1à(ÏWÐ|áxЧùC�ùÞ]58ÛèÇSʤCA[™Þ… ˜¯xNV’1_ñ?uTbÌ�ó1Œeà(ìù ç5†”€sø+µöy�]L/ݽ§öWWç\M�¹vÿ|rÆØ±×òÔÏ‘:¿1ÚíŒvÇôˆ¿Xk÷¡©IYÉÎOq®¦Gý|Hw˽óDÈcÇvGª‚ÆÖz�ÖcX¯!k=ÞWW¯åú�m¾;Œl-66=5+¥@�içR¡vóDÓåKœ'â4óD¦N´^ VbSˆ6¶qÊïôŸÿÅõµúO킹7-Ñú—³³0ÈÏÕôÈÇýóD çÀBš‡°ÉÁ~ޝ´óDˆâƒù·–ãeZ|\�çq5=êÃM¨ÿÜ7O¤pŽ($|lrŽ#câ`Y Õ<Öz|ЦåZ|\­ß\M�z¹ž9cì¹ö 扰_Áœ'ÂqíŸ#NØoP�« „Î 8ZçêÃÉMfÐaÜ/Œ|ÉE¦Røkáò¼æRB ás•kVâ~a.æ›Ë—`)ð¹�ßí¡:�§?É›ÂaóJ/æ}.yüOëa� ñs…ìžÏ¾d` S×íj*Ûý¬÷þ'o\t_™sÃußs�:è¯á™úžúœ¼‰Mn,öÜ-ŠoÔ+*Ûµ¨l3ˈÏʉÛsnÈóz/ÜÝ"̼»Å|ž‡ßä8m~€—–ÐäžIOŽ6Ÿ÷•´\H÷àšøáûäxèàšÐµ#Gcr½è@ÐÙDô„ç½H^Fý�Dg¸ÞJòyAý/Ý+'|pö°¸¸¹%[Ñøšˆìþ²ü‡RPk¸ÿP²Èò%iávIZÑð¡4M–OÚ­äy[I*Úè \qò'›03*_Áëܱup�âž«ed›‘ï;…ëíÄ…²¬ßÔA:å{<è3Žóâ$ÊÇ›°aÙR¹#Øt·qC™Ším÷ ~f:0�¾¿)xZ{)ìik�ÎÕ{0ÞYG˜ þ+ȹ,;›œ<Ð^�<È÷ øî—̳ Ö¾D¾Sª¿ƒâ8kûBÛkûò«Ò¾`»£gOÚ—Äô˜$FÈœ¦}á[Ù¿QXøéó‡×&cÄGûgñåºhÊ+èûw¶/ü&Éï%îÑuTPåÈ6ñl ö "°žiù)?�êr¬×Õé¬m8m³­mømÚ†3Ɗ؆;·: 4àŠ¨ul«-#2ù£¦Á{…›²ç:nÃýÿYmx�›âK—ûàk²¿iÚ<–Yu%뾚Шƒþž©ï©ÏõÏ��žFE§ÉÐ9 EvrÌ¢cÝ×$&,:Ö}Fz´áTÒã6\oò|^/9õ½fœ Éø\#mÕøïnñžÔ·I˜Ew·á9´^Nh§­Ÿõm8Ò¡^zz[[Y¸m8ê�z¡�P_›^øÄ³1´Åð�.ÖÓ Í^‡m6Öãj:k›MÛhk›ý'm³i[iÔ¡_XAW¤¨SËçÚqw{m™@jen¯þy1®«EÍÀþç¸õÐÇmýæ¦üo¾!í—½ý3Û5´;xØîÚîŃþƒÄŸw·yù¥ :>ú6K üÔ÷Ôç—’ÑÂRÚ¯³8òíd~€ã’–øZÞŽ½jžx¸³Üè6ÆW쵺ˆ¸yKsùZ›à¥å< vOžÃ%s©Ê¼.™¯m s¸Oy^Uf'ÿQä�û�ÈÑ–Ð49 ÿx¢sw¢'�•!yÙJô�áz(Éäe ÕåÖg‚ÿj$í;[¾ø~Hp d§ÔÀ’ñù‰–$Œ‡ž¹"T¸õ‚<Œ|ÍËR¶Umñ…ëUäç·ƒfewZÚÍp¥ÌGÙ�žè¢›×íw¬õ×?C¾z{t� Ë­½ôxϵôö汇“yìt{™ÇžAÞ¹ž£ï‰·Žol&óØçɺ»š^…ñ¿| xØù„Ä×F6ZWÏÖ|c��¸’íÐïQÖ£þ…OÜc»‡õ¤£vÏ�’M”zcä�å õÂçŽô*ìö˜lÉa}z£ÎpŽcT¬'ÕÏ­cTÚZÛÄ¢´M¤m%¤Q‡~aý“¢S\y5¬}7x¥¸æ+ÊRçïflÚvpŽÃwÃUþYóÊŽm“�MžÃÁ¬ºÇvÿëÒ“ñ�±Z&úúJ Ôê{êsååû:\Áy‹}�Éw8 �"ÏhQîÌÐèùÁó‚Ü+-ðVE¾·lÅ.Ô> ¿(É5É—QDýÉuC²OÑò`¿"“÷Â=v‹2ýBònø=Òž’vU¾†6ÚÓéôÛ¦·I›zN8i8ü¹AN¯ò¶‰Þ¤‹ªäò䞀ühlPåÄ*@Mc½Y('ü½lÙÿyn¿ÿíóÊ´žtÔö¸Ó09T^ÂUmýŒcl‘õÒÓ%Jv›h$2QÔ mƒúÚôÂ'ž�­í-m_±½E©<ŽE³¿Ñì-Ý/lPZbztÒ9kÆ ü5-žÈqÅëÂŽ®ö´Û@=L#þYcÐt졃Üy)›Ô•;^ÿò-–6?X#*Ã}}`ÝcÝ÷Lz¢¿�àÑ–à±xŠ´·ð}pý Ú[õ¾u†1ìY:†­øQÕPÃ6W}‹E5õ`{ûÿû[,5Ò¦ÑÊxê{öΡw`¯‡`�Ö•{Ø®a=©o?�7´î ›i½Œ1òÆ<£^øÜ‘^…ÝÞÂëCÐu†sƒb=©~Þ'”ã¶‘å2ü’}òw­-hZ~…r ´øoçaßs }Bû�ŸºKOt¥U„ö®/]ªñ�¾M„`]ç(F� Æz é•{ä;n¨uõ£žÓ8ŽÉwœÊÚ2Ž'6nÍÁ7â¨'œÃ{ëGÃ:*c 0ŠÞä«#òbŽcEf9®¬]ëlÛÓè|¹pÎàÓ•|¢Q_ΟÜ'�ðUÒjcx䉲 xyéVX�òÞ»Á÷!r¬œcr×n@ýí>üÛnF,·¿ïÌNº/ QŒÚB¯"æG“²AÖ|¿‰bé�FÍï)q~û„X7¡9ª›ÔÒ\=Ï¥~ø�Ö±| ^H‡z™¾ÕÒöXõB=P/Ìê z%eM"›º‘Mh#cÈÖi.npœ‡ÁQ/ÔõÂd¨¯V¯Ìô蔌´h¢eÌ3HéÞô‚ýpÐ/˜ûá¼÷¼¦�pÇ~8P籂§öÃyfÃÍð*g;†ó{éþ7ÙJA÷É0©öËp¤KïüÞ÷Øþ½4_¸ooVò‡zñéÓ58[Úß§ ½¤wvKœ0Ò>++ù@Þ_~^W³¿¨H÷�SbÌ�óqá퇣-G öïD8ׇüíßËS{àºw“AkS¨¶_çê~6®¦Ç\úp¾iÏíß[TîI¡´GcôóGŸ8¾õdíŒvçiyD<øp­Ý]ÝÏÆÕô˜+÷,¼M›IÖò[,»£�Ñîhg´;òAöÝ¢ \)Ã>ö¡á¹oÙj6iî:C|Pð|`ÐJæé²RG‘ˆâcê¡àƒ¸™zjñ±ÖoNÎ÷¸šò£÷íø4 çS”ß ¿n‡ÂÜ#>(>”÷ðí� Äñá{QÿA?ê­Åg`j&™*,误(òᯫémœ<á?Ã)>0J÷D@|PÈ@ÿ±É³áƒx >&Ú.#n¦>Z|ú¦¦'»òîÊÕô˜/.›ä‹Ôonëo„ÆÇ? ‹ ø¨÷ÂB™îˆèo¢ài¿$èüˆâ‚8¡.ˆßO‹“«ýzWÓ£~^Ü!àôEXʼne=”¯žoÆ{ù‰'›–$-NØŸÕã„2Mýµ89ÓÇF^»šy¹{¿L¹o¬ú]•¼æ Q�‚Æ€S’çq¿L=î¼~¾ÇtžûùÈÓ#?Ô åXÇa”/ŽÛ±þTó3�Äøþ÷ß   1†ÒÕ‰üã ~¿%£Éäo8Ò‘UÓÛ¯G0Å?:nI´3�#Šp÷ «î©ü’ã9$Æq™Ü_KŽþäpW0F'ÉÁ’ɺº¸¢ä×è„\½>ïeÈQ�@ˆ�ɳ^6^ƒ-€g~ƒ…bZwÅPnÀ¦ywæ[¯;èà@�…ä™>�»¯� ùä>èçnyöøÙó K!É}ÀÎêþQXyù Kí“rmÏNž¼Edb0’OʲÇ{- 'ñ»ƒ|‹J>œÛÓQòòòb¬4yݧ�®téÒrzxÞ A©gÏžRçÎ�¥Ö­[KMš4±Ê:tèÉÊ•+K5kÖ”š7o.EGGKÉÉÉdé�6,_¾\jÖ¬™|Ô­[W¦¯W¯ž|Ý®];),,L4h�4eÊéý÷ß—(d<*Ɇâ�ø NèGúuƒb¢]úÑPWÓ£~äÙ¯Æ�ëYÿUYPÜŽÕl²�?C|Pp²á³Ž´Y“‘£‹Õh;Œø˜tí1¯[àêº%WÓ£eÀ¤ÒÞœéwýºg%@›Þ <�âã§²ÊtGŒø àiÃÇ&ñA<¤°öŸtëÈ‚"$q*v5½MhoÀÇ}ëžvlÓ¦txŧ„]«Ù¤;{†ø àøÈ“)V¦Jý–ãCƱ´Ÿº�ÙÃÑšDóþ‚Ðz“Är€÷úàì=õ;…'¼ |4¨ù«Ó๜ô¢‡L�z>¾¯ô±þUvÀ²-—e]RɈú/ÔòxœŽ¿­ãñ:§ãôGÖ×�Çò’ÓÔœówî\*oG½)_*û ùsºõßOÒqŒO¦¼o¢ÉWÛ8Ù?Ë¡ûGaLæ€IûùwŒÇAn9xÕxü&9ÇðyÖ„ö¶³<µ¶³¦§tãqݺ®A™d³²±Îÿ¨�«ém¹1¤Ý¹¾ìù}Xmgý oOlgQÈÀv–îÁHî¨Æ+>^JyEÜôë¹È¾6™Ñ)1ŸÈ¢™u5=eC"÷­/^FÆá»ÃLŸ’Æå@~°$�q8ýýÛ8ÂDñ@|x¬W(nü@íz»ˆ¸Ä± ™6+ôÌÕô6yʺH÷âóbØæ|öS#\x�ãp”ùA|”oetã<ŠâƒùGÜLƒ´ø¸º>ØÕô¨Ÿû×/#ãð.a9ŸR*«¡LwÄP¿Á|#Êž6|Ô´ëV±Öã„)ø!ÿTœºÈãq7®'íPƒð\ŠSi†õÐ.ÎÆˆÊ>öqR$=¬sÅ~�~]ªBEz#øÞc¬i? ÇeÀOîgÒ~¥µŸyŒö31ýêæ>CÐÏœ!gú/yˆ\–óѾ÷)Jû•%i{]Z£½òÃ7ðî¿9Üÿ½âúhËÈšLdÚöÒî+v�å<ŒÊ�¼>P™¬ZY•ö3mø ˆ�ÉOÁýÈ4B‹�«û¹šò£÷õ3Ÿ¦á&Šì÷所þƒr@J‚÷qÄw,ÿ¡x >¼?õô£QZ|\Ý'ÈÕô6›yÂ*†o¦øT°ZÍ&ÑgˆÊžè?6þ*ÿ¡x >&Ú.[ýh´Wûñ®¦Ç<¸ÿ»ƒœ0Øg(‡â“WÿÒäÂ8MP9ˆæËëüˆâ‚8!�ÕŸžÒâäê>A®¦Gý<ƒÓa¹Ô~eòð£qB9�¬ç0oJ¬Å‰§ýY=N˜Æ©ÅÉÕ}‚\M�z¹{Ÿ!¹o¬Úg(¯ïGQ�‚ÆPßÉã%:>²Ž—ðûsœŸU7^ú§ìÃLJ•zæ2œ¯f¼¤·‡© íßÐXÿœ·­›Ò?¢×9”q’gÆKj¡Z¹¤�ŸªÈJõ>Ì;ÈóòÜ~œ£CÌ?Ë¿øh­¹Z�¹šsã�}˜‰­¦‡ñe•ñR^õ êQÐìíÊ�ôZ\Õ•~ìÃŒåÐcû0SÿFG-xœ'Y§ó÷^ú÷päËÖðÔÔôXL™¿˜~ 'ML!¿–¿tHU>À‹{E¾À}׋8ôw¾í/WWbä“ÿ8ˆ|ßów¼‡¹þäàˆ_ƒ|ª÷pÆf‡8c)xn7 ¿cþÑßMåµv0�Ñú{w²~0� k—kÞ7]M�¼8å{$÷Í‚-É÷HÔßy!êàLŒþn“ãH’m�¸ N|EZn±üÆjqruàjz´�'p’¿K¢8ÁŒ'âa-ùà qAœL•œ?Sœ§!C]ÓÞÕô(Ýýí§ÿ¡øøßèý`ÞÚqB9 ƒ-IåOĉ¯Bý ýj¬§~cÆ‘ßsp>®¦GÉžð§øø#a&Š“'÷φ~Ê�üä'Äq2U¥þ„~• Å)<:™´Oh­‚Ç®¦G‰žÁiUØfŠ“'÷ÑœPä'?8!.ˆOûSˆ?N‹Ó°Ä—ÖÒ»šÞ“8�ødtXÅÉÓûi£œüℸ NhÄÏ4^‹ÓÀ¸ø$Rñ9½3½«éQ?OøÓ‰O|Ãr)NžÜ§ü åä§„×ûâûnýw+<λà:E:/†ëy½©á }~˜ù™è¼ÊÁõöø¿ƒÇïUôü0=òË¡ü"�/¾G§zâw8Ÿªç‡é‘®;C9Öq'òÃy:o«ç‡é‘5‡rxœ¿ÂïJ±Ý§ëÌÔü $1î—ãhëQÜ(Ž�*à>Ö*zv=‹Úÿcã–D39¢èçp^{*ÿ…ä¸A‰q\&÷×’£?9Ü „ÑIr°d²îƒ.®èù5:!W¯Ï»„Gr$bgò¬—�×` à™ß`!„˜Ö]1”°i^Á�ùÖë:8P`!y¦Oãîk#C~¹ú¹[ž=~öüÂRH²A°³:€ä+ï¤Î–ð i9‡{ù8@–Ú' �FæëEb<ìÝÃg¬Óä­G‘‰Áh•Iø’…™’�·ù|Ðkù>9ÇØ›ž[éÉ5ðÂtj¾ò¹M¯µ(œÐ¾ é}}8©¨¯—äWÌK*âCöÔ%÷Š!çä^o9.éG–½•ð–Ê–ô–üy/©9*”ö‘¯! ¤ú’Žås_r¯á×?8o(orà‹zYJ¾ x5©[\ªS­¨T¯f1)°Nq©I½âRO¡²Ô©e©]³RRPÃR«ÆþRH›²R‹%¤†µy鉥¥fõý¤Æ$mÛ¦¥¤ðäç!­ËJíIàÓÛPEêܪŒÌ«]³Ò'Q¾Ð¶üÉÑ}kIi‘�¤IñM¤¬˜ÆÒÎW»J»×v•ÞYj�Þ_&�Ý5PÚ¶,TŠRWŠ\Gz>¥…4 K5©OhIh[Nê%V–åuíTQ>~#{×”†ö¨! î^]ŽAß!•¤šUŠ=ý¬òWÎèxR’fIß&}³—túÃdïb#92$éBŒtïT¤ôÑáÒÁ7zHçKÿ;%}½w�tdKOé’y°4ÿéÖÒÛK ÒêY¥Q}jI¦Ì–’1¹¹4nd}9Ï}‰Ž ä_lWNJQ_êÚ©’Õþ?挲HÒÓ’t-^’®Æ¹S¤ï—¤_ÇKÒOã$éF’$Ý$ÇåXIú#•<Ï”.î,}õÑéõ!Ò.b«sÔ>p¾å%Aš:¾™´î…ÎÒrãÒ¬ AÒ䄦ÒKSÚÊöªS½(”Ï…hcr˵’4‰ð�+Iß'H_ïDÎg“ƒè:H“mÇÝ4éÂÞÁ’t~Œ$}7Vúéã’ôC‚¬ËO9#ä´Ù¯EÈ:�Ù9@zãÅé½åaÒ+3;H¢I’(“D¶å—-U¤¿t;E¶™ôk’ô#ázH‰ý¥g¥g£e\r�ŽPìòWº$]Š•®d‘>ÞÚKÆH’&Jï. •®%�|¯¯t`Sɼ¡»,{áä¶r™�²Q¯F1� ‡º-,3¨[õPŽ>y§�´g]7Åæ$_pþûÉ'%édžß’2rb[é0Áþêþ¡²®¿}:Z.Ÿ_¼ßOZkê$-™Ú^Žß|I”meº_XUÙ§¡^ ²¡ì©ë?ŽÔ#kÁÿj‘² >e'€ø ”õE·“ÚHS(†¦ÌVÒëóƒå²øt\cY—Œ1�¤Üµ’f§·$6./ êVMjZÏOªTÖGªXÆG">.×K4ïkI¬ý‰n7 Î)NhýI}Qœèé î�ú¦A-^.ßP/Ô—ë^jÀ˾]µ‚¯T¥¼¯,衎‚´P?OšoÈû ½`Õõ»rÝIè! P^ Nû@ýúA}õO¸‡õÔ¡˜êf8tõ®Q%O@nÜP·C ·|P^X߃N b”i¥%i4õ¾­Î·þÜõ �ër(:�t>z¾ö®!�ê ¼Àæp€ìrä'€o\&¦•c5_ý¹žVw å]íoä2Ïvz—œ¸6’4yÙœ�0CòÄBŽ‚êi šg¦ä��`°¥=]nÐgFÈá©¶„òf œÃ÷ ¬ûXÓ}«­ûX›è>Ötk‡ûX;¹ß )Ã\?EÝÀŸ´ûÚÂ,p¥ýåƒíð=ªíPgWYû«}f”÷•!T$�:èiÕ<Ùç�÷±þÿßÇ:g•ý}¬7Û¾ÇÒ•',[öËù–:Ö½ÆÇo¢eè‘Ó’U/ª2¯<·=stó®FB€~¤ß7Óº{ëê·›Ñú/ukë>ÖH‡zñ:zwïc�ð³¢Ƙ¨s  ½ð9ê¥<µýú¿c_f´ê…öE;j÷?ŽI%?æ›2Ö¦¶ÛÏÐ^¨ê…‚P_­^…·/3úëf_æOéúÁÏ”8‚1à‚e1rgì±}™i¾ð;@žæuÿçïˬì�éKVï�iªA¿#¨­Ä˜çcX# Ç¿t_fj|/Ì×ÒÚ忺/s^ßèý» eêï(R! �Ñî&Z±|þW÷eöä÷-`w´3Ú±C<þkû2óå”ïÜ=ù½ †QØûÑöPù>O^oBÛlw¬ø`;«ß—ùv ÜÅD~£#.½ojl\XFl|÷¤ÔŒÿcïL­œÖÿ¿‹rT𔢰÷94G"±Ïi È�4SHÃM3%Ñ!rÒ¡ÙLÑpÉ fçä !M¦Ê. dŽëÆuþßÏZë9½g+äÔýßßïww½ûùîç}Ö³žõ ë]ï~߳ߡWXÛ?B}‹øŸþ³îs¼Þud÷Ÿ§ü.sÂÏ«i3¯ö¿5«(ý#6•‰·úÿó÷ùô×ñ®f8îaUôïMfh?³ãWáüüau˜s¯÷‡µJý]æâþ}}qÛ›]%õU÷ï¾ßÃÄŸÝÚÔ u¸£ê°¾‹Cñ;u¸½ßSêy®ÅÇâañ±¼M qËIù=æâþ}}qÛo÷��Ïîû=Ìx+þ>¿}ˆÏž¼ïœøX?Œ§„¶ Úvô;]‹ò¼,n©¿Ç\Üûú‹ÛÞ[ǘ»úÙ}¿A|ê·éâ³Çï7/¬S×vZôïVsÂ<Ÿ'“Oý]æ?} ‹ÛÞìÚý·ªcFäïVo}mvì*eþr÷=†óðÔûMŸ�Ϧ…u…ÅÉÖß%ƒ ú²„íûÆßº�&i_—½¼ÂhÐo¿ÐËU‚¨<õþ?ôÕDvgië60<¦´=õBÿm\ï)ØÉ¶^üéÚ:jÛ]¯,)Z¡mg}îŒ�-űƒñfÿ‰~Sí™'µíÊ+.á?3æÔ¾í3¾@ç}åKÐÚî.JÞàÓß{íÎq§ÚŽ ñß0`‚ö¥¶ÙÝŸ³wÒ\|ìÛÝýíH߯êBÏÏ·g�ÿÝ 6âçè«¢úüê÷úMÝ/;ÛááçhMf¥êæ³=»ÝèŽdŠaCµµ—îä>¿Yö|x{F¼ñM*;Ý¢r;��n�kŸîÙÞ7ýñ|úÒ¥KÙì™õØaò;Ðëì±ý©6GìÍ�ô_˜{È—*Uª --­`¿ýö+Øÿý *W®\P¾|yÇû#6Xߌ]là[WDú_Á>úF?}W¬X± ‘HÔªU« N�:‡z¨³aŸ}öq2;ó�õÍ~ü‡Ý*TpØÚì°leÜtPAÆ N?ýô‚cŽ9¦ AƒÕ«WwûÐk9aýÙØì3}ak•*U ªV­êÆogþg:Ñ�½ñx¼ yóæ]»v-èÞ½{Á 'œP�‘‘áb±ï¾ûîÐÖ7}¦ 0.³1ØP8ˆ?ÝúÇfú¯]»vÁñÇ_pöÙg»í”SN)¨_¿¾Ë‡2eÊ8}´‰ö™Šm<ôm²‘ñg Û«£õo6rÈ!nüíÚµ+èÒ¥KÁqÇçòZÿ–SÖ¯”É}øèÝAßÈE�…nþC[Ë•+çbFÞ5nÜØÅ¿I“&|°ó þ�Ž)µÿÙa¼@ɽèü§;| ,ÿ‰ysà�º\ ÷¨CÆþ{5�ÒW4ç O—L‘—úï¨í+ó5X¶lYç êŸÐ7ñaì;Ë)µ>vF¿*ÒqäƒúŸGÿèÆôC¶ñ¹˜}cSv¤ËT7˜ØÝà³I®È&E;o”Ÿ/¹"qO5@Ÿ� è·¾Ri1úŽï ¿±š¨�õ©ýìè³GÇ·3L¾GëmG}¦ò¨ÉÂãb1úΖâßóyjßÑÏÔE~´íÜÙ8£ü|Éí꘣ý¦â,ü!&¾Œöc˜ºb_¶¶,m{ê…/Ù[VØÀlðwéUx`¸ï¯ð>ÀÜp`¸?ð7ï"¾íZ®ß¡\%‘y|É É(ö÷Gýú*ÏG_tßÿÝûVs¬÷îîzǯ¼þ÷ߘs׎ïlß¿¥»ž&'_8‡DÞ,÷ŠÒ?z`jžÿÑïèø~/[VX¥Þ§erŸÖî|m u[÷«¢õʺð~;“3»r¾,*�]]qQÿ^Cw§u;×eþ2;Ì.‡Ù[ô¾¶ßývf‡Ùe#1{‹Úõï»ßÎêâßx¿�þc篴Ç?¼™ï¿·_�ï<¤×.þ–ÛŽ´Ï8ùœ²_~«uÚêp¿Ý:O—†ïùsîôŸiû[öíH÷®ðöØýva\vßCÚ›Ûǃ}ÿù÷Ûùçì'[£÷Û¥Íñ×õÓ(z}W|^Tööýv滘ó×¢~ù¿z¿Ýï=ÿÊê¼h.üþ'Ž+=4!˜ŸÍï–��ÿ«÷ÛíÉçZáwó³ùÝ"fñø¿v¿]N¸`O>‰“Nëÿúx¹ß.g �;o‡ã«gSï·ë¼ƒß{=éÒž½wñïšÄï¾ZRìMÏ*þp{Ç÷ÛåÌõóªÑ´‡Â燋ηi=º¸ëõiÝ~ºú·¯Û°ÄÿÞê¿û>oúÝðB,öèó¾œý½×ýµÿsíßñ«pþ þH­Ck•z¿]Wýø×À!¶w×iqÛ[�»ÿ~!üùáâû ïãùuuXßÅ¡ø�ßÿÚÞÏŽêÐzØþû”–§§œ”|M½ï®¸÷5·½� dÌ?‡z÷ÝIÎ×j³4ÄiOßwgý0žeDa…xX|lü·ÔûîZõÔ§§ ý ZÜöÛ»ÌrÏ ß}ÏÅÙàž¾)ÄgOÞwÇñÌúa<¿Ž�¯ŸØÞZo„yü^ ýZn»7¶'é¿CûïsÂÝ÷g|‡¦ÍùľO ¼ÿò½oþë‡ÝãrÌ6îq>Åý>€ÖU´N=N{ôÓ«?í1u­Äá÷=b%õog/ö3o»¿+ ëÚÂuîš°Î ëß_=_ü?ô9&ûh¼ÑïWRÇž6ϯo�¦îÿqûßÍ§î Ÿÿg?ÇÄÆ�z|¶Á¦Þo]Üç�·½Ùµû‡�gÂ\Û:mÿ÷]ûüÎÑÐìØUjë\ë‡ö;?îúã4Ï1±<ÜcÏ1 õ]Xïáûâ4;¿ý�Îë¿*àË´XÑç¼æ<êûÉp>ûTQJ›]{ñ|P¾Såo¶Àuµí™WѼ ¯â?çÕüaõž6ßûÃF�vJÑßµ.îùNqÛ›]»ÿïÈð§þŽ,Ô{ÚoT¡Ùðg(õÎzÜúAqå9¯­K’ùe£w‹<çÕâañÉYò5äqΩEãSÜ¿+n{Æã_Y×îÎkûŸ}÷p|¬ÆB|˜Lî¸ýö_=çÕâañI[äãcqK;½h|ŠûœÖâ¶g<þåã³ûÎgýs^û„ø”ÙÃñ±~‹Í‹~í[ôïÇ,ŸœÇCýXu,Ÿâ>§µ¸íCpDöDýTm“âS¶ÐkÛ{ÜÈæ7ë�V?Ûõoÿ¾ÎâañI Çe‹[Z§¢ñ)îßQ·½�aÏÆ&i_=m;~ç*@ó‡ÕWγÞÖ*§kÑú:sØ�^zëcûw•·ýöþv÷znh½)̃{òïÑÝõ‹Ðã±õ„Ö{¿^�‡xX|ÒòB¾†>»o=~Ë —\òtë´*þû«=ù»PÄÇúa<Û�S|?ÍkdÛÂú ñ°øä„yÅê(çì¢ñiß«oï>Åx~`qÛ{ûy_¢q•ˆíÞøÜܺnˆÏï]Ÿ�ÞŸ¹Ý¦ßGøÝ}ßú¡EÑøŒÔõüíñ±xX|¬‡Â::·h|Š»ž.n{³o÷ßçpË ¯/kÛº}ðÛžü}/îs°~ÏöøØè )ëñpN�“µÈ9ï?5NmcJÆvãï×è8T«MŸ§ß;o2ÿì*¥Žˆ“õCûÇÉkFžßQ±õÏNGžWÔê/-Ä·¤Wç®Ã¡Ïîã4}©ç…ëÍpÿ™�Ø}š©ú¬½ékÎW¬ŸÂïûmk×ÇÂù`ª>koúr‚>ë'ÍÆkúÂ8í<2UŸµ7}Á1ëÇîó.ÔîS³ù*ª/K�íï]~ëwh‹K«Xn×~‡&"ÿ[yaöÿ‡Ò&²+K[�°�áqÙS/ôOÐö•¶‚�lëÅŸ®­£¶ÝõÊ’¢ÚvÖçÎøØR;oöŸè7ÕžyÒQQÛ®¼âþ3cNíÛ>ã tþÑW¾­íî¢ä >ý½×îwªíØÿ &h_j›Ýý9{'ýÇÅǾÝÝߎôí¨.òÿM}c~޾¨�?5vž—S2l<ˆÏáyS…ãæ>ÒÝè+Z“Y)û eÑÇ>+ÜfÏ&â™GéH<³)]ϘJ¯YZÏ_ÚWÏLÚÇ=éÐKT._Ò=_m=c­²ž§Ä3�"ýô¶W¶€ÛÇó›xÏVã¹]<ÿíàj¥Ü3—x–Úi­«»ç�eêÙU<ïŒçLñ«�+¸ç¡Yo?÷l6žÏÆÆ>žÇÖþ¸œ ÏoJ—^õ7Ý:�Ç3•xÆRçk\7¨qÁ =×êþ É‚&& ÝÑÆm3olYpãeM îÖsÏ&�:ª`üåG<4%³€gQ]Ø)^ð—ss}5®SÖ='ªI�r�ôì8lâùq< ­c› ºém�jï—oýkŒùž™pÏ£/ž+öŒžÇ3¿xÞÚ篜Sðâý'»çíÏÓ3ÀìàžÛõÐäÌ‚ùzÖ˜{Ûu-ÜóâxÖ¨¾õ�_Î×3áè›gY/žu%F펫¶Âú¿ûúcWðŒ±õ,¶o/-جçŽýýo] >ÒóÆž»÷Ä‚ûô\5žõæÙt�ßÙÖÙʳ×xöØ“w·Õ3ÒÎ,xíáS VÍ?½`Å£§9¿ÁÝ¿aÁ´ÑÍ x&ÏçjV?÷<¼#ëoÞ¯�·¢`s_×ïF=n¥tο­µ{¾×ƒz¦Ø&=‹ŽX`Ã=S�g«ÍÒséæèYpà»Ç¶pÛó³Ûð,6ž›Çsížæ9q÷hÿ%]Ó�ÿ�nXÁ�¿éáå ýÿä=íò¿[y~ÁëóN-X¢gÞAÑÅsÎ~~§‡ž‡v^Á÷«º¼¹¨cáØy6¾ ç®ñÜ3lyxJ–£<‹�gù-žÙÎñ?Ï‚ëtÂAîYƒî9‚µËÎ3ÇgNç¹sø�ñâûïô ¶WåÏ­«ô,6=wŽX°ÿ==«ynþÆVrãÕ‡Nq<â=ä0ÏêËV x.á -ª¸ç¤QÊí•mñ?¥ÕÁݳçôü7úÆOÜÕ¶à=ã�\øÇäk,<ßnžžOHþñ:ÆN¼±áž±Ç*?Ú¹ØQ'ÄyuB]'xÏSßÑcaÅá½ê}ÅsÙþ§ö–ª/bÏsõ¨=â}ûµGÌÒóàð+~~VyIà5²‘ØSGS®:ªàò‹wã&÷xžšúe#÷£óŸ>Ʀwm_SmO.ø~uw÷ >ž9H-þ²¶§{þàÙp¯ja¢ž¯G_ÔßÔ«�*¸%»¹{ùŸ�¾yVõÎ3îjTÝÛú†N§Ã”WG}þй’qSÿä9°>¿‹âp–Ë=âJ¾ñì?úÃžËøÖã�=ä:Ïb<»ÃÁ®?ægé�nÌý;{ÍÓ÷ÌHæMž�yAÇC ®Õ³'}añe &Ävò¨fî9|½ô¬Êžšó8ºv°e‹·³W\;°Ïµã¸ÅœÅüÍÜߤn9÷<>üy—æ».zÆ$ö¡¹™ÂcU8f™žÍN�»XE^q}*´AØ=÷ΨåÇ ž‡—rLÛÑx�GßqmäEm¬×fm‹KWH:wå…Ÿ\>ˆ§ÿlµÿ=ŸKd§¯ŽÚ“¯mWm Í®Žy§FhG–6ü�/wdËWa_¶h–¶=õ—lŒ-+l`6ø»ô*üšð»3ö;4¦$-ü>�}6zj«S{ë5¤oÏþ�š4ifÜ]£ZS¾–¦üŽ;êqØq;Ú¶ßOnßÛ›û ݎýæâE_Û÷ÕgmwLw÷óè.ŽÅô“¾¯Ê±Ê±2ïÌlɶÝÒ½cmbY{� [àñ—ßöŽ•‹é�` ÿ†#ÕÖí­w/¢^ÿû‡¦ý=;þ?~÷ž’O¶'5þ³rð=�δì*å{Ül5²:JýýÓÇï—ìÎWŸ¯ýïÉÜÿMÑß•Ù+tbv™œÙ•–"_ôwUþ}¿÷bv˜]6³·¨]ÿžß{É–ï̳Ëbföb׿ûw{Õäcu±Óß¡YÒö‡ê£ÍÚXì´Îþbâ<²E÷ü™ ØÑãÄvÍí©ß¡Y|Êß_ø°×^­ÓÞ ?ô�§KíºCä~©ß²/ÕÞ]ý¼Ç~‡&ŒËîJ ã3ûÒ;¡H³›¤ÞtúeÃ]6ÌVÖî÷¨ÉÇ}óßÿÕþ6:ŽrÜ�<÷íoþ>Šœ‹Þïò+E˜ñ?ûwhr‚?ìúkÚ’¢~É™ô�£õzæeC.éùço3‰·½……û»¸× ýÖ·ÜïL1}œ9ð¢¿ôæç“ûã”8Þ Í¿~ï> «s“ÿ£”ã]Mægó»å£Å#mJQ¿wØÿ²KÿÌä +n{ß^:¥ØÝ~?òÈ…~ß“÷÷àwó³ùÝÆeñÈ™ZÔïº/jP%ü¥½ü©»wŠÛÞì‹Å;¿ïÆûvÚyä…mrþ ÷…pÒiý0ž_ý}ôîþÓpœ±ãŽ�¿ð8[7å¸óòÜ7î?½Þ»ãß¡I{9Ü¿÷j8þ¼V”Ú8ÿ8åyaÌYhão¾êjÛ}¯’UEãE¿»á¹oÁV‡9K‹wÒn)Z‡Åý{»â¶7wìþ¿×ßÝÚÜ_x_[Qo[¿Å¥w¨Ãíýø:Œ~Â÷ v|²xX|ÒBÞZçÜZ4>Åý{»â¶ßî|ÚÝÏ}[âó{÷7n·c×�ÅÇú¡5™P¡ˆšíñ±xX|LÌâ–v{Ñø÷þÄâ¶7ûvÿý�þ¹o›B|öäïÏpßœõÃxv\©EïoÌ ó|jœÌiw�Sqÿ¥¸íÍ®Ýÿw,ÿÞç¾Ùú<õ~;Ÿ�ÏÚºÂâdëo;þu>!›¡@/½Æ?Ï­ÎNãnš=í|ŸÿM;ÓͯößýþLsµþf`FsöÎ74¹ïd%Ó¶#Yí)|ų€6ö}ô«Q¬=¼4mÌ…{JÓr{MèY•ÇyÎöw}—í^´ßSuº(ü}kó[ê÷d&Ç÷d»óµ)Äɨé6?2Ïg‹iûË®þ—�ÐÝèqÆ ë5bØeCŠqúgf씞ª<Ï)¥¸–këîm!IçÊþóΞzB›¾CôóàºÊÃõ¥?óÒeÙí¯œïŠæù1·|~éŽ~�1­ªÿ{�>eú#mðë‘û-úâ8B¾ÕäCÊ+mzñÇCÿ¨ý-;l_qÇD?6žÕO|¯X,&\y-©ÏYJÌs„oXñu¾ÈBm±ÉsÊeÕKfMm|¶—Nâ•ÏñØä2¥#|;ûß/Ë–ŒÍ�¿uÜ0�»ƒÖÝêçc£¦ò²ã™íÿ-»þÝ×£8ßµã¶bsÚmϹyÛî[Àþ¸øvtr/Éõx¿¼AhƒO(íÒì8ð’äÈõ=ý²ãÔžîç¿ú‹çWZ¡[¼(j戕‡.¾î’‡ÞünN~YÝ-ôþ]ž÷èm]’ç;V¼nû¿x�çU¸zU²íG£ÄûºVßYž×«RõÌ·\$^•£'?ìyO�o•ùâøVâxâÆ§<ïÇie¬T]¼�¶,õ¼–�ÊL¿zU^Ùy·ž[q�çu=vlæ»·u¯e϶xÞ�ïæd¶übé²ó2. Ø|–ä��ÈuÛß󎓾}e#ú¾®åyô‹�ô»ÿÑž‡}ÏhþOô¼‹%óOÉ2Ž�ÆðªÆ²$gvCóóKÒw’‹GA=‹ývtq›_Ûâ†}§ºønŠ[|ÛɶÖ.Þ=Ðò ™l[íòeE%Ë—»e1^’Se_Ë«‡WÏ[HŒñÆû�k“÷éó—å—ÈÆbÏëûr~ÞÝ£{á½zTÙü÷ºu,Âëܨiþ`mѶ/Jæ ÉFyã¥k¡tFyï«Ï§Õw”7pòÈüûŸž»(Êû»äÊ�k“,™íÌs6ß.}½^ÎOFåÞV¿/U63Êë'ÛNoÔ´ïcÙ–ß­cÞ}²íºÑ½‹ð&ɶ7ž¿¬ï¶ñ�]8yd^KÙöfŠÜÙ6.EßJÙ¶$¥ß.²­«¶èØþ&™’�òr¤ëŠ”ñ¾¥>[©ïèx±mkÃwFyŒár�%ªo¬ôMM‰ý®M‰ö]”_Ʊ"%®–mSRòå$Ù¶^±‹ö;üý ‰±Ù÷öSOßtð†¼+«Ž×!¹ÔŠ,]h„Wâû~y·Ì™"^ÚÆqWy^ã³Ffžwb�üX¬¿Ož,+ýô“Ç_¿¡sfΆÎâ]sÎèÙžwú”� ´¦OkÇlÏ뿵_Þms¦ˆ—¶qøµ^_oé:\:c±OžìßÏóFÉŽš²'˺¼Ô Ï›,ýW©ŸXlôìkÎ){\öM•mHg,6�^îØ³Fæw<±Žä¦N«ÙÎ˨óŠãKé\ã—ѬdÛµUÇçÿ«·�Ë·M®ÛÐëƒ÷“jpióÄ´¶ ¼>jðuå ö•ªæõÁ{U<ì›t€×G]Noàò6¹È‘/ð&:¹Ü›‘c¼V«ø�~±ÿUVNã?ú%æÄq`»{ \^0›‰/¼ôg.ZÚüÌ\x賚 ¼Â/è#¯Èsò ¿ �Zk¤¼Ä>üŒ>xMÅ[Ú<÷füŒ>«}åÁ™Ä }c3øä$qCŸÍø�<@¼v.ÓÈôÙ¡ÐW'Ì%Ä—ú@ŸÍ%–×mH]¢¯b˜_¤¯uI>¯–ßßÀ奪‘ãÄceà-m>é«›s*O©-ú…w‡«Áf�PƒôkóÐ飦é7Oú˜›ÐgµosÓ@Ù·m²ï·Z˜¯°/¡9‡ñÚ|¥šÎûønßïIª·V3õ¶jºïwÂ?K¹9l€ê¼„Žƒô»uqEǣΖ-Œ×æ5�£ú/¾?Âék›…>úµ¹Žy ûï–0ÿ1¯a_ƒöÝòz]°!ï¹2ã3O_¶ò‡Á±ØÖ[æ_x׺ª¡xߊ÷ÁÇýòÝ9%s㺃6Õ‹ÅÕöýÀ;<ýë�?‰‡¾µmGfn¡ckúÄK®xÆë[x×½Ûë[ñ>“¾ÊowÎ<àíÎù×MïÚó�Xì½vÝòŒW/½E·—ï× /Þ_”Yxåè[òë¥Çbs®‹Å¶¨m»:ÞF�7g_ïõµ—-Mîœ"}mz÷¯¯]àÕ“}¥Äþ+eÛ²çðô+ž™x‰·Þjñ6®ûö™w{y¹<ùätùáðô/[é匷q]ÃÁ‡jýŒ¾„ÆPVc9<ýåû[tórðʈ·q]Ϧw�ÅÎ’\ùîiÙsxúO#¾Þ¨#šÆïñ6®«5â M^ß'mGæ÷jQGúÝ~C[¯Ïx’»£¼xè»b´ŽwO×Xxxú9WrÜC¼êÕë-ܸ.{$<ì[Rf|~ã 6$O/ss³Æ^Ÿñ6®{ãæ�t¦‚¾†²eÎÇý$÷ÓˆŠº¸Ž>x³Åþ Õ¼¾¦òñ¥N®Ô È‘/ðú;¹wo@}ùò߉®ßÓ/úð<üG¿Ä—Øúrú¢zéD×Ç^³§ï]¤q(º^y5Ðùeâ%ø}äÕñÈ+ü‚>Ùœ_æïýò꥗º?“/ðÊŠ'¹ð3ö‘kû»¸µèFÜÐ��œ$nè{Vþ©<¨'ÿ‘è3þ#Ðw©ìXçòꆶäúúÞÆuåÛ’Wè[©øŽU¾ÕS|©ô�øRèk+?-vuÙ¬1u‰¾6�·qÝG�¨Kâû üÎøO¯X�'so㺠ըú-¥œ¬«­žò”Ú¢_x‡k#O©Aú½Sm+î裦é÷ŽÀCµO¿§ÊÅXý6k\æf߯ñ°ï ñè÷|�õ3�¹žêmÐí¾_ãQoµîðýNŸ¼ï¢‘ÊßÃUçd4ýÖª·Ÿã¹:WFÓ/ñ~WúO¿¡-ú/¼÷ÄÃÏè£ßC³e_=ÍkØÇx <æ5ì«øòãù#«}’×qî¸Ì)kÛ¯Z6(ë·éÉB^n‹¬7gô�ÅNYÑ&/{BŸ¼rµ&gvȈmzP>±¤yÞèÀK,k°ù=— }W¿:hÁf¯ïÆW‡ç�›TKú®ºãM]ˆAßxñrÄËmñÍŒë´ÊG_É’Ó2ç$.œ²¶š2Ãëƒwæ¹-æ¶èìž’Çx»Í—ߦÚ'É)k›Mx²‘×g¼Ü=nY\ßë++[NšÐGryÃWiÃ>xíÅþSðöU��+:¹Ö9Èa¼ Nîƒ Èa¾:Çõ»lý¢Ïxø�~‰/±=ÿ‰‹¦¬%º^¼ÉWß·(·ÑõúÈ¡ÉÎ/czáô�¼Â/è“Íù�8?·ÎÁÏØožóóú øûÈ?¶)k;w%nè»-ðÆ·x§#qCßéòßÍ.šM°<€7Q<üG o¢lËvyõfò }ðF‹—ÛâºLò }—+–s]}\u‡ÕÇðÀ#¾ÔúÎ’ï:¹º|²u‰>ãå¶X\Ÿº$¾§ÉïªËü)kWUk�ãÇk¼Ü§ðÁßo®ròQmäéCª7üb<òôp}M¿I¯O~YU-o¸ï÷øÀËmqêé²…~{zû¤ïÉFÍÔúzÞxÙ×ãßï5ëD��z»Jsr׊7I<ê훾ßgV–]DþRçd4ã­uAÇ£ÎÉhú%®uúÞlcú&~F~n¦øœ¥81¯™}Æc^Ã>æ°+$Çü—XÖâ�ý½}c”+Ìu¹-lf¼n®S™×Ë:ôüEß"ô‘}6‡å*_ðsÎÖ}ÿ±€üM,‹Åþu£—û2ÌCè[/_¡�9ç éL,û%¯ƒ®%À£>.–=‰e5ú·xÃó˜_&+/ËÚ<ü\§Xl”ä˜7ºËÆÄ²†4P>ÓÖæ�IJE÷”lååðg§G*.L,Ûë2•‘“£öÛ*N‰eŸNy¹�—£Î;(Æè{Sõ‹>jº²ãÓâÑ/ùxžk[£?m/cý¶î݋˭—#ç§(&ø [�£r66£ÿ1ç3ß36䨭›œ>�‚�#¾ÔVbYÉVø 9«#ÆK<�;[¶�ébùrbÉ8:j ô�XöæhKÞÏÓ†O9ÎÐ6KrûÉÈq,£í…!ŸË^nðéßÖò™¸-ºÇ·Ý°`ïE{É×ÄOÓ–<½FyŠÍÈÑï!'É5ôuÔqÐò¯CÆç+Ôš†¿&äß”µ�7QƒÈáSò¯CÆ)—ÌÑi?ÉYþ1‡QÓÇInNÞ¾îØ¨ã`ìG­(‘û"äú˜#Ðgù×!cÎ3§h½Ïò¯Cƃƒ?_éy–2J;ÿõßÕ{}vþk;ÿ%‡j¶óúìü×xèã\�ó_ÿ=¿×�ó_ã¡�\ãü×÷ïõÁc3úì\ÿ•Záõ¥òÐg翺ÃL×¼>;ÿ5úì\—øRäs*}vþ«3A]Kðúìü×xÄÃÎýõ;ÿ5ýÚù/99z¶ï×Î�G¿vþKÛqWù~SyôkçºØ²xœï7•G¿v®KmM�æûMåÑoâÅ2î\—¼%{Éç™ÿ([È#Ëé×Îñ)úÈ?;ÿ5ýÚù/söág;ÿ5Þ¾5¦%/o›ýØ /¦äß6@÷ÃåÇb/nÎI®-9~þAúz¢ÎQæÜP"ö¼xkô¨¾¯odµtboµ}tý%É¥U'©í¤r+Çœœ®$õ=·äÊ7Z1±D¬”äÊ ú8¹lnŽäî¯Î/ƒ£O×òønXrï·þòN¯¯m÷Ã2'ÿr™ä^Ëðª—ãšÈX}G;±þA]6ÌõúFyF¦6ÉMh8xµ—Óµ¾ —\å‹3žóú¦þrYfëî‡InòQG½çåø^^ßÝæM¬ßtà·«¼¾×çæd–ôqÞmƶ¿ÌÐX—ɇäKSÍ2Ø÷ø€·rÿ%¹vÎ/׫Á²…CäCr"÷³bÁwðë�Ý„>â±Z±ðú~‡>òª¡bKŒ'Öÿvö‘)¶Äø¶gmÄ>äz)Wê»ñf<Çx‘;M¹2Á�÷¨÷/r•{W;ÿm˜‹ÿ�»N¹7Ìùoðjü‡Ü1ÊåN._ÞI<�»K¹ÜÒÅcÀ«Ä¹l®?ºø®˜H|‘[©Úøb ñ¹„ø"ÇõêÛ]¾ü0Ž|ANcÍêòeÅbò…Z¥N?(5iÑÄús´º*£¦©çeoÞ´Hy ŠörÔn]šXÿ‡qä3rÔî¿\>¯XL>£ï Ù×ÊÕÇŠ‰Ôr¯È¾†®>F.¡>�;LãäêíË;©7äÆi¼g»zð*õ†Ü0ùïVW¿æR¿i’ë#ÿݨí¶ƒWS¿Èµ“®¤›2žc>@_éºÏÍG½Ç|€Ü]Ãàúñe~AîÍ�ç­vóËY™_�ë¥|Á‡ä óý&}¾¨ß�ß1_]þýÉ%‹6]¶,7¿ôÐXìÝ—c±¹'ß–¼ùÛÜy?®¿9ÿ[�û.}As xßÿÜ=Ù(‘+^~ÙoÔǵý*ÿÜäQÕoTÛ­e¾Z‹ýUrÕ®K¾V0Fre«u¹‚±ï$÷«z­äFUå }û=HæŒ[/•ܰė¯{¹·‡ÔÌ<ý°~’kzèúÎ }™åOÎL–?YrSëõËË•;´]fÙCÛInA�S×x}÷ÝzifÙç‘\å#r?ðrgÖ/ó­!5%7¯Ñн¾ec2÷_¸.ïÛA÷ý½Î°O¶eþ<ö�¼ÒC×yÝg^ŸÆšùÝÏÝ%W¡e«­^NcÍÔ˜%WéèrßÇb÷ɾmëoÎü`RbÁ·ƒŽ9Ž\ }¯/ËÍÜkzƒ¥‡Ö:ÞLÉ5–¾¯äCôå—õrÍ¥o³|ˆ¾­e¼>ì«(b_Y}¿†¾ò²o›|ˆ}£ªz}Œ~;¨ÒÃ^ŽñâCÆÛôP/‡ÿØðßÔz^ÿ±á¿u|¿å¤ �Ä£ò^N¾Ëì$�Äc^#/‡mØH|ï;ÚËý(Û*ÈFâ»þH/÷±ÆÚDc&_*hÎah¬GkÌäK%µÅ/+/ya!>$×ð rGUÎ_ˆÉISûͤïù°ôЯ–’ÏÈ-•}-]}t_J} WFöeȇ¥‡&–QÈMÓxuõöÕëÔrm5ÞM®ÞÎXE½a_#ùï4W¿ýߢ~‘ûé�vù5\ýžº†úEîÇŇä?âæƒÜ˜�û›t�ïæƒ2 ÷ñ‚uyøðÛAßob~An™j·²›_®ûŒùû®SíâCò…ù ¹lÕ.>$_˜¯ê·°ø(Íõ#u¼Ü¶yñŠ«†•ˆÕ¬4dq²óûy}¦]ŸY)7óóäÆôA‹7¼ø÷¼JWŒË|fþÖ5'v�Å’\Ϲ=󖮸Irý¿ozT,v¸ô•Ñ1†µÓ¶Í½7ÎÕO RÛnÇõÉ{áëIj[}K•‹}¿ uìí®9Ûæ·ûl}ªDì`é{bð Ì ÷Çó+åVo¸þ#ßïºÁÃ3ÏïZ+ÿÙùk:wT4±/~å)™‡_yŠäΩ=Gß—Òïµ:F�ÓqfÛæºg¯™£ëçê÷è��2“;©m�ökŸöå e½!9]7¾Æ�÷ÐG&.ÜçÖ‰Ò§'ò¼smck²>¹lªÚÆb?èûú]þ@ϼ×WÜ$¹þß/Õëªã ÷0Þ®×ù~ÿÖ²OÞÒ¯'©mõ-[îôãí£±ê>‡Ìm›·>õv?Þ¯5ÖÇ4æJ¹ë?ª®u~¾Dc}Sc~v~Ç—×töm¯T|âŠÓ¶ÍW [¬{²ðU_ŧ¾âT)·Æ™Ÿû¶Äg•âôìü»oU^ß©òÉHùfÛæ5sêž]"vˆÚ6“ï’+åÎY{NíXl°úm/?5’¿ž�¿ö‰:í}Û)Šã�oÛæ¹WöÖ=côû’â�TÜ+å6=ª¿j›ŸWl›)ÆÏ̯rqõ-¾íq:–Ÿ¦õжÍõn-w¢oûòàAùoÝW¿›V'ñm?<<ÿÔ®µÔoÝÕ\‡ÍÕµŒÍ¾vá¶Í\Íš†~÷ºubæ³Þ»°RîqÍ©iú]¸ljf¬\îÂgç—Ñ·R¾-÷wýS÷ölÛŸÉ娧/zv>Ùìm¦¹w„´=©|üÐŨzC‹ÑZåc7£5�‰ýê|&¿¹j�ñ’ôûªÆ{£Ë�寒Ôà‹ïuÊ Æk¹A­r¯µJNâç„ò1ÝåäÙµÏVNâçæÊGjøÕ/9I¿òUþɮƌ§è·Ÿâ{¦«…O^§èWµ�¿ÍÕÂÓ÷Z-tÓX¹gjÛær'Rƒ´ý@ceÌ•r‡X vÕX™wž™ÿè1Ô ýêþ¸ü¡n¾ªw+óm*ŸróÕ¦Õh¾¢_Õnþ`7_Õ}�ùм*¯ØrN²msV›c‰­ìV¿ÏW±9–ØVqsl¹:̱´}M9…¯·m¾½:ó ¾ª©|Äוr§–Y¡y_UW>âëgçoÚŸ9›‡«öïtsâš9̉Ø\Mµ¬›;ç¬eîÄæªýÓÝ<¹ö æIú}Ú÷+›o¯Îtý>z ýâç¯tNr�ïâŒ_m;óý¼!n¼™Ÿ¢ñâçÊǃ”—ÏêÊx÷«yíâaó;æu­=&¿Å‚Ò[&(nC¯Ê^<®O—¼65Çæ÷þäž�ÑUax?œ¶*ïÖûG‰×`eŽÆRNmË?º,ïÑ*ÃÕvåš‹¤Þ-S«ä}~wñj¼¼n®oÛê«jù{]t‘ÚN|ºêmžwJ�VùýµõþdÆ_güÕÛ2°Æñù7ik±à–'nQ`ßZéʓΠÖÍ­¡|Æ–-J—töù¤êmŸö¼ëeÛɧ¯ÊëýINn]7 ítÙv�ll±à¢{Wêx„}�4ÖôÅ›pgi+З¥±¶ìÛEmÿrý==ïƒgsò/ì0QïOöÃ|…¾jO^Ÿò•�.j±àV7‡¡¯³ô]>¿c}Û4£¯µô�ïÓ%‰¾ «{Þ4Ù÷�ÓV‰—“û¦®� ožìÛïÑej{ѽMêxÞg¯|˜Éx?Õ\‡¾i¼Y_UËì­ñ:ÁózÉw'÷h%ÞŒ¿ö8Ë�m¬|׿Æñj{Ëý4_aß|ùnõùÝÅ«ñrí.¾íyòÝÆ /RÛ‰OÞÛóšËwÙ÷�¯ÁÊZ÷ÓöùîŽ*ÃÕvåš»5`óOÊ—Ók�¯ô–ÁZKa_eùcÕöž�ÓtíÞ~ëŽZ´öÙñb±ŸGù¶ŸO=rQå'¯W[]—UÞ£ï>ù®£Ó·mÓ÷„|w¼ÓwauÓWîôUɱ²¯Ï'o6Æ>ÚfÈwбô5©cöÝ+ß)gÄûôÆ;D¶œ,ß)gÔvÐ 6Þ3ä»NÚú|Òã,ü‡¾¡òÝ0ç¿~íñPLZ,|±åsKéÛªîýÉ´‘–Ïcd_mŸ�ì³ú¸Kö%]}ÜÝ�ú°ñÎuõV»‹Õã=ÓÕÛç½­Þðßy®~{œeõ;D¾íê·_{ê—š!ß}ìæƒO�±ùßý@ +6T–ïrÝüòfcæl9\¾›ãæ—&u˜_È«—å'êµ÷'Vgn¢�GåOêºÅ‚mû3‡Á»§ï£ P½’kT+mŸãÑ…ï«®ÉIªzïºg/NÓ"ú·�¿uaá9„¿Ö¦{üųóMNßïªm³pîb<äl�í¯ey¹ñ{¥¦;VǂѾ�ôCýñG°—ú`­ýú°s íηµó�Ï÷›Ê£­­åýu5/ïP�%ÊãxÄ=½þ;}߇£Œ‡}CÂ÷\þºŸ—³s’(oxÁ wÞÃØJfû±-| [öÙzÃ_;ñöq_[gûëƒ^_*9[Sûk�^çP¬³�‡œ­�ý5>¯/•‡œ­wýu?¯ïŸ÷Òçÿ& 9[Ûúë~^Žk"¬w�‡œ­cýu?ßïÉamk<ûÝû½——J¨rTŸ{Q¤{ðõGWgšð_ÕÀîw NÒ,~‰/Øã¥™ì•ã÷/üçt—7|ŽÅÒc{ëÝçQºË)>ÃWs÷¼�0ŸÁizç3x_½ó¬¯<ÜgpYa>ƒËé�ÏàýôÎgpy½ó\Aï|WÔ;ŸÁ•ôÎgpe½ó¼¿Þù Ö×4î3¸ª0ŸÁè�Ïàjzç3¸ºÞù >Pï|¤w>ƒkè�Ïàšzç3ø`½ó|ˆÞù >Tï|óâ38®÷P˜=&Z+àÚ¢:¥Ð+=VWï‡\O´~À D¬¯Ûc:-Ñ+Ý=¦iÀGˆp3Ñ£Ö©lìè€�mð±¢-&_Ž}èB?ý4 Ýè…�nô‚Ñ�^0ºÑ ÖdèÆ¦úãï¥t×§bŽƒoð {áÑŒŸð?á#0~ÂG`ü„�Àø �³ôÞ (KZë½MÀmEOøDÑv·Ué��¬÷Ÿ"zjÀ§‰žpGÑ3î$zfÀ�E»ÜU´[Àg‰žð9¢ç|žèù£]Ø@?ôF7zÁèF/Ý製à ôž¦ú·Ò;¾Óg÷€ñ ~��ö`ü„�Àø �ñ>ã'|ÆOøÌ8|.Åcä•ù �Äbný¢ÏÇ4îâk±À>ã.'ÍÿØCN ‡1;±ÅçCÜå†ÅÿùŽ»Z±x‘S6.l÷ùw¹dqÇß>çã.ÿ-¾øÞçÜÕ‚Åš8øZˆ»º°¸g‰ׯ;9n~&>¾Fâ®^,7ˆUº6äzo01¢NàS»–?Ô‘åùážÚ˜ynÐûE�í0t´Ã ·ÿê€iwUÀì0û¯ ˜ý#fÿ³DÀì0û/˜ýÌþËfÿ°€á Þ�€á Þ €á Þ€€á]0¼þÃûKÀðú ¯oÀðú ¯wÀð. Þ…Ãë0ãó~N¸ýÞÿ ·ßÇÅãl'ŸÓŸÇÞq8=v‹h}&ú辨8¾­÷¿~UÑiŽŸî|™ã°nŒmàO=9Èc[n�Y#Ú?ð±ÿæÀß_¼)§»qO üƒÄ7ðñÃäÀ‡žôà+úÃÎuzןãê•î|ÌxàWo’Ãé.·~Mñß|ârGàÓû ‡ØÝøï‰|â{OàWo‚Ãé./fþ!â¯|òä¾ÀgÜí‚riVà ªÛ‚ôJw98'ð÷ï&‡Ó]žÞøqñ? |òvnàãïƒrû¡ÀÿPtPà“ÿ�~¦xù§»z4ð÷\àSGóÿFÑ‚jmaà§‹÷w‡Ó]½>øy¢yjöÉÀ/+ó㥮Ÿv8#FNµ òÔþ³�ÿ±èàÀg~@/ñ=^¼çN�e‹Žq8#v�赓ËÌGÈ_¯÷±Ó—·!Ã�•±!ƒ³�Âø]`b‡.01G˜œ±<'×|¼2\ÎÒrÜçI†ËYËsêÉçg†«AËó[Å÷u‘#g-Ïoö5˜árÖòüNñiC_ä¬åùÝ´��Þ-ϧ Óþ ½Ó|¯Þi&giž©wÚ€gé}Px¶Þi&g-Ïÿ*Løä,mÀè�6`rÖòüAaÚÀ'g-Ϧ |rÖò|ž0mà“³Äü˜Þ}Þf¸œµü_ >º�!g-ÿ £ >9kùÿ„0ºà“³–ÿO £ >9kùÿŒ0ºà“³–ÿä&ºà“³–ÿÔºà“³–ÿä,ºà“³–ÿä¬Ïó —³–ÿä,º�/UÂr2=¦[bÏ;~ºË÷6úL­�}!ðþ4àë…_ ˜>»ùD_ü}„± =ºu-öJÀÔDë ¯ËL±×ÿÑ!�“èë�ßRØ�1=6AxEàã¿£‚ü$ÑU�_Bøš€§¿0¾j¥ÏØ3Mô­À¯-¼1`]2+<Æé§dB¼Òc· ¯ 2øþ|}F�nñ+<îì%Llàß-ü~ÀÙ¢YA~ºèúÀ¿Lø³€ïþ(à ¢ú™½Òc3Eÿø-„}¤Çf [,ȯ#ƒü_Em,u…7‡¶Dðâég;ôJ�=(úy�9[Øçmzìaaä�!Ï òóD¿ |n‡ÝðcÂß¼IT·àè•[ ú]à-ìs;=¶HøûÀ§nšù'Dÿøõ„Ͷ§„ÿøô¯[NõJ�=#úSàŸ%ìë1=¦[9cÿ |jëÜ Ÿ/ZøäÝ/¿*j|ò÷çÀIÔôPÛÿo¢Ö/:~ |t˜�èø!ðÑaãBÇÖÀG‡ùß>:Ìoèø:ðÑa~FÇ—��‹ :,.è°8¢c©6ü†«GtX¢Ã|Žb‰<:,—�%Gá#kù†,5 YËOd?†->²–ÏÈ~¨ >²Œì#kõò¡ð{��¬Õ²ëÙwFvMÀÈ® Ù·Fö�€‘}3`dm~@vuà#ûFÀÈ® ÙU#»<`dWŒì²€‘}=`d—Œ¬Í«È.|dŸ˜’»ø�’»`t�»`t�»àÅz'wÁè wÁ±ú¯ \R”ù ¼·(ÇpiQæqpš(ë4`Ö´‰€YOfÌqªVÀÌíuf><<`æ–ú36 ˜y¥qÀºíªp^:BØæØfÂG™æ¢ÌkŒ÷Qæhð±¢->Nôø€“¢™sL0Ÿ‡V�ϱÑ|NÚ~[Qó9q8!ðOµã q°˜¶¶ã,1±˜r¾Bì$>»“„iŸXY9?£ |âf1í LøÄÐâ{Š0màO‹õ©Â´�Ol-î§ Ó>q¶8]˜6ð‰¹åCGaÚÀ'þ–gÓ>¹`yÒI˜6ðÉ Ú€Ï¥ ˜±üé,Løä mÀ]Di&whî*JpCQÚ€»‰ÒÜX”6`ŽSÄÜTt߀ÏEü#EÑf‚.ðQ¢èŸ+Š.ðÑ¢ès¬F¸…(ºÀç‹¢ Ln¢ ÌÚ ]`ò]à Dí¸O΢ >9‹.09‹.ð>¢¶$gÑ¿¬(ºÀä,ºÀäl�€ÑÓ3`rö€ÑsQÀøìâ€ÑÓ+`rù’€ÉßÞ“³}&OûLnö ˜|üKÀä`ÿ€É»K&×L~ ˜œ0y48`rgHÀäËЀɑa“—LÌ/˜8˜ØŽ˜x^010q»2`b5*`âsUÀÄäꀉÃè€ËD0¾L~iQ“Ç÷Ç~IQÓI¬Ž |ôY¿è8&ðÑa¶¡£yà£ÃìGG³ÀG‡�G>:Ìèhøè0_¡£Qà£Ãü‰Ž��Ët¤>:,è¨øè°x¡£nà#k1E¶và#kqGö°ÀGÖrÙôÀGÖòÙxà#k9†ì!��¬å!²5YËUd |d-Ÿ‘­øÈZÎ#{@à#ku�l•ÀGÖjÙÊ��¬Õ²Y«AdË>²V§È– |d­Þ‘Ý;ð‘µùÁÉ>1,pš¨Íè(øè°y%?&jóL5á[™Š4±–³±ß&|J�g\¶$Ü5È!ʹò …˜s:æ5ø�è½[ÀMD9ǃßXx^À_ŠÚœ¹X8;ÈC¯ ß^0tLÀÄúº€¡×L¬Ç ½!`|œ0t\ÀäÞ�CÇL®æ ½)`jáæ€¡¦¦& �0µ99`蔀©ñ©C§ÌùÝ-Co ˜óÁÛ†Þ0ç�w ½3`Î7ï zwÀœŸÞ0tzÀŠ?#`è½,þ}Cgü‰ø³†Îxƒøs†þ5àMâß0ô�€?nÀÐÞ"þCC˜œy$`輀ɽG†>090sÅÓCŸ ˜9êÙ€¡ÏÌܘ04?`òÚçÜå»Ïÿ¸Ë_Ÿçq—×>Ïã.O}>Ç]þú|Ž;>o㮆|ÞÆ]­ø¼�»Zñyw9îó6îrÜçmÜå¸ÏÛ¸ËqŸ·q—ã>oã.Ç}ÞÆ]Žû¼�»÷yw9îó6îrÜçmÜå¸ÏÛ¸ËqŸ·q—ã>oã.Ç}ÞÆ]Žû¼�»÷yw9îó6îrÜçmÜå¸ÏÛ¸ËqŸ·q—ã>oã.Ç}ÞÆ]Žû¼�»÷yw9îó6îrÜçmÜå¸ÏÛ¸ËqŸ·q—ã>oã.Ç}ÞÆ]Žû¼�»÷yws’ÏÛ¸›“|ÞÆ]îû¼�»Ü÷yw¹ïó6îrßçmÜå¾ÏÛ¸Ë}Ÿ·q—û>oã.÷}ÞÆ]îû¼�»Ü÷yw¹ïó6îrßçmÜå¾ÏÛ¸Ë}Ÿ·q—û~NŽ»ÜgŽŽÅâ.÷ýÜw¹Ï\ ~Ž�»ÜgÎ…ÿ7ÑNwtqÀÐç†"Çõ‚%¢/>ÔÚ²Ÿ}ȼ$ú²Ã鎚<ûÙ‡ÌRÑW‚ ÔäÙÏ>d^}ÍátGMžýìCf™èëAjòìg2ËEW8œî¨É³Ÿ}Ȭ]d &Ï~ö!³Zô ‡Ó5yö³™7Eß 2P“g?û�y[ô‡Ó5yö³™5¢kƒ ÔäÙÏ>dÖ‰¾ëpº£&Ï~ö!óžèûAjòìg2ˆ®w8ÝQ“g?û�ùPô£ 5yö³™�Eÿîpº£&Ï~ö!ó‰è§Ajòìg2D7:¬ïŠEMžýìCf“èf‡õ=³¨É³Ÿ}È|&ú¹ÃúŽZÔäÙÏ>d¶ˆ~á°¾ß5yö³™/E¿r8ÝQ“g?û�ùZô› 5yö³™oE¿s8ÝQ“g?û�Ù*ú}��š<ûه̢ÿp8ÝQ“g?û�ùQôŸAjòìg2ÛDr8ÝQ“g?û�ùYô_Ajòìg2¿ˆ8œî¨É³Ÿ}È0Ÿ˜ <ækÛ (™‹õnüÂÌ)ð¯Ô;søj½3G€/Ò;søB½SóàÞz§¶Á}õN ƒÿ¢wj|©Þ©Ið@½S{àÁz§ÆÀCõN-�/Ó;5®wjdJ‹î0ÔäÙÏ>dxÆÝ¾CMžýìC¦ŒhÙ€¡&Ï~ö!SNt¿€¡&Ï~ö!S^´BÀP“g?û�©(Z)`¨É³Ÿ}ÈTÝ?`¨É³Ÿ}ÈT­0ÔäÙÏ>d­0ÔäÙÏ>dª‹0ÔäÙÏ>d­0ÔäÙÏ>djŠ0ÔäÙÏ>d=4`¨É³Ÿ}ÈÄECMžýìC&]4#`¨É³Ÿ}È&Z+`¨É³Ÿ}ÈÔ­0ÔäÙÏ>dêŠ0ÔäÙÏ>dê‰Öjòìg2 D 5yö³™F¢�†š<ûÙ‡LѦCMžýìCæÑ#†š<ûÙ‡L3Ñ£†š<ûÙ‡LsÑ£†š<ûÙ‡Ì1¢-†š<ûه̱¢-†š<ûÙ‡Ìq¢Ç 5yö³™¤hfÀP“g?û�a>1x%ì� qwŒðü¸[W2§(»Üz“¹Ì:‘9Ìz�¹Ìº�š³¾£¶Á¬ã¨a0ë5j̺Œš³þ¢öÀ¬³¨10ë)j ̺‰š³>¢6À¬ƒ ˜õޝ…¸[×øœ�»õ‹Ïí¸[§øŽ»õˆÏÕ¸[wøœŒ»uˆÏ½¸[Gø‹»õ…Ï¥¸[øœ‰»õ‚Ï�¸;Îûˆ»ã¿�uÜ·}Lãîxîc��!Û;:ûÓ½ÛáŒtzàC‘#ާG0ü{Ê>d:ˆž0ô‡uï™è]�Eù“"þ��e2'ˆ¶ z«ÃŽÞøPä�oÁðo |(û�aŒSÖýu¢·>ÔÆžøP/c™äøŽN 2P#xràCm\Ø~³ãëþ@щ§;jc�7!ð¡f?vŽw|ÝÓ%z“Ã鎚ýðrjöcoŽãëžIÑNwÔì‡7.ð¡f?v^ïøºRô‡Ó5ûá� |¨Ù��×:~†£×¨ÙøP³;Oqü GO 2P³|jàCÍ~ìíøŽ^d f?8;ð¡f?öŽrü G¯2P³|UàCÍ~ú¼Âñ3½2È@ÍðÈÀ‡š ôy¹ãg8:"È@ÍððÀ‡š ô9Ôñµv½ÌátGÍxÃj6Ðç ÇÏptH��š àÁ�5èëRÇ׺Zt Ã鎚 ð>Ôl Ï~ŽŸáhÿ 5À |¨Ù@_½_k~Ѿ§;j6ÀëøP³�>/v|�wˆ^âpº£f¼^�5è«§ãg8zQ��š à j6ÐWwÇÏp´G��š à j6Ð繎ŸáèùAj6€Ï |¨Ù@Ÿg9~†£ç¨Ù>;ð¡f}vqü G»¨ÙîøP³�>;9~†£�ƒ ÔlŸøP³�>Otü GÛ¨ÙnøP³�>³?ÃÑÖAj6€[>Ôl8E¸£ãg¸ãó Ç‹ÓE™_ÀØu²Ãî8f¶�$žÙCÿmƒÌ ¢fCáh¿•Q)�ûëÝlø(ÒöïÂ×8™ŒØ§Â7ŒžJ§»ãCÅ€7Š«6ÎI±¥Tà—5ÿlßìÿ\øz'“ûBxBÀŒeïÐöNá½þJømè÷þ§Ç´ü)œ{¿Ñ~óáwÂã‘ü÷Â�Œ?u8ÝW øâß­ ù*z·|ø§x“œL†ûûN˱ŸÄŸøUE-oÿ%þ´ÀO½ÐéÔw¢þš¯þžE|«¯ ¿¶›áþN´O�ßK| 7Ãý]¦Í¥Ä÷×j3Üß’Úܲ�øþš¬þÎEúm¾ÚWü{ƒ=eE‡ýeÅŸøŠüýÄ÷×.3Üß¤Ž ü âûk‘îo@¯ üJâûkŽîïV³ñýµÅ ÷w¢c¿ªøþb†ûÛÖ±�_M|­0Ãý-inà(þ‚`gÑ �_CüE�krà,þ�°è´À?Tü§†x÷>ô¾€¡3†"GŽÍ�0tNÀп EùûE:7`èƒC‘Cþ!ч†>0t^ÀPä�Tô±€¡ó†.Šò E }<`èC‘CþIѧ†>0ô™€¡È!ÿ¬èsCó†æ EùÅ¢Ï ý[ÀІ"‡üц¾0ô倡È!¿Tô•€¡¯ }-`(rÈ/}=`èò€¡+†"‡üJÑUCW }#`(rÈ¿)úVÀз†¾09ä׈® º.`è»C‘C¿™ð�ùÿ?dð¥Å¿™ð�ùÿ˜«ù ?Øx“ù„ñÚ¸°ÝÆþ�ðzmؽ7`ê‰}ð»�‘q˜¨Aj ê‰:3ö÷†¾0Ô|B=RoÈS[Ô$y³‡þ­-õH½!CmQ“`ꎺSCÔ˜ú¢~ÀÔ 5¦Ž¨05A-�©êLîS3`Æ” ÇõŽ_À—î ØÛëù£ð 2™z72¿E}•ŽˆdwFÀ5Eñ üz�úç0Øâ¤w|Ƶ€Â¢þ©ø_ð2ø¦NàW�ú­nàã§ÃæØ‡iËq3êÏz°Åçø‹OÁø²>P˜µJÔÏ Ÿµ ¾F7 |Ö)Qÿ7 ü|É4˜õK^hËñåù€©—&A†zjpyQê�¾¨µ#?Q«AêéÈÀ/'J½!O­5 |ŽÅVƒe„©=d¨¹£€ÂÔ`ó€÷µÚd]AM"C- ¦6� xQ«Yê²Eà³£n‘§f� |ÖkVËÔbËÀg-F­"¯Ch‘š=¶øÔßñ#J­Âgmf5KÍ%a‹­Þ?t2ºÆ'ú‘ÃénÍüqàCÿø�D? |è§�ÿŒôl|èÆÀ+þ¦À‡nüE? |èç�ßEtKàC¿üç¤çËÀ‡~ø7ŠÿuàC¿ üSD¿ |èw�Ÿ#º5ð¡ß~¾ôüøÐþY¢?>ôŸ�®è¶À‡þøÝE|è¿¿§è/�-ü‹¡“YB”5(qé-~ÉÀ‡²…ßOü½Êþ¥â—|(kPøƒÄO |(kPøCÅ/øPÖ ð/¿\àCYƒÂ¿Büò�e ”øÊþhñ+>”5(ükůøPÖ ð¯ÿ€À‡²…?^üê�e ÿfñ |(kPø“įøPÖ ð§ŠHàCYƒÂ'¯}'bä¹Ïí„ËGŸ{ —§>'.�|Î$\~ù\J¸Üñy˜p¹ãó0árÖçÂå¬Ïÿ„«_w W+©oŽDØåó0áìõy˜pãðùŸpãóùŸpãöu—pþðu—p~òcL8ÿù±'\¾{Ÿ$\x_%œ¿½.Þ· ïó„‹›�EÂÕœ¯©„«9_k g»„‹¿�iÂå…�uÂå‹Ï�„Ë#Ÿ —_>g.ï|.%\>úK¸<õ¹—pùës2áòÚçjÂå»Ïá„«ŸÛ W>ç®n|-$\=ùI¸:óµ“põçk*áêÒךV Š‘¯Á„«c_› Wß¾f®î}-'ü|àò-áæ _û 7ø9!áæ?W$Ü|ãç�„›ÿüÜ’pó¢Ÿs.gý\”p9ë稄›ký\šps­Ÿcnn÷sxÂÍñ~nOÄ ·kúÀ±Fûkëüw ääŽ_]ºžÚsÐŽwý!nÚ‡å.§?Ö;—wö:­ÝÀñ{^Ô«a×^C†õâ¶€]z¥eïçúÙ¥Fÿ.ôùÁ—+¯¶Ú“õ[+lù_ð_ü×ÿõÀ=ð¿ÑéS3¯¼6›¯@boן9R˜%,xJìrÇGÆp-áÊǽïNM×H&Myð-¾r|dfmk:Mÿ?ô.Ô¿-àh[Óiú·~VÙ�î"óÏ€ÑomÑ�NÓŸV³K¡~ÃѶèG§éÏþ9Y¨LÀè·¶è›þËGgê7ŒþÎ-ÿáô ÿLaÓÿöúÊN™5l}!� &¿åä‘…ö|0öX_Ø6{ʧ×+´Çða’¯øïH¾‚0òàáÁ~d c›õ…=Ø`ötowo¡=†±Çú°Ùóf#2†£}™ f�ùÃØc}aØì¹&ûÕB{Æí {è×ô7qAÆp´/ì±øÒ—å2†±ÇúBÌb-ׯ�±ˆö…~ú5{z›Ñß'‚­/³Áä­‘7L_–KÈ“c&O¬±yË�h_؃ &ß6Ä™vl}!6ù+¼�<ó†õem‘G§É/9Œü’¶¶È£yb÷þ†1…ùüAÀѶȣÓô÷5‹ÌÅ‘úµ¶¦ÓôPîúBýÕ޶E?:MÿûaÎAæÃÈücmÑ�NÓoý’†£mÑ�NÓm˜3‘1m‹~ô˜~ó26‡GÛ¢=È“ÌÕĈœ±9¼ùÜ™Éô÷¹¼}*ofrãØûœ=gôš™L{Ìóoë±YÉ�=ÿñ§f%O˜âñ–cæêèŽÎk ñ݇A&Ší8‚¼aä'†ãòQlyŽL?rù(¶Š-?‘�bk‹|Ÿrù(¶¶ÈGqÕ�“ÈG±µE>Š×„œD>Š­-òQl}¥Úom‘�âá!?‘�bÓ“j¿ù ù(¶¶È&v{…üD>Š­-òQ�i[Û¨Nð¤ˆýQlmÑÅ–KØÅÖ6ªüUÄÿQlmÑÅ¥ÂúýQlm£:Á£"ùÅÖýQ|Y8¾£?Š;Eê+Šm}‚|[_QÀ›#õÅÖöDñ~áx„þ(¶ãòQlë䣨úŠÚ>'³��bë ýQüFXŸ ÅÖòQl¾E>Š­¯¨ àìÈ|ÅÖú #oóú£ØúBÞ0ò–KÈG±õµl±FÞðÛ%f'×Õ˜éæçò[f%Ÿn?ÓÍÏóæÏJžÛÌó;äÏJ°·ÇŸÎÝ–^ùNwÜlsÇ„d…’Ûñyß>âøÈdî3ϧ¶�73Y®³?´»vfò³#üñâªy3“óÏõüî“f&GŒñ¸ï#3“Ï4ð}ÝûòÌäËݼ=+n™™¬7Êó¹lfò½®�HÎNfdy|N|vrco/ocáxÇׄ1–¹{V²ÛK¾¯£o™•Ü<ÕÛÓjÕ¬ä¶ë=ÿ¶�f%]äñš#f&;ÖðøÓóg&«—ôò6ô3ƲaŒ7�›�lŒ—«çìä‘yù}¯™�üìÓYÎÏ?><;ùôOã«;n«ÐŸ•GmÇk¶®.ôçªJo8"Ö”× åË�ØŽÏ>=¿P~sïüBùªGv+”¿©Îv¼feF¡<˜uBò™ÙÉôMÞŸ5sg'GüèýùíàÙÉÑÏ{þÏwiŒ÷{|k•™É¡ïú±<Ýffò�×f¹ü1_៨o®8+™“ïýSïàYÉÖ¼ú�=+Yö6ÏÞuVrÝ+Qffr@¯ø±3“eªyý5�™<éLÏÿ à¾d׎¿;dvòæ�Þ¶‰§ÎNΛèí·ÜÀžáÊ™ô�3ø³ZÄ?“"þ¹£õu…þÙtêuÎ?±•³“Çõ}5½G~äí)çìä¨#=IJÙÉûx|á^Êyåý¾®zª6ÑË›¯àßñáÊ#´ú—_kÝ×bVòÑFÞþ;™™œ~¼׉_ÎLŽ,ïñ‰™É�U'èYsÚÌäƒï{yóü¨ï°'Ï˃OýþøÝ¹…øõ»îq™o÷�žG>€EäçGäûT›ÿz�Ééµà9äqvò0­çà÷�6;™ó�¯ù >><&øpXbvrí->ÖÇ¥ÍN.ÿ‹Ï‡r-f'û¶óüºç(Žý=Î:qf2k¼ïÞf&/xÀ�ׯŽú¨ON‰Ì]6§açàËg%'Ô÷z.¾bVòoÿô>�Ö¦Õ,ò6ôGÇ�»lNCþ•¿ÏL~8ÒÛ[>3ùÂ_=ŽÎ]6§!ocAtŒÑ¹Èæ(äÍWÈãÃ5Á‡Ä¢|õQÎÿÄwÔ�íø†­:>2W¾ÿ¡«Óh-[�£ßjý辶&„š¢íJÍEðÑosØæ.d˜ÓЭ«ø6· ':çÐö›ô—]¢óõ‡^*Ä'<ë02/íõ\a~v‹Ì‡ûEæC³Íl¦_0Ç&úE¿³À;š?£s‹Í9è±ZFO´ÆÑ�oá£Ó|~?2ß‚Íæ“·9y;¶¢“c®ÉSk&o5ˆ|ιÇÃGþŸÆ»ó>0Ç“·1"o¾BšþN—l×_·º¯qäm®@ž9Ä䉅é·!ÿPd>y32Ÿ`›É›ÍÈ[®¢Ÿ6ý¶Þ8U2æäo�ÌÏÂüLÛÕ{¾ 9ƒ¼å2äú£µos|›{±“9ùÄ0'ÓvZµí5µW¤¾žÚ²Ýÿõ"þg.E�³!øl¶™Íô�ël„ok ôD×´¥/øè4À;dˆ)z¢s‘ÍQðíXŒHôͱæÊò~ž´cò¶6C>ºf£¯c#ùb˜s°Ç|… >Dxgùiµ‰Œ­'Á¶nAg[_È`ƒé·ºC>ŠíX�*kÎu޼&í<~BÎã:™æ‘>M�< Ïá�­Gg[Þ‘ó8®Òu‘þûÜ3*«ÿX³1×›/¾›ótm©O:oÊÏœ2*«T¼þùmè¨ì•õrÿtm Oº”OãóNÛGóV½<šshÎÓg}b_bO½yTvÛuyüt.Ð?Í ù¯?s½Z–Ç|iÁ¨ìÄé9�çýxÎ}b§1ÙÂïsŸÓ7“�{5çé\lÌØ—ØÇx,â1ŠçÜË“Um•ç<’ïê.Ù,çé\lü˜[Ì9Ö6Ö<]¹ï͎ɺݗÇ|‹k·¥çæ<]ûé�u±V±†ñ3Úã7�Î:”æcòÀ©£³~Í‹¼øÙÍøqlÇ1Ç^“i]ußKê�Éîü*Ïy)ŸS_›™óxÇF3q®Å9˜ÖUãwàòx¬ãˆc5Žátè¾_ó9ìV®å›ý3:; ZÎãy$ë8âØ‹c2Îý¸&|]}t6«i?žGⱎc ޽8&ã5m<¦±/±�ñXÄcÇ^“±¶±æq,Å1×–¸æÄµ1®™±¶±æq,Å1kkÇF3qm‰kN\ãšYdY6ªx¾>ý�²l%Ÿ9—ŒÀ~S~Ÿ|VYöùy9ŸÚhLvsßü»÷¦µù^¢eþýü�s°×Éíçß<&kyXΗÝ66{•u“�Ö´›}¼8Ÿ#—v›msEn?gØØì�«r>tñ¨ìµó}ç,•M9<�Ÿî'Þ#ØðË1YÝj¹¥gÇdcßÏÇXº× ¼ÑdóÑY�fùg·áێΪœŸß¿x¦x/Cÿx�ãï‹X“OËãÏæüsèÎy>)7ýcνCßSM¬gÊMÿ˜óÁ×�β&y>Ç_3:;êœ<Ÿ”›þ1gï}Z¼÷‘î‰? ýã1šÁw4Îó¯yÀ¨¬Ó¯y}R_ô�}lñóèì£ò|ê|1:û±ožOÊMÿ˜óͳ˲ÉçŸU—ýX–}:¥¸†ÛÒfÈaáIc²N-Æo5&ëò@?µ¥Ìa`ÿ²¬Ù€<þŽO—egwÏã§¶ô�9Ôâû¨êæñ_⻺¶¯ãÛÒ?æ�S–]¿]½ÛʲJ5òø©-ýcm86[¹4�¿”~ÏØ8Ÿ/©-ýk‡®Ý§,4%Ûõ/.Ëê=’�ÿÔ–þæpC1‡VG�ÍÎ+ÍçÚ¸ºc³=ºæñS[úrè´GYvYë<~�ÞeÙmóø©-ýÍáÎb®›Õ�Çõ ±Ù]Óòø©-ýÍ¡W1‡U–eýßËý7¼º,÷UîŸÚÒ?æPrÿØì÷�ó|ï<6ë]7Ï'µ¥Ìተ¶¤5ÇñœÚÒÿ—�C\+Ò¢jKsø£˜ƒ÷[ï-¦{Žú§µHÿ¸FÅ{—鞦þm6*›ÿ]~Ü«//ËzMϹß�§{~gž¸ß½§{úDïEžîUéyºwiÌÈÓ½Hý÷núÍÀnûö+m^üý€<Þ»O¼]�ãJoœÓ·ðÙ]>»[Û¹@{âñ7»ÓßXãÇ{ý‰WY¸yé[ìSˆ3«WÝÒÉ÷,ð»ÎÚ¶ô÷Î= |³‡ë•nÙ§W�ßßEÓø‘[[íñw _·ú Ûå…Š­´¯Ë_Ú¤ÒZ{âÖ'õ=ÖDn �£Oâí,°C×B»ÝË&e÷^�óíæOÈŽ¼6ïûóë�Ïþ©œs÷M}�5‘{LSüħ¶)·uyê—öÄcn1gyümCâõ i9l‹{ ýj}JIËGŸœ×¶ÅÌ–?î›×ÿéW·,;!¯¿ñSn1ç¦Ä÷¾­ùÇßE|KýÇϺ¼ý/ ß!hOÜø)·˜³<þv"ñõ j9ùƒS íî<ôô–íwÌëéc_P6õø‚ýø{´9$ç1·˜³<þÖ"qÇö‘Å<×åÿ6/Ì?ås–Çßf$Çvóo\Ø ô¤×òcñð¨íJ¿m˜£ø›�˜³<þ–#qÇ|?ëò4fâ¼0ÿ”[ÌYž~û¡Oâ;m?9{ô¹¼¶Ã›LÍ6}?çq.Ä9ss–Çß &Çöº<õ+΋˜[ÌÙµ"þ¶0ñ8¶wcþ…é¥%wÌ×¢¯»œXrÀï{æ…ù§ÜbÎò4¯õI<Žíuùû½ß\;þO¿«qÅœåþR»>‰?ù÷–Ÿ ?³0ÎkžôqËU[æëLœ qŽÄÜbÎrïù¦ù›¸cþÝbžëò›1·˜³<þ62ñ8¶ã˜oÏø_¼ÞÔBÍ�fü2fÊÚú§ÜbÎòô[;û˜xÛëòƒÿ,ôW{âæŸr‹9Ëû»¥OâõöœœíØà¨Bœ«K¦f=ªç<Î…8Gbn1g¹¿ HõOܱ�r[—§ùç…¹¥ó 9'î\ðÃøÎ‘Ä×+›’­º]Á~ןS²Ú=x“9ƒ³çÎÍyµ÷d³‹>±ï±&òøÛÎÄã܉sêÓ6cJöËþ*Œç½¯™T²Yi¥µÇ7õ=ÖD š¸s*Í�ÈžsÃ? ó+òØ÷X¹¿YMõIüÏkeÏm¸SÁÞiÛFÙ^5v,𹿷É:ù»wµÉ^(úXŸÔ÷Xyü­iâMµ-Y]v^!æÒ‰”¬h¯�s9ÎqÇOê{¬‰<ý6UŸÄ�aüìT¬CäëÎå4Ç­Oê{¬‰<Í)}ßïõÍK�™ñ}áØÕ;«néøKWøÃÏo\ºÃ´Ê…¾ <~£ÒýU*pë“úk"�¿}M<Îý¸&ô8cÛÒ#F¾]h«Íøz¥?zkíøI}�51ÿt­kþé8Îýuyý?rÖžxì{¬‰ù§k]û˜øù× Ëv¹O!Îà:#²¡ì]àßTy8ë¸oI�ïÙb|¶áÔœ»oê{¬‰<]ëê“øå‹Ëv{ä�Bœ &e»æ<®Eq�r­H}Y—ÿÛ:³pù¼ìûŠûj»Ç.5žO|}øO*ØõIüèûdÍ79±0¯¯ycϬ¾¢oϬFç-�_ýîì•]Scu�¿Í¾]›_]È 17þ²ËìÆO<®q é>ú¯’¯~]hk͹•²˜Tào²ïú—çcï¡&5žO|ñßè¿òO<®ëò‡‹çA퉛Û¿ç}±>‘§ZÅ^]³J6üÎ+ ýªýq¥ì©úx¿Ÿç–4)¹¬ÀÛ¼ôZÉc�û¸õ™:¥S�[ŸÈS­b }öî’lÄEÿ½î½½dæ™} <®-qͱ>÷,ß­àc}"OµŠ5t _¬ÃºüßÖû~à_ùuŽõ‰<Õ*Ö0žkâ9hx»žÙ®Ûòܪg¯l~Y½·ïCŠù[ŸÈS­b ÜúVÖuT¾o—ûßÎ>î–ÇŒç¾xN´ï“‹õ·>‘§ZÅƵb]¾ËerÖž¸}¿vîñ/8/¬Oä©V±†Õ·¨œ]ødãBœyß­—�ŸþŸç¦xÎrß ‹ãßø‰ÇZÅÆsY<ÇÍØùœlþsy[¯é‘µœšç`ßO)Î_ëyªU¬¡kÎÎÅ:¬Ëÿm]2ÿ—n¼¶>‘§ZÅÆsM<=8¹réÉœ“¬ó±·V*Ý­ãFnnim1ÿÈS_bã¹&žƒâ¹/žÍí‚¥�®Í?òÔ—ØÇ¸¶¬Ë/\•^Öž¸¹U:nX¡/æyêKìã‘çÜ•µ+kVð?yòÝY‹v/ðxnŠç,s;¿ÏSkó�<õ%ö1žËâ9.ž›â9ËÜ|hüÚü#O}‰}tÍ9¿X‡uù¿­KŽí«ŠõwÌ'î\H}‰}Œç¦xÎúèýÁY¶qI᜵¬Ù=Ù�g )ps;÷çÇÖæyêKìc<7ÅsVÞhŸìØù›¸û¦qbüÄc_bãÜ_—Ox)ÿžV{âÆŸõk~}büÈS_bíõJÉÄ_›rsÚK%ÔÎy<×Äs�û¦yjüÈS_b�³‹y®Ëÿm^»ïuÅëOãGžú¢Oâqm�kþµ½Wd»÷Èëêsßg—ð¹Ås�s?]»ÆkÚx®Ô'�7ãÜY—?rö¤BL퉻oZ‡ã5m¬U¬á -dÇ®Ìk¾i³ë³v5r×긆?]»ÆkÚX«XÃZ­vÍ–½°Ù\ŸÇµèƒG(©ûÖ]ŸÍ+n]úP«Ÿ2kÏqñÜ·Õ> J§»°àsÐÝS³�ꯩâµV|Wìž·ÛŠ9ÄkûÇjß]²W· ùĶbñ³aí® K¸+ÿî(îcÆï"ªí»yÉ1Uv-ä÷�1ãwSú<±WþÝlÜ7ÆŒß%v=¾]ËïõX?ícÆï~˨ç5ßäþqß3~Wß¹Y�ý:5Éó‰ûƘñÞJ…*[—ÖÚ:ïoÜ7ÆœµOIËZ?çß¹ÝV±ú~ãnÎë÷�1wyqãÒ3oÈ¿ÏÙ©Z�Ò‹åÇ+îc´fF˪wåŸßnÚ®åÔÃê÷�1·¶réáû�)Œ�Á÷T-]Pùî�ûƘ÷ßTZÒúœü»ˆ§vؼd‹½ò1÷�1/é¿"›29ÿ¬:óÀŸ²:»o^ˆ÷�1§6Sò÷ãù÷*Þ]òòíU c>îcüðÛÙ¬}f®w^˜ýpJ»�ûƘ½Îý«ä»gòëÕ¦wüPòp…üÞVÜ7ƼléهÝó듇NÍúV¬½Ÿs6ε8ãz¸ë~?egý½U!ÿØVÌ!ž¿f0v*úǶbñzéÓVƒ3Ç�ùĶbq­þvPÕÒ+æý�mÅâ¹õÜïzd»7ËדØVÌ!^ËõÞììì…áGêÛŠ9Äϵ¨ý¾wçÇ7¶sˆŸUW7œ�W\c[1‡x½×äØVÌ!®½qMŽmÅâÚ×äøæý7ÌÎ;;_«oÒ6ëUäñs_ü\ÐuhYÖü»æ…q2kùĬßy- <^çÇëÀËÿ¬˜ÕÚ$¿><ð½Y%‡O¼¼à¯ëâuÅØ ³Õ»ä߯ÆÜbÎñ<ØsÖ=ÙÜ»òï.bn1çx�úý¼†Ù¤Oòïšbn1çxÍ3zç%[ß¹�sÌ-æÏÑ�=uCÖbHîs‹9öN›ìòÎyMê÷h›]µ:Ï'æs®Ýõ–’¾Í?£-]smÉcóþÆÜbÎñsz£õ{f“vÎës‹9Ÿ9ýì쎗òï ~tn¶^ÇÿÌ-æ¦ïaÖåéxi�<}?¬=ñx¬ãˆkr£îÊ–VÍÏö1µ¹5IßÿD®Ojk]žrÓžø±wU*í|Q~ï)~¾ˆc)ޱcéKYqüDî¼hu}~.‹Ü¾§ãµ.oZoÚ�c#Ž™xŽ»£þw-'}šŸs� ©ÝÈÃ>²˜gäö=µµ.OyjO|ß}N,©ùd~¿8~žŠc)ޱ8wÖå‡ç‹öÈÛë¦=ñ87#�c#Ž™xÍбҀl§ ùý8çTÛb»ëòÿ;óÎ}Sn‘7ïûìþcòû§ñócKqŒy¬Óx^—?Vü>J{äikOÜš¤ñyœ›‘DZÇL¼¦½mX�l‹7òë^çTjk]þÿļ»î�·²/ÞÍ¿ï�ßıÇØºs'Σ¦§æ¿ïÕ'ñx¬ãˆ×üUoTòÄ”ü“c;í».ÿ·y´UÇJÙÌc7*—øýC<Öq ¬;¶ÓØÓ~añøF�Eÿ»¿²ásÏ-ÌÇ&{ý•]úpþyê²}ÈV˜_c¯è´2«øà9ŸŽì›îwœ@ÌÄ�Ÿî ?ñ{Û×-�ö}þýF×—·*}þó¦…8î^¿ô�Ãö,ð×[nSÚiJþ½“ñ÷,þîÈøéÞ�<Ý£9Ÿ�Š¿yÞqe¶÷Õùw2-K~ÈF-jTˆY}Û¿Ö~÷uøÌ¿²?öÈÏûk"O÷˜ôI<ö=Öä•ý—d ¯ËëÖà±/²½vË?×ǾǚÈÓý2}�}�5yñô†¥×ߨ¢Ð—ѵ”žuÄþs‹9ËÓý>}�¹Åœ/œøN6®þÙü‹‹²}îï¾6~Ê-æ|,ñÓ½×â's‹97l³Sé‹g—b.ž¼CézW䟡bn1gyºßªOâ1·˜ó}Õ^ɺt>­ÿƒ'ßÈÞü+ÿ#æs–§ûÅú$s‹9Ï}¾qi婇â?S½QéçÕÛ¬­OÊ-æ,O÷»Í?ñ˜[Ìùíff—´íRˆ¹åns³‹nï\à1·˜sìKìcÌ-æüü´Æ¥—o—Æï[­Qéâ©ÅïUBn1gyú½�ù's‹9/nð\¶ôÁŽ…œ[W˜�½Õ¿ÃÚüÓØˆ9Ë[bþ‰ÇÜb·´Ø©ôÛSóøcß¡´^Ë<~Ì-æìú�~ïáú�xÌ-æ|Ï£Og}»çõyýøÙŠ?òúÄÜbÎò´¦é“xÌ-æ¼A»†¥í™ß5(½ôäüøÆÜbÎòô{}�¹Åœï#ÿ9sóñùÏ3²ƒvËÇgÌ-æ,Okµ>‰ÇÜbÎ k×/ýî¸|~½\²MéiŸåó+æs–§ß;é“xÌ-æÜaܳÙk§çëÙ‹geïÜ�¯1·˜³<ýRŸÄcn1çÊ“·*=ãÆ|}›}FÝÒƒòõ-æs–§ß›é“xÌ-æÜ࢙Ù÷½óõyëÚs³ŽçësÌ-æ,O¿—Ó'ñ˜[Ìù’Ó6-½éÎüü²ïÓuJ?Ü;?¿˜[:÷™s:':Òo#�#‰Çs_<'¶¨_µthŸüÞÐSS«”ÎÙ7??ƾǚÈÓïõI<ö=ÖdïOæe‡5ËÏïMƾ‘=?"?¿Ç¾ÇšÈÓï-õI<ö=ÖdÓs6,½¼ø[ú¯Î«Y:ûÑüú$ö=ÖDž~/ªOâ±ï±&£®Ù°tÁ/ùµDÉé5K»Þ’_cľǚÈÓï]õI<ö=ÖdÅ}ïd£>ͯ…F·_”ñ^~�ûk"O¿×Õ'ñØ÷X“�9¾¿ ίåx­Jé—Ëó±ûk"OsJŸÄcßcM8uÓÒÎoæcfLJ딶«“÷%ö=ÖDž~/­Oâ±ï±& öY’�Rü ꇓ¾È>Þ$�ûkbþéw2ñ8ö=Ö$^ëÆkàØ÷XóOkf¼Ž}�5‰×ºñ8ö=ÖDž®uã5pì{¬I¼Ö�×ÀÜ‚/ÿW^�ò ”W ¼å(¯@yÊ+P^�ò üÿ¤ßnijĿ™PxÞZŸÕ£²Ê+rÞ°tt6}ëq{½yc-¾o¥Þ)²~Ëòç‰ý5w|Ö}aç˜{ÇfŸTÍí§}<6xgþL­È£O|&[|ÿKÕI#³!×/ä¹Ù¤²ìîÍr~ïèùzþ>©íªŽÊ>­š?)òèŸáŸékÒñ˲ìÅçóúÌyzTÖ¹jÞ—X‡È£O|æ[¬Õjrz±&Ó«ŒÏv6¾Ð—U-Æf›õÌëëyô‰Ïˆ‹µÚ<Ô¤ú¬QÙê†â¿R�gE>š×'Ö!òèŸ)kkRoÉÈìÕòú4ÞwTöû{yþ±‘GŸøL¹X«ç¨É®Åšì\\¶¦$�ÿ Ïï_0=�ëyô‰ÏÙ‹µZŸšü^¬I¯E¼3ha^Ÿ§xŽþÊqy}b"�>ñw±VÖäµbM殑Už•ßCy^Ï;òüc"�>ñ¹|±V�©ÉŸÅš¬Þnlöù£y}ºón‚ÍãÇ:D}â3ãó­IY±&×|7&[R%Ÿ_µêŽÉŽz>¯O¬CäÑ'>£/Öj5©T¬I÷&#²ÿäs꾓˲>{æùÇ:D}â3ýâó¯%çÏŠ9?¹blöþ¹yþãyÄÄåyþ1ÏÈ£O|`ì‹9ïWÌyâ-óÅ[æù¯©Y–�x1_Óbž‘GŸøÌÀØ—˜s¥�Æe®7¢0òL¿}›çkZÌ3òèŸsûbÎs~yëáÙ [æ5¿õ�‘ÙžG1>/ñ%ržQÌù÷O‡eÏðŽs¾bÊÈlÕ¬ü¹‚1ÏÈ£O|îb|¾¢9w+æ¼ië Ù” ù˜™;{lö7ï±­˜gäÑ'>§1>�ñÏ�óýËý1vb•ÇFfUy?Ǻ}‰9GŸøLÅøüƘóª)²—&ä97[36ëÞ/o+æyô‰Ï`ŒÏ{| äüA�áY£Oòø§¿82ûÄö%æ}âs#c_bÎOqmòÔ³yÌõÆewUÌëóŒ<úÄçLƾ|DÎ;s~û‚áÙ7äÇ÷…ŸFf5yŒõ�yF}âs)ãó'cÎu~™�­÷vžóøã²n7ç<æyô‰Ï±ŒÏ«|'ä<¢úˆì®òùuÄþeYãâ3'cž‘GŸø\ßøüÞZ!ç^œ�-âù¹ÖäÄšã²Ëyž¯<æyô‰ÏÌŒ})#çÁÅœû½:"Û£Qžëûʲ¾'äc)æyô‰ÏØ´/£‹Ï(öœøYñœøM¸Ö�×´ñ<yô‰ÏÑ�çÊEÔäƒbM¶áZ÷Êâµn¼Ž�uˆ<úÄçŽÆZY“=‹5©Âµî}ÅkÝxëyô‰×´±V‘§g–úwyéÙÎßXÏ ãyÆoq½½å˜ÑÙ¶Ûæç‹øN¥¼ ½ë°?Ge{×Î}öá]:Ïüœ�™øžˆø>ˆKO•½Z|ÖòmFe yG”9Ä÷|ÅwâlümYVíÐÜçÓ9eYÃÕùœŠï�Šï‡zíqž�[–û {¤,;÷ˆœÇ÷°Ä÷­Ü0­,kòK¾¬÷^YVwTÎã;€âû�V®Ç3“;å>÷ñ>¥7¶Èy|/O|ÿÎäëFe?‘�ó{Þ•Í~!çñ½ñýÍw�=^\Ã�æØÆäþñ=#ñ}"ƒŽÎzNÎ}†ïÈûËÞÌù{ÿë½lñýk']À;Öä>_=1&»Œëxëß{ßo5ké˜ìî+sŸŸ6àù½ósß¹ßT£þØlýyÍj86kÐ7çñ½Wñ�>l16;ó�ܧÆc²ûx›ùÄ÷(Å÷%ÍâÝX[óŽ'}¸kL6鑜Ç÷žÄ÷›ÄÞjßëk�Ñ^áXÄ÷jÅ÷g £æËŠ5ïBmß-Ö6¾WÎc‘ÞgÍ//Ö<Ö6Ö0¾/)Ö<Ö6Ö0‹XóXÛXÃøþ¬v�Î>¨œÏßñÌýŸŠs?¾ç.¾CÊctoñy,¶*‹XóxìnkH\+þÛšÞ×¶8¦MÚ�Ɇšß>¼— ½ç+ë¸æ\Ö–¸†Äµ¨)1‡cúûh[é}X®Q�nÍsˆkQ\sâûû–„5*®Eq͉ïks�:§¸Fŵ(®9qíŠk”kщŵ(®9qír�z³¸F¹ýT\‹âš×®¸ÎÇw¤w8ïâú¯^þïÿ½ Ä÷PÄ÷SÄ÷AÄ÷DÄwpÄwRÄwUÄwCÄwFÄ÷×Ä÷ÅÄ÷ÈÄ÷¼Ä÷¿Ä÷³Ä÷¶Ä÷ªÄ÷­Ä÷¡Ä÷¤Ä÷˜Ä÷›Ä÷�Ä÷’Ä÷†Ä÷‰Ä÷}Ä÷€Ä÷nÄ÷qÄ÷‰Ä÷ŒœvÛÏ™Ïw´ºëžµÏc—§g°ë“žþz�™3vþºEÁ¿ôŒ7þaί-�£Oâîë³…Süô|xã§gÂ듞Ñí¾»tVð7~äÍÇŒ/ØõIü,öMϨ7fäéõÆOÏ�}•}ý�™ù?òŸVì¶6þÏEn|Ÿo™òOï–µ­ôY}ä^—ÿÎPŸÈûVŸTˆ£ÏeEnn>›4ÅOï·5¾Ï Önüô aûþ}ÉÕkó�|ÍÕƒ vã'~ ûú|Ñ?ò½ŠïA>Ÿô¬QãWõ‰¼U1g}*rsëR|ï°9Gžj•j˜êsíÜ|œXÿóOµŠ5´>>ß5åŸÞGl[©V©†Æ7·¶ÏvZ[ŸÈS­b ­�ϧMñÓû‘�Ÿj•j˜â¯,Ž ó�<Õ*Öоû|Ý?½»9Ö*Õ0ÕçþS<¯¿ñ#Oµ²>©†il§øiÌ?Õ*Õ0åŸÆ¶ñÓ˜—§ZÅÚ÷ôkcFžj•j˜â· õ�<ÕÊø‰ÛwŸM�òOïÚ¶­T«TÃTŸ—*œðBªOä©VÖ'q÷MóÔ˜‘§µBŸôÜi÷MsÓš¤9+Ok…>‰Û÷4�yªUªaªO‡ÆŒ<ÕÊú$nn>ß;Õ'½ݶR­ôIÏ÷6·{&^[ŸÈS­ôIÜÜÒ:cÌÈS_RSþim1ÿÈS_Ì?qsóÙï)ÿôîxÛJ}I}LÇ·EµÇÖæyêK죹ýOç—Ô—ÔÇ”<§Džúbþ‰››ÏÞOùW <õ%õ1å¿èÞ§Öæyê‹ù'nnéHù_xêKêcŠH¨ä©/柸¹ùî†ßwj$žú’ú˜âôgþžtó�<õÅü7ßï�b. <õ%õ1ÅŸÆä©/ÆOÜÜ|wFŠ¿Yà©/©�)þìíž(ø›ä©/ÆOÜܺ…õ­Kà©/©�)þzÿk}‹<õÅø‰›[ÊÓñyêKêcŠÿa¨ä©/ÆOÜܦ‡óWä©/©�)~«®ÿuþŠ<õÅø‰»o'ëŽÿÔ—ÔÇ?��uÇê‹ñ7~ºŽ5~ä©/©�)~ºv5~ä©/ÆOܹ“ÖãGžæ¯ñÓû5œ;im1~äiÎ?ñtm–Ægºf³­ôî$ã§w¹oº63~ºf“§ëv}o}`‡+œV¡Bõþ^²ñÕ*DC­jò/‹Q¹B…*V¨pU%ÞyVD¯ˆýtQ]{ôÁõÐ×Ã> ½¸%ú�ØÏAÿÜ }Oìß¡oÖDûÁ耢×Å>]?ýÝï<ô_À­Ñ›cÿ]?ýÝïPô�À�зÂ>]?ýݯ7új°ú>ØD×O÷; ýcpcôzØ_E×O÷»ýwpôØW¡ë§¿ûµCÿ¬…¾-ö×Ñ­ƒõ°.�Ð_+¡WÆ>Ý8Æ3î%è‚Û¢ï�}5ºqŒgÜ£Ñ?k£×ǾÝ8Æ3ncô¹`eôªØ' Çxƽ ý/p;t"÷ºqŒgÜcÑ¿ë o�ýtãϸMÐ_« WÇ>Ý8Æ3n?tljãÅqóºqŒgÜŽèKÁMÐbÝ8Æ3înè¯�UÑ7Àþ8º~ú»_'ô¯ÁMÑwÄþº~ú»ß诃ÕÐkbŸŒ®Ÿþîwú7àfè�±/F×O÷kŽþ&X}#ìO¢ë§¿û�‚þ¸9ú.Ø?E×O÷Ûý-p}ôZا¡ë§¿û�Šþ=¸zS쟣맿ûí�þ¸zìϡ맿ûuG_ÖEß ûRtýôw¿ôwÁè›b]?ýÝï,tç¡óÑy¹ ]?ýݯºóÐù輜…¾ýð|ë`ääVô÷°®ï{c¿¹yý'ìçýôw¿»�‹�Ûб½uÑO÷»éƒ<ˆ¾Ší½Š~ú»ß äbävôÙަ觿ûÝ�\‚ Eÿ•íýô/ìǶKõC_ÌöÃÁ¿ÁþàØG Ý‘kÐga¿4ŽñŒ{+ròúoØû€Æ1žqoA.G¡‚ýHp6x-ØûÍÈÈuès°ïÇxƽ é‡ Cÿû¥ qŒgÜ�È•È�èK°·�c<ãÞˆ\… @ûΠqŒgÜ–ö ÃÑ×`¿4ŽñŒ{=r*rúçØ��c¼B\¶�®ú<ìMAãϸ×!ÖÑzZ×+AãïTìeH7änô/±Çx§c‰œ†Ü€þ*öÝA�ƒÇÃãrb­§uÝ4ŽñºaŽœ‰ Fÿ û‰ qŒgÜaÈYÈ�èó±ïYôÓßýBz ÷ /c{—¢Ÿþî79ˆþÛ÷.úéï~"ç ÷¢Ëö®E?ýÝïä\ä&ôloQôÓßýîGz"÷¡/gûiE?ýÝorr3úÛl? è§a?¶õÒý¶ŸQôÓßýîEœÇÎgçuVôÓßýîAœÇÎgçupëÀˬµ°+µ‘—ÐÆÞ||ĵ Ð ¯ó¿Ã°ï ß·Å®l‡¼‹~4öÁÏÀÙ`kðy°XV…qnW•u|ûáà³à¡àÃlÿ܆í_‚£Ñ�dz½8 ý7pk¶/'¢wG±ý$ðYô?À-Ù®Ÿþî7Œí§€ÓÑ×€[°]?ýÝï~¶Ÿ ¾€þ7¸ÛõÓßý³½;8ÝblÂvýôw¿;Ø~8}=¶×f»~ú»ßÍl?œƒ^ûÆl×O÷»žíç�/£Wž!ÛõÓßýú³½78½:öl×O÷»‚í�¯¢o€}}¶ë§¿û]ÂöKÀùè5±Wc»~ú»ßl¿ |}#ìUØ®ŸþîדíýÀèµ°Wb»~ú»ßYl¿|½öŠl×O÷;�íׂ Ñ7ÅþOÑO÷;™í׃ï¡oÎö¿ÀÑ߯Þ|lNÆþø'hã÷8¶ß.B¯‹ýwÐ8Æ3îQl¿ü}+ì«ÁUèSÁ�àal¿\Œ^�í¿€Æ1žq[³}0ø ú¶Ø�c<ã–²ý>p.ø5ø#vãϸûc|\®Ànãwoì�Áï±ÇxÆÝt9ŸœWß±Ý8Æ3ncÐyä|r^}Ãvãϸ @ëh=­ë×lŸ ÷b¨îŒì‰Ü€>ûN éUxüýð=ð~�…m� Ÿ‡Þ}{¤!r.úxì5ÀéàÕànØK‘]‘+ÑŸÃÞœÞ 6Ǿbæc^‚#ÀSÁúØ÷FŒqú'Ø'‚çƒ;b?i„˜�y�.½a±OÑgúûØÛ�Õ± ß@ß|¼\»Û6@nEûÎà+à-`�â¶�ÁkÑgaÏÀÀk@×R·½‰~'ú¾ð&ˆ9ÜŽ>ûîàãààNØw@ì‡ý±_ƒ£Á³Àí±£Ò }ö£À©à¥à.ØK�aô)ØO_o­�>ÖÙz[÷& §� ÃÀÅèGƒ‚�@aÛ;�Áèû¡7EZ w¡/À¾8 ¼lŒÝÛûc¿Ng‚×�Ͱ+»#ýÑg`/Ÿ/­M#Äí�ýÚÜ ýðIôÎàdðbpsìnÛ9}öcÁ±àÙ`½â¶…è÷¢ï�nßí‡ý±_mÀ�Áá`†Ý¾Yáèa?œ^Úw}ÌÓ|ÍûdÐyâ|qÞØ7Çðô±—€Ž3Ç›cÓ±oæc^û‚Îç‹óÆÜ=ÐÇa?tž8_Ü×±aæc^[ƒÎçƒóÂØæhìWGÐsrw° ½"8< ô<í6Ç¡ãÑqi'ŽÇÍÁ`5ô»Á·Ð[ƒÎç‹sÃmŽǃµsî:FïŽûCÀºè½ÁÇÐ7{�[bw§ˆ ÷ ¿�}ÐvlÏØns�q½qÝÙ|¼ä¿Â6ǹãÝqo ‡ŽGÇå& ý´¿öû0ðSðtÐnC-ŒwÇý~Ø]ç\ï\÷Üæ8r<9®ª€cÀ3ÁmŠÛ …|ÌëPûaÌÝm›"}!Oaß t;ž»n³Öú> ö·*n³Û³Ý#A�£ÇÓcç¶ ‘Ñ_ÂÞœ ^nTܶx!úØ;��‡µw›ãÔñ긵vÎQç«óv°z?ðYô-ÁgÀËÁM°»Íyx1ºó²6h;¶gl·9�œOÎ+Ï®¢».ÇxÆíZ'ëemÜæ

8/\û¶G\]«�®#®'Î=×Û¸ÝóÎv ×³W�Ï£ŸÚûcînsw=w]o¾ ÞÖ,nsw=w]ß4ŽñÜ×mþs<9®:€®£®§®«þó8x<<. ÀY ç Ï nó8{¼=î냮c®g®knóæeîm‘^ˆcÙ>8ÎGŽBº"G"½‘]‘RÄuïäxÄuD.D\­�y˜Ïˆ5²Öú4B\÷.B:!ævÒÙ1GÛ±=ÛµïöÓþÚokàš}1Ò±�'"— ž ì»u´žÖÕÚûc¿¬m}äR¤bîö±/bßìƒ5òx[;kãq:ñØX#çãeHÄœ„\Žx¾²6öá<ľYckÔ ±6ÖÞ1râØ±ï"ý�ˆ50ëinÖÎ>z<í›5ô_‰xì­¡cì*ıem�Ñ1¶ÇÀ=^ææ±ñ;^=öÖÎ1v5âØ²†Ê%ˆÛ¬½m\„Ûc`�ú"ÖÍc`æc^ë`=¬‹ÇPŸ‹·ylí§ýµß­Šr)X¿(ã³�½1C§!ŽcÛOûk¿=¶‡Ë�–ˆÇØ~ØûeÖù d{Ķ=†½�­û:Fz Ž c·kNå|-Ý}Sdú‰Ø'‚G‚ Àô¯"ä-ô›°wÛ€óÀ*Ø•ªÈ+èÇc¼üÜ»²-â÷ðïÞ®�‚Tý>áA xø¸1v¥â÷C° Þ þÖî؆íÙn[Ð<Í×¼ÔB{¶{$öÀ_Á�°+¶a{¶{,x4è÷ÛaWüg=¬Ë3àuà*pkìŠ9˜�y�ö7Į؆íÙî©à•àJp+ìŠ1ŒgÜ3ÁËÁÀšØcϸ炗‚ËÁ-±+Æ0žq{ƒ}ÀoÁØcϸƒ€ËÀºØcϸ—ƒ½À¯À °+Æ0žq¯Ï¿·À®ÃxÆö?×Ç®Ãxƽ <\nŽ]1†ñŒ{;xø X»b ã÷n°+¸Ü »b ãwØü¬†]1†ñŒûè8w¼;îcϸe ãØñì¸VŒa<ãŽý¾‹ÿ âp>8/¦ƒƒ~_V»R™‰~ öàOàdvjvBNE_.¿e{Gp"úrð ðs° lNfû±àhô/ÁÏÀSi¯?r²é�ŒBº!eÈBäT|Ïar´{€gƒ °‚Ÿ^ƒÜˆ|Ž @Æ"§!#‘�ÅÖøza ¤ú}ØAÎ@®EnA¾D"�îÈää,üë°Ÿsmsp4¶÷‘;Œšoä+äVd"r&2¹ƒ�¯ßi‰œIœ°­BNCÌw² ¹y 9 †¼‡ŒCÎe¿£Øïlбó6¶Û�Úží~‹ B&!=�‡�û‘îøo‰¯÷`6CÆc»ù±Û³ÝåÈ]Èdäld(ò.r:ûoÊ~®)uÁ‡±}€Ü·Û³Ý�ÁÈTäÄÚ«?‚Ž¯ß ·CÛC°ý„ØŽíÙîJÄz=…œ‹X£EÈ£HO÷e?Ç�ãa!¶[á¶c{¶c<ãNCz"öÝãìñö¸{käqlw#?"¶c{¶» ±Íg‘ócyœ=Þ÷#ˆ³øúGÈ-pÛ±=}E¬Ùt¤bÛök r¾~§î8p<ØžýµÛ³Ýß�ù Èùˆ>"O"ç±ßá´ï8p<¼‡Ü ·Û³Ý?�ÈL¤7â1V<ÞwïÖFžF¿Y�ØŽíÙî¤ ™�\€XS�³ÇÛãîZR|ýcä&¸íÌDF #Öjr!b�!Ï!mñõž„ãÀñ`lÇ‹íØžízt.¼Œ\„X»ÅÈóH/¶µ¥}Ç�ãa2n;¶g»ë¡Û×yHÄ>šƒÇÛãþ:²12ýä{ÄvlÏv+³Í¾¾Š\Œ˜»Çù Äãîš¹-8 ýSäF¸íØžíVEŸÎG.AlãväE¤ Ûæ#Žƒ)èöm9b;¶g»ÕÙöør)⾟ /!ç³Í5Öqð$ºãâxwÐõj ²ú$pÒ¹ ¹y9„mÞû.EÞD·ÛÁÍÓ|Í»&údðmä2äVÄ:^7¯!"sÑ�ýbžækÞ±m*¸¹¹qœ8^7‡�}ðôÏ�ëáæi¾æ] ý)б}bîŽÍ÷‘®lóž] Ä1il�…yš¯y»FOý�›ûðr(Û^E‡ŽÇAÈ·ˆyš¯y»Æ= ZÛ+kºyéͶÖäï8t<:.ÀÍÓ|ÍÛ5b:è¶«�‘�í±Œø„ıcŒmàæi¾æí³¿ó«÷u y¬·¯ Ukx=¶oó4_óvŒ^öGNEô±­Yˆµò\o.ï¢�\7Oó5o�‘9_ƒœŽ @´ïˆýÄ{©Õ�ƈ~ú›§ùš·mx\®EÎ@ÌÅ»`?™‡8^ÄæØ^†|Ž|Œ\ ù9ÎïÆ¼>ñØÿƒ~*ø*èw 7÷«”·Õ~ âoH@vC<ÆžóŸGNFþB?,ÌuöwîlÃþŽã¹Ha\c«ˆì‰\ƒíkä9øIÈŸð3ÀÙ`û›ÛÖìÿºãÙcâ5SCPYŠíðäDäwô³@ûaì×–ìïqÛnŽ •�–ÈuØ=žO#' «ÑÏ퇾ök öï�žÁ[!/#‡"ŽwÇýWÈ“è‘_àž;ì‡ý±_›±ÿ—èMá"­Èßqîx_‚ô‡OAŽC~Fwí±öÇ~mÂþ3Ð]OJ݆쇴FžÁ¶%ør ò#ºÇÖ~ØûU›ý�£o!룿„‚¸^9÷­áãèG#+àŽûaìׯìÿºãÙq]JþŽÕ}�ÝÕà£È‘È÷è�öÃþد Ùßyw¼ âo<6®7ŽgçãMÈÎˆÇøbÐ~ØûUƒýï ®Ksûþºk‡µ}ýä;ø¥ ý°?ök}ö÷97Ì-#ûè|ø¹ >9 q®_Úûc¿ª±ÿóèŸ"%è«‘}‘ÈÓØ¶Ç!Î9ëqhæc^UØÿztÇ®ëÊ‹ÈÁˆµtíù÷˜x,®ÍÃ|Ì«ûkw¼+%äïÚ૟þ£cËãaæc^ÙßuÓµÅ1ù+"÷ºî¸žŽDœÛŸ¡;ŸlÏ|ÌëÚ»Ý6«!³kézãºc ‡ÃKkthæc^±¿kбð>HKtç�óÁc×|±¶“ëÁÏ@ó1¯?ñw�q½9ùÙi†<‰}3ðAÄmމAó0óú�ý¯Aw½©ˆÌBŒízv-öÏ�ûáÎ)ÇØM y˜�y­fëéx·f Û÷NˆÇù ð>Ä1ᘾ4ó1¯_ð÷¼×ÞY…œŒ¸¹.m ÞƒØ'çØm y˜�yýÌþס»^UBf"­×£þØ— wÃ÷BœÓw€æa>æõ#û{vŸ‹‘ýÑ�CçÅåà�Ȉk„Ü<ÌǼVàï:ãœ3§ŸÛr œ‚}Ð6wG\£îÍCù÷ìï8u¼:†öC÷Øî6ì—�öyWÄ5Ñ6ÍÃ|Ìå;ü½îh?ù qq=q]©:f!/¡Ûgó0óú†ý—£·‡_‚´@w‹8.û‚× �YèÖÜ<ÌǼ¾ÆßyÞnMDÌíxä ìµAÏ“ž/=ozÌ_wKK±;N/Ž›}ÑËŽשKÁ�±Ø_FwÌÙûc¿¾Àîu›}6ÆJä$Ä9ì¼®^‹x¾œ�ÚûõöSÁŠà�à,92©€øÇé`%Ð9û"R)C*#'c?Cxø²>2©Žœ„Ý8Æ3î\dCd,Rñ»ãϸ¯ #ã���Ø®Ÿþî÷bMÇ#öÍï:ôÓßý^Gs�½ß]ê§¿û½‰l†<Œ8·Ža»~ú»ß[Ȉk³kŸß7è§¿û½ƒl‰LDê"~×O÷{ÙyÙ ñóª~ú»ßûÈ6ÈcH=ÄÏsúéï~ Û!�#Û"mØ®Ÿþî÷Ò™„ÔG¼ž×O÷ûÙyÙñzS?ýÝïS¤2iˆx½¤Ÿþî÷²2Ùñ|®Ÿþî÷²32q¾z¾ÑO÷[Š4AžDÏ®‡úéï~_#»"O!Mç»~ú»ß7ÈîÈÓÈnˆó¡:èxZùÙ™†4Cöf»qŒgÜ�g�=ål7ŽñŒ»ÙyiŽìÁvãϸ?"û"Ï!û »³Ý8Æ3îÏÈ~Èt¤²+Û�c<ãþ‚€<�ì�4a»qŒgÜÕH òÒÙ™íÆ1žqGJ‘H†ìÄvãϸ""Î×SÁF qŒgÜ¿�ƒçëéà qŒgÜ�Cçë`°+¸x5X܃Ô@þFNA¶Å~¸=X…TCÖ '#Û`¿l®ŽD*! ]�zØû�;‚¶c{¶ûr²5ú`cÐvlÏvE:#[¡_îÚŽíÙî*äDdKôËÀ¦ íØžíþ„tBê¢÷wmÇölw%r²ú¥`3ÐvlÏv@ŽG6G¿Ü´Û³ÝåHk¤2zw°9h;¶g»ß"‘ÍÐ/÷mÇölwÒÙ½èùÇvlÏv¿BŽC6A¿ôülã÷KäX¤ú… ×OÆ1žq?GŽAj£_z}kãw Ò©…ÞlÇxÆý9Ùý|ÐχÆ1žq#G!¡÷[ƒÆ1žq?DŽD6D?<4ŽñŒ»i‡ÔDï úý’qŒgÜ÷�#�èç‚~ÿfãw¡6dôs@¿Ÿ4ŽñŒû6r²>úÙ ßßÇxÆ]€´Eª£÷ý~Û8Æ3îH¤úY ß�ÇxÆ��ŠTE?ìÇxÆ}9Yý4Ð{Æ1žqç!­� èÝÀN qŒgÜ—‘ˆóq¤3vÇ™ãÍq7©†8«"]°ÛŽíÙîlÄyè|\9»íØžíÎD† ž†n½¬·u?}(ö_¯·ÎE¯…Ýóå¦àé ×�wÂ{¢oÙéŽ~?öÕˆß ��nݬŸý?ô;«»à€g¢{<Ž‹^èðÿ†x½v>úFØ=Ÿ×Ï½Ž¼>ì�¾üdk¤úƒØG^C.D·~õAן À¿±[ ¿û:Ýãæñ³þ�ó±†[ëa]ÏŽë>è#°ÿ�üƒ\‚žaw=u]½ôzÏ5ÚëÅKÑkÂ;‚ÖÑzZ×{à#Á¾è à!ÖÑzZ×?‘¹ÈåèßíA×ÇËÀ5Ø=ÖÖÑzZWÇ—¶+À9Øï…[Gëi]�¯ÎÛ~èeØ�ñrzKìž/N¯½Þ”{½y5zeø  ÇÁãáq¹> ì�¾ücÄãàñð¸ûEäZtÇ_CðJðÐÚ9–­³õ¶îŽ�ÉuàLìCà#@ëmÝ]�\— �Æî1´F7 ï�Ýó¡5¿œ�Ýc1 ¼½üDÐãàñð¸ÜDoÿñ8x»ÇÔ9~'ú>ð�AÇ‘ãÉcïœw9žK'ƒŽ#Ç“ãê!øð.ô�á_ �‡Ç¥ÜqâxqÜì^Þ ®Â~|&èxqܸ¾™“ãÍq7 n�­·uÿñ¼9ýaìæò xzsxÐqäxr\y®˜ :žW]A�™ãit8üð^ô&ð¥ˆÇÁãáq©wœ8^7MÁËÀûÀŸ°÷„[Gëi]¿BŽG† OÄî±ø¼}Oø® ãÄñâ¸ñ\ø(øú®ð¯ëh=­k5¸ÇÙãíqß ì >®ÄÞ n¬‡uY†x]2Ýû ޵Á‡Ð›Áw=Îo�»çòÇÁaè»Ã¿A¬ƒõ°.ëÃ=N/�[3ðRp8øöÞð�àGHkø·H'¤ âçZç’Ÿƒ;ƒ»!{°ŸÇÉãåq»îçlk¶òb›®­7!5àÖÙz[÷=ÁK@×?÷_ZgëmŒåȉH;Äï\+¾›"{áçqðxx\.‚Ouò=âqðxx\6„[gëmÝ›ƒÝA× ×�>pël½­ûˆ}õû½�k­óÜùî±Øô8x<<.ßµí�¬@<�ËÆpël½­û> û´B¾Ån-œ'®×!KØÞÎÄîüÑ> ýZð3ðpdÑO× Çü�ÈçèÀÑ ëŠë‡öqè7€_€×ƒcŠ~ú»N:fnA¾DŽ­ÏEû#è7ׂ7�Š~úÏÄÏ|Íû+ðVp"èye\»ùš÷×àmà£E?ýÍÓ|Í{x;øøö{áÚÍ×¼¿ï/úéo;¶g»ß‚ƒÀI ×ƒáÚmÏv¿ïŸ(úéo;¶g»ËÁ»ÀÉ ×Mrí¶g»ßƒwƒSŠ~úÛŽíÙî mNbצ؞í®ïŸ,úéo;¶g[+AûüøvÛÖn{¶û#xøtÑOÛ±=Ûý ´æÓÀEØí»v۳ݟAϹÏýô·Û³ÝU ÇüYðCìsí¶g»¿€žóž+úéo;¶g»¿‚޹éàbìŽ%í¶g»«AÏ9Ïýô·Û³Ýß@Çü à'سÚmÏv]ógýô·Û³Ý?ÀàLp vÇŽvÛ³Ý?Á‘ଢŸþ¶c{¶»,gƒŸcwÎi·=Ûý ¾ê§¿íØžíþ Žç€_bwìk·=Ûý¾TôÓÿsülÏx*åßµ½ŒþêUØ´Ûžíz¿`8},¨¿íØžíú·hãÁyè˰÷ƒk·=Ûõ~Åðtýô·Û3^eô‡ÁWÑ]Ÿ.‡k·=Ûõ~É#àkèúéo;¶g¼ªèÁùè®ï}áÚmÏv½_ó(ø:º~úÛŽíÏ¿u{ |Ýuó¸vÛ³]ï=¾‰®_áoãð�>Ý¿…›.@wÝï×îzåºåýª'À·ÐõÓß<Í×|ü[¹ÉàÛèž·.„k7_óö~Ùðtýô7Oó5ÿ–n*¸Ýóno¸vó5oï×= ¾‹®Ÿþæi¾æãßÚ=¾‡îuC/¸vó5oï> ¾�®Ÿþæi¾æãßìM¡{ÝÓ®Ý|ÍÛû•Ï€ ë§¿yš¯ùø·xÏ‚¢{Ýw\»ùš·÷KŸ?B×Oó4_óñoõ¦ƒ‹Ñ½îí×n¾æíýÚçÁ�ÑõÓß<Í×|ü[½ÀOнî?®Ý|ÍÛûÅ3ÀOÑõÓß<Í×|ü[>Ï—; /bïj7_óö~µsÚó©~ú›§ùš�ëçùr'Äóêi vó5oï—ߎC×Oó4_óño=�6A<¯vµ›¯y{¿þfÐó©~ú¿6g‚Ûƒ³ÀÀÙ`}ð%°¨ŸºöÁ9`Cp.ØÔO]ûÎàËàNà+`P?uíMÁyà.àkàn ~êÚý»îWÁ]Á×Á=@ýÔµûwÙóÁfà›`sP?uíþÝõà^à[ྠ~êÚ[€ À}ÀwÀýAýÔµûwÓoƒû�ï‚% ~êÚ3p!Ø|lê§®ý@ð=°ü<ÔO]{kpxøx(¨Ÿºö6à‡à!àÇàa ~êÚƒmÁOÁv ~êÚ�?�?�õS×Þ\~ ê§®ý8ðsðp)ØÔO]ûñà—`ðk°¨ŸºöÁ¯ÀÀoÀ“@ýÔµw—��ÁïÀS@ýÔµw¿O¿OõS×~¸ì®»ƒú©k?ü<ü< ÔO]{p%x&ø3x¨ŸºösÁŸÀ³Á_Àó@ýÔµ÷W�=ÁÕ`oP?u퀿‚烿ƒ�ú©kïþ^þ ^ê§®ýRððbð/ð2P?uí—ƒkÀ¾à?`?P?uíW‚ƒW€3Á«@ýÔµ_ :Ï�ï•X F‚À2°"8 \VÇ€ú©k VGƒÕÀñ ~êÚ'€UÁqàúà# ~êÚ'‚ÕÁ‡Áàc ~êÚ77ŸõS×>¬ N7§‚ú©kܜ֟õS×> ¬>n> ê§®ý9°ø ¸ø<¨ŸºöÀMÁéààLP?uí³ÀÍÁà–à‹ ~êÚç€uÁÙàÖàË ~êÚç‚[�/�Û€¯€ú©k¬Î·çƒú©kÜ| l¾ ê§®}X|Ü|ÔO]û;àöà[`#ð]P?uíï� Á…àNà"P?uí€;‚ïƒ;ƒ�ú©k_ 6?›€Ÿ€ú©kÿÜüÜü ÔO]ûç`Sp ¸;ø%¨Ÿºö¥ànààà× ~êÚ—�ÍÀ¯À½ÀoAýÔµî ~î ~ê§®ý°9¸Ü\ ê§®ýGpp¸ø3¨ŸºöU` ð'ððWP?uí«ÁýÁ_ÀðwP?uí€-ÁßÀRp ¨Ÿºö¿À üt^ÿ ê§®ýÐyî|o6¨œ§°=8}ð°~Õµ7‡�;‚Gƒ ÁÃÁÆààÎàPpðp§"ªko >úÜ�ÃÀ&`kÐçÜ6ï÷w+¢ºö½À! Ï9Ü|ô¹ƒÁ}À{Á}AóMýQ×Þ¼ôïŠì‡ý1ïýÁ;ÁÀ»Á– ù¦þ¨k/ïý»#ûaÌÛç6ܶ�‚æ›ú£®ý ðð`Ð~Øón ÞÞ šoê�ºö6à­`[Ð~Øó> Þ šoê�ºövàM ×d?ì�y^ Þ¶Í7õG]û1à à± ý°?æís3®;€ÀŽ ù¦þ¨k?¼ôïžì‡ý1oÿ®¥x"xØ4ßÔuí'�G‚]@ûaÌÛç~\ ž^vÍ7õG]{7°?èßUÙûcÞ§�ýÀÓÁ«Àî ù¦þ¨k?¼<´öÇvÏ/{€W€gƒ¶—òQ×~x9èße™‡ùØnOðð<°/Ø ´½”�ºöóÁKÁÞ y˜�í^^^^ ^Ú^ÊG]{°èßu™‡ùØî%`oðRðB°/h{)uí—�€—ƒæa>¶ëscÎû�çƒW‚¶—òQ×~Ø ¼4ó±Ýþà9à5`OðZÐöR>êگπæa>¶{=xxx6x#h{)uíÁàM y˜�íÞ voÏom/壮ý6ð ðvÐ<ÌÇvïO�§ƒw‚¶—òQ×~xx7hæc»ƒÁSÀ{Ànའí¥|Ôµßv‡€æa>¶{?xøx2ø h{)uíCÁ.àC y˜�í;�ÃÁÎàÐöR>êÚG‚'‚e y˜�íŽ;‚£ÁÀ1 í¥|Ôµ��Ç�æa>¶;<œvm/壮ýð8p"hæc»�‚‡‚��mÁÇAÛKù¨kŸ¶ŸÍÃ|lw2Ø œNm/壮ýIð@ð)Ð<ÌÇuëi°=X<œº^¥õL]{CðhðÐuÌõ̼Ÿw�ŸÍ7õG]{ð0p:h?ì�y?¶w_Í7õG]ûžàÁà Ð~¤þÌD¯Ã¥‚² 2 ÝþÙÏ‘`Å*sp=pX VÇ€UÀ±`UpX  V'€>—àapð°8¬> ú\�ÇÀ�ÀÇAŸ[3¬ >ú\ˆÉ`p ès9&�µÀ'AŸ‹ñ¸9ø4ès_¦‚›‚Ï€>wâYp+ð9ÐçžLë‚σ>—áp[pès¦ƒõÀY`p6¸=ø"¸8¬¾6_wç‚;�sÀ†à+àÎà«à.àk ÏÍ™6_wßwßwçƒMÁ·@Ÿkò6¸'ø¸¸l¾ î ¾î¾ú\˜…`sðÐç’|î~úÜŒE` Ð~µí‡ùš·Ï�±Ÿö׺d u°¿ö»´NÖË~·í§ý±_‚ÖÁzØïƒ@ûiì×Á u°ö»5h?í�ý:´ÖÃ~ ÚOûc¿Ú€ÖÁz| :N�ŽËÃÁOÀ¶ u9´ö×~·­“õr\û\DZãÕq{è8w¼[7Ÿk´l~ ZGëé¸?tœ;ž×Ç�ÎçƒûuÍÓ|Ì«#hã9/|n‹óÀñî¸?tž8_œ�@çA-Ðq"èmú9t'ÐÏ›;ƒ~®lúùqWÐω»ƒ~Üôsß^ Ÿïöý·/èçµý@?—úù«ôsV)èç©  ß›´‚*"' ùÁà‰Hë¢íð$äPÄmm�.H[DŸÃ�“‘Ã}�@NAÚ!îs$Ò9 qߣ‘öE1Æ1EÛ± ±Ž+Ú:€Æìˆ¸íxÄØæªO'Ä6ÌUßΈm™«¾æh›æ¦¯9éc.Ƽy‘óÄÔc ãa)8ý6ì_#ÚGaÿü üSôÓÿz|^Ãÿ;쟣ÎG¿û7ˆöG° ~.-úé>ïàÿ3ö/Ñ¢û»€sûì?a_ ®Ÿ,úé?¿§À_±®'�7cߎýµ?�¾üü|¢è§ÿóø=þ€}¸ Þ€}ö×þ8ú ððpBÑOÿçð ~…ý[p 8¼ûÖì¯}ú×àwàgàÈ¢ŸþÏà÷ýÝŽ±¸Ý|í�ýÚ’ýµо-ø=h?ì�~ú?�ß_ì¿ Û@7_ûc¿¶`í£×W€öÃþè§¿¿?ø“ý·fûJtóµ?ök3ö×þúVà� ý°?úéïï'~gÿ-ÙþºùÚûµ ûkÿ{]ðgÐ~Øýô÷8{¼=î«ÐÍ×þدÚì¯Ýãíqÿ´öG?ýý�Äjü·@ÿÝ|í�ýÚ˜ýµ¿�}sp5h?ì�~úû;�_ðß ý7tóµ?ökCö×þ.öMµƒöÃþè§¿ãÌñæ¸ût;ž×KíŽ7ÇÝŸ ãØñ¬Ÿþ�àó3þ›o ºùÚûµ>ík{ð/Ð~ØýôŸ€ß�ø×FÿÝ|í�ýªÆþÚßÂ^ ü´öG?ýÇá·ÿ�Ñ+TÍÛ3óªÂþÚßÄo#°"ÛÍÃ|ÌKÿ1À÷øoˆ¾ºí™�yUbí¯ã_¬Ävó0ýô…ßwø×@¯Œn{æc^Ù_ûkøoVa»y˜�~ú�Äïü×G¯Šn{æ3û?ˆöWð¯Vc»y˜�~úÇçkü«¡WG·=ó…ý/Dû\ü«‚>OÕ<ÌG?ýÂg)þUÐ7@·=ó1¯?í/á_ôy­æa>úéÿ >_à_ ½&ºí™�yýŽhÿõ@Ÿk棟þ÷ãóþÑ7B·=ó1¯ÕˆöYøW}Þ¬y˜�~úßǦOñÿ‡ñX ÝöÌǼ~A´ÏÀÿoÐçÙš‡ùè§ÿ=ø|Œÿ_l¯ƒn{æc^?#ÚŸÇ èórÍÃ|ôÓÿnLáÿ'Û7E·=ó1/#¥ý9üÿ}¯y˜�~ú߉Ïøÿ޾9ºí™�y­@´?ƒÿo Ïû5óÑOÏSž¯Ï›>¯Ø<ÌG?ýoÀÇó�ç�zèž/=Ÿ^�ý D»çÏ;>Ùó¨çSýô¿Ï7žw¶E÷|íùüìŸ!Ú=ßxÞñyËžÇ=Ÿë§¿ï…¨øìù7ø^ïï²¹ðœ$àü×ñø#Oíý?ný¿ÞP}eþŠ-q­õ¿¸Õæü^õ=õô3þŸÿmSõfÞwñ¿ù”oûŸ+àø¨ßŒu«x¼ÆÕ5 ü_yÊ+P^�ò ”W ¼å(¯@yÊ+P^�ò ”W ¼å(¯@yÊ+P^�ò ”W ¼å(¯@yÊ+P^�ò ”W ¼å(¯@yÊ+P^�ò ”W ¼å(¯@yÊ+P^�ò ”W ¼ÿ߯€7P·!7Püû‹éRú»þ<…+ˆ‰W¼fàþmHòÙ4ðº�× ¼~à oxÓÀùÓ†µñ›Þ"ð–�· ¼uàþ oÊÓ¿ÇM¼}àþ}n²û·¸‰û7º‰w ¼{à=ïxïÀûÞ7ð~�÷_Ë+UøÀÀo |PàƒøÐÀG>:ðñ�O |RàSŸøôÀg>'ðy�Ï|Aà _øâÀ—þeàË_øÊÀWþ[àkgد=Ö•¯x͵¼Rá}•Ùß?œÛ4Øë^/ðú�7 ¼qàMoxóÀ[Þ2ðV�·¼màíox‡À;Þ%ðn�w¼Gà=ïxŸÀûÞ/ðþkyÅÂó�óÚV,<ç7ñ[ƒÏ À>$ð¡��|tàãŸø¤À§>-ðé�Ï |NàóŸø‚À¾(ðÅ�/ üËÀ—¾<ð•�¯ ü·À×^�¿5Lu®¸ƒ˜ì5¯ø¦�× ¼^àõoxãÀ›Þ,ðæ�·¼eà­oxÛÀÛÞ>ð�w ¼KàÝïx�À{Þ;ð>�÷ ¼_àýøÀÀo |PàƒøÐÀG>:ðñ�O |RàSŸøôÀg>'ðy�Ï|Aà _øâÀ—þeàË_øÊÀWþ[àk÷ïŸÓ8÷o±÷ïÂ÷oÔ÷ïå÷o÷÷9‰ûL„ÄëÞ0ðÆ�7 ¼YàÍoxËÀ[Þ:ð¶�· ¼}àïx—À»Þ=ð�÷\Ë+žÝ›÷½Rá¹¼‰÷ >ýмb…Šúû€µœõ-¯TáÖà?(دå+ YË+UüGûèµ¼báÙ:)·‰ÁÒZŸJ…çë¤ã8-اÿ™Á>g-¯XxvlŠ??ø/XëS©ð|×Q°/þK‚ý˵¼bᙫ)þòà¿r­O¥ÂsQSüß‚}Mðw ¦8•×òŠª¯å•*Ô,r�W­`ßt-¯X¡îZ^©B½à_?Ø®å Ï8E-\G5 öfky¥ÂsIõ±ÝÁÞr-¯Xx¦¦>^�µö¶ky¥Âs-õ1Nû`ï°–W,<3Sãt önky¥Âs,õ1N�`ï¹–W,8ð!Áh°�öÑÁ>>ð‰�O þSƒ}Z°Oö™�Ï |^ðŸì ‚}a°/ |qàK‚ÿ—Á¾,Ø—ûÊÀWþ[ð_ì>\•|þ-r�QõÀ}Ž˜>ÚkŸ–ì> ,Åñ¹_É^?ð†�7þMƒ½Y°7ö�· ¼Uðoìmoxûàß!Ø;Þ%ðnÁ¿{°÷¼gགྷŸ`ïìýïø€À~kàƒø�À‡>"ðÑ��|bà“Ÿø´À§>3ð9�Ï |~à _ø¢À¾$ð/_øòÀW¾*ðß_¸Ï JãÖç÷$î³t÷¹6‰ûŒ™Ä}ÞKâ>{%qŸƒ’xýÀÞ8ð¦�7 ¼yà-ox«À[Þ6ðv�·¼Cà�ïx·À»Þ#ðž�÷¼Oà}ïWä®'ýƒ}@° ö[ƒ}P°ö!� >#‚}tàãƒÏÄ`ŸøÔà3-ا>3øÌ öy�Ï> ‚}aà‹‚Ïâ`_ø—ÁgY°/|eðY쿾&øT¨–�U�EåÀ«¹«~Í`¯ø¦Á§n°× ¼~ðiì�ƒ½i°7 öæÁÞ"Ø[{«`oìmƒ½]°·öÁÞ)Ø»{·`ïì=‚½g°÷ö>ÁÞ7ð~Á§°ö�Á~k° öÁÁ>$؇ûˆ`ìãƒ}b°O ö©Á>-اûÌ`Ÿìó‚}~°/ö…Á¾(Øû’`ÿ2Ø—ûò`_ì«‚ý·`_쪇ñ_äŽùêÁ^3Øÿ{o®cöý.B†eHˆPZ¤Ìd%ÕZÏC!’&*$SfKJ”¹Bf*dXJ’™¬ç1+3™ç ™2”¤Röÿwß×Y×÷îý½Ç»�o¿Ç±÷>¾Ž£çÿ?ÿ÷uŸ×}]çy Ï}ßÖ“ÇÓóyzAO/âéÅ<½„§ßíée=½¢§'{zUOOñôjž^ÃÓk{úcžþ¤§7ðô†žÞÄÓ›{z+Ooçé�<½‹§w÷ôÞÝãý<þ¶Ç{|¸ÇGx|´ÇÇ{|²Ç§x|ºÇÓ<>Çãó<¾ÐãK=¾Âã+=¾Öã_{|³Ç·{|—Ç÷yü�Ç�yü¸ÇOyüœÇ/zü²Ç¯züšÇ²ý»WÉäñ¬Oôx�çóxA�ñx1�—ðøÝ/ëñŠOöxU�§x¼šÇkx¼¶Çóø“oàñ†oâñæoåñvïäñ.ïîñÞÝãý<þ¶Ç{|¸ÇGx|´ÇÇ{|²Ç§x|ºÇÓ<>Çãó<¾ÐãK=¾Âã+=¾Öã_{|³Ç·{|—Ç÷yü�Ç�yü¸ÇOyüœÇ/zü²Ç¯züšÇ²{ùïñ¬Oôx�çóxA�ñx1�—ðøÝ/ëñŠOöxU�§x¼šÇkx¼¶Çóø“oàñ†oâñæoåñvïäñ.ïîñÞÝãý<þ¶Ç{|¸ÇGx|´ÇÇ{|²Ç§x|ºÇÓ<>Çãó<¾ÐãK=¾Âã+=¾Öã_{|³Ç·{|—Ç÷yü�Ç�yü¸ÇOyüœÇ/zü²Ç¯züšÇr$$ãö�ö<Å<^M<ü«ûŠŽó¡¶§?æéOzzOoèéM<½¹§·òôvžÞÉÓ»xzwOïíé¯{z?OÛÓ{úpOáé£=}¼§Oöô)ž>ÝÓÓ<}ާÏóô…ž¾ÔÓWxúJO_ëé_{úfOßîé»<}Ÿ§òôcž~ÜÓOyú9O¿èé—=ýª§_óô„Äó'“ãäOVOOôô<žžÏÓ zzO/æé%<ýnO/ëé==ÙÓ«zzЧ׫©¿A«ûDYóÖþ^ëýÁ‘]0´³&:¼øðoõwjí¿z5nÿÊ‹�Z—¯X±’iÿwQ�§ÿùïëËÙþ‡¿[pÜÙ—ø»¸ÿñ¿ñÙ{¿éëY§ä ÎËÚÜá±Ü¡],Äÿxþ´³6ÿNmÖ•ÿµ¿Wk¯?×ÿ?ð×I?+Ä ù0þÃY?ÿþ°ßŠøöÿ›8×fíQÿÿþ¿ÁÃ^ òý%tÒå|úõ¿Rî?+C]zìä[Œÿð_Ö‰ÿç|ûÏüýÏŽáövÌ×ÿWÛD=Öžÿ«ñÃæ�{Cößj=s­–;üýœþãKV õ~•6Ê[mËæáÑÍúßÊ‚ëíHFeÏâéᎄã¼ÏÙOhó£¶ôAþ þ‡ÿt«óÿÑÿÚýÎdžæœþä?».;þŸ]׋¯j¡èž÷ßýüÝlUâ¯\sÖÑéÁ8Êúvöp}ïìÁ¡ÍyYh›ßíï±ÿw_¯­?ÿÝõüoÿÿk=@~ðÃA¯`°j˜©]£Ú_É#’[æ)§†Œý2ZdÕÞÔ–%òK{¼ðåþ¡v|RýHñ¾‰ÒþLî;,Ô>Ÿ8!2ä赘~9¥îf½Üˆ¿ýÖDräÜ+mjÓ³CmÐ÷'"'®¤I{î¥^é¡vÏË×#W×¶“¶º×.ýÀ:çösc´yƒŸô34?÷­¨G뙚=ú}¹Z•5c¾Éìaå^jðS*å¶ø×_†uí"ø+[.Ô¨÷Ì•4iϽ4ä¡PãúòäÜ+mjÓ Ï†Úµã½£×¤-ª›Ü6Ô«½%û&Fõëɺ‡Z9õK›ù¥=^8±o¨e½º¾r«<¥q…¡–oÕÞôVA¹ùÇ­Ü–IõcI�¿L›Ìߌ‰bƒƒzë.´zè·&–5¸¾fSíú^ÿþDìhÐŽÙ£¬w¿|=vz-í� ¶övsc¼RÐ/¹ú[¿tJÍï?4ƒ~Ú&c?뿎*7/èç\ý­Ÿo•¿¤uÄ#2ØâÑ^õþÄmö(‹[’®¯HßfSÿ‰¯Ú1.ȃº -ÞU{Kù’y“åË�•{Ó[y5ÿ8yõö®ŠÑŸÝ˜ÜZùWM¢ñºÂ�Ï�–ëq¥òøIñøëúMª¤­*M‘9ù•ýã7$é7$ßÖo… ,Õ‰&_Ë_8þCyýþÉ`å÷üÛ¢ óþª|°ómñõÍôÛŸé·¶^(�Ùïtj­ª·Ç×¼~%sâqý–¨ê-£Xr-ÕË4@¿;¢s/,ú>õz“Âñ�ÍòåÍ¥ÃÉ6¨dôÜ/‡R³,ÿ±|ëB3‡©]K–ÂûS7œÊÏœôô­Ýé÷P[�Fw´ŠÌ8š?¾åõÁ9²� ë8æPüáÄÉY†ë7JÝmñ`ÓHµÚyã»›ÝT<6_kèà’Ñ23Fv¥äŽÿ\¾V¥‰ú‘ûW—�Þs¶AäÆäœñĤ›*¡éÔ¶htâ3"÷ŲľÞ6O‘ÓaiaîÆj&>_·–~@¥Ê²Û¢ù+N�ôqCüD³÷LÒ�2eZ2º±ò‡‘ñGâ*´­uýcýæœêÈ9tb¤vñ¿cù“®Ö~g²~›¤sÑ膽;#GN��{½u¾¿Î…uDÃ1«�X©i•Oõ›aé·E×_ÝÙ<éhì·f##g×ëw‘†•ŒŽû{C¤O‘ƒ±›*\{nïú-¿5e£U>[¹§ð¾ØíI•Ÿ??G¿�Ú]ñ�ð[dQÚ‚ØŸ¯w½¥­~°…xôÇj¬nâîNë4<°ê¶èî# #¿ˆek^­ö•oõ>ï–ŒÎÍ{6²©àœØf¶.¶Z¿¥§:æ=øcä© ³c¥’šµ?×o;Z4Ú£}¶è˜Ú½b7ö}¿Pñ+aå4çÜ ¯—˜Ü+›ü5[{[ô‹™£ó–w�ÝÒ¼à·}¯‘ý~Éhÿ÷2Fke~)V¾ÂÓ/_ß­ß¼Y[6Ú¿{BtÏÑö±JIm»õÒ? XõzÑèøõ7E3]û3=wß-·fÓ÷ôS;ºkë®±õDb“¾u£fëo‹Þv,gôùæWÒïh~Wý³zù?uDÉè̑٣}|)ý¾ yzl:£½÷䂼}ï-ÌCÝ4'¾ô˹O$¶}-ïÕ1-O4aåÙ%š¿ÑíÕq­fÎh”ó ¨p¥'ZSÕñð�9¢ú•›÷%=Û�vŒS;~üóÏTÚÁïHY;i.¡‹ üÛŽHó+©´#¿ö‰ÖŽ’_J¥÷æÿ·gºžO¥פõQ<º+ƒj÷Š�ÃÚpQñ¸¢9ŒxüVVc]ñ˜«xL_Þ5B<¾/ªß±sñx óKâ‘¡´~ÉÅcãÑöâ1¤Œ~SWyUFy57mA„¼š�+¬ƒ¼:®¹“¼zð!�—WŒø"B^eW½›”W_(¯Öœ!¯Žie™©¼úRyUwÃìyU¬š~KHãc�ÆÇ¾ÓÇ#Œ�në`|hÍ‹0>6>£ßèÓøX§ñ±~ÒÑã#¿nL\Òø¯ñѳÈÁ㣔ÖãÒn|”/¼/ÂøÈ[_ãCã|œÆyr,K”q~\}O_Í ×Úã|yý¦Æy>�óî#nˆ2Î[×Ðï Çù¸# QÆy†æú� �óD�óZÅÿŽ0Îû¼¨ßIÖ|u¯æ«©GóG™¯~ÓêPÇ·áe¾ú£›~ëXóUCÍW©µóF™¯ª§ßBÔ|•¤ùj{Jîè%ÍWm:éwUGiÍW™’sF™¯žê¢ß3Ô¼;Rón�ª·G™w/+{©ãVÍ»/jmdÞ}UóûÍ»‡4ïþÕ¤p”y÷gý`afÍ»4ïf*X0ʼ۸»Æ‚æÝË·îO]w*”y÷ÝÞúÝ!­oOž¶`t‹¤(kÅŒ"aoåxfA ­É¬)í4B2±.ô{ÁÞΚ·šéw‘4Bư~T{}ÁÕü…£¬…zÉëLBË�÷Œ²Î´Ò¡Óû�N(hGö?¬wi�o´ãÛãÖŽŸ}Ÿ~-hǹŸ¬g~9”ž1hǤ“ÖŽŒ…÷§¯ Ú1÷í`ýxpG«ØGAÕÚÝ_{�š‰3’W¬*N�u òêÌòŠõcsåc£‚¼š°Œ¼býÈ=tb,5È«¬KÈ«Bë÷îŒm ÆÇ¤³ŒêÐøˆÝŒ�mSnýˆÅ‚ññò*ÆÇ¯áøˆuÆG¦4Ƈ[?b%ƒñ±ez0>4ÎKOø-6-çïŸbœSÇ[Ú«ìÆyéç¬;w\ŒýŒó•Kç¬sòž�-Æy㉌sÖ�¹þ‹ã|êØb笚¯â/óUדÌWÔ¡ù*v$˜¯6f¾bý˜· s|x0_�šÇ|åÖ�xR0_ÍÁ|Åú1 {B|A0_MÎ|µNóîèõ7ÅgónåÌ»ÔÑU{³¢Á¼;½?óî‹Z? ËOæÝýs˜w«knŸ>2{üÌGÌ»‡2ï>¦:r5Éÿ"˜w?ȼ{RëÇÂñùâUÞ®¼(oßMÇôu¼¬=áÖae=‘8¡Z­·NËOØXqQ‰æýµkÒo©©Ž«5Uï“å=P!û´–ª#zcŽxB÷²‹îKúôm4Ú1Jíh¬ƒ•O°R{ѵÁ:8½?ë í(¨v|¬ƒûç°ÒŽ)jÇÁ:xq(ë íÈ®v<¬ƒŸ d$��UÁzÞõ¤­ç·+å‚õ|ó`[ÏÓ�CÁz~jž­ç}ÞËï¬çsGØzÞGñÈxŒõ|ÂpÖsö%•W›‚}Éû§l_ÒYyu]{ຉe>°}É*åU�`_²r‰íK&*¯¾ ö%�'Ú¾d²òªM°/™:öh<s5>.û«Igmu—ÆG’öÔµ·MµýÕÜ«›cGƒýÕË«Ø_1>úý½!ö^°¿Ê”fû«Û>[«쯶LgÅ8]ã<ì'\°}âp�óµGgœÛ>ñj…©±7‚}â™-¶Oœ«q>%Ø'NXfûÄ‹C&ÆûĬKØ'2_]ÝÞ*öY°ßí}Ùö»ã4_•ÕžŸùÊö»·j¾ªìw/²ýî‰ cûƒýîò­¶ß=w¦A,1Øï^ØÌ~·ŽæÝ<šwëûöìؾ}²¾C´ öíß·}{Í»_`ß~î'Û·7Ѽ›=Ø·O:ɾý¤æöž·îOßìÛ¿8Á¾ýë…¹¢{ %V¾ãâ;ñFšëwÖ}æßþŠl:9æÝ늟ÖXKxK¿Ãw2G´ß�'îéÙtH¼f[�ƒ…ú ¿;uϫߢ{º~7,~èýNî{úM:�{)þ|äÞ‚Cã?çÞTð}¯Ø¼ WtýÙ'"+›ˆ7ë37ËGÚëÜj¥GöU¿ü@ù£G$$´V‡v?ymÅÀxöKr]\úK´7’3ÿx¶ 9×ÓoDÊ_ã?wGj§¾¯ò`÷2åôCˆ™Näˆv\½#2æhßøÈ¶«‹¼µ<ô·ç•"Ñ'Jtˆ—É3ºV�±úÎ:'W4÷�ù¢3N7�ï3#oªf‰·Jd‰f¶p´ü'íâã¼Ù;UýðCŽèÏu FÿØ*þCÛþ¥v¬ ý%ÞþH4Çí�ÄëçÙÒ¨æLíáÒrEÇÏJ‰þ6;5þiŸÖ·,=¥µ»x–èMKkFç¨ÏšòÛ…æé÷f�åˆ>ýCõh¿VÅ«·{-¹÷¦ÐßS%:Dw¿R$Þ'ψöï,Óï"~’+Ú÷—¢Ó ä�oè“TøÊOZ“å/¹»h›ž…ã=S¾}¡‰®¥Ã‘Ñs´Š¦¯-ŸÜ®^jÂÞПú.úçÀ½±ÉyjôèµM¿g8%WtﲞÑͽ¶ÄŽôÙZtÉ/úm̤,Ñ åߊþ^nOlgJîvç5Œ8”#zµkßh«7wÆ~l—þð™BŠmô|üùØü<½^øGµãÃ\ÑÙ×ûG3 *öSŸ¶·󻯇üí-1$šÐ²q,Wê³�ój{ö`ŽèÅa£Wg<+Ô~æ#+ô½'QùÂ}Õ ¹öÏ_–çäêå„o'çŠæýN´Ç’ ~îsáv´úòwÛîaÊ·íó‹§vë‚vò@Žh§Šª£Ø±ù¥Û_©�†¿*º¾3ÊA®/½ ~‡R×÷©®ïÚ°§"\ß}Y^‘¿=º¾?Z4Žp}çµVØõý<ãÙ×WCë*þr…ý¡ÿ†TÔïIªÿ„ý¡ÿê$j �¿‰aÿE迼ZßÞSÿýö_„þ+ ½þˆ/9H|ûÔÒ½fÅ÷ ÅwF�üQâ›=¯îÏ*¾÷*¾m{ŽßéºËÑ^ñ=¥øÆÖŒñ-ú#ÿøŸüûª‘~ÓZù7Aù÷ûìÔ(ùWû–„„cò—7Ì¿(ù÷ãÚ¿¸üëßê¡(ù789ô§Ü‹>­kd| k¯ßüÔøÈ£ñ1ûtÓ(ãc�ö±oj|dÓø¨ôI»(ã£TSí½¿ÏýEããï�­¢Œ� ºfÚûûÀ½‘ÜêCÆïã=ô¬¿;4~ó�éeü> gÕø­¯ñûhê[QÆï·íL�ßÖ¿Žö�2~ßÔ³NüUlïSŒ™_ÞÓž÷Í/K4¿¬i> ÊüÒé­eòW^óË�JC¢Ì/�^Ö^VóËfÍ/}W Œ6Òü’çÑÐ_rî% ÉÁ`®{S¿Kª9±õ�é ‹_|'ÊœX^ûà!ò—°tÁÂîß ‹2×¥uUŸÊßÊ3sön:$ÊœøQ]7¬|>FþœûÞ¹>æ¿£gŸˆ­®ïéß_Òõ1ÿ5,Ý8¦ùO×·ó4×Çüwe÷3±×u} ÛÖ¹Äõ1Ÿæ´7ÆΖ§Ù6ú�ù6Å4ÿÑ¿ÐÌmÿÜÓü§þ¾‹þcþëµzGltБè?üÕÜR7ˆo§eÄ—ù¯à�ùâS‚ø>ÿñeþËûláx© ¾YW_æ¿ku Ưñ}cñÅ_>Í}™ƒü«<“ücþûxVJüR�“N‘Ì…–ÖŒ§¨©üË6�ücþküCõxŸ ÿn"ÿð×Psóæ`|tËø`þðË ñIÁø8rœñÁü—Ò¿]ü…`|”›Æø`þ;Ÿ£U|a0>¬NÐøÀßMZ;N('çY1”ñËüwdYÏøâ^[4~ïùžñËü7¹ü[ñïËíÑø½4ŽñËüw½kßx½7wjü>¼‚ñ‹?å^|A0¿ Àüò…æ—Ï®÷�Ì/Ž1¿t—¿}%†Ä×ó˧#™_jþûyØÀx,˜_/e~a­UîÅÜ:pѲ<·¾Å¶7œÿâ5kÑÏ}n:†öœüiþ‹'zgQñÔwßG;ÎñjG,*Ý>û4ü%ëúîSÎÏ3dóó<]_š®¯v0?O8ÆüÜCþvéújóó§#™Ÿ¹¾óº¾ÈLæçÆK™Ÿñ—]ý—¤¤ÿX?îPÿíTÿý¬÷|Ïúñ�ü�Uÿ+ÏúqiëÇ(õß/ê¿¡Áúñð ÖüÕP|Oë[—±¬oß®Šï’`};rœõ­¶â{—âÛ;XßÊMc}{Iñ= øn Ö7ÅWëþþ¼í‘xá`ý­<“õ÷åß`åß�Ÿ²þN:Åú{\þ”±`ýÍ6�õwžòï!åßÈ`ý¸‰õ«um/ûƒNËØdøñèã*O µº7¬ç—ñì�>W&ÓÔP›«{Òz~›Q'wdþg¡VS÷³ë^Få:ñz// µÁá=øØºÚY·ý&Ô*ëÞÿozþÛ±ö7-�5òª©îUª}C»~ 5ò¯ï�ƒ*­×níßr/+ÿ(·>ï¿þ2*ÿð—tg¨QïYÝ¤Þ UB�ë»I÷"¹¾‘µB�qô¾î�ÒŽÇ„Ú÷ü—ö^kjÜó_úeKëPëÿ1xþKÿÝ©?8DŸæuÏŸxtþi+·Y÷Fôü<šýÑÙ»ÌßtÅMÏÏUï¥UVïýº¤þÓõUŸo××G÷ Ží¸:ÃÚq—î}�ѽȎµïûÐÚKþ%ýò×8ëò¯åM,,Z»:«yp}äßÜ Ÿÿgý\Hþîн4üY<Ú©Þ«º÷µ®öÕ·;t}…ƒøVŸoñ¨vŒ òàÒ*˃ájïÝA¾ÌÞeù2È=ÿ¥_È«JczV»^grs=ÿÛ3!a·öWhO¨Ÿ›ëÏäž7eÿm{¨ý¤xÜ!ózö»9Uû+Ê}©¸½­z·ôÜR¸þþP«­øfÑõ�ï9#iãÑP¦œ\½WŸò¬œK¹7ÕÏ”ë•õ_Ù•øÛ”'Ô¨÷¼âF½›µWæ\®/¿âËõU)jóÔŽ”´ãó’¡ÆxSÿEiïíÇ9—uA÷¾¢ª_²Uµ,ËÛ&·Ñ³ú¯LÅP»AùÇ{ ö¼ð«•[§xÜú;gþ¦*nÃz+·z«(¾9ƒë{þ°]_oåÁA;nÙgí(¡|¹¤ü+Ý«Ý.ko'åU� _RvZ¿tPþ=ÕhùÂê½ÞÙaý×^å> ú9e§õsù+¤üßţµêý5ˆÛ-û,n·éú ñ}þ°Åw€Ú¡þST>nyðŽÚ{W˜/ç,_z+ÿôìIyuáWòê±Gß©vç”ï’[Õû%Ö¾]BÂoÚ¢-œ8'u”ó±íþÎÝI¨�¨S*Rùëc±#m¸=ûŠP{vm�H»Ç6Æj·ÍT®ÆšPû¤ÍäH‡ìsb“Ú쪺N{üu;µ$r¢Ì Ø/­}(ï¾Pû«áæÈ�÷=k׺t�¹ÚSS®Ì…}‘,‡ÓÓ[7¨Wüg§U8yqäCÉçZ-}œþ³rU§§RîpÎý¥Þ÷@Oë;¬Õ{¹Ì õž¿+Ô¸¾W³Ï‰p}j/E¹jG¯Ç6FhÇŠ”P¦ö>ôõ±í½òp¨ÍR¿¤M9¡_Þ¨j«sŽMîRï—ý—Ms þOœ“>#(—ñ¢•kU§T,5ð·þ˜ù+¿¶G¬kPïµ�Vï{m&Ç^ ®¯ì»¾&§–ÄÎíXœní8Ñps¬TÐÞ=‹­½y.ì‹e úeÎ|ë—œÇm~ká¹Vµ¿´þË¡r�ýº>õŸâ[vƒÅ÷¯5=b݃<¸¶Óò RØ^åËúc–/ç&ÌIÿ0È«Œ-¯,ÿ¸¶ ýÂþ³ü ß¿ 5Ë?ÞGê;,Ô,ÿÂ÷¯BÍò/|ÿ*Ô,ÿÂ÷¯BÍò/|ÿ*Ô,ÿÂ÷¯œæò�·›¬ÿ(Gþ…ï_ýë�ü ß¿ 5ê%ÿÂ÷¯BÍò/|ÿ*Ô,ÿÂ÷¯BÍò�÷Íôì,È+Ë¿ðý«P³üãÚ¸B?ÿxÿ*Ô,ÿtgHï_…šå_Bï_…šåŸžîéý«P³üKHàý«P³ü ß¿ 5Ë?=ñÓûW¡fùF7Ô,ÿ(Wñt¨Yþ…ï_…šåõöJ5Ë?®o‡¾WÐ^Ë?Ú±y|¨YþéiºÞ¿ 5Ë?úårÝóm:°ÚÆ¿¾æ¿TÍU—ôýÍò¯Ùæ|…&¼j#Ýüß¼°âÚkSî97ÿÕÝ2¯f³©¡fùwj˃Ïœj–on½ÐjûêP#ÿJh¼ý¾õóÎí÷„šå_ím¯uÿóŒÓ”“FÕLnµ­­V¸Ë‘”Ëœÿ_åþÆ• 5êýUùG½•­\³å×wç¡öŒ›ÿhÇÔ¦¡6ÜÍ´÷Ë¡fùG¿´}%ÔÚvÌô_î¡fó_³ÍçNZ¹ÝüßüØ6óWÎÍu·<¹Üêµü;µe]š]ùw.hÇM“¬ä_é ½õGZ{-ÿjo8Ìú…ü+ôX¿…­¶MbýgùG9ëgò¯F�ú#-äŸú/öæÖ›&YÜ,ÿ¸>‹ï57ÿÑ˃Šnþ£½–/–ô yÕ«ÄÐj¯^ý>ùç6…â+·&$Ö¢µœµ?µi÷ñý[‹8<Ôfö~&2uYÎxÒ¶½«�µøå‰‘J…®ÇÞÛv¾f³)¡¶´êºHßKûbÙ·O~î×/B­Ë©#ïtû4ööön­ó*ÿ¨ãÙ½ ѧwtˆ�ÞþäËßíµ³ë³F/w¸�^vGå‹””û±{Žè½­;'?¼ãî^ôå*t¼�J¹ºÊ?ó×uG‡þn/jÔ;®Û§ê=¯ü£×7òÒ¾×—ãÉP‹©5 ]�ÐŽ©ÍBmŠÚ›¶,g”öÆ;†ÚSê—¶Ý Dé—׺…Úœ9’ÿhS(JÿסŽÜ³ö§·Ê>iå^ïýLlFà¯Ô6ó÷Ù剱HPoÞåVïôªëbC‚ëk•f×÷ü©cÃv¼;ÑÚQwoB¼aÐÞy#¬½G×g�ÿÒ�~Ù2Ôúe÷ñiwÍZøðŽ}ƒ­ÿªÜÃéç-C­ŸkÈ_Ÿ óFX<êªÞ‰AÜÞ�hqªëÄ·UšÅw¸Ú‘äAÞå–)a{•/¥¶Y¾¼=szó ¯Ÿ$¯rœXm{¶¬÷Ž:˜ÛÜJ÷ƵC@+¹{qJ—5×ÒÓZ�ȳV÷sОxªrj¾BçÓju­Øxí Ñ~+Õ?õ©Ú{Ò?{ñÝ �ÆCí«Og¤v}pqú_-³¦tø&ÔmY�úM¹÷ÓŸn™µV7åçVí¾/5_´fúÚ�×ûþûP«ó͉ԲE¾YѶÅâ§î×ýgÊ¥×9“:ð¹»’kµ¨XŸþC£Üž"ߤPnC®ýµ‹ÖLÅßmEC�z/—{?•zßUNr.×7ñÁÅ©\ߨ*¡vEíx­öžTÚ±¸Z¨=¦öV+t>•ö¶Ó^�soU¿L^s-•~I©jò\Kžy0!Bÿ}§*劻xÅ„ \á V®ö“•Ó«þ25=KõOïÔÛm»ÕùtFúèàú®®±ë»wËêôŸ‚v\]fíXÒm_ú3A{çÏ·ö®ýúDúÇA¿<:×ú¥r�3éê¦T®Õbûë¿t•{9èçGçZ?Ï‘¿{ƒxÌŸoñ(©zq»ºÌâv·®ïÍ ¾W×X|›¨ ƒ<è¶Ýòàfµ·h�/™ŽZ¾ÌÛ¹xEÏ ¯ _ ¯ ¿:¹Z��²ßû÷”[Ó õÑnJ÷ÑRÛ|°yÚ-éyûŒ¾qÎáP;Yá¹”Õs¥ÿýÚæ\Û�†Z±Ê“SŒLHÿùïÿ!Ô>Ù²>eÈçVÄ^ûõÖ%ú®‹¿NkO§4ÞþÙŠ_ëu{žŸBmÉÑ ©K¿ì´â­×âIÙ~ µw�fK}¸Á¥¯:¿–^¢£ž“pnæS7Þ’7¹Ýkíî¤ÿÐ(÷þ³—¤Ü=ïAÃß¡ù�Rð÷[b¨QïÅퟥPïż¡ÆõÝ6÷@ ×WG߉9÷vµãÏ‘ ©´cC‘Pû^íM<”+•öV,jÔ/ii·¤Ò/ ’BmLJ7Þ[kê­©ô_.ÝÆß¢æ¿ Ëuºjå&—ynEæÀ_åKæïWü¦z�½–vÆê¼iýŠÁõå8a×Wwõé'ƒv 9fí˜u$Cúº ½Õ[{ûÉ–^7è—‡Z¿\™˜Þ!Ë¡Êí^Àú¯·Ê}ôóퟧÊß± Õ[<îW½�ƒ¸ 9fq{Y×7!ˆoŽß#jÇbåí°­ç¯²<ëé{Æ…ZfÝ{Ð{õQ´­úNȹëݽÎÝØ"ÔìžÌå¯4Ù²!Ô²Û˜¬÷6ã·êYÏ­ñœk÷(®,/¸r㳡ƽÝ{ˆ5Z±¨õ׺ïC9»oÑû«Ÿ¿˜®ù ­·îÓ<©û “Vèøù9§¹{—¿ª÷I媡ÖK÷xš_)yþŠ#�ˆçrã¢îo4ZQwbUÝ“1}uõoµ—t/ã¡@;3Ú4®/›îq}vnGÝyzõÂù+’>°:ìþ}`×ÒAþ¦×|v´]³Ý3"Ö6î—ܪû%\Ÿõ�ÝG"–ÖWv…öZ?ó,�{Kï,ŸVÖâQO÷–ô>«byµ€ÅÒîµÐ§–)*×6ˆïÕßsîÞþ,7ìž q³¼*rwCþ­G”øÞ¯=Íìa÷W}zj¥iâeFÝ�ëÛx†@»mÂûÉsÆŠGG鞪îýSîÃeÏD6Ï¿8ò‘ÂSõGÌÑNŸ9ÙæzlòÈÑ%Ûj«º¯‹Œ®¼?–2rV…›w‡Zö §"Ýf};6¢S•‡Ž†Ú{'Dì3âÆÿÖ¿5Â߈‹Y£?/¸�ÞzÄÜÔ+úÃähM>ÎÍÒ³Nå#†é{ì¿å®/¸�J¹ì9þõ÷cÁŽüeÔ¿Iâ\êí=ëÓõÆŠ…×7¡òþ×÷SéPûQí8Ûæz„vdKµ±jïÖã9£´·Ùƒ¡6@}uï´Qúª\µPK^µ²òÜ1…¢ôÕA=¢Þާ÷§WÊí»då-{&¶1ð·ìxSçïXñI±A½�ö[½Kº¯‹� ®¯Ñv»¾ëåOÅ^ Ú1úkÇпâ[ƒöþ¾ÖÚ;èbÖøš _ž^mýòôÇ9âϮʸ¨Áˆ«¬ÿÞV¹‡ÒÏO¯¶~ Y �ß×Z<ΩÞÁAÜFcqûX×7#ˆo£íßÕjÇå :í·<¨¥öîòeÙqË—#§ö§'¹¶ï¹öe´Fµ±.ÿVÕÜS „ž ý|t\�[õÎÈ’Ñ¡ö‘â¡þ‹O®Ù´lù�Bí´â¦þ‹µªÙ?š<;ÔV+¾èú’j{â…%¡–CyðŠÚq´FÁ&Û6„ÚûÊ¿CÊ¿Y5²·þFÏÆ¨—ü»¨ü{«F‹sõóÑÈ¿Ãw©Ü­Æ]š›þ-—aá…TÊ=}ó¿þN)ø»OÏø8—z_Uܨ·RÕPãú&*¾\ß'µC�qtNy@;6ëßÄqî8—´wg‹P{Çå}uHÏ:(7øÐwAþÑWu:†Z{—«j–>må*¿ÑÉ5§}kþŽ*n¿ª÷�•VïbÅWý§ëë1Ï®ïoåAç §>±v�Û‚ö^™hí%ÿÖ+ÿÞªññëòï·¶×v«±_ónx}ä_uå嬟ɿ•³j\™hñ8«zq;õ‰Åí#]ßô ¾=æY|W©¿yðÆJ˃šjïö _¦}kùrÈåýB®5:Þ³Ú õiåä°.¥s¾ºVï¯IkÝbgò§šÿzvÑkGú¾Š6SñøFþÖvy¦P}¯@;§¸}§z t][üø¶P[§ø¾¯ëëÖ5Ù¶ûB-—ò@ýÛÜ5õžCß…Úåß.å_þWZWÙp6ÔF)ÿŽ*ÿj¼²¾ê‘_C­©òï©:5“¼2ü~Ö-ê¥ÜMÊ?Ê%eÿ×ßEÅ÷ç 5ê}]q£Þ·…×÷‘âËõMÐ=iü�U;.*hG‘Š¡ÆxSÿEiïu}O¡kÅ}š×è«A†ÚÝ—Z'ÏÓüG_ÕwlÊ5Vþ1Oë²çg+÷¦â±%ð÷ÙIówHq;Ô›rÈê] øŽ ®ïì·v}*ºíX³ÅÚ1Xù²'hï¤o¬½ï(¯ö(ÿj¼òÀë—'•ëW,lðJ÷õÖýU®’ò�rÖÏoÉßõ “¾±xœR½‚¸­Ùbq›¤ë›Ä÷ì·ߘڡþS¤²<ˆ¨½Û‚|ùì¤åËåß=A®íù™\ËõZ‡rhkìÆê·Î µ¨;wPlÌÎ=“B­‰úTsg´alÊ©çµvs®åÚñ^O�]jÛT‡Öž8åfhG¹~®ïñWZßÑ,'{Ä6í¤žAëÿöÆäÏ”÷µcz–¥õ Íb´5ö{ìdÃP#wÕ÷±¯âƒÚîVŽSÎâvG|ÈÜ�†ÚHåé÷Êç3ñŒ/Ý£ýå,–=âiSG+£Ñ^PŽÿv­ròŸñÝ�‰ñÝ­ø~u|iå)þr+ïñ·Uû?´�Šå.ÅüLüïQ¦q}‚sµ-ãÎ}Jyðóüµ ÿŒ—iuØø ìZÈ_eåþìšmÌÐÏÖ6ò%Aó×g}`ãˆXZ_YÑ^ëgöRŒ­A±Žå,ŸhlU âÖü‹›å}jñ¥rU‚<æï�è—�ptkÿj‡ž;”¸‘}°ž…þ>½=cô†‡žJ^Õ¤²fœÐ_¡»²éß ?“\§dÒkhÄwdy½W™½AòÊšOiFü÷úúëû ×·²À¿×÷\룩\ßç¹ÿ½¾ñ=Ϧr}ßè2þ¸¾³MN¦r}E5¿p}ô_}—¤ÿr”û·ÿ:Üú|„þ;ÁºêúïÉ‹m"ôß­eB£ÔË/´ˆÐqݽÁñ½ gù•ß…þj+¾õs|!¾eTþ¦*¾ó¦ÍŠßVÑÐñ-–az„ø6¹/ôGþÐûäßñgBß*ÿ6tÚ!ÿ~×kù—½Éîù÷ÛS¡¿\Ê¿ó+¶GÈ¿g ýñNÇh½“ÀøØÑ&ô÷«ÆÇ7YÎG«k„þZh|4ýþ�ããJ‹Ðã£|·_#Œ�Ÿ„þNºïºŒßìÝCÏhüOÍeü^},ô÷µÆoõ–9¢Œß¶ZˆÇ‡¿�_ÈeüvnúãÝ(ÞÁ`~ðz诹æ—-õ}ZóËíO;š_ò]½9ÊüÒ¨gèo«æ—‘kòD™_òªmÄ£k«ÞÁûÌu]”�Œ�—^~;y[Rî(sâwõC Åú$W"¸¾%§íúÖº{7ër<ºÉúïž �Ćý÷ë!ë¿™—žŠ) Ô·Xÿ½Öº^ìÙ ÿ&í²þ›¢w5Þ â;k¡Å÷‡1#b«Ãøn±ø>Ùz|¬aßû—Z|*8&vwß/WY|ïÕû ¹‚üÛ8Õò/–yi,ä_­•–ƒ¯¬Še ò¯èLË¿?V§ÇNù÷å—–½tˆ/^)Gál|Üóâ¾X�`||¹ÈÆÇð›�Çfãã—q6>v%�ÆGŽ6>Šë>Í/º�”5ÇÂÁ6~÷¿|1V?¿çÚø]Ûé¯XÕ`üyׯïôï\ƒñ{y’�_Þ±©Ì/ïô·ù%_ôzìö`~i2Ûæ—6ogÑ¿`~94Èæ—>oˆÏç—±6¿ð~ÎÆò_.<‘½w?æ0òoòíãõÞŸ¶pU“-Ú†ù—ã®lñ„}sÖ)yä4ÆÇ€òYâÕúÍ^¸²æ£ÑÈ?Þí™ÌÏïô·ù9�®¯s0?7™mósK]ßü`~>4ÈæçÞº¾L/óóX›Ÿó«ÿ ê>ýgëÇõ_¯`ýÈ8×Ö�eê¿fÁúqä][?^Qÿ}¬—'ÙúÑJñ½¬o…?°õíÅ·a°¾}¹ÈÖ·WßÅÁúöË8[ßV+¾%ƒõ-Ç [ߊ*ÿn Öß�SmýMSþ}¬¿µVÚúÛEù—Ø„õ·èL[Pþ] Öß/¿üÔ­¿ý5>FûƒY m°AãcC¸?Øbûƒ{4>šûƒû—Úþ „ÆGÙ`ðå*Û¼­ñ«¿c£ýË£›lÿr¹|0~µùõ�í_ÚhüFƒýËÁ-¶IÑømì_&í²ýKO÷ó‹í¯Æçß”¾8Ø_%ž·ýU‚æ—ÜÁþªÒIÛ_ݨùåÝ`µä4û«—ï^mÆò“Éι9¾WÏŽÊè»Æ¯­Ö¡ÕÁ3᜹ôo4ûéïµV-áÔñäÞËn‰ß©ï‡í´_£œ='NÈU¤ð|íõðwràŽÔ*{òÄg=><ãÃs3×Ú›Zb[¾øõ µ åžkÏ“äü(¹¤4Î-Þ¯^äLç¬ñâ�ÿ^jÙ'®Þâõ#ûÊ&ÆGWHª´ýƒð\{î<#gÕº ];F”Y7ê×X‹zO¥lÑ“k>óЄÈß�_‹ýQ¾i­+‡çÚóév9s7Mù4¬wÐÁôÈ×{·Ç—J½m´—â\ÚËóxÚ{­ì¿í=šØ2B{'•ø·½Yªµ‹ÐÞú¥Ãsí¹=ýœª=’õs�Ó#ôsÚ½á¹eÔÏ-ƦEè窑ð\{¾O|×j?ĹÄ÷àÞíâ›_÷ÉÈ â[qÔžñm÷dx®½@^¥iÀ¹ï+¯öŽú5B^UÖÞÂò*ï×"äUöæá¹ö¾ù| [xnQåó¥ÎY£äó#MÂsOª9Z61J>Wìžkï0Žמ†zwkEöä‰2Žf¶ Ͻ\sojÙmZm4ŽÎ«úùÂoï0V«*œ»ê¯¡ÉÓçÜeLïÖ÷ý`üN˜üÖ²[¢ŒßñÚq®½§��ëøq«÷½�;ÒS‚z»Ÿ±zçÕÜ›^:¨wéI«×Þg8�³å&kïÕ7ëÅÎí½q�µwwRýØ¡ ½G¶Z{í½‡9¿^hýüz™1±�A?±ÆúyßCb‰A?O[fýlïG´ËyiªÅ·ÛÁôØ® ¾I -¾}ò¬‰• â»k–Å×Þ£(Ÿ³Ö–W“¢GcÑ ¯¶Ï²¼*ÐìDìÙ ¯¾›`yeï[\Oün°ås¯ÜWc‚|¾ô‘åó]‡ÿŽ�‹’ÏßÚå³½—ñ]â‚þ6ŽºvC¼c0Ž&M°qtñ‘ãiÁ8Ê8ÔÆïoœœ7sážÄYý—ÄwG4K¼vãÉ ›>ºkñíp^ûƒ|Ÿ,ü¸l¶ÁhÄ×Þó ÞGܼÑEõ.æ�IlÞ8«z/óFÆ¡6oØû ´×æ«jïé`¾ºô‘ÍW·ª½yª1_]|ßæ+{o„~¶yr˜úù±`žÜ>ËæÉÌêçƒyò» 6OÚû%Ä×æçÆŠï�`~NZhósKÅWãWóó®Y6?Û{(ä•­ /(¯¶ëÂkl]Xª¼Êþë´e¶.Øû*ä³­GËÃ|Öztã[�Ɔù¬õèÈV[�ì½Æ‘­ƒÙ4Žªë`÷3¶–Ô8º3X—žd´¿iGw}†ðoŸÞ@ÿÿû¯þ½âÿÆKøß®ÿ =üÝÈôïÓÝß—NÑ9ü½X¥‰û¯xð÷eC»¸~MRÿ48Rk8Z½ÔÃ1ÊÔò8¾±Ñkz¼š86úçlôÇôYÇqÐꥎQ¦®Ç©ýQ�S6zm�S6úSú|ÜqÐꥎQæI�S6ú§lôz§lôgõYßqÐꥎQæ�S6z�S6úÓ§lôçõÙÐqÐꥎQ¦±Ç©½‘Ç©ý9�S6zs}¾­^êi®ÿÑ›é³9Tœz°áM=N=ØèMXŸï8ösœz8F™A§lô�§lô·=N=Øèïês¨ã ÕK=£Ìp�S6ú0�S6ú�S6ú(}¾ï8hõRÇ(3ÒãÔƒ�>ÂãÔƒ�þžÇ©}œ>G;Z½ÔÃ1ÊŒõ8õ`£�ñ8õ`£àqêÁFŸ¬Ï ŽƒV/õpŒ2“—8Z½ÔÃ1Ê,ó8õ`£/õ8õ`£/ö8õ`£Çõ¹ÂqÐꥎQ&æqêÁFO÷8õ`£åqêÁF/¦O« ßIúŸOüw%ç¼;/)Ìà8PÌñۅ泌xF§WÞàø½ÂLŽ? ÌìxT˜Åñ¯#ÌêøãÂlŽ×fw¼¡0‡ã/o)Ìéx[a.Ç; s;ÞU˜ÇñžÂ›ï#Ìëx?áÍŽ¿#ÌçøPa~Çßp|´ðÇ™K :ÎX/ä8cñVÇ+…'—‹8N®uœ\¸Íñ ÂuŽƒ+W;RŽ˜®÷8údé Çàk=޾ Y:È1ø&}~ã8h×@=£ÌF�ãýk�ã}›>·8šüqŒ2[=Ž?lôÍÇ6ú·úÜá8hþñÇ1Êìô8þ°Ñ·{Øè{õ¹ÛqÐüã�c”Ùãqüa£ïò8þ°Ñês¿ã ùÇÇ(sÀãøÃFßçqüa£ÕçaÇAó�?ŽQæˆÇñ‡�~ÈãøÃFÿAŸß9šüqŒ2ß{ØèÇôiØè?êó„ã ùÇÇ(sÒãøÀF?îñcâØègõyÚqÐüã�c”9ãqüa£Ÿò8þ°Ñ/èó'ÇAó�?ŽQæ¼Çñ‡�~ÎãøÃFÿEŸ—Í?þ8F™Ÿ=Ž?lô‹Ç6úoúüÕqÐüã�c”¹âqüa£_ö8þ°ÑÿÔçæ£ÌÇ6úU�ãýº>ÿr4ÿøãeþö8þ°Ñ¯yØè7dÐz¤ÿá ùÇÇÐ3 �ã�…ÌxàÏé7 3;š|pŒs³xØè™<ŽltýS™„lŽƒæ£Lv�ã=«Çñ‡�ž[¨?UpÐüã�c”Éåqüa£'zØèú' 79šüqŒ2ú³Sÿpüa£çñ8þ°Ñoæw4ÿøãeôφþáøÃFÏçqüa£r4ÿøãenõ8þ°Ñ zØè· ‹:šüqŒ2·yØèE<Ž?lôâÂ;Í?þ8F™$�㽘Çñ‡�~—ðNÇAó�?ŽQ¦¤Çñ‡�^ÂãøÃF/#,å8hþñÇ1ÊèŸlýÃñ‡�~·Çñ‡�^AXÎqÐüã�c”)ïqüa£—õ8þ°Ñ+ õ§ýšüqŒ2÷xØè=Ž?lôû„÷:šüqŒ2U<Ž?lôd�ãýAáýŽƒæ£ÌÇ6ºþ¹Ò?ØèQaªã ùÇÇ(ñ8þ°ÑS<Ž?lô•ú4ŸøX�ìü°´sW9ξï΀K¸C¸Òñ¯„¡ŸbÁ>®´ÓÙUpœ}S²ãìwîw|¿0â8û‹‡ÿNXÛqÖóz޳?í8ëçs޳î5qœõª…ã¬3mg}èèx† vŸ­X0÷p:óèkŽ3ÿ½é8óÖÛŽ3ß qœyâ=Ç‹Šà8ãr¼ãŒ§gLsœü�å8y7ÇqòåKljóbÇ«‹WÓÿÄå!!6üa!6¼†^Sˆ ¯%Ć?"Ć×bÃë±á� ±áu…ØðÇ„ØðzBløãBløBlø“BløSBløÓBlx}!6¼�þŒþ¬þœÞPˆ o$Ć7bßbÛ±á/±áM…ØðfBl8ý� §¿×BÅWéÓbÁx²2ÄákW†8lvœ8ð€s‰Ã.ljÃ>ljÃ!ljÃ1ljƒíu‰ƒíQ‰ƒí-‰ƒí ‰ƒí刃íÁˆƒí�‚8ÈæzˆC&ljCVljC¢ãÄ!�ãÄ!ŸãÄ¡ ãÄ¡ˆãÄ¡˜ãÄ¡„ãÄánljCYljCEljC²ãÄ¡ªã-„Í^<¡¥›»/ ±á­„ØðÖBlx!6¼­ÞNˆ o/ĆwbÃ; ±á�„Øð—„ØðÎBløËBlx!6¼«þŠÞMˆ ï.Ć÷bÃ{ ±á½„ØðÞBlø«BløkBlx!6üu!6¼¯þ†þ¦NcÃßös¼¿}€þ¶þŽ>Pˆ $ĆbDZáC…ØðaBløp!6ü]!6ü=!6ü}!6|„>Rˆ %Ć Ć�bÃDZác…ØðqBløx!6|‚>Qˆ Ÿ$ĆObÃ?bÃ?bÃ?bÃéol8}°1cÈ' Ý×}EqËúìWf¢ðVWf‘¸å}üµ+3IXØ•Y(nùFL6¸2“…E\™â–ŸÄp½+ó¡°¨+3_Üò™˜¯se>ÞæÊ|)nùOެue>ÞîÊÌ·ñBN­qe¾Ú˜"ïV;}®Ðƹ¹ÒéŸ mlη1û™¸�åOÅmŒÏ·±Ÿ&nsÂTùœ¢ÿéóiBlø'Bløt!6|†>Sˆ Ÿ%Ƨ ±á³…ØðO…ØðÏ„Øð9BløçBlø\!6ü !6|žþ¥>_ˆ _ Ć/bà ±á‹…Øð%BløR!6|™¾\ˆ ÿJˆ _!Ƨ ±á1!6<.ĆÓߨðYŠEÛ€k.çõ­x§ÇKxîw²9÷a8Æõ\O<œ‹ôìO<œÓô¬P<ûzî&N~sîPñpÐs:qÆúpñpNг?qÆú{âáü�”ð¾8c}„x8WèÙœ8ã}”x8o蹘x8¿%%Œç=Gç:=kç=›ç==çç–¤æ‡pÔó)ñp®Ö³3ñpÎѳ6ñpnÔs+ñpOJ`œ†s‘žs‰‡s¦ö<ºÞ•îšW ±¹þ5BløZ!6|�¾^ˆ ß Ä†-Ć#ĆobÃ7 ±á›…Øð-BløV!6|›¾]ˆ ß!ĆïbÿbÃw ±á»…Øð=Blø^!6|Ÿ¾_ˆ ? Ćbà ±á‡…Øð#BløQ!6œþƆ'<æø÷Blô„ØðãBlø !6ü¤þ£~Jˆ ?-ĆŸbÃÏ ±áç„ØðŸ„ØðóBlø!6ü¢~Iˆ ÿYˆ ÿEˆ ¿,Ćÿ*Ć_bÃbï ±á¿ ±á±á ±áׄØð¿„Øð¿…ØðëBl8ý� '׬½´Õò�Øš|[|éËCâh±#n6v¨ßr€~²\%ž6¦¸.Ë úÏr˜8ÛXãz-gèWËmâoc�vX.Ñß–óä…�MúÞòŸ±qJl,�/6f‰‰� rÇÆ/ñ±1BÙX&V6^È)×ÄÍÆùecœÚ8Ê ¹(|¸¨ûºâ�­¸Ü ŽMŒ2 ±á™…Øð,Blø�BlxV!6<›ž]ˆ Ï!Ć' ±á9…Øð\Blxn!6<�~“žWˆ ¿Yˆ Ï'Ćçbà ±á·±á…ØðBBlø­Blxa!6¼ˆ^Tˆ ¿Mˆ ¿]ˆ §¿±áä˜éh6.È7k í°±LîYÿÓ÷6ÿàÓÆmµñNLl^¢Ý6ö‰�ÍQô�ÍÄÊæ+úÃæâfs}có1´yŒ~²¹‚xÚœFŸÙ¼Alm¼Ó6Ɖ³Íuô¥Í'ÄÜæ½ â6?ÓÇ6Ï� 6’³6oÓ÷6ÿ�#6O’Ë6Ÿß!^Lÿ‹$!6¼¸^Bˆ ¿Sˆ /)Ćß%Ćß-Ć—bÃK ±áe„Øð²Blx9!6¼¼^Aˆ ¯(ĆWbÃïbÃ+ ±áÉBlø½Blx!6ü>!6¼ª~¿þ€þ ž"Ƨ ±á!6<*ĆÓߨprÒ®‡k!ÑÉOëCú�¼DçÉK8}I^¹^òN¿’—p®�¼„ÓÇä%œv�—pú›¼„Ó&òNß“—pÚG^‰y gÜYþÜ!žÁéô9JbEŽÂÉ)rNß�£pbHŽÂÉ5rNŸÙü@lmN m /™;(OÌ™/àä&sœø3/ÀÉSæxua5Çb£?,Ć×bÃk ±áµ„ØðG„ØðÚBlx!6üQ!6¼®þ˜^Oˆ \ˆ Bˆ Rˆ Jˆ Zˆ ¯/Ć7bßbßbßbà ±á�„ØðÆBløóBlx!6ü!6¼©ÞLˆ §¿±á-„Ío)ÄFQˆ o%Ć·bÃÛ±ám…ØðvBlx{!6¼ƒÞQˆ ï$Ć¿$ĆwbÃ_bû±á]…ØðW„ØðnBlxw!6¼‡ÞSˆ ï%Ć÷bÃ_bÃ_bÃû±á¯ ±á}…Øð7„Øð7…ØpúNŽ[?ÓÇ–çÄÍÎå<‹¹fí¥­–oÄÄÆ¾-¾ô�å!±²ñÂ5TÓÿ\}cùI mÑO–«ÄÓÆ}fyKlm|Ñ–ÃÄÙÆ}iùLÌmÜѯ–ÛÄ߯ }lyN.Øx¤¿-çÉ ›ô½å?9bã´…xuýO‰‰� rÇÆïígú¹23„­es_î#a§Çů;>Rümǧ [¹ò1áßNÿDø¢ÓÓ…9}š°¥ÓW¯9}а…Ó› §zñàžÊŸ®Ìré8¾LüwÇ—Š_u|‰øoŽmr÷ÜK¿âôLÒ8Nû2¸2‹TæW§g–öŽã´5£+³Pe.;ý¨ðcÙôU?áª@׿‰SÙ�®Ì[Âܹ?‹Ïʇ÷¦~qe>Z~$n}þ¡¸Åe²8åˆã$!åà…”ƒOR>^H9ø !åàã„”ƒ�R>FÈ1øh!Çà9%ä|¤�cðBŽÁßr þž�cðw…ƒr >LÈ1øP!ÇàC„ƒr N¿r N|8'ž´þ–ÐúŸ~µ8Ò¯wú•r”'÷¦¼xù‰MLÉal8yŽ gŒ`Ãg ±á³„Øð4!6|¶þ©þ™>Gˆ ÿ\ˆ Ÿ+Ć!ĆÏbÿbÃç ±á „Øð…Blø"!6|±¾Dˆ _*Ć/b× ±á_ ±á+„Øðt!6<&ĆDžØpú¾R¸ÊñÕBlô5BløZ!6|�¾^ˆ ß Ä†-Ć#ĆobÃ7 ±á›…Øð-BløV!6|›¾]ˆ ß!ĆïbÿbÃw ±á»…Øð=Blø^!6|Ÿ¾_ˆ ? Ćbà ±á‡…Øð#BløQ!6œþƆ ëúÞòŸxšOüYLÉAëúÀò�XÙx¡N‹;}cùI mq-–ô™å-±µñÅ5ZžÐ—–ÏÄÜÆýj¹Müm ÒÇ–çä‚�GúÛrž¼°±Iß[þ“#6N‰ƒ�òÅÆ,1±qAîØø%>6FÈ#ËÄÊÆ 9eãú˜øwúŸ¹è{!6ü!6ü¸~Bˆ ?)Ćÿ(ĆŸbÃO ±ág„Øð³Blø9!6ü'!6ü¼~Aˆ ¿(Ć_bÃbÃbÃ/ ±á¿ ±áW„Øðß„Øð«BløïBløBløŸBlø5!6ü/!6üo!6üºþ�ÎËüÖ·Ä­ k¾µ…þ¶uœóØCp.íc¯'¬ýæÿFÇiwVljO6ÇéƒìŽ«ŽÓ‰Ž·œŽÓ7¹'†¹§Ÿò8NËë8±½Ùqú/ŸãÄ9¿ãôeljù-ŽÓ¯'þö|–<µç°ô·=o%/ì¹*ùkÏO‰ƒ='%_ìy(hû+Žú08ÏqüYyê1?Ôoþ¹.«—ëµë!v�´É®Ÿ¶Z»èk/}cý@ŸYÿЗÖoô±õ'}oýLL¬ÿ‰•Å…Z¼ˆ­Å‘˜[|É‹;9bù@îXž�_–?ä�åùhùFžZÒ¯–Ÿô«å-9oùÌÜÖËícÇ‹[Ÿ “¶I6kÄRaoWf�¸Õ5\ÚfW†9ïUWfœ¸õç»Ò¶¸2̯¹2S…6×�•n}þžt[_¾’ÞÇ•Ÿ&´ùpŒt‹ËûÒ·Éæ:Y£^wå?Ú¸-Ýb7BúvWž5ª¯+?]hóêÒ-¾|ßÙáʳ^½áÊÏÚÜ;JºåÀ(é;]yÖ®7]ù™B›ŸGJ·<ù@ú·®ü,q›·GH³ü-}—+“&nóùûÒ,¯ÆHßíÊÌ·yþ=i–oc¥ïqe>·ùÿ]i–‡ã¤ïue>·ua¸4ËÏñÒ÷¹2sÄm½&Íòv‚ôý®Ìçâ¶Ž •fùå8hþñÇ1Ê<íqüa£?éqüa£?'|ÆqÐüã�c”yÖãøÃFoàqüa£?/lä8hþñÇ1Ê4ö8þ°ÑzØèÍ„/8šüqŒ2M=Ž?lô&Ç6ú‹ÂŽƒæ£LK�ã½¹Çñ‡�ÞVØÚqÐüã�c”iãqüa£·ò8þ°Ñ; Û;šüqŒ2<Ž?lôvÇ6úË—Í?þ8F™ÎÇ6z'�ã½›°«ã ùÇÇ(óŠÇñ‡�ÞÅãøÃFï%ìá8hþñÇ1Êôô8þ°Ñ»{Øè}„¯:šüqŒ2¯yØè½=Ž?lô7…}Í?þ8F™7<Ž?lô×=Ž?lô·Í?þ8F™þÇ6z?�ã}�ðÇAó�?ŽQf Çñ‡�þ¶Çñ‡�>L8ÄqÐüã�c”êqüa£ö8þ°Ñß¾ë8hþñÇ1ʼçqüa£÷8þ°Ñ?Žt4ÿøãeFyØè#<Ž?lôqÂ1Žƒæ£ÌX�ã}´Çñ‡�>I8ÁqÐüã�c”™èqüa£�÷8þ°Ñ?~è8hþñÇ1Ê|äqüa£Oö8þ°Ñ‹ Í'>’œÎyŧìŽß)´÷¦Vj_Êùø™"ne(Ï3t¾7•peŽŠ[]¥¤­veø®t·+SN¸Æé|'*ëôJB{‡Šï>�~¯ÐÞ›â;N²ÓïÚ{S|—©êôT¡½7Å÷—§WÚ{S|g©æôšB{oŠï)5œ^GhïMñݤ¶Óë í½)¾�<æô§„›eÓ'|yÒéÏí6¾w4pz#¡½·Æw�†NAhï§ñý¢‰Ó[í�4¾S4wzkáÙÔËwŠVNo/´wÏxÎÓÎé/ íݳÒ;9½«ÐÞ=ã¹R§÷Ú»g<“êîôW…öîϳz;½¯p¯l®‡ç_¯;ý-á>§óŒ¬ŸÓ™‡ö;�çhÌ/œË\rÀé°wÿ¾’Î8GgLråy–ÇXEg\v:Ïþo茭#NçY!c}†pºãàÇÁiŽƒ”£ü'GŸêt�c”IÎr4ÿøàefzœó°Ñ?~ê8h~8�c”™íqÎÃFŸ+üÜqÐüpÇ(3Ç㜇�þ¥pžã ùá<ŽQæ �s6úBáÇAóÃy£Ì|�s6úábÇAóÃy£Ì"�s6úrá2ÇAóÃy£ÌR�s6zºp…ã ùá<ŽQæ+�s6úJaÜqÐüpÇ(ó8ça£¯®v4?œÇ1ʬò8ça£¯®s4?œÇ1ʬõ8ça£#üÚqÐüpÇ(³Á㜇�¾Y¸ÉqÐüpÇ(³Ñ㜇�¾M¸ÕqÐüpÇ(³Å㜇�¾S¸ÃqÐüpÇ(³Ý㜇�¾[¸ËqÐüpÇ(ó­Ç9}Ÿp¯ã ùá<ŽQf�Ç9ý ð€ã ùá<ŽQf¿Ç9ýˆð°ã ùá<ŽQæ�Ç9ý;á1ÇAóÃy£ÌQ�s6úqᎃæ‡ó8F™ï=ÎyØè? O:šÎãeNxœó°ÑÏO;šÎãeNyœó°Ñžs4?œÇ1Êœõ8ça£_^p4?œÇ1Êœ÷8ça£ÿ"üÙqÐüpÇ(sÉ㜇�~Eø«ã ùá<ŽQæ²Ç9ýwáÿÁÞùÀ{9Þÿÿ“°3Ú´-[› !Ë„$„X2¡(ŠTKá „�‰ÅBh4 !„kdËÖhþŒM¬MÛÌږͶ6¿çó|®ëóywN'-Û÷·û<ºz½^×}ݯ÷ýyß×}_ïsŸs>Ÿw³�û¹Í1 ÜýÔö/ÿ‘¸˜}ÜÏmŽù{àî§¶ÿ=ð_‰‹ÙÇýÜæ˜î~jû'ƒy_ÇÞ’úÝ~sâSÀ=ëž…ò| t÷mÏc¿G³)xks <ûßN_×4f3ð¶4æp¯Ô¿9ø�Ô'Ø-õ·§¥þéàÞ© ðîÔ¸Oêß¼7õ?î›ú¿ÞŸú»§þvàÌÔ? Ü/õo>’ú÷Oý[ƒ�¥þ'ÁRÿ6à©ßûw�Ôßœ“ú½7˜ú·ŸNýÞwJýÛ�?HýÞS¿šú·ŸMýÞ/{¦þàüÔï½ðàÔ¿ø|ê÷>×+õ |!õ{;$õワúöNýÁWS¿÷žCSÿNàk©ßûÊa©g0ß¼gžú¿ æ{‹÷ƒ>©¿˜ï^ëG¤þ]À|Oð:þZêÿ ˜¯w¯Ñ#Sÿ®`¾–½þú¦þÎ`¾N½¶ŽJý»�ùôº9:õïæë«ò¾ù×»hÞÁïqÖá hée°’¯C;°ÿð•l¿M5m68ÍxŸe`‹• >hßaCÛìÓÿ¸�Û6pÄÈ�£V2t…›j–ã¬pcÑù¾¨{ßüùYS:_ÝØ£Ëï»[1 È@‘�"Eþ‹2P·ü7áxŠñ+OV‘Ÿ"?1Å|ˆÙhÈ‹ü4ÌÉêô45Ÿ««Ø·È@‘�"EŠ (2Pd È@‘�"EŠ (2Pd È@‘�"EŠ (2Pd È@‘�"EV=ÅÏsW=WÅÈ"EŠ (2Pd È@‘�"EŠ (2Pd È@‘�"ÿ ˆÏ ^>ãEŠ<s ˜Å(æ@1Š9PÌ�büÿ:Êg¶áù�ý�ñ˜“ÆÆÄþb|ÌFC^ä§aNbO‘Ÿ˜�†¼ÈOÜЦæ'îyc>�õÇ}#_Óãc¬È×tÜÂ?f»!/òÓ0'±§ÈOÌFCþïÊOS}I¹§©>ÅøÆ2¹úùŒ¹-xÃ|9)rRÌ�bs ˜Å(æ@1Š9PÌ�bs ˜Å(æÀÿõ9P>ƒ ÏcìoŒÇ×ÞØ˜Ø_Œ�ÙhÈ‹ü4ÌIì)ò³±ê¼±¼5Öߘs1¾±Ì”ûÿÛòÓØÑþ·gq<��©ÿÎyõŸ:_M�ÛXV›êSŒo,“Åü\yf>üüĹZð†ù/rR䤘Å(æ@1Š9PÌ�bs ˜Å(æ@1Š9PÌ�bs ˜Å(æ@1Š9PÌ�bs ˜Å(æ@1Š9PÌ�bs ˜Åhl”3Sü_d È@‘�"EŠ (2Pd È@‘�"EŠ (2ð¿��øŒèáõ¯±È@‘�"EŠ (2Pd È@‘�UÏÀʾ_è¶gï=Kg–J5 78mƒsK¥®ØvÙ TÚ¡Y©t;NCo¿ì‹Þ¾)øOtOð$ðÚñ´¯¢ÿ>ŘÙàžèMÁ=Ð�€]Ñ»Á;ƒ;�Gƒ÷Ðßnã·Ø <Nÿ}4ãϸϲíY°z{pwÚÖ´½ÐÏ€#ؾ íôh=�c<ãn®öO¥Í8Æ3îÚOÐ{£;‚ûÒŒc<ãžÁv_‡¯Ç×õ¸qŒgÜ�Á�‚‡€¤¶ô}šqŒgÜWh?Eïãx°'Í8Æ3n-Û?Fë�æ””~DÓG?}ß ½ŒÞík?‚¦�~ú^ÌöOÐE�A¿HÓG?}Cû9º;z/ðXš>úé{Û7¤†¾½�¦�~ú.¡½ŽÞÝôÜ裟¾×°}cÚáè+п¡é£Ÿ¾¥ý ½?ú@p$Mý^'±ýó´>è«Ñ¢é£Ÿ¾ÿ¢éyºx6Mýô½•í›ÒŽ@ODÿƒ¦�~ú®þÝ<¼ˆ¦�~úÞÁ˜-h_C߀^®�~ú¶ÿˆ>ì ^IÓG?}ïaÌV´#Ñ· Í¹>úéû)ðôA`Po}ôÓw&c¶¥y½yÝ}~ ¨Ÿ¾Ÿÿ†öz󺻙֟¦Ÿ¾�3fØü øéÔG{¬¿£B;½øÑÔöG?�víôF 6ýô]*§õ@¯êaÓO_çÚ�´¯¡7õ°é§ï?iGÑD·õ°é§ïXÚ­´#ÑŸõ°é§ïºà±àAàÇ@=lúé{m*­/ús 6ýôÝ<ü*øqP›~ú^O»“vº5¨‡M?}7‡€=Á @=lúékŒ6´=Ñ~m’ZW´÷š]Á{Á£Áσưϸα¯ƒƒ-AcØŒgÜi´´nèæ §½®í…ÞþeÚƒ´cÐ_�a3žq·=ǽÀO€Æ°ϸ÷Óv¢í�^4†ÍxÆíBóuøz|mưϸ;‚g�‡€Ÿ�a3žq£}…¶zÐ6ãw?Z-­7úS 6ýô}š¶m_ôº 6ýôíE»�v(º¨‡M¿Zp>­­;ú# 6ýô=’v)í0ô† 6ýô}™æ1õ°é§ïš×™×›×ž6ýô}ƒæuæõæµ§‡M?}O¦=Cs=Û4'[к ¿žÄ8ϳ目P׺@¶„oG3³ñ%ø8øð"´9šË ` ðMZ íj´çhDçx÷»�>sv!Ú90 �s¼û-¤y�üºn�Î…óÁÎà®`'ð&Ð9x¨�~úžŸŽAûšŽõÑOß—i¾À«Ð^ÃA}ôÓ·#ؼô:ÔG?}O‡Ï/@;g�õÑOßçhË ãÑ^ÃÃ@}ôÓw[°xè=`4è8Ç»ßáï‚W¢½‡ Mãï~[‚íÁI ÷ ³@Ç9ÞýæÀ—‚W ½‡�œÆ9Þý6Û�ß½ž :Îñî÷(| x9º|Hçx÷Ûl ^z>tœãÝïø[à8´÷ð“Ò8Ç»ß'À6àu kÀ(ÐqŽw¿»á‹ÁËÐÎéÓ8Ç»ßz`kp"è5q:è8Ç»ßTø"ðR´×Àà4Îñî×ôžûMÐkè4ÐqŽw¿›á ÁKÐÝáƒÒ8Ç»ß2Z+Úµh¯áSÓ8Ç»ßõô½ ŽE{8!�s¼û½CkI»Ý vÏŸ`¿=ÀÎhç»óþ\Pýô½îuèõèuy<¨�~ú¾MkAózôº<ô:Þ”Ö†¶Yj›ƒ[ÑÚ$T»Í{ƒÜ}ÚÑÚ&TÛŸûÜ÷‹¡©ë½ÄXíizyϱÏûˆmhŽÝžfß¶ ÕÙÃ;¤mªíÏ1w„ãK Õn3žq½ÏÉ;Òôpó8r¼Np÷Ù9¡ÚãÉñ¼÷ë½KBµûæx�áÓ® Õ�ñŒ»;Í×´ÍcéBÓ;ÇÛnL×Qíñäx{Á=æ® ÕÆÎñö†ëÕ-¡Úã1žq÷¥y,ûÐ<öýhGŽ·?ܱݪ=ޝÜ×t@BµÇ“ã÷XL¨öxŒgÜž4_ËWiÆìEó8r¼CàÆ:8¡ÚãÉñ…›“Þ ÕOŽw8¼ í°„j�ÇxÆ=‚æ9èCó˜�¤y9^_¸9úZBµÇ“ã ÷µ•Píñäxýàæü˜„ê.4ã÷Xšç¬?ÍÜ y9Þ@¸9=.¡ÚãÉñN€›‹ãª=žo0Üs6(¡Úã1žqO¢™ëiž›“iGŽ7n.†$T{<9Þp¸çpXBµÇ“ã�€›ë¯'T{<Æ3îHšçêšçö4šÇ‘ã�7—§&T{<9ÞpÏù¨„j�'Ç; î¹:3¡Úã1žqϦ9çFÓ<'çÒ<ޝîœ8'¡ÚãÉñ·{®ÎK¨öxr¼1pçØ Õ�ñŒ{Í9y!Ís:–æqäx—ÀûÑ.N¨öxr¼ËàžëKª=žïr¸sr\BµÇc<ã^IsN_As.^Eó8r¼oÀ�sãªûÑr¼ pçìÕ ÕOŽw-ü8Ú5 Õ�ñŒ;‘æ\ü&͹{=ÍãÈñ¾w®\—Píñäx7À�Ó“ª=žï&¸sñÆ„j�Çxƽ™æ\žLsÎÝJó8r¼)pçÚ- ÕOŽwÜkâÛ ÕOŽ7~2íö„j�g2͸wм¿CsÎN£y9Þ�ð‘´ï&T{<9ÞÝpçò] ÕOŽw|mzBµÇc<ãÞGN»—ví~šÇ‘ã=?ƒ6#¡ÚãÉñf½L¨öxr¼‡á§ÓJ¨öxŒgÜY´Si�Ð΢=Fó8r¼ÇáçÐM¨öxr¼'àgÓf'T{<9Þ÷à£iO&T{<Æ3î÷igÒæÐjiOÓ<Žo.üÚS ÕÏlšq@;ŸöLBµý9Þ<øy´&T{<Æ3î�hçÒž¥]H›O«¥åx?��¥ý8¡ÚãÉñž‡_L{.¡ÚãÉñ~ ¿ˆ¶ ¡Úã1žq_¤�¡½@»”ö2ÍãÈñ~¿œöRBµÇ“ã½ G{%¡ÚãÉñ~¿Œöó„j�ÇxÆ]H»„öíJÚ4�#Çû%ü´×ª=žïWð«h‹ª=žïMøxÚ¯ª=ã÷7´+h‹ih¿£y9Þ[ðoÒ~›Píñäxoï¥ý>¡ÚãÉñ–À¯¡ý!¡Úã1žqÿD»šöGÚu´¥4�#Ç{>‰öç„j�'Çû+ü[´¿$T{<9Þßà×ÓÞM¨öxŒgÜÐ&ÒþN»‘öOšÇ‘ãý ~3mYBµÇ“㕚•ïeïÑ7™¦öxr¼µÐ7Ù�Píñϸk£o›ƒ·‚ë‚GŽ÷ômèuªoFçxE]“P=�ã­�ž‚^/¡Úã1žq?Þú½ÐTpÐãÈñü^é»è�'T{<9Þ'Ñw ?‘Píñäx~/÷ô§ª=ã÷Óàíà†à� ß;z9ÞÆèéèÏ$T{<9ÞçÐw£?›PíñäxŸGß…ö{ZQíñϸ›€ÓÀ/€÷‚›‚GŽ·ú~t›„j�'Çk‹ž�Þ<¡ÚãÉñ¶D߇Þ"¡Úã0žqÛ�÷€_·=ŽoôÃè­ª=žo[ôCèö ÕOŽ·=z&z»„j�ÇxÆÝ|ìÎw=ޝ#úqô—ª=žogôcè�ª=ž¯úQô—ª=ã÷+à#à.`Ðç´GŽç÷ø›¡sS{<9ÞnèÍÑ[ÐDµÇ“ãíŽn‹nGÕ�ñŒ»¸)¸ mKZ4ÿ*_{"Ú 6¥}ŸÖ=<|<|ì—Pmÿ@ð{àñàSà€„jû�O€ƒÁ9à à3àI q²ßôÑ'&T/û Eÿ}rBµñôÓw88> Ž�“ýNAÿýõ„jãe¿SÑ?B�L¨6ž~úžÎOž'û�‰~=*¡ÚxÙo4ú9ôY ÕÆÓOßsÀùàÙàOÁZÐ8Ùï<ô‹èsª�—ý.@¿€>?¡Úxúé{!¸¾ ^ 'û�E¿‚¾(¡ÚxÙïRôÏЗ$TO?}Ç�/�—�?¯�“ý®D¿†¾<¡ÚxÙï*ô/Ðãª�§Ÿ¾Wƒ¯‚ß_¯�“ý®Eÿ=!¡ÚxÙo"ú ô7ª�§Ÿ¾×ƒ ÁëÀ_�“À×ÁìwúMô·ª�—ýnBÿ}cBµñô[Þ .'ƒ¿o�“ý¦ ‡¾%¡ÚxÙï6ôoÑßN¨6ž~úNƒ·ƒ¿ï�“ý¾‹þú; ÕÆË~w¢ßFOK¨6ž~úÞ ¾Þþ¼4Nö»ýgôô„jãe¿è?¡ïK¨6ž~ú>.ïßg‚ÆÉ~¡ÿŠ~0¡ÚxÙïô_Ð'TO?}—‚³À¿��ƒÆÉ~³Ñÿ@?–Pm¼ì÷$úïè'ª�§Ÿ¾sÀwÁï�ÿŸ�“ýžF¿‡þ~Bµñ²ß3è¡ç&TO?}.6£=K3Nöûº9m^Bµñ²ß|ôZ´'TO?}ŸK´ŸÐÖ¡- 'ûýþÚó ÕÆË~/Â×¥½�Pm<ýô}™¶6í%ÚGi¯ÐŒ“ý^…¯OûYBµñ²ß/àëÑ~žPm<ýô]H«¡½Fûí šq²ß/áÐ^O¨6^öûüã´E ÕÆÓOß7i-h¿¦}‚öšq²ßo២-N¨6^ö{ þIÚïª�§Ÿ¾oÓZÒ~OÛ�¶„fœì÷GøghH¨6^öû3üÓ´?%TO?}ß¡µ¢-¥mLû+Í8Ùï]øçhI¨6^öû;ü³´¿%TO?}—Ñ6¢ýƒöyÚ¿hÆÉ~ïÁ7¡ý3¡ÚxÙ¯ÙZåZ±”Pm<ýôõç4­ÁµÀMÁu@ãd¿uÑ›£×N¨6^ö«Ao†þHBõÐúéëϑڀ·[€ÆÉ~C½~Bµñ²ßè-ÑO¨6ž~úús®¶`Kp+ÐßÓ0Nök…ÞýÉ„jãe¿O£·Fo˜Pm<ýôõçpíÀÏ€Û‚þ‡q²ßçÐÛ£7N¨6^öûà@popØ <Ü <4oæç2ðüuXÓá¿[›5¼=Ž~û®§-¢}¶9qèÿ8¼˜¾©ŒŸ Ð3Ñ/¢kѧÓ/¿\þ€ö[¶ëi<ãÚ÷-Ú›´Ïá{ý�ç�é»�ñúè§× èÀ7h§Ñ/¿ü%ø í7l×ÓxƵoí·´Öø�ÏÆàëèëh·1^ýôú)ú~ðW´Sé—� Î¥-f»žÆ3®}7Ð~Oû<¾ñ7OæË¼}›ñúè§×ô p1m$ýò‹Á߀OÓÞd»žÆ3®}7Җо€ïüÍ“ù2oS¯�~z=�¾üíúå�o�OÑ~Ív=�g\ûn¢ý™¶ ¾ÇáožÌ—y»•ñúè§×sè{Á·i#è—_þü>íWl×ÓxƵ¯–ö úKø‹¿y2_æíúõÑO¯Ÿ ïÿHû:ýò1àŸÀ9´El×ÓxƵï|Ú5ô7÷?þæÉ|™·›é×G?½æ£§ƒKiÞ+ä€ï€ß£ý’ízϸö�¡M¤-|ûáožÌ—y›L¿>úéõcôÝà_hÃè—Ÿþ|’öÛõ4žqísœãû#¶ß¾KJ¿ü<ðoàlÚëlwýô}tœãû,ÛïÿN;™~y-ø-ú»ÔG?}åŽs¼cç±}øÚúå¢ZþC¶\F;‰~¹¨–ÿ€íw€ÿ¤�H¿\TËŸaûwÀѼËEµ|.Û§‚ïѼ÷ËEµüi¶ß¶áœ@¿\TËŸbûmàfèãé—‹jù÷Ùþmð<еGþ8xÚ{p~½7´eüdú=׎s¼cç€SÀ ÁôË/Bûvg}ôÓ·îšïØï�·‚ƒÇÑ/‹6G»±¿>úéëµâ8Ç;öIðððXúå³ÀKÑžƒÎì¯�~úz-;ÎñŽ}œ ^ºvÞ ¼í9Þ•ýõÑO_ï5Žs¼ûÍÝgØ�~û¯@;‡¾Âþú觯÷‡À+Ñι]Øî8Ç»Ÿ÷â™àx´s¸Ûçx÷s-x¼ íœÿ2Ûçx÷û Û¯F{ íÌvÇ9Þý>ÍöóÐ7 ›ÃÏe{ ô~TKÿãàýŒ»ôšÜ‰íúè§ï†Œ½=½6ü¶{Ÿñ~s>ý��3wè= #ÛõÑOßVŒ½ýMô:ð³Ùî}Äû‰÷•GÁûwè=eG¶ë£Ÿ¾ŸbìMàõè×è|ôz®¥ß¾‹h“Ðë2v4ûû:}½¾îYཌ»ôžö%¶×Ý»ÐÆý$c÷¤Ý».×z_øÓàtônðwø#ô ô ÿ)8}*üppopø ýÝáúè§ï2ö?œ�~‘þÃàúè§ïÑà~ààè—룟¾ÍÁóÀçÀ—è?®�~úg‚?¤¸>úéµx!¸|™þ>p}ôÓwx0ø08�þàúè§ï'ÀKÀÀŸÑ\ýô=4'³Àgéï×G?}7/__¡ÿkp}ôÓ÷LPÏÇÀÑoL}ôÓwð*ðgà«ô ×G?}Ï�gƒ?¦ÿ ¸>úé»%è½ñfp6ýÇÀ_¿�¾> ¼|ü9ý}å ñŒ;ì> Χÿ«pãϸۂۂSÁïÑßÕ±àmè­àÏqþ¯�þýîcã÷Jp 8ü ý=áÆ1žq;‚;€w€sèß nã÷eü}¾_×ÑpãϸׂƒÁ§Àçè÷œÇxÆÝÜ œ~Ÿþnpãϸ ñ?œ‹~žþ^p}ôÓ·+¸ xøý{ÃõÑOß7Ùÿfô´kÊ3èMÁ[Гé÷^ôuÚРЇÀ�c<ãîîz=z]î7ŽñŒû6~§‚^�^—½áúè§oOðôƒ ×f èk¼üý…{}] ? þôþéýõ»àChçö >úé»ÜûôOÑcà_õÑO_ïßÓÀGОÛOƒúè§ïúp×�Ñcá£@}ôÓwcø�à£h_ÛçA}ôÓ·…|=~.¨�~úºþÜ>ŽöÚo ꣟¾ƒ{<ž—›ÀIà­ ë·ë¿ëà+èñð‹@ãϸ®�wƒO ½v¶�c<ã~~ x;º|>çËyà|p^4ƒ»Nÿ=~9hã·5|:ø=t?ø—@ãϸÀo¿ƒnãϸ®5Ö¯¡'Â'€Æ1žq?¿ü>z|Ð8Æ3nKøð»èð_àoã×µÆ<™/óö-Ð8Æ3®õ�ëÏÓèAð. qŒgÜOÀ¿ Þ‰îÿþÆ1žq׆{ñ~â}eOøàdôð2Þuìôô¾ qŒg\×·ÛÀ»Ñ�ào1Þ8Æ3î:p×Ù¢‡ÃõÑO_×ßÛÁ{Ð�áf}ôÓ×5×uþYôHø¡ >úéÛ >¼Ýþwö×G?}ý^Ú:ãÇèQð¾ >úé»!ÜëÔëµ¼¨�~úÖÀ½N½^GÃ�õÑO_ëדóÀ߃¾¶·ÀZÐuªèzrøðLðïàù ë”ë•ëÉðmÐ{’>úé{ èù¸|ì./]oúé»/h=éZÿеPýô=´ž¼ü è½AýôíZO~ ü+x¨�~úZON õÑOßý@ëÉÀwÁÓA}ôÓ÷pÐzòFðwà‰ >úé»?h=yø7ÐkWýôíz�z½zÝž꣟¾€^§^¯^·g€úè§ï çû pêÿÇÀ/€³AçÙ9 çû{à'é¿üø$è< ~Šþ{AãϸÎ7çÃ\p]ú¿ ÇxÆ:ž[Ѩ�~ú:ßœ??Bÿm >úéë|s>üÜ�þ >úéë|s>Ìkè¿ÔG?}O�Ï‚Ÿ¦ÿ~Pýôu¾9~~”þ© >úé;t>üü ý€ú觯óÍù0\�þï€úè§ï`Ðùðp#úõÑO_ç›óá9p}úïõÑOßAçÃóàÆôÏõÑO_ç›ójØ‚þï‚úè§ïI óê§àgéÔG?}�o®/€£¨�~ú½ß¿~Žþ‡A}ôÓ÷LÐûýKàÇé¿ÔG?}O½ß¿ 6£2è€v¾~½5ø´>úéëõà|­AwÿŠÖG?}D;_?ŠÞü-Zýôõzp¾®‡Þ|­�~úÎD;_×G·‡ÖG?}½œ¯-Ð_ÿ†ÖG?}B;_?†Þ| ­�~úz=8?ŽÞü;Zýô}í|ܽø{´>úéëõà|üzSp!º Øíu0í|ü$º3ø´qŒgÜGÐÎÇO¡·ßFÇxÆõzp>¶Bo¾Ž6ŽñŒëõà|ܽ¸ mã×ëÁùøitðhãϸ^ÎÇÏ 7ß@ÇxÆõzpÞo„Þü'Ú8Æ3®×ƒó~côà´qŒg\¯çýgÑmÁ_¢�c<ãz=¸}½ø/´qŒgÜÇЮG­Ñ_ÿˆ6ŽñŒ{Úõèóè-ÀEhãϸSОχçå=´qŒgÜÇÑ®W_@ïþ mã÷^´ëÕ&è-Á_¡�c<ãºz�z½zÝþ­�~úÞ‡ö:õzõºý5Zýôu=tNÎøµºý}À{Ñ^kG‚®µ×ƒ=è߆í€ÑÞs> zN¿Fÿ.l×G?}û�sÁIà�ô·g»>úé» èkž IÿWØ®�~úÞDÿ¶l×G?}Û‚ÞsûÒ¿+ÛõÑOßÁ�“Á¯Ò¿ÛõÑOß­@¯‘óÀ.ôïÁöcÀ ÑÎ…³Aï ³À£èïÌvãϸÃ@×Ê[ÀžôoÏvãϸÛ�ÞcÆ‚{ѿۻ‚¡½wþžïü&CMÿnl7ŽñŒ;t­œL¶ÇxÆÝôp)Ø�þÍÙnã÷Oøû:|=¾®ÝÙnã÷ еð6°ý;°Ý8Æ3n'Ðkh¸7ýmÙnã÷¯ø»ÖMEBÿ—Ø®�~úî:¯÷¡ ¶ë£Ÿ¾ËØßûÉ´×â¯ÑÞSÎG{½x?s­»Ý½#ûÇxÆí ºFŒ÷¥K¶ÇxÆmê1 <”þŽl×G?}÷½GìNÿÙ®�~ú® zϸ <Œþ�Ø®�~úö½ÇM÷£¿ÛõÑOßõA¯¹éàáôïÌv}ôÓ÷`Ð{ÀµàþôoÅv}ô«»w‚^‡^�^—_f»>úé{èuèõèu¹5ÛõÑOß Aï÷�Þ»�Þã]g\o¼ßß„þü‹àÓà  ëŒë�çÁóáy9ô|è}Ìû™÷ûGÐÖ'ƒÆ1žq�cÞïoF? oÇxÆõX¼ß_Œö^ô;οóÀùà¼p½ñ~ÿ(Úµ}hã×õÆûý­èùð@ãϸÞC¼ß_‚¶VX‚¿qŒg\×ï÷�£ÍÅé qŒg\_«÷ûo£Ÿ‡ï ÇxÆ]÷~Úµüü�c<ãzŽÍ“ùÒk4hã×kÓûýíèໂÆ1žqÍ¥÷ûËÑ®•Çß8Æ3®ë�÷ï'ÞW6åüï Ö¢]{3Þõà;è—Ñ]@ãϸÞ#]®D»Ö¼Çxãϸ®7®+ßE¿ ßÔG?}ÿ w]¹ m­·6¨�~ú:G­ïD¿ßÔG?}=—ÖƒW£­µ> ꣟¾o­ïF{®¾ ꣟¾Þƒ­¯A[Ë|ÔG?}­7­ïAûZzƒúè§ï_àÖƒßD»Ö ÔG?}½ö¬ïCëu¨�~ú:W¬¯C?ßÔG?} ·¼míx4¨�~úz�·üzüó >úéë>^§^¯^+Ç�öé§ïßà^§^¯^·›�ú觯k°ëAæÅq`WðX°è|q=r=8<< <<tr=r=~ì €®C®G®ǃÀ½@ãϸ®G®;'€ç‚GƒÆ1žq]�\/�#ÀƒAãϸ®G®ƒÁ�`7Ð8Æ3®ëQðD°x hã×õÜõâ$ð°hã×õÊõbx<¸7hã×õÊõâdp$x¨�~úº¹^ O÷õÑO_×#׋aà©`oPýôu=r½÷õÑO_×#׋¯ƒ§�‡‚ú觯ë‘ëÅp0ØÔG?}]�\/NOõÑO_×#׋‘à‰à~ >úéëzäºs*8 <ÔG?}]�\wNO÷õÑO_×#ëÁÓÁ3À> >úék½i=8 ꣟¾Ö›Öƒg€g‚G€ú觯õ¦õà™àÉ`PýôµÞ´< < ü¨�~úZoZއ‚‚ú觯õ¦÷Ó³Áþ`Ðyæ|ë¶­ÏGƒG‚Æ1žq­G­Ï‡��Æ1žq­G½½½.÷�c<ãz?÷:ôzôºì ÇxƵõ:ôzôºü*hã×zT?}õ÷ú÷úô:õ:òzr¾;ï�·Î_çŸóÐyä|r>8/<¯ž_Ï�çÉ<›oóeÞ|]¾>ã{�÷ ¯g¯k¯;¯?¯¯#¯¯ç³óÚyéüt~9Ïœ'ÎÏ·çÝóæù3¿æÙ<˜óâ}ËûŠ÷¯ïž'Ï×U<çŽAOo÷à¾8žþùðÁóé?~3x#¸;Ûo ÿçð ÀZúká·€7€»±ý|úŸ„룟¾·²}Ø}%ý?†ë£Ÿ¾SØþ-pWô$ú_…룟¾ßfûõàWÐçÑÿ\ýô½�í×�» ¯ ÿGp}ôÓ÷v¶O;©é®�~úNeûÅàѵôφ룟¾ßaû7Á/£/§ÿY¸>úé{Û¯wF_OÿÏàŽs¼û}—í×€;¡ÇÑ?î8Ç»ß4¶O;¢¯£ÿe¸ãï~w²ýjpGôeôÿî8Ç»ß]lÿø%ôDú_‚;Îñîw7Û¯w@_JÿàŽs¼ûMgûx°ú›ô¿wœãÝï¶_ n�¾„þgàŽs¼ûÝËö+ÀíÐ×ÒÿÜqŽw¿ûØ~9¸-z,ýsáŽs¼ûÍ`û8°=úú wœãÝï~¶_nƒ¾˜þ§áŽs¼û=ÀöKÁ­Ñè_wœãÝïA¶_n…¾ˆþ§àŽs¼ûÍdûX°újúŸ‡;Îñî÷Û/·D_Hÿ÷áŽs¼û=Ìö Á-Ðß ÿ9¸óÈùä¼z„퀛£o¢ÿ5¸>úé;‹íç�›¢ÇÐ?®�~ú>Êv¯S¯W¯ÛŸÀõÑOßÇè÷:õzõºý…cAýô}œ~¯ÓZÐëö{ðÉ´fü\Õ¹¾�~¯©úfp6zØíµø´×ÌZèGÀWÐwƒë ½–ßF{Í­�¾ üúp]´÷‚×ÑÆ1žqŸ@? ~í½dÚ8Æ3î«èé` Ú{ÑÐÆ1žqŒ¾ü(Ú×òÚ8Æ3î“èÇÀõÐæâŸhãϸ?Gß®�6—KÐÆ1žq磧€-О‹_¢�c<ã~ý8ø1´çò_hãϸ¿@ß ~í\ø#Ú8Æ3îOÐß7@;—¡�c<ãÎA{<ž—÷ÐÆ1žq_Cß¶D;Wÿ„6ŽñŒûú6ðhçú¯ÐÆ1žq¿�ž~íµòg´>úéû<úvðSh¯µ_£õÑOß§Ð÷ƒ­Ð^«KÑúè§ïôTpC´×ú›h}ôÓ÷iôà§ÑÞ+ÞA룟¾?Eü Ú{Íb´>úé;ý ¸Ú{Õ_Ðúè§ï è;À�ÑÞë~ƒÖG?}ŸAÏ?‹ö^ùW´>úéû"ú»àçÐÞk‹ÖG?}€~l�ö^ý.Zýô} = ü<Ú{ýïÐúè§ïу_@»Vü ­�~ú¾Œ¾ÜíZóZýô�‡ö:ôzôºü;ZýôýÚëÐëÑëò÷h}ôÓ÷Ytsî {¡¡7 vKôûûžkƒÝÀ÷èßü¸'ØŒþsÀuÀ½Á?Ñ¿øG°+¸ýþ¾æºà>à¯èo ÇxÆõ÷-?î ¾Nÿ qŒgܳÀ°;øgúýýKãϸg‚÷Mÿ qŒgÜ3ÀõÀýÁ¥ôûû¡úè§ï(p}ððMú·õÑOßÓÁ`ðúýýT}ôÓ÷4ðcà�àbú¿꣟¾§‚ÿBÿN >úé;Üü*øúÛ�úè§ï)`K°'øWúýý\}ôÓwø ð`ð·ôo꣟¾_? öߥÿË >úé;üxø;ú·õÑOßa`+°7ø7úýýb}ôÓw(¸!x(øýÛ€úè§ïÉà§ÁÃÀ¿Ó¿ ¨�~ú?þžþö >úé{¸Øüý_õÑOßÁ�Á#À·éßÔG?}ƒŸ¿.¤¿ èÍëÅà7é³¶>½í}Éû“÷—±hë^ûÎ/A{?ò~fãW>l‹§1}ôÓ÷‹ ëËp*ýÞ}¾_—ë…ëÆ·Á+é÷û=}ôÓ×úî§àmh¿ï²Oýôuýrý¹üý®±§Çëq�]·¦‚WÐï÷‹ú觯õß àwÐ~_hŸ>úé»èútxý®Ñ§ÇëqŸºn~¼œ~¿ßÔG?}­_§¡ý¾Õ>}ôÓwkÐõëNð»ô»Æ{œ¯Ç=tݾ G¿ß¯ê£Ÿ¾Ö�/�w£ý¾Ú>}ôÓwÐõm:8�~k�Óãõ¸Oí»¼Œ~¿ßÕG?}­/_ïEû}¿}úè§o{ð÷à}à�ô{¬§Ç+? ô5Í/¥ßï—õÑO_ëÏŸ�÷£}.aŸ>úé»-ø6øxý³Çéñzܧƒž“ÁKè÷ûm}ôÓ×úôp&Úç&ö食¾Û�ï¦ßœ{œ¯Ç= tN= Ž¥&~ú觯ߟ¾ >‚ö¹�}úè§ïöàp8�~çLÝq¢=î3@¯¹Iø\ĸ‡@}ôÓ×ïO>Šö¹•}úè§oð�àcà=ô;ç=N�×ã>ôžòM|.´ÔG?}ýþôàãh¿·OýôÝüx#ãî¥ßköbôú½–Ïëî™l¿€þG@}ôÓ×ïO_¯}n`ßì÷ÛÛ€O‚›�ß¿ÎN¨¶ÿû Ïž·ç$TÛ?ôYÃ3 kúÓàVàAãd¿yèmÐ?H¨6^öûzkô³ ÕÆÓOßù`;ðÇà¶às q²ßóèíÑ?I¨6^öû)z;ô‚„jãé§ï‹`{ðpðeÐ8ÙïgèÑ/%T/û½Šþú•„jãé§ï/ÀàÏÁ�À… q²ßëè/£_K¨6^öû%zgô ÕÆÓOß_�ÁE Ï.ß�“ý£}&úë„jãe¿ß¢}&ú›„jãé§ï[ Ï<úlömÐ8ÙïhŸùþ>¡ÚxÙï�hŸù.I¨6ž~úþô™îŸÀ=Áw@ãd¿¿ ÷B/M¨6^ö{Ýýׄjãé§ïßÁ.àßÀ½Áe q²ß?Ñû¢ÿ‘Pm¼ì÷zô¿ª�§Ÿ¾þ�A7°î6�“ýÖF€^+¡ÚxÙo]ôþèuª�§Ÿ¾þRwð#à�àz q²ßú询?šPm¼ì÷1ôAè ÕÆÓOß ÀàÇÁƒÁO€ÆÉ~ŸD‚n™Pm¼ì× Ý ý©„jã駯ÇÔÜ<ôïüŒ“ý6FŽþLBµñ²ßçЇ¡?›Pm<ýôõïœzƒ­Á#ÀM@ãd¿6è#Ñ_H¨6^öÛ ý5ô¦ ÕÆÓO_ÿª¸9x¸%hœì÷Eô1è-ª�—ý¶B�n—Pm<ýôÝì n ö·�“ý¶C‡nŸPm¼ì×},zû„jã駯ÕÜúw‚ÆÉ~;¡O@ï˜Pm¼ì÷eôñè�ª�§Ÿ¾þÔ°8Ü4NöëŒ> ý•„jãe¿ÝÑ'¢wK¨6ž~úv�{€'ƒ]Aãd¿½ÐÃÐ{&T/ûí�Šî–Pm<ýôÝî~Ü4NöÛ} º{Bµñ²_ôô ÕÆÓO߃Àáà�à©`OÐ8Ùï`ôéè¯&T/û‚> Ý+¡Úxúé{(8ì ž'ûõAŸ…>,¡ÚxÙïkè3ÑG$TO?}û‚£À#Á³Á£Aãd¿cÐç¢�J¨6^öë�>Ý/¡Úxúé{8<<'û�¾= ¡ÚxÙoú|ô ÕÆÓOßÁZp0x!84Nö;}1ú¤„jãe¿aè‹ÐCª�§Ÿ¾_Ç€ÃÁKÀS@ãd¿‘èËÐ#ª�—ýNC_Š>5¡Úxúé;  ž^ž 'û�…¾}FBµñ²ßÙè+Уª�§Ÿ¾ç‚ãÀsÀ«Àó@ãd¿óÑW£kª�—ýÆ ¿�¾ ¡Úxúé{8¼¼ 'û]‚þ&úâ„jãe¿ËÐ×¢/M¨6ž~ú^NÇ�×�W‚ÆÉ~ãÑßB_‘Pm¼ì÷ ôõ諪�§Ÿ¾À‰àÕà ൠq²ß7Ñ7¡¯I¨6^ö»}#zbBµñôÓ÷[à$ðz° 8 4Nö»½:×ëjãe¿Ñ›£s½®6ž~úÞn Z¯oNF?Á÷]à³Á›ÑÆõû‚)àëèÉàà-à/Áoƒ ªíÿx3økðVpx;¸Ô'�ÿ z*úÍ„jýï~¿o ÞþÔ'�ý]ô[ Õú9Þý–€ßÿÞ þ Ô'�ÿ3ú.ôªõs¼û½N—‚ÓÁ¿‚úäñï¢ïAÿ%¡Z?Ç»ßßÁ»Á¿�÷�Ë@}òø¢g ÿ‘P­ŸãÝï=ð^ð_à ¿§«O¿úAt)¡Z?Ç»Ÿ¿gx?Ø|ô÷tõÉã?‚~½NBµ~Žw?Ïp&XÎ×õÉã[ E¯—P­ŸãÝÏß3|üø8ØÔ'�ÿz6zƒ„jýï~þžácà'Á'Á A}òøO£¿‡n•P­ŸãÝÏß3|ü ø}ÐßÃ×'�ÿú)ôÆ Õú9Þýü=Ã9`kp.¸ ¨Oßý ú Õú9Þýü=çÁMÁ‚mA}òø-ÐóЛ'Tëçx÷û"øpKðGàV >yüÖè£Û%Tëçx÷ó÷ˆŸ·nê“Ço�~½mBµ~Žw¿Àù`p¸#¨OßýSô—ªõs¼ûù{Àσ;�/‚þž¼>yü.è—Ð_N¨ÖÏñî·+øøðgàn >yüîèWÐ�ªõs¼ûu_÷võÉã÷Bÿ½gBµ~Žw¿½ÁWÁnàBp_PŸ<¾;úuô> Õú9Þýö_÷ öõÉãD/B�P­ŸãÝï«ààAà¯ÁƒA}òø^è7Ñ=ªõs¼ûõþ< Ô'�?ý[ô¡ Õú9ÞýŽƒ}À·À#A}òø¾èߣ¿–P­ŸãÝïhðwàQàÀ~ >y|ôô1 Õú9ÞýŽß�ÿõÉã�Gÿ= ¡Z?Ç»ß ð�à à;à‰ >yüIè¿ 'Tëçx÷;\ ߇�úäñÃÑCM¨ÖÏñî7ü+øuðàHPŸ<þTô2ô) Õú9ÞýNÿžþ <Ô'�?ýzTBµ~Žw¿Ñà?Á³ÀÉàÙ >yü9è[Ðy=Wëçx÷;¼t=ŸÖ¢÷äYažvÏCëk]àçB×Ð7ö²3Îõs¡Ÿ¢~ l¨ûR Ñ¯C;°ÿðF·¾ÿ†š~-ë>‡zc†¶\Éðƒö6´Í>ý�¸’1+ÛT3¹gecŠm�gÀùѦ3µA:_{1Ôµ¸ø*2Pd È@‘�"EŠ (2Pd È@‘�"EŠ (2Pd È@‘�"EŠ (2Pd È@‘�"EŠ (2Pd È@‘�"EŠ (2Pd È@‘�"EŠ (2Pd È@‘�"EŠ (2PdàÿNü»á�¶åï†Óß_ïÉ¡ç¿æÏÐùjV3¯ ¼EàþmxÓ*ð�ox›ÀÛÞ.ðö�w¼cà�çÏŸ+ÇÐ%ðn�w¼Gà=ïxŸÀûÞ/ð� |HàÃø¨ÀG^ø˜ÀÇ>.ðñ�O|bà“Ÿø”À§>-ðé�Ï|f೟øœÀç>/ðù�/ü¥À_ |aà‹_ø[�/ |iàï¾,p¦}e.­xMà-ox«À7 ¼uàmox»ÀÛÞ!ðŽ�w ¼sà]ïx÷À{Þ3ðÞ�÷ ¼oàýø À‡><ð‘�� |tàµ�� |làãø„À'>)ðÉ�O |jàÓŸøŒÀg>+ðÙ�Ï |nàóŸø‚À_ üÕÀ¾(ðÅ�¿ø’À—þnàË/ñ^#ks=ÔÝÿ÷=Hr‹À[Þ*ð�ox›ÀÛÞ.ðö�w¼cà�ï¸ïŸ’�³[àÝïxÏÀ{Þ'ð¾�÷ |@àƒøðÀG>*ðÑ�×>&ð±�� ||àŸø¤À'>%ð©�O |zà3Ÿø¬Àg>'ð¹�Ï |~à )ðW_ø¢ÀþVàK_ø»�/ ¼Ä{§äù³và5�·¼eà­ß(ðÖ�· ¼màíox‡À;Þ)ðÎ�w ¼[àÝïxÏÀ{Þ'ð¾�÷ |@àƒøðÀG>*ðÑ�×>&ð±�� ||àŸø¤À'>%ð©�O |zà3Ÿø¬Àg>'ð¹�Ï |~à )ðW_ø¢ÀþVàK_ø»�/ ÜÉ_™ÿ�×Þ"ð–�· |£À[Þ&ð¶�· ¼}àïx§À;Þ%ðn�w¼Gà=ïxŸÀûÞ/ð� |HàÃø¨ÀG^ø˜ÀÇ>.ðñ�O|bà“Ÿø”À§>-ðé�Ï|f೟øœÀç>/ðù�/ü¥À_ |aà‹_ø[�/ |iàï¾,pß\­MªÚÀÙTjVj^÷Ù9eÞ¬îsXr¿Ÿ ’¹ŸO‘Çt¬ðæuŸë•Çt®ô7«ûÜ©Üß­Òß¼îóÓ²O�Ðß3ðÞÞ¬îó´²OßJóºÏŸÊ>Bÿ À‡Tx³ºÏ¿É>#+ýÍë>$ûŒýµ��©ðfuŸ•}ÆUú›×}ŽRîŸú'>)ðÉ�O |jàÓŸøŒÀg>+ðÙÞ¬î³1ò±ù¾½ùõΫðæuŸ‹‘û„þ—*¼YéÕ o^÷¹yü¢Ð¿¸Â›Õ}ÖCãç+d¾4p?_!÷/ ¼Äûæþµ¯ ¼Eà-oUáÍë> û´®ô7+µIÜ+ màíox‡À;Þ)ðÎ�w ¼[àÝïxÏÀ{Þ'ð¾�÷ |@àƒøðÀG>*ðÑ�×>&ð±�� ||àŸø¤À'>%ð©�O |zà3Ÿø¬Àg>'ð¹�Ï |~à )ðW_ø¢ÀþVàK_ø»�/ ¼Äûd:oë¾W ¼&ð�· ¼UàÞ:ð6�· ¼]àíï¸ïÙ›�­Sà�ï¸ïm›Çû~·™÷¼gà¾mÓ'pß+6÷÷ Ü÷fÍý¾kæ¾§jæ¾Ïjæ¾§j澯iæ¾÷iæµ�� |làãø„À'>)ðÉ�O |jàÓŸøŒÀg>+ðÙ�Ï |nàóŸø‚À_ üÕÀ¾(ðÅ�¿ø’À—þnàË/ÕTÏÅÚ�×Þ"ð–�· |£À[Þ&ð¶�· ¼}àïx§À;Þ%ðn�w¼Gà=ïxŸÀûÞ/ð� |HàÃø¨ÀG^ø˜ÀÇ>.ðñ�O|bà“Ÿø”À§>-ðé�Ï|f೟øœÀç>/ðù�/ü¥À_ |aà‹_ø[�/ |iàï¾,ðÒGÃü¼&ð�· ¼UàÞ:ð6�· ¼]àíïxÇÀ;Þ9ð.�w ¼{à=ïxïÀûÞ7ð~�|PàCøÈÀG>:ðÚÀÇ>6ðq��|BàŸøäÀ§>5ði�O|Fà3ŸøìÀç>7ðy�Ï|Aà/þjà _øâÀß |IàK7ðe�—Ö ó?ðšÀ[Þ2ðV�oo“ê¨N¡¿sà]ïx÷À{Þ3ðÞ�÷ ¼oàýø À‡><ð‘�� |tàµ�� |làãø„À'>)ðÉ�O |jàÓŸøŒÀg&î3‡Y�Ï|NàsŸøüÀþR௾0ðE�/ü­À—¾4ðw_xiýò\õu­xMà-ox«À7 ¼uàmox»ÀÛÞ!ðŽ�wªðf¥Î�w ¼[àÝïxÏÀ{Þ'ð¾�÷ |@àƒøðÀG>*ðÑ�×>&ð±�� ||àŸø¤À'>%ð©�O |zà3ŸYáÌÿ oVš]áÍKsŸ[áÍJóŸ_áÍK ©ÂyVøÂ o^Zøâ çYMàK*¼yiiàïVx³Ò²ÀK-Âü¼¦Â›•Z޲›—Z¾Q…7+µ¼M…ó¬2ðvÞ¬Ô>ð޼Ա›•:޹›—ºTx³R·À»WxóR� oVêxï o^êSáÍJ}ïWáÍK*¼YiPàC*¼yix…7+� |T…7/�®ðf¥ÚÀÇTxóÒØ oVøø o^šPáÍJŸTáÍK“+¼YiJàS+¼yiZ…7+M|F…7/ÍLÜg³ŸøœÀç>/ðù�/ü¥À_ |aà‹_ø[�/ |iàï¾,ðÒÇB­xMà-ox«À7 ¼uàmox»ÀÛÞ!ðŽ�w ¼sà]ïx÷À{Þ3ðÞ�÷ ¼oàýø À‡><ð‘�� |tàµ�� |làãø„À'>)ðÉ�O |jàÓŸøŒÀg>+ðÙ�Ï |nàóŸø‚À_ üÕÀ¾(ðÅ�¿ø’À—þnàË/}<ÌÿÀkoxËÀ[¾Qà­oxÛÀÛÞ>ð�w ¼Sà�ïx·À»Þ#ðž�÷¼Oà}ïø€À>$ðá�� |T࣯ |LàcøøÀ'>1ðI�O|JàSŸøôÀg>3ðY�Ï|NàsŸøüÀþR௾0ðE�/ü­À—¾4ðw_¸X•Ÿ¯xMà-ox«À7 ¼uàmox»ÀÛÞ!ðŽ�w ¼sàîÍgpñ³·š�ºÕ}.Ö.u?u¨û¦¹î¿šO–û«=evàÞ=‡ô:p»v¨¿i•5¿žWùªùËGëâW:V‘´ÛpTÝç‡åás×[^çþưæà3ëâÖL:k•âçÏ+Óï½ÿ_§yæ—Z)ê}Õ\?ì"?-¾‡DýßÄ=¶üz(Ãþ¿ÿûpÃó³¦Î‡É\]o=Vv~jnúð^�¯eu_S|=<¢oð彿|ÿ/oòµ«sìr¯ÿ×îQmÕÞ½ îóÊûu©öV™ÏR‹Ì÷G“Ö�¯Ž(3~|üoýššîdz¹ÇêW>®¼}eÇuÜÇ xJy¿5ý¿ÇUÃï½æûtþ\É57¯#k:Ná¿zp~ôÄ"Ÿ/.ÊtýÖÎæúœ½ý£»^o„÷Îu¦×vI}Ÿ }³í_Á8û*ãò<Ìëkž‡üJêýZÕ:f�Daþ¾p~t`T>_�á®ܺÒ׿uX¾ßn^wÏ/Ï�ÍùIC·yåstóºšçYÝDÌV+ÀÊçÛn{ØÀ#ŽZÁ�•v5µÎ^©Y±q�eÀyÖ÷|¾ºÂs½âܲ9çœSÕy>Ÿ9ÕŸy^ù¹É+ûªÌ«• ZɶúßÏ­dh±é?˜ç•ßåóµ'¼|¯Êók­R×^¥ÒFÍ5/”ê¾·~‚Ž©YXÖ�~×^{P´:ÏÖÊÇÒXŒÔïò_{ÁúuÇ׬ò Þg¯&nn¶VùνünË?ðÊÏt©MÊ£Ýî×òã¢~v^�Ýމã?Ï136vq{9ΚÌ_Ãó_›ß?=ӥij,¿þ³ùËÇå‘d¾"\ÑvûН"EŠ ¼_êž~î±9ÃÖÎ]Ø…_Q*@;þøã÷xvÞ¼Ý⽨ºn„V@›Uoº®EúÔ­7›"rƒ¦5¨lPöŽ÷»rùÿÚ½8ŽF›5E-1ózü0œ•U¹ú½‘nÆX1–Óaœòö�¿xÎã;?úänâv`÷U|Ö_Þÿÿ÷ÿ㹊¼úºó÷ª9oÕ÷ˆ(ç·<²v÷M.<)�“.{¬÷â­Ì¹¸½T­SýW©[®s�XÞ¯ú×^]‡ ;¶´:?jjR=Øý¢¬Þ/â9Ìó#÷E]¿¯v�¢Ìùæ§šãÆ¶—÷*þ/2Pd ÈÀÊ3PW¥z°aA¸²zßtZy„OT7;¾Iõ`«»žÞ=¶tïk´dû^¹ÌëñŠêÁjMï¡hUׯ¾wîãÛóÞÃâˆþï=<¶¨«g¶ÑgÕ!¹Ìyk¬|ñÖá•zðÊ'Om¼Lõ_¥\šêÁFžZž:¢ÄóÁŽÕƒjkR=XsqQVk]½¶ò¼-�S—[QVsQž®Q×ç óWÞ§ø¿È@‘�"ï—�áù`µÌlr=˜×„å_EãÏ_©óz¼¢z°êçýÔ¯†X¿¬ÿ|pnQ–SWÉ_ýµ)ç´<,׃9o�Õƒ«ü|0Õ•zð_©Lub8¸:Úµ×^CúŸñá=œ;¶¨—¿~ó|ÈóÄÓ’yÞV¿¯x>Ø0G1gõyÃüÙS|(2Pdàý3°ÜóÁÊðïx>L›\Ægƒòto\¥çƒy=^Q=øïx>XsêýmØûŸƒÿFÔ_—²®¾¶\æ¼5V®òóÁTÿUêÁšfå¿ÙKub5r™•ëÁ6‡Œ1xø)¥ôŠMz>8öÒ¢¬Ö2žçDÆú<븽<‡Šçƒå<4Ì_ìϼaþêR^üWd È@‘�÷ÍÀrõ`ƒÑÿŽzð“U×FëÁɧ”ÖŠòàüûƒ«SæõxEõ`óÊ1yõ«!Ö>XÿçÅÝ‹z°œºJþòš±:$׃9o«]¦ú¯R~2Õƒ©N¬F.3ëÁaC®ÎÂ&ÕƒÝÇ­ùzÐß‹]þkùÜO²|v¢òïqV%ÅߓĬ¼È@‘�ÿ3ÐÒ—ö�þždÇw\®†k,G¾Gnúj´dû¿ýïIòz¼¢z0ЊêÀò¶Ú=ê׃õ^<¶¨«i\îç~Ë×$yP®sÞ«WùçÅ©þ«Ôƒ­S=˜êÄ7#õàˆ�ýOY�‚°Iõ`Ík¾̯­ŠË羨«™©ÏŠz°~F ]d ÈÀÿvÂóÁu«¿è—s²ò烵ËÕpyŸúXWq–;›\®ÎóÁ¼ׯ}&P}¥®Ÿ~5Äúõà¢þw?ö¥ †ïñ³?ŸûøzÞ0knQ–SWÉ_¬E2¯Éõ`Î[cõ {¤sâßoÞøß“¤ú¯Rn™êÁT'V#—Y×^Ýú�8iàÐR‡�ëoZUݤzpî•E=X¾®^[Ë_oõçJÖe,~^óáT�º>_ÑöU�ÞŸ"Eþ·3ð!ü=IõMŒ›\Vï}ñ,­Úß“äõ¸~=XýÝA=½Ÿ®ë׃õŸÖÜXüþ`9w9õצœÛò¨\æ¼5V®òóÁTÿUêÁ©LubõØÊŒzpDÿÓýûâüÙü„q•¾êæÔØ«Ö|=¸*?ï¬M‡\>ö|Nâ¹r@UWßGªÚ·0žcdlì8âörü¢Œç¡a~–?+Ún_ñUd È@‘�÷Ë@µ,­] úQÞï}ž¦Zjå1šÕäzpužæõxEõ`u]�ë’¯£ªë׃ ~°¨É�kVäÕ!¹ìžòÖX=¸ÊO’ê¿J=ø•T¦:±¹ÌºöÚgð�!õ{›¤›ô|°ûÕåz°å ~K­IQü¿òóÎ"õ¯§¨ës'ËŠú™DEw‘�"E*ð§¹µkôý›Qh¦¯ºz0‹M!¹å¾ŒMû{’¼W­;j)Bóz¼¢z°Z£zïô«!®¨lŸÞð3¾ÿ`Q–SWÉ_ýu(ç´<,׃9o«]¦ú¯RvKõ`ªÃÁÕÑr=¸}·�‡ûCãò”°Iõ`Í5kþù`ý׸|-Pþ|�Ú4¨x>¸|¶þWêéå_u¡Š (2ÐXÂï®àJVþ|°´JÏýÌÙôÕä烮oé}fò{Íà±j?/ÎëñŠêÁêÏŒsÍÒWTÆ÷£ž[Ôƒù¼‚æoE­:$׃9o«]¦ú¯R”êÁT'V#—õà�þ#Gºý^ÆŽÑÿ”‘M. ›Tν¶¨«sÂs¯±ú<ë<®:—ŠŸWsQžÉQ×ç óWÞ§ø¿È@‘�"ï—�5_~¤zj=˜×ã5UÖÜTüþ`õÔÖ_—²®ŽÈõ`ÎÛj׃©þ«Ôƒ}R=˜êÄjä2ëÚkßý?ÄÏ«;±¨‹z0_ÿ.t.¯ÌkEÛËó¿ø¿È@‘�"+Ï@¹ô3ŠWôµòçƒÞ—Þÿk�ê�¦Öƒù™`½¿c^µçƒy=^Sõ`÷¢¬žÙFרê�\æ¼­v=˜ê¿J=xlªS�X�\f]{í7ôxžäGÆuØäǃ¥&=ì~}QVkÏA¾_äz&÷E]¿¯ø|’jëç/ç-bÃüÙS|(2Pdàý3°æŸV~{°ü>"Møüâ.Ô�¹ùÞ6•¶¼ÑfÝQ÷ûƒi=^SõàØ¢ Ó+®I‘W‡äz0çmµëÁTÿUêÁ!©Lub5r™uíÕ£ÿG4½ ¬5©¬™TÔƒÕZÆ$:/2ÖçYÇíåyTü¼¸œ‡†ù‹ý™7Ì_]Ê‹ÿŠ (2ð¾Xóõ`õífJM}>X÷»ƒåߌ/¤ñZÐ:1׃y=^SõàÜ¢ '%¯Gõ±:$׃9o«]¦ú¯Rž–êÁT'V#—õààñûƒ¥�êoZUݤzpî E=XÔƒõ¯‡ÕÕNÕ•y¬hûªNïb\‘�"ÿÛ¨¾ßÌ þœ¤´²ŸWß§lålVý�q“ëÁê½/ÆXµz0¯Ç+ª«nÞ[ýjˆõÿž¤þûvŸß²îórËûÿ¯ÿߨUÍK®sÞ«WùýSýW©kS=˜êÄjä2ëÚëÀþ§œT¿·IºIõàØ›þ;êÁRºþþ³_œç‡ùÎ|EØp{ñ|0æ©a~–ÏgÃíS{W½»¹ø*2Pd ÈÀ 3à§ ¯Ù÷›ùT^�ÒÏ‹óaä÷šë5íýf–¯óóÁ¼¯¨ü·¼ßLQ†Ó׬ȫCr=86å­±zp•ß0Õ•zðÒT¦:±¹Ì¨�* ªßÝݤz°ûÍÿõ`mz…ÿÙzЃp^d¬Ï³ŽÛËó¨¨Ëyh˜¿ØŸyÃüÕ¥¼ø¯È@‘�"ï›�þ|pÕ?¿¸rêóÁ¼¯¨¬Ñrk”½ÞWËø~Ïçõ`9U)_åÜåu)cuH®sÞ«Wùù`ªÿ*õà„T¦:±¹Ì¨O2rðð!gÔ߲ʺIõ`Í­E=X�æ¸zm5äy[—çOñ÷$ÕæUs³ü¶Æ¶¯òü.(2ð?��^®òÏ‹Ë&Ìò‡ZæõxMÕƒ5?)~^\½t[£ª#r=˜ó¶Úõ`ªÿ*õà�©Lub5r™uíuЩNø¡ý=ÉÜ)E=X­W<õë•Ü—çNùþŒR6éùàØÛŠz°ZÛyâ5VŸg�ÇUçPQVsQžÉQ×ç óWÞ§ø¿È@‘�"ï—�5_V–šXva|n•÷š±FÜkeͺÃ÷›ÉëñšªÇõ`˜\õ×¥¬«Cr=˜ó¶Úõ`ªÿ*õཀྵLub5r™uíuÈq#ú¸}Ï�ýO:僔ƒM|ÿÁ©E=XÔƒù:øw¡sye^+Ú^žÿÅÿEŠ XyÖ|=èß(§¯&ÖƒåûÞý¼ºîi=^SõàÜ¢Ìçll�ªÉõ`ÎÛj׃©þ«Ôƒ³R=˜êÄjä2³³ô>êWC|¿Ÿ×Îó<Ö™×ò~ñ=ÒçUûâöÆsŒŒ�GÜ^Ž_Ôƒñ<4ÌÏòçcEÛí+¾Š (2ð~hé€=6ç¿5öþƒ¥ÊS•FëA§5ÈÃ)•r=X½×•ûËÿ¯ÚÏ‹óz¼¢z°ê×%{«º~=Øàý‹z°šÆPOTÏYÎeyX®»§¼5V®òß§ú¯RÎOõ`ªÃÁÕQëÁaÃFú@?).›5í÷ï\óõ`ý×X?÷E=Ø0C¹§ÙZÍK«RO—ö.ïñŸ­§sMè±d¾"\Ñöòñÿ(2Pd`åˆÏŽô�Lýlãã�?ÞÏ™Ûmù{Qi¹gz ÷.÷TªÁ&ÿ}qüs‹î«VŽMëñŠêÁê1yOõ«!Ö¯ëÿ=ÉØ¢,§®’?sX¿U‡äz0ç­±zp•ÿž$Õ•zðg©Lub5r™QíÒÀ6݇ ;éÖ„Mª»ß]ÔƒÕùà9ˆ×X}žuW�GÅóÁj.Ê39êú¼aþÊûÿ(2Pdàý2P®­ùVôµ²Ï'©ÞßW´gµïcUjíÕ„Ï/®ûkŒåž¢÷ZY³î¨ûüâ´¯©zpnQVÏlƒ:0¯SÕ!¹Ìy[íz0Õ•zpQªS�X�\fԃÎ÷ãê:ìPÓªê&Õƒ5÷¬ùzpUžoÕ¦W÷Ÿ}¾åA8'2ÖçYÇíå9TÔƒå<4Ì_ìϼaþêR^üWd È@‘�÷ÍÀ‡ñóâʪÕÔzÐZ0µøBV­ÌëñŠêÁª›þ~5ÄúÏëÿ¼¸æùâ÷˹ËùËç*buD®sÞ«WùçÅ©þ«Ôƒo§z0Õ‰ÕÈeF=xê±#Gô?ndý-«¬›TνwÍ׃ �|ùÜ?/n˜¡ÜSü¼8g¢À"EŠ ˜�áý¨«?œýPëÁ¼¯©z°{Q†K(Ö!‘W‡äz0çmµëÁTÿUêÁwS=˜êÄjä2ëÚ«÷ÀQ«ñÇŸ4éï‹ÇÎXóõ`å;­Ê‹]>÷E=XILRÔƒ RRt(2ð?��åžÖÔOÅÊ~^üa~^�ï9“ÞwÆç…«ôó⼯¨,ÿìÌWëú¹b¬ÿ|°Áïõ`9u•üÅZ$óê�\ŽMyk¬\åßLõ_¥\k­Ó68—÷yIub5r™Q:õäc?à¯Öy4éù`÷Ö|=Xÿ5VŸ§—çuQ6ÌPî)êÁœ‰‹ (2`ª¿?X®–ÏÊÊêAF¦Zjù}꫺'�åNÇx¿?˜ÖãÕƒÕG–åusEuáûÕƒs‹z0œê\ÿÕÇê�\æ¼­v=˜ê¿\æH5©NÌ:#õàéƒOù¡Õƒ53‹z°ZŸzâµVŸg�ÇUçQñûƒÕ\”çrÔõyÃü•÷)þ/2Pd ÈÀûe Z2²Á�ŸV^z/zÿ¯�W‡|¨õ`^�×T=X³ øýÁê©­¿.e]‘ëÁœ·Zö8¤TšÏL­YxVÝóÀ}˜Â &n5l…õ8¤Çà¡yÆ��•¾¦’U‰Sö,¿þ4~�ž¼{¥©ËϦçv].v—Öûx­Å/Ç–÷¯76 r{ͳçœësÑÿë_ƒþ²ÝùÌè|ċʺS#çù�þ'2xè ôõû ÖªžŸòW›=Eãw!Á9¿mè3ß-ÓY�Ö}Í=¯\÷÷2lè Çœ2rİ“>Ðû¿ù¼2_ç�¡)Z~[·ƒöÜaÁÍJ5>9Ï[ózÚóÀ½ßÞ TÚzèÀQ#K[1ð´ÒÖú�ì_ÚúøÁ#øfnë!ýùTéŒÒ™¥Q'ÊýQ²3d[6xèÈ�#J'ŒvêðÒiý‡Ø¾TyÆð�¥Søýañø!ýO( íòÀ#wîxTé”þ§ Pª 2„¿69ldÿ!ŽáôÁˆ8øØ4xç£J§žR|ܰ¡Ç°aøÿcì=àì:κÿÙµ“†á%/QÖÊIœ7”HZµXk)ZYvâ„›Ûv÷Fwï½¾e‹h¡›nz衇zè˜z衇z‡ÿ÷÷{fÎ=W’óùk5÷ÌÌ™3gÊ3OŸ9ÍΪš8uÇÓ^—îuZýaûŠšÛïºN¿çÈ�«¼Iy£ætûÁH®Œšãî@Ýl¶¯t;º›ö\}EÚÖ�©k{»9ØêvÓÞNw2Ö•¹2î¶§Žl�fSÆj6î*I›<ªVv�îfw<¦g+ÃVr£Ü÷fgÜvºÑ£#«wSWkDè^�&pŒw5# Ënsì'HîÒÃÔ oâO‰T«7ÝiN®¤I¿×é64þ9Æ$´gc üJgÜãI'»úM“íáÞ•îAÚ¡ÍªŽæ¦Ñp¢ë‘4îö›SÐû»ýîNš1 »žÇ˜'½i\½iìénv¿qwSµê!–߃GÇ{W»Ñsæ…·­lއ;ª]…ÛO½bKS þèrH¥t-føð$LÒ@·')~Wè}›tû}õ©�ˆµÓÊlÐ6Z³Íäˆ:别jwF‡´ã—NÔ®I·{%mÛ³I£ƒ–¢9hó¶Ét8Rf³ßàÁ-ÎF›t“á8 f;�V¿Ù¡Û½­íÆC³f¿7=H›xÃs»=ìé÷+R©ª¡ÁiNÙ=9cL‡LŽ�$O¯t†›4~Ò¦Íý†‚`æù¯H^6´§ßÏ[¨3ƒ Q€*ͬgî–F½Ýá4u¦ûLädˆ�YB£ífj÷{#úækwÐItj’†ãéö°1¡“ÝÔáÛy8ÔÏÆ~îpãXémR£/饧´\MpÀ4�¯¼òÄfoš&¬ü.=iw™ÏÍ1S8Ç•÷nnNº”!›•ØmôvhØA»Ÿ8ndgÖôzݽF÷€þÐ ƒ¾³½A§»Ÿt7õ›ôJsÐÛI+íf{¨™¯À¤|ÆxLV6Ð:y�ÑÆ¤Ï }5ê“!0Ôu¾Û›¦£æVפ¶xwÚwGé@?Ó=�ætOc©[^ɼjärs4B„:£Å“él&Šw€:ÑÌQ—3˘ë÷À¿îµ’n€"�î0T,€ 4ÖœŒ®ÉˆE$¸›ðÞnƒ¡�B„'É3߸²žËZdHÕ–I#/0'˜%ÏÖÑNÉ® ‹Ç ¼Ö‚”FÓü;ènyqvÜLðÚ«À‚i…ri¶[ás0ò«€D~ü{UUŒÄ ´Æ³É6KcÍ‹$ص3Ó^pÇps¢µ$¸ÔuÌ´�›,ï�†Ë&Þçáqïõ`?�¢•qQ3B%#MÚÛîµ·ÃÙT� L©•®$Ðs «!d ÙêÂcºç#]÷šc_)4uÛÊÚé�]ÄÃe9ü‰¥@w§7Uz»9îè:nBãp÷`â×5wZºG½¥8QШouI•è°bue¹‚MüæRL¸L·S¹ºþlÇíí€m”q¥7¸R®9 ²¼µ­<ÐN®{kÜÜ™)³ßÛt�{¥!nëµïÞL¶›�ážn]·ù%DÈ(O˜ÛÅX$ÌHß�’¯�ídH ;Ÿî#àLØ ÓŒaÐ{ ¾|)xð®Wð? [N}…ÁÂU„�ÂÃ)XRÐ÷L0­Èsª Õnô¶ KþiøÙ’˜°½º2aŠ:=‹hZF´ß¬ ıc299 ÊOÃh§ 5l-$ƒûiLÇ]ð’o2ìÁ¸%G£•ï 6û3ax OÅZÍI/¿õ¨:¹^@ F$0wÕ‰Zž[ OԶİå>‹è2"“a_ՙΌòH@ËꇵZ›ìÀ>ÃíˆOÛnöÆS/"ÖÐ`PGøÆ|<™öúýF Ï>JÍÙ,=,Ìï�ëD±a»Û°vÍYä¥éŽz�`§Z³>øZËsÃëÊ3ir#è©W–aN?ðn¬?»³Õ8“øé7Û³As,*MjØžÂfN :DæV¶I4­ÑÜÎࡉàÝAcïHÒïª�ú÷.ýît÷amÁÍ<º£ˆV¬Ì=¨Íí<3&Õ÷]|ƒ�5'Ý&bFZ³Õ‘'!Œç¦æ¦8 Q¤.œ’ˆ’®ÐA8رÉó  £’€gÊØ1 ±;€“Á�îŠ#�šEÕ]تa;£Y]æ«N/2öu1Ly}gBD^$ñ@‘p��ÌY@Ð…ÉvgO|ggoË¿-ÿ †àÆ[~{ëTW$ØcB@zGô# ž1ç^Å�Þæ$iõÒª-ÜÂ6¿ÛjC·ã»¼á¹ vÐ !æK òI·SYE¸: ªn¸l‰{;ëj‹e€äÐl€ ™ôˆŠ§¬bóèÕÔì@A¹…¥>`.Œåf|*’è0dÚ_©ÜmäY(ô©iÐèÒö6•XŠºrà!rb{8î]EŠ¥bl6aD_=VÏ%éÁh!ìdjÂ:ï{…©¬ðÂ`¢åÒœî4´{�’ê òPñFžo•gôpò4 –+0?]ò&¹ÁZ¨Äy ö�)wÄ1ƒGډ橀q Xæñ.ËY; ̓GàæF ¤¸Dž'ú B¦¦BK'sÛA-ÅsˆZ2tÊ-·U¿@ÚD6?RòæÅKN®¼0Ì"/�öl 5�;ØaÇ0ËL”F7ÏÓ,¤&2g2+A9Œ‰g!äÇÒŽ¤jä:Ÿy.ƒ§‹…Á(vÌ:’k Â•à½@Êb“Y¿Ýq&`®…åÇ/Ë�ß–ùýlé§•`DÆúqlK1  �¡ÓŒ‘!_, ‹<Ä É7ÓUñôx'Ʋ?ƒïo¤Ýa?mY|£¯ƒnñTR@oôª”ê/wˆëN ºé>°©–)ë^‹'Ó÷ƒÖ6ÅjIžC†ÕïjÚbåLüÒˆ©ŒÖuc~£–ÔÝúõƒ .1èM†µ L6Ü/fx:ôC1ÛF)B��~Òe5~Iq Xšˆ­’fá�QñŠ^š¾kÖšç´† žŒ~‹¾DÔä:G!°%›¥µ [’Ø£ê”)¼c®¡ÆµOŒ6û�Z�ÚFL5Ò¤Ðøx«…˜íµ'Äì §î@õ…@Á_¾ †…‘¼ %n¦3X­.ô_Ì'²¡–îy­Ó_ñÍ2GZwˆoŠ �>„w“Ø­²½ \^…"UÝäÝÃ=¡ˆ£~ŽeS•TÜåVBKµ9î†Øçh|‘6·MM÷|3u�o˜Ì4²‚_ Q*cEQøhà‰¡X/çPÌ�,F´DQ‰@æTNxÙ�¤rDÙ`›,ÚœW(ÆpÐ?ˆ±¹ Œ¦ã£1¯:Üå•yG¢¦ H }‘ÓFgš3 ×¾cmÐ]êœ;³äŒ˜]p‹î0=#4 é_†}­=]Wº1îèªSù/ï�D?; « ᘊP é×z"Ë[i¥ ½‰ôŠKh ЧT›özŒ†ˆlìÍ4Õ:I=˜v»beÔö&ƒ�öº¦nÛGÒöjÚ<’6ù=Їiì²â$‘jÐ�”93)R@�e€FPm\hf-Æh0�Ìü»Ìô,.»(T€÷Y\v­²šù†ë Ò OÅu7Á'O�àÇèð,t”ZÆq¯³Ÿàâi/m£q·)Te�×YU#)S”C±Vw9œáö8bPÇá ¸~=o%��j*œ�½" ³¯Lv`¬ÚˆËlż#É%êfÐ=ø )�èg5÷_z”<Ž^ƒYâ×êJÓïX2((4Ø‚N/ªÉ¶¾C¼Ù£¤žo•Jk×ߎYÛGµt@ÐSF\0¡N– “ڬƞNª ~?›ZN›Í�^ÿÀ¢ÅÊ®sâÂÀ9ÙËבiKÖ¢Qiû¢ºɆR.úÊ(°Z�h4¸®æëé1B«ùUèY –E픂dg4ìpA¢ôµ?D͸²£Ë qD0¾²Ã �w¤@àš/;Ï•�.ºR´o9åX¡°Àb}ÝûFkêÄ®¥ÎÐo:. T3õý+Î\Uqõ{¸æ–s¹º� ‰˜8°ž`ØNmôEÂù(ó;½Ý|éA± <æ:<*³²Ã´X¡†‚ˆµ¤a¡ÝZU¢H4jRºÏ{Òjï"n!k!hÝ•º¡[kÃÊBÙZy%KiÃXéì©ñ9³=Ô‚øW­ÙMÔ»«n¦^š<¸ú\4a©uõ(`8Bq‚v#^QbòìÃÏN+ ؽ¤¦Â¡ýöðŒÕ¢­ † (“�Jó‚ºë´êÇ”]a~GJ]ÊX¹Ë±Bƒ€­ ÊÔ.šjÀ *9Fæ öx¡iÀ§Dq�iE¢ô×J‚¬¯UbÏ„I©Z—ƒ”q.ú’1]¡Lž”ˆT"·úef_ÂèdWÚd£«‚Bå}.3_“I›‡‘­7ðúg]éýš×3È›åpM}š:x’éöù€â• ³C Òêk|KèãâÔµ¤Â™,à†I>hEÀz°F¼#eT4ªƒ-´‘9Îêju`{}i´,¨eTÄ„Iò6þÊI¿,Þ 4  ±8lÄpŠÝ>vC¤¬%ý ýZ 3Ò@Òeׯ;6'¼Yc‚ú§eÁ{Ü)%ßè€z|ƒˆo˜>x.F¬Š˜È$vI4Zø3Vš®›Xú#&ý!â%yÎO AÊg>��".Ž"uÍ)#¢¦ë‘Œ„k]�©h’üsÀâ}ÍÛJÆøhÕ@Áae yE�=°p`Z\îZ·Šõ«˜,¹É�cÞNw¤ Ìë·7飳¶¤Ý³ö×øYÖÒ—[s²˜©ñ%SnÏ„a ¤#äïAv-ëû‚x™b6göcBŽ'¾g� a©/uf©³›M4#Â+®Sj„»­”€¡°³�„`weØÚÖ€dL!^ˆÀZmá÷Ãõˆ«ú9ªükä4µ‚ü$7'-8DK_˜'ù\åD =:'Õ7ÆH†G*Gä3�Â.ïÜî•…�Š¥#:¸i’Ââ 0Â^*Ȇˆ ^2ãl±—žO$tÀmki:Ù˜$:(®ÊüID ?ß�^;§è‰H„�W‹+*×Ô%6lÍÙ 7yÎUJ™$%³šg[‚¦›fIÓ|*£$VÁq�ŸcX±%«úa�ÃXí4H¨\w{GÑ=çÈlÄ vøEgÏ…éÔÅJ •÷Â>¯gí8[Né0·Pѳlzh¼Å9ÜÁ°Æ½XX�ºÄRaM]‡Ly³Ýï^”IÂÞȬú«0õK‰ £.‚–£ô9C�b¢rŸð*k!š†ã†i¯0bÉÃ� •x]A–«æÉàÿlìï2*"X¥°¹ Ìtð¸Äa�8=B÷§Ü Æ‘öTë@v^‰¬‚ïm» Iñ£Œ5Ï\x&ø¿ G½ö©¬–dÌ!Tî`ŒñϦ´Í§Š$ˆ2¨ QF>¬2,ƒ+ÌGŠÖ°sPfFÑd6|Ï�.6ŠßŒøyœà�XÂò�묋jE;yª7À¯N¯_‘­kxq ›wŒ×<ÜÌ®>½LEDÑ›šÉµqZdÅÑ®~�ñ§‰b;n]àÿzμò‹�3 »nb%Õe¹ƒœPXIAÀÐË�q*«F<«v;¢qè7e*˜P ÷:ò�’'¤‡° pfΪ+‹dvþ�±�Ùñr-ñOP�«p‚ ÝQlâø ñÎ �’Ò lÂÄïÁÕãB�‚q_s~Ãw@뺡ˈfD=Žy©D&=؉X¨çã~-ŽKB;Œ M m<2t© -Ëq|ÜJÔödyЈ$à2§í�NÂn>±u—âëÑÐÂ×È„í}eÌRGQ%oD�Bû‚>xì�ªÍŽ7¸s Ä%úHI¤,ä0dz’˜j]Qö08*)|€›ÔN<¸�§¥=9"•¨ ¼ߺì(¤ѯØÏE#07ìÎE!©>MijÌyyôªI.8/;« ââŽPÜnLeÔDEì‚3x œ�²XËÚ­Åy®ÊGþ¨âW6.ž¹Ø8q.]Ù¸§D6Jäbcã¹Kùn-¾1�_>q*]Y»@8�®œ#~ábºrùiâë—Ò•gÈ j^ ŸcüT8RH ”3Û DªkíÚÃ'JX�©ÂN«®¼r†‹Œ� Ž(òGV$´Orº0QóÞ¹|º™x¤ j§× @_ Ï&¡×–1XØ~kØÄͯS4в`”ÐÊò•…ã«Ø´à ÊÛ6sÝò7gW¯Øô†…?êdÞ…vퟬÖm8»q�ËËx'矮ý‹é¯ %I ÓŠì ì=2>LÐ;ÀžEåŒ*p�c?^…аT’I«ü^3†t BVçªS�ŵ?keή%xb­sôUà·?kÀG¡4icÖ�™!jï F¸Šû¡õfíS{[”˜¯v´û�L®ŽZ) Þ–½œ Ìº½²¹ÃÂGl‚Ùeol4;»âì:CcsKYÐÞ?¸ê%†#&”O) EÓÖ¬‡ÖAþºPkèaë90 ho».[�Y%]¼J�įb Ñ\€¤æÉvÃ\¿b'AR»#G1åx-Ÿ—¨-¡ ÷Åî&¬Š¨Øån?_òõ*ÂôxkÝFYŽG 2¶™áÂÜë«Õò{Ô ¢`ÅÄXœ QÛªÓ{Q ´ñm•ǘá,Tó’4Ñ"GH4Ñ] t/ÁòŠÍ(é …îûýÜÛ°•B Q R†msáì`SM©8ÒÇì(½ÙŸ’‹£ïbi™lÓq)A´¯ =š\B]ã–:¢/É~àÈ:Ýär£ÐÀz&ì›\ �«V .äæ’í­á0ãqÍßE1¸«˜;C,ÃþàÆÁOKΘcýléŽâaCD:yVØXd­?´Ó\¡<怫ãÃýü^üoü‚a[ºp‘Èèä §F[´.·ÀL"C*"ñ„(ùJ9 Ÿé6Y¾fº�ÃF -ÑLqtõübç×ü‚"…GPÜ+ ꊖ“tâÉÓ…â¾Èý‘&#.ê{s˜}Κ8”¢whÍ7‡öù"ÕÓCÔ�8ز”k~[UÚHØ‚²F¼²Ùžn39È"ªdŠÉQ.ÁodáŒWKIm°PPl¹LN”äž.vWÉJ ’[¬3ÓóŒÜ»ÿÃÒ¥à>šHë8F€�l�OTþÈ‹ýÑ)9HC©ú#–êõv+ç´[‘±Ùn{-r=ƒ€ ƒ�l{O÷à”ˆÿI †å½ÿ�½ãÓîäBw¼a|Ï­¼Î÷Ί\ô»(ã!|�å6ß¶î*6À´;ñJØPVU,‡�'J9é9¶_‚Ú²4ÀyPm‰{×ì O"Ï Çó”kª çÒ5… `î®—¤¯ÍY§”ð&·ÆÉ XAÉh¬ §�÷¦ñn§*¡:RóF–²óÑCQ1,R§Ëv–X¥TyM `­Ýà .•" £ÆÔ8–Y®-4²^Rc¨,’¥Ui³ÄÃA2ŠíÌö©ŸR¤!L¥]®¼Ö†¯X Cs¸^~#a\4*Z}¢…&ë}i;Q`7˜L;ÎÓÒn]µ¥*¥¾ü1ˆ‹±_OBðV¤±Ïút$ÜâæŠX±Ÿ Ç~÷Äp°ÙØÜìí›s‘¿¸«¢UsUZsÐÜꌶC:4cƒÛpvØëíRI*Fïø)38vœ' 熮< ÕÒgËó–øãÂæb0^FyEbÊÅ\v‡óÝjñ|WGi6êØØæ!«e,at䉉¥0Žw> Øë]½Ô’£}"ÞmŒ–žóج”%i¡b%¯<'r¼zëæ¦ÒǬeæ¯x®•úµYu$HÂûF\BF÷Vß$ÙÆð‹þ=íßã(Ðà1VPh_S“ü+‰Ë‘Q4W®É¶ „†ÊÈ»aÆùýUå-…Ú0 2y^ÚŸÀèW&©,â"¿™ßdW…nå¹Î£ìš¥©ë:â&ºÎóQNw}¤h>¾˜…Õ+Á34! ß!Ý÷ѹ+<'ý ä†ÎH?ÙövÌ VÕt¿r%²;”(FVZJž×¸ìh M „Ð÷1§ýäÊ´q ‹¾e†ÂÉØ¯±³– ÙÒ¦xŠi†®¸Óó*S�~øÐŠ/l¨‰ŽdgLÇÝøÈ¤;¶ZÎa� Ü—Í=J€a„"!²;O‰¨©'~N¨ß9®g?¤r5h¯�7m‚S�ºý˰#§f‚ÊŸÿÃSÄ‘õ“0â¡úíî÷¼çvw‚¿Ò(oôðÛÈÏð„Vº[† \šÎ„^§kÁålҴÊ+{Ny$m\½&¥¤ʬÛ9Ú0�� ¸½>Ô ^ íýgÙÒJ6ØH m¼­' ”vCRf3_… +k ^'„+œjÏ~ö+±êb†F�’qVÀ~iâ°QIJ£¹Ú%9h÷à_ì+«qWÒmÂ"k²¥ w¥õ ‚ÅX1Û6ÍH8¦�¾r°g¸ a¤ò‚”Í¥‚B';vѶ­XñXÜ»˜2Ú³A€À¼Z :ƒµµÈ!Yà+¼™µËX«AËò¼žøEÇ”½4k½ýn̆0hZÙ«%4Z¡†ÌHDrtboI^<øŽëN(‚šXðs†Õ�cP…ƼJd_+§!¤(|¤7CU‰!àd`œÙl·gîú5ùv ÇæR49á‹IÓ^xSdgm¨‡+δ�eB/s ç f�©Þi½ºï•§AšÆ„ìÚfP©ÄLX¹ œ¢C`¢Ø_6‰zû8”å¡Ñ›íæ Eq?¡Ì¡aÏ¥ÅËC`þ¼Ü òžß$>ÿˆFO�GØ ]|••Ìo �ÖÐ8·j©…{ϨúUCœ]ã’Ä›D<Ð2þpÊ6#/I�6æïf»fv¶ÉFáÎpÖ õf¬GOB“}5ö÷Ë.¡À#NœhÛÁ-Ïv«kmáäÙ€¦:zøcàÐ5ÂÞÂ,§¨¡¤d‚‡W LQ�-[tœ®µ%°ˆ×dg¤«)™íð%ag8ÈP²…[l°ŒßÑÙá:¹Í©“ÀȨÐg°˜2-]{ŒCxuƒþàe)I¬7ÌesV e4ƒó3[ðSÜJLIbÊ„þ�ÕÇ^¥ãN-c…]rYÕîañó¯Žé!aƒ<¯˜Öá%%eÐA«HôSK8‚3qÔ�ÇU¢³ac÷5íà!ט2!úÕìˆMÆ(‡n°BRæäv–%\ÙW"™.SO(¾PMl‚iË’¾µ sxḂˆÇt(îGÞM(°Sf,°²½˜v)ɯØÊâ¼v—°e”`Å�˜Ýê –�ó²?˜�6šÓÞÌÞ¬JD·kv�^¯å)¿((ñ p‹FÎF=ùöõpO®Ò €¶±ëŒ»´ °¼6-º÷Cɪ½åá¡�Ó1‚^ß™f© I$�8‹O1ÉÉrð¯äø,³ÀüINó€à�…†ëŽ£bQ23`1Ý(œD?©Y |›a¡¤â,@mY ´žë�6È~³L0�ö Ínõ+¢õDƒ­©"à«ê–•~ÿ§íX/Dzf:«ù¬_Ü–î8¦^ƒªw@2øÉèŽtøæQ9 ƒaÂ6©�–,À²@Œþ `ŸÎ˜¤ÝaA˜ÑÈ¢ lÇ®½~ÀXhõö»¸‰ ”r¦Vb‘ÈE­6Eô�lj˜=9 ‘ ·a& '¢fuÇpÎŒ‘±¨Xa½ ß‘þ «£JðœaÞ21ŸðK%â®xŽÙ;NBkÙèŒØÓ*°'—ÏR£;Õ®fä ƒÁÖcäoz4į/ôŠ10î¡@lˆ5’ƒl4›ßÖ ¢cu¶Ö™µØ^{âÛò õk#îeŠ;Dûж-ç«Q¥š_Ø}òÅTVód†ã\ÌÈÂpÖyhiÖF¹Õߤ÷œXŒ‡‚Š]í1ì™x¹’=œõáZÞVaƒ„•é¡RÇô嬠s7ËTaM6~ƒÀ©¼ßl!×°0Ð ÔãQ0H ê•Bñ‚œaŒÒ‘ ( À)Òz¤Øy�#†AÇ÷9‘G飯D!GckT¦*b]½qªŠÀEXMÌâóZñº©k¹g‰³8¼”#˜Ñ)fa§C{Ä�JQ/\aÏõø-N•Z"xž¿›Äâ]ŸÁ)·ô\[¤K<Ô€UÝ(êj/²Èޏa‰¦£_TÂPÖ3üˆ2ÒãÌZ³.>¥�mĨk·CÅQŠnÉÝÞEÄm”ˆÏ?©n¡ÊˆáÕÜ÷€Uùq‚Å<©ñ�²jÄùÉ÷´ÕÞ‘X‚¹¶ñp íÙ$RòŽnÌqXäüÅ/eŠÕª±Fw§…‰Lc£b>tW<ø½…t u±3ZR±Î•ÊlÞ¾öÑ¨Žƒ¹Z"Aè¹eÚîyލ*ǼËi/ö©û.!A÷DRíÒ�T£´Îì(W“@Wàm9ŠIkâœ�æõ¦E‚‘Wl>FÆDÊr¤>˜E¥ ›b×9*ªŠi©AJj{�Í+ßÍ–ŠN·­ª›—ÎÉ8§&ÒrW%�/ìnF5¾‹ü‹^·u§\k¯W6'¦º)Œ>§ù9лëœçX�;Ïós7Ìã�*z8Å¢óY1§ 9ÎÖ’¡Âlé¦SP7¶JÔfý%©uE»“9¾™;âEÒ3¶F y•cNôX졞�g»‹%[›4fâ¦Tȩݒì]P»Ç\SZ9Õâ�•a¨ CDǬÖuý9)9£v¿Ô@¶ÖB…(U»mõ§7ïåJôžkêUÖ5u»y‹õ»”$ÂÚ;Ê“�Ú{Øç–]½T�bz-ƒyO²0ö%O×�9+Y-àçŠ�¸*+™¯²q²žÃ�ì|S­¤R8WZƒŒr§ªû÷â‹7BÛ‘_‰ZÐ4þ8¦øW•*96/f°q¡VÀ†õzF–&jEéE añ1£àFÐ A(k7$¬޹´†švÅdÿoLQÓ‘ˆJó– x˜#×'ŒDÔzºˆzQFÔ<�Øb&—·y¿çy™ñ¤úyžÀ–“¨òD´ô3�Ư) ûb9¸WY 3Aï4Hy;Cp~±6Q¹ˆ[Ê´3˜"ÖB)b÷DEb{¡bÖy§¿R(û�Ò$0Iu^CFy�ÍñûBF X®É—}B-Ó¼¼¸qÔC-„ƒ<–'Ú¯wŽbB4q_)­Åy Ùº–³_Kµ_A²æÿ[ÚGæ�rÒ1Õdó§¥’ÜF} ô™1¹!±JªL•¨õ8ëxÌ�©LI# #þŠŠw‡*aÆÙ¢>7(­7ß ;’3ñ nÎØ?ª:ãöœ†ËÈc™C•�à¨JHéAˆÕˆGŒ®¥iÝž°ã IPO±ä5Èpr N®â§�EÔä©-=^¥½ý®ÊãPÁžËT9ÞR®@¥J(^¿gëE)˜MYÁ ‘')¨„4U†7þë9çVXjžZ,€kÓ ÷ÅErz±�îTUº˜•Óé¶f ßrªz>l\Âhx$è·­ [ÒÝ2‚x¯%˜'7‚k>é;”Ȩ·½cÅ»¹t¾[��&B'Š�óƒSÁV:û:»ð�ðJÀ°ÇåÞ:‰…2ãÝâMà¥\­µxµ4Ïæ¾Ô2ó6FéÏå^‰½¹D÷š4)+"l„Ù–á ç |t —Cæˆ�qñI*BeéÊb:¶KVWb{�ä"áèLUF«3Möd9¹‚ ߀/±DÆ@^)Oj.A1žÑõÓ ý5ÁÕ—–véŸÑá Æa\‰!”’m®hÇæ!¡¿œ«æÌ}™âQ'37¨–ù=•£ –¥sÌ‘ˆ¼/ú«WbõH6éaÏCZDbˆ’¹‰·A´ÓN»5-¿ÕTðzyˆ1ËÎÏ´ÄqH';J�hR”+µTÔ]Θn´t¨ot(j´1ÇÕºÈÐIiáF\ëÜ�Û-”•Ý£„»0 ¡•šÎÚj�a( ‚̤"V23²¤¸«�­Pœs¤;8‚"ú”`CW¶ôüÈéÜ5Ú èÊuß T´oÅ�ÕçÐÖ6ØÌzöR�-F:õ|�«˜v· J¹mP=ŒT¨MÉ]¾®¬ÜAÜ�€¥è'¯ä»[âD™µ9+$ã@æ­ÝÐiL¦¶E”-“6¤j­ �ô± › p¯¯›v f0Ð ³Œ"[fä�`vÕ4Yxw43k­!¦…ÞÖ§%8d–-Aúa§‡OaðF #?V�®5Ō⠾ l]qÆ4L5%�-n pòÖ׿#L•œ*›ž">h6Îe]�¼jEŒ–¦>“ÂöxùQr'ö¼°\h*5貃áF*ê–¹W7|ÕÆHƒ5]F—ÁÜ�XôÑ+ægxL‹,U„ÐrF…HE†yб’âSNů"†@néXwý呈ãYö˜ƒ_p¿G‘˜ ìg‘¨Ô }À( ª-x áEæ½ø·Õã¥N:•;lŸ© 0²|D+W Az™Î>Âø„0¡a{³ñYâ´Z÷%¬P·ìš,4(ëCôM:5Ñ™óÕ­Â=G¢Ã>¦Óªˆ(¥×s$kT–‘z.àÙ™GÔá~�®#€tŠk|æËÍuVwÚ󽳯*L�—佇­{‡' �iC.„ûg)îØ�bN:·¥ D¶ž„ÿ»\ís§GÁSRß®C1bImød !Lü+z�Sºk4®‚ ÚÙ|&tíº0ê‰ÃëÀøtM$¡n‹€©ðåèã/áw|$«á=oß±›FŽë…°–º®\ÜF\ìì QU2…è qëhµF´:äˆ)gokÌÑŠàK¥_Å_-‚–¤Ž9Õ¡8èU^Høùˆ¢à‰D–î¨kÂn*¯+K²ŸuKΧJ±wt\%ÕÜ$ $@€éyR$Ö’"‚ŸU}À `Š“;8A.<ç+Z5O6vC°…eµÉU­Ç“�^c!æ¹\"Í7\ËB)þö®ê¤1Uœ¹í-¯þA*²Gø½…ZN‡2VIj›e|æ ^�›N§|²‡WØw«zL'€'"C[¬ŒEŸ-R»ŠÇqxþ‚àù8²¡}&�¡äH|o Û$²ŒZœsqÀ·EßäÊ9ééUÃ|¨ºÞ‹ äcÆÜžˆe ›Ò¤åSåhǃ±]}‡#SöX_¬;#–Är„À¯]fJ$<¼´„jh ƒw4 Š8;†êóYý$áýäŽ*¼‹HËr”¢:Z9ðìQúޝ1à™¯%M²©†îU ¹šàõST ¬xfN$È^�Î@¼Q†¿“4t-8ž£vaz<Ê,ú [83ƒ50ȧfhi€}ëIÔ¤œV#žWÜÔüd[/29Fðˆãà/Å© ±r4F®P›ÌêYs"N$ÅI :F $I:×Jn‰ÁPEíäU1íCÈÓÂŒ‚)ÀB;vÇ1©€ ¥­Æ!VÇVY¬Cö´Gî<Îjj¢+8Ç?:ìàô’ð’$ÜAYM:µ:W¥ó æÕKE˜?¶ØÇb”•È5 ”!�˜±Ó9ÈÎü¸PhË[xk_ÙðI¨æ®}Ò‡^>Þ1¤ ­DÏî\âTÒbwÃ�=PîÞÖÁ¶úS­ÐâòÕ•‚¼¡¼`zŸE º†üÉc±~­ˆõ¹fL¶Ñ¦ù»D‰™ÔŒkoš®¶M‚?ˆp/EÐü±"Š)®RáF­”kÛ ÎÕ¸ÈHËg øå;('T‘#Þ7én‰Ÿ†•c�¸A #|*)žðAjÑg1º1å)>ñ®Φâ†>@lá‘bÑGPÓ„̉�¡¾š¸8f²%yyžÅazQt¤qA ªTKS™nƒøãp#a m¸5¾ÍË1×Ð(UñA©¨³Áóq‹"âäâ"T ôÌ›²t­˜é˜Þn%ͼ„öÿÎS¹½z¥Ëæ#k¤Þkê€Ñ`H�ð�f€\MçN�>»Cm`áY»ƒMòy†Kœ³¯ TFÝYlHk`!{÷µÉL¾W É ÄE†½+LmFÏ=Nî丿•⯉¼ÙÕP€¥4XdLŸý}õB}µ×®e0Føa…|ˆŠÞ)Æ Ãâ0õ+fž¹Ú¥SÄ�Ê ¨šæàÓƒ¿†¿e뉣kqe/´æ9Wµ °Ï(¼â³+…W…T¥Â¬´ª1Ð'æÛ䆷îb#ÃbÆw™e·±“©È “�t a‘TQù¸=Õ`ÐâY 'r`$íIEM&œyµFëðØ#ÒŦ óã5—^ÊLAÞ#ÎÄä˜Î‡J€Öå!"†-¦Äy+"¸žÖÚÇ'¥i°‘)j ú`øc0lˆ `„ÃF¦€0r­p³{¥{mH§dx€I-Çã3ϼ,{ìψ¹Ü¿j®~]†¾‚ˆç»½Ï2Ç˜Žˆ…C®™;è¢?âlÝ+»u™^ZKi:[gk`;_NgtgøðmÖi'4öÎ\¦ Їí¾T?/ãHã/%¼L/8'}¬V&oªâ(ÇÍSW!Zñ[�±Ý1ã;²j‚¨‚%â“®y�E<˜¿¦;�ø®V䕲Ò%«‚R¾¤ã™zʳT+ 4xŸÆÂÓUN~~!M Uš×Kv•öòðÂ|ü†½aé2þ{f1zE´Îù±]F_¤È+Ⱦ¥T~Úy2g÷".�Å; Øè\±$\äº=ç c#‘ô÷Á7ÖëVÉØ#"‡|}cL,«"”WL(ÃØ~D°_œ 1®ðúf ¯�§R" Ë’o£€ûøäHt¨¸FŽL· é¡9´}²�Oô�ïÁiç†Ï·l …a(ð}Äýf–tÎd2ân|ŸË/7ûÎ:£=¶ J�aã„ûB¾”<>ŸþÉM—£5?3Ö Ò^ïÒUj[ÅAf‹ Òh*Ý¥@iGÀf¢%«ùz4_ïâƒ.˜¥eéax¤-Ó„ ˆa” �ïûŒŸÑxW?Þuш]M%Å9Ž(¯WâõSXaöSé‚°²ˆ Q>—�»§p�qUN »"ÌV¹³°‚Y�®bRf©ãôÛÆ’<˜Ì¬ù@©†Ũ.?‹êkæÙÆÈž©8êh{F5j± !`î¬Äà€iw®"Fù¶dÆ Œä°Î¡¶S§=Û­¤Œ4Ç…ÁGÉ)ÒÁ£Vø0“¶ð�ù™tø™ñ¢%«?"`ïˆ„ŠÆÓf­ žá�"ã#­e)ù¤É>ìȈ«;àÑat´ÊÝ ³PÕ ^YB½•JãˆâTδ# gëÁ5ûséð9øì;j Òn€Œˆ‰¦�ã�} lˆ­ -v™o‡û Õd%fØwHfEf¶¤Åvfõ»¶DxÁ¤·Å¡ÁÖ¾ ÀQ<蜎þ'1nbUwA-Ú©8Ž5‹Ê)SÊÔ”´ù“bÎ'áx’éQ>è+dªÁ‰Ôúü<!Ûì£[æœ!Î…‡÷‘ßîþ‘´¿šޤ„(>ÆGÚ—H‘¯÷è@%µ®`eOäc\L*ß&{zC«³‘R+¤Æ¶}¤·,ø#¸ªJUgüùë¦ÌÖàѬ$‘:¬˜T'ÈLø´bEÀpj:æ[†Õ-iS”,JKã¢+vl_ù¤Xí« žèX(½ô}SQZL |t…"«u¾Þ‚¼–¿¹*6 νÙgw."³.8&P�Œ'ÜÞˆê`ˆC 59 >”&,bPK-^yóïJÂ;3í—eæ=¼þŒ‡cpâe¨®º$ à¦t<˜O"1Þ �}¥®i8Š®¡$‹6Û^¯˜l�„ba«gÍ¿âdmt>åHŠé8ü¨ÓÓ^ÿ¹fc“/€è4ÄJÕQ2Ê·‹|l8Ëg�é;2èÝD®ç‡kÍÝÅB§-ÞÞá E˜ŽßZÈÛFÝJiq¢½!„ÖƒF–,™òdytq}"bðüQIÔìj+;Eðé×w™@ÅÐØá‘7¶ *ñÓƒ2–°‹J{¥Ý¥¯Ò6:q�—«eä§É‘âI¾}3Ëmƒ µb,fäùõÏ…@Õ3¡Hk�7)VhÅàŽç‡=‰4Ø¡Ô {'ó†&Çóf!Ç[µ2¹<˜¯ú«qyO˜íkµýa"A´² “a�ƒ,®*x¨Üò'îK"cQô¸œ­‹Ïl­’ù6ÀÐÓ- ³7£UÊ TAó8fW,»l�¹Öhˆ2½�Œýožr;d±> ÅSX¡ €YÎ8ÙFî±¼ÕŽ8‰H½EÌp>T AJYHªO:öÎδÒY^Å�È�*5´äRDI*Ï–�|6RUØMìÑôK%:¦F¸RÀž�xu¼:_*èÄiiPÐpÞ€"èí#à­ÅLp<Ö_€ž‡Ë! –>b FwçXKøOøªtíƒëv «Lú£Ãv�\¥7À‘!r¸óÎ0-­¥ÝCß‘¯vngn`øõãj /Ð伂&øËBŸÏ¢â”NN<(y2ýh¶ü’Å,&3s±Úær8H¢©r�¶ñ¥Q‘»éÏËê;E v¯HL(Ñ|h¸Oðÿã#qªÃ•éÖ•;¹àBÞBi“�ŠtŠcú„ë€à=\î)D›‚Ê<Æ8$±Ê9_¯“¢OÆiD(ò.Ú&-¾r…#BNðÒ#�×,¿vQÚ4¬�¨(öc×Äܲ/ÞÃØƒ£ûâ@‹œ‹ÎLòEC52ž@f̺I%»¹¨Î=ýlú›–(­c—6 çVïNò—褮 ƾ-aTꯎS0jÛù³âH½qm垎“i\)§›càdQÕèãR:¤šå=ªß/”5n—Tu0xŸ³->˜VNo´PYY�Å»jqŸ à¡)Ml͆Ä_ºiV-"p©{\ü%�P–ûà Ó7Ýà �äê�¦áâ"÷$Vˆ™W—ÅÌÏÀ<êZ”ü¶˜)„wé¨hF<(‰­ÆÀ;Ï0,·Mì•<DÃþt‚%»_Á“AøÀæhŸôY;ð1ÈIŽõxõðÄŒä¦s>kÑ#b¨‰lÄ�0¹ƒ|ø®µ>ZªŠÚƒ…Ö‘µTÕ}ùc�.Üóªh]WQlÉð}E4lú]Èw÷!ÝzŽYö™ä-vû%z0/K«z£Uð¹zAÃ<ëRzIàÈõ:¦Jê),Ó*Àr†Ó�!Í?í¡¬ò=÷" Ra�–  ŸN$jsˆR€©z@/" ǾҦã�í8FÝY­gn�Hÿ:†"ŠÉ9% ˆÈrT¾æòš ¡�rŽÃŸxŽ”r,J3AˆE†.À0jÝ;XÄ>™¨ìõ^úç£ 5ÿ,(˜¿øÐÇÝ0 æHÐK¨qw6b 6‰þ´¨E¯Îƒ`›N0 �bè©ý1}é•Å¡Ëý¤JP„õIB›(˜€¹ç "äÅ�&ÉýÕw}0Þªõ±¥}eʼn*[®Á1þá$½àó ÆÅ`ØÕŒ8l¯±pÜ @ô/—DIÃáë%óB6žäosæ”ß�ïFÈÐŒãdV'êŽèL ß­µ5¿®|úÒãí#oC²chf»¡ß~E0‰;lΨ9¶pcÕQ G¥&ýÃìF¨Ð— ƒÂ„¡m•fÕè G9Ûß³|è†æe{Q;�€íL'vu4aŒþ/O±H/t Q$îG…» 3#‚ƒÚx€wƒRÆ¡Á·×‰àÁ:úP«Uñ„Ž~’S ØÐ²GC¥Å¢™?ù5öñÄÙ•$íÈ+U6úIpòG£Tƒ¿¤&Å7<­A/Q­• ¼²l¨ÔîPG3ê¨Øn¯ü Ýñ)»Ã@ÞmM¤ûÑ;u.l&!:çó =F9CÃ7<�eÈJÊ•j¤C%2I!AÌ ¡Ë /‚‰Ôm3H‘†©™ÌxÈ›Aã{ɵhi‰Ö²}ècu:¤õˆfa‚ãÎ>Þâ‰Ôr“nEÃâˆÓ»l†úfÙͱDPÜ‘ÖvNê–’¾if Æ]W©ŽÃÏBGúâ”ç¢$Ì�­ä{(bz ŠæÒ\Ì÷ìmB†œç›nʘÆv°ÌRq†F 6²æW‹Ê¸²ÊaEIÇË&†>zÇib—?ÐLRÎâ3wÐØ”¶õ)мDLg0‹ðÇNÓyì»-—W"Wvz:†%7‹T ì·:—е|@MïÇï(Û¦wsìŠ °áß°jŸNÎÄ\Žì Âìµe:D†Ò‘GægxáA#¼¦ÍRÅ&xYÀ<2²<#”(°IƒòÀ¦»ìœÑ±\!+çl©Í¡¶q#'l•p½¨5*o†@2dþ¤Ÿ;kZŸœFR!…VM'ó±'¤7EÅ®! 8Ñ9D`�ŒËõ-vŽôBqOº/(”ª 云6À‘ÁD‹Óæ¤?TÕŒ,4 ¯xƒ{%š+#÷Zl 6wÛy‹i®gFQÙÃ× ˜™8ê2çš …a�.ómT„KLŠâÏR?yn£¼!Ð1—a²yƒñTD%ò˧‹•«óòP‡úd÷ò.lÙ£=™1ÅxÊí—tl^”JRøïV5DÝ V‚#K¥¼Èry(…Ý"=Së„’s�¢1Ûã@tšT0;´¼ $vƒ ”C,`~í(ƒ*ÚL»1` æ¨ñV‚]*TGVø>NkƪBo�AÓö´x�ð}ƒÃf J4ôQ2mÃŒ%ÔRU�nȼfhg\ Õhƒ'ç¶ÛÐD…Iâ4L1ˆø3§Ä¯,¤<ª; ZDZ½LâØ_-u^ _RûÆ¦Óæ|²«,·•TUÕ=ÕåÄ�*CÄFåÄÙ}b2'âOͧ±Š­Ä‹„�)€ÂAïÉ´ŠU¡\cmäkòìÊY£;EXGޘЉDÅÓ˜ÇÇ…L\Pë%Ϫ‘§2il*Š ©¤I[�X¤ºÅ¥Øï S}¾ ? ôèÍ€<Vò×”ðÁF›̱¹þÊš ø1,uò9ÞWɾðEñÝ“üݧ¶l.“êU€çEÍØ3cÑñPYQžc„îR±¡R˜eß…³‚,Ÿ?P1`ᇒùÔ]ˆ>hí¼`âáïczÍY£%k�FG¯R{¬®”¶ðÇ㊰„ÆÓs&î–O%D|^o¤Y~¡ˆ¤ Í»…jOJ¿/ÃÈ%¡,+¥€†3)œt�sÄ¡àu4Ël›3xƬÈG"ÅOþŠÚ|U‰,~Ñrš,•D!>Áô–šÊ]¯òü:”¿ûfƼ Öì.t¡ýZÒj#³Aßjö]�Œ\_ ñ(T×l×`Ð4òn c/‚ UmcíÁpL:7µZf6¾°læ¶�‰®. @cQ"µXgã�ð;ˆx¶(ÀP´ò¤Î`ýê}ˆNò‡*©\U©8”¶Q�gE*-ºóë§KWèÚì)•�VèU|Sb©PŸ�´–Nà›7êI.Ðg|³…Ù»éPÁùèµMÝQ;any¾Ýã{ Z(Wޤ+«éÊQ*ÓNª"g_£éGG0�Xú¼Ç_¹ù\HPt=æàôÑø¤D#7ú6Ñ }¢eàr6“êcVõR�ª`� òyD#îñç¤X籠tÅÔ£M(ÙŒ'2)†1ªã1ÚÈ'2øÆ©>熆@äe±3è%tÜZÃTKÐÜ0Ø—M*Åfá�%óš7—ìµ Ü+ýðê+™¹× y ½/=!â’,•Å ”\dn¯ãð3® È1Ô[úà|Ÿ<,¸K žw I‚)ð ‡-’–‹D09 ÉA­1G;�’ÌóˆuñBmµú©’Çj€¯Áòƒ:Aîèb°É'ÃraføâR¡ 5ÁUsŽY¬Å±Ûy2ÑI€>„Q-É.ÂÐÛâ+,Ô\rƒì•Š#ÓÙµÞK˜žvÎ,�„¶F¬³\#*B— «Ðâ ­«~fÿj­uf¨`ý|¥kja$ØÈ‘¦ì·‡sˆÏ_[�P’´Æ®„‚­IÜy€« ‚0)ò ±N±-¸ FNNEAvâ)¹Z ?ïÐ˺Ý©Íê“ZyI÷à"mٯʒè„í9•°Ôab�òP(=ç,‡ÇyHÑpT¡’`QÈà‡µðàBVVúDÅpË:^E'1p3œ)|˜+sBfÝJ‘äDT㨤ôÃ|Gê7}³âÊljFvT«{Þ@±´Ÿªê|-½j¡beƒ˜©pÅ`�Ìî"�’öºS¿­"ÒÙêZ¥ƒqE er+5«Òè¸P¥4sLTOè{®T‡| W"N ѹ<îî´�§²*�§ýuS ½36ºI:íœÈd6ë娖=Ï8Û¶qŒ†BZ pºkÀ£U%#ŠèÛÃi@˜ÞPœrdãÒË�™,‘VÈ6f{xŽíÏ C¡žRâ„/£mÆÁ'gf°oˆ‰¶¤A— À×ÐÐgA,òB(‹Z ÍHF‚+é‹S­ �3B�`Fò/›AôuY/Ÿ g X4ÎzÅšûñJù t>Ê¿$óZ¯ngg5zµ£RÐ)Jx|Ê7v”czbC ½©À«Š+‚,W,ÐÚdz˜=×ZΗ^â1l­b{ˆóvj Ö$W~˜�}x}û½ž3ÁÂ×rð~¹¦Œ>4°Xæêue®.”Qkß9õz”³ø®È¹¶Ìâ»T¦¼+ë·çfSmáÓÚæ‹Uµ²—γ®–RYå¬í•ñXɨ*WÅ¢À¡i ³¡ZfqGíºñ=#Ú„aÑ;âæåë¹èÌ¡*¤ƒ@Äð<Ôã¿„p–쬥Å*… &!œkYrÔÌt ÚK‘­|Ì>ˆåvó@'hh¬*®‡QÐçjA=öé\7ŠN;{_ÐI*tÕÒ�çýÑFU¡ç‚U oPõX¶G}l…¼#’Ö€÷ƒZX¾Ìx:[Ú†í)x^ªíØÑʇ»`äâ_<8¹¨DQú`\TÕXþJ£s*¼2˽RIð$šnñ&¸júˆ¥Æ,_QÎêÈ%m³Õ4—�í©ÎS±� �*Wþl!&γÂ?€ƒýeëˆ& UUÞzKŒ¨!ÇÈ˃¡ÌõóÐ{Y£Š¾mGr|«9*Qe¯Î³KTÙGçÙD?t~D7 ôb�ùá „ ñJ× \uTJtÕ¹G•{\{ã�'Û¡‹r6­¥ç1/³Å÷B»¸Y׊]zé…“¯YN"8ýk¯;,“r¾SÑ|1t3ÿzƒ<Ÿ­ç2}Þ] >jS"»rõ8‡‘Ø?kÒqŸCÌ;.[9ªËU}ú»½º©ß£ÐRÖ–~6ÓÙµ (³¡3~fžä5pl=®á§àÉ|û0Ùí(™.„¸yVŒW:}á¾K™§:;®Y˜Î›ú$2NØ;ðø¸t¼{õŒUp'ÝÓ=8.!R‘t yÇïQet¦›QíkçOm É��cçëéST©æ¬7 ®Ýá5™É�½‹ûÖu²ƒÓz©·ùGò22tÄj�½ÚéŽ7úì"НëÜÁ²²¦¸w‘Í7¨ûO4ÖõYßnÇq+î«vD³ŽvNƒ»N÷ÔÅt⸻í'޳ªÓÉÁî:já³;ÇñŸó¸­…2y,¹g‹áeY ýèù6²Œªb�~‡/ÕsP9©R.7+:'Në²?x_5ì4£V%xð‚x÷we‘¿xqZªætùj‰øõ{×ñä9©]ÞÇ…“øŒ{RÎqx¶t/îÄéÀ}V§­QéT·O¢€õ�ÓgXgÑgºâu�=³¾aìŸÖ/`jH¤ˆœã\¶´®ßû.Ç•~¥õSÒ—®_ò%~×/‹qZ? ˜Ö×,NDŽÊ'¿7õ‹Nx›EôƒÙÃCvRÊß_Ÿ\?¥-¶e‰¤õ³ƒZbCbåVuó<Œá†”·nI•ŠV¯A‡¨<¿ÅížÇ£9½�ˆ.ä;çlW\¿èl¦Ó¨ô=Mëҹ˨�Ò)æÞäÏÏV©¨6ã¬èr‘fg½ž¿>]È;þ y‰õ'�K¿µPFm[È8&ÓÉBÎzOßQ]ÈRË7D/r�«û 9Ò^^Ÿ³ÆÑ|]½à —b÷s˜ƒ~•£éÑ× *»ï2s+z!w� ù�òÅ¢¼ƒ“$Ê�€ÉXȸ¿�q,’k!ó ¶Ž…Œ�á&ûþ:‹ƒvTtÍ딓œÏ‡U«Ž9c¡«Æ&�º|ó 6 ÃC<;ì#u̱Y8,4èøå3Æ/þ öb—ÖÀ®½ºr¹SØÀ"�§$Hj¡.­N0o.Wê {pÈd;ÖíBé r:Bk³á¯–½ƒ[©”<›-œ eOò™o�äB^Y™ ™§ìÁÒÛ¹af5Äv¥� ÿB9f"wƒ^lÈçr·XZ§VbsXÌ„ùÜ[È1š¿>'9?&õ~œwJ*»|Úh¯¾\Ë�õÞþ úC_¸»¦C«zí@=õêê7N4»ÍI5Dõ[Çå^ݹ¨Ó!YXlá�° °ˆúVðâœ�kjÍrïF«O:S›Gnpó¾Ë× ’ Îã·ðæê 7˜Æû!V³-<¡•t V|‚ aáÆ½"ùýëæ@B®)cØÔŠWµ=7ìÒßð)ya›N­c!µ.°—<µN_èˆßk‰“¹Ü»Z�mkÝûF.`õMÇ9¬;.9.ñúàE²R•i„@t‘­ŒPóÎÁùVªâ'Çη„ ÒŸäèeïâ½§ÓIŸŸ4HMÒ…K®ç¤<Kb.¡äÓë´q\D–Eïɼ!± ¤ÜÝh#G "÷*Œ¢—‹‚ç~OÐÜí±ÝÞ VsÛ8ì%úZ¡�•U ΩSë£îּرûè\‡yÃàêÎÙ黢¡ Þ4Á^NÈ931+'ã˃ʣz9Sv‰BrþJ{;ÿ±¤–S¤ü¸ûlñL«kµçV×â91«ìØqîãØy�F|üÜYöt³WVÔ×ϘñŽç¥ZkrÖ·;ï^N6vDí‰e]%ãÆõñõÈ�ø™8¶¨R\»yKÉ{Á’ú\—ï[ Ô�äLz})ÒîîÎó íéÔÆ:‡Ýžôþâ¨Ôâb~Õd‡ns'7S²‹^mrá¯$#2§ Y—Ðè¢z"vÎ'5³RQaÒ4¤<È‘Ðô"¿næ[‚‡jêsÛf=Ë#qÙ°6iÖ+×ûý"³Ž(Œ¤ ´ÃÒWÞ�oX¥NK±ÄÒÈ—tÆï}g“¯n^DER\$µ| ”.O½ÔRÏuòZøÚ§pΧÞÏaÑ÷VGŸ&u ¤žZ œŽ0äb±‡«e· 4@Ë.Éà2ë�ßÐùGÖ š¯3éâ8÷4­q)¥É�’«w!üë Z1Ž.u,VMÊWç NÛé#IdYâv,Xy'ÐBÄÝ ›DÒã�j²3/RFjžsí¨¾æ7CeUKWÖšyžùÁy2pžÎã4Ï30OAd{²âNæy—ö†k¬L´;ó<ð;Xjž6N›'ËìÌsPh!ñ ¶æ9†§*éfg>ñ¸Î©j•:L²#kΦ]™«Eodstëì=&:©u–“39•ª™Ú`��:#£Ü¨žcÂ'¬(ÔX7ÈJ­ùíK±}i'ù±Ôºê�¤ßkÏ  6Ã�½§žfi_¹Ä٘啩uQ_V†þ\aÍÏsÏáÓr}îžp×–Ü`þBGWÞ(ìÚ¢ëˆKÍýz±’z/¾âVÖ3×P^—yŠ…;Ü ‚3o8ØV‡L]ÓÇ"$¼XŠÝzÍ>Dt±ð í~:¿Y/åÞÈÖ_ϼ CD=ƒ¦Ÿ“%¸žÇè^—£xMAÅ”¬öz�ÑñëÆ#ë“­© †ŠìvÇõüû‚á Xµ2ïä)¢òžE‰{ÙpÜôÒi3‹Že•nPìP–;¿0AÒ£‹åìB›�úw�4™‹÷‹ÚêÏæú)yR‡Êø¹hÍe�«‰Êóºœð6Kw�ác4|Íý>9æŽÓÕС�·®gˆoðéÛ�=ù'ôAKÈu¾Ó“™;zãáÀçˆç¬Â0—"÷Ê»´$.)=ì•äz>@¤¤Åú”øzSßmQ¥hÝ0áÃþª5£@ä <+T”h«ŠŸ�ª…$Rxê "³Jm �©g &ÒXU9`a1Ì@)4Sã0tÍ[SVkê%™�Y{ó"¡B’]hžwßå*=ç\íIe! •J±…/DØB¹oµRÀ³]Ë/Ï" ¹¡±6æö;q:—´Ç’ ÒVÍ*~[dI;á1(9Y¿czPòªÇ31.ùV3eSL•'ÇÆ…3V U�r·ÊP#ªD¹k)XMÌÚ¶ÚL”"5õË=kBŸUÛÖØ3äž5k¤y[ã#'¿ˆú@G­t ž°¿è½`YR¾ß›¾ÂJˆ?ÓN¤‰Ð2H‰TL{;'½g}okLuÿ4: ù­ííœ]?馸 ାuêICy’/ùk8ƒø^ÉàNÔC6«(Õ)b�Ó˜E³¯ä©Ù Ø­yö‰õë=Ü(@Û�•œäÔ‰ØÆãxpß‘o’=‰x,h�‡ÄǦ“Âlœ! ^² ŠÌFåS™§z%IÒ{àylã1qyë ù‚KÄ+.ݳѰö€ÖZ†èêÑóÐnoŒ9Û9Ö™^B½¢k�½¨])‚!EN›ýc¶°—§X4!ãTƒ‡8‡/ ­˜—µæ†7”ÌSà•2��N�»ïìZqãþK÷]<~ß¹“÷ž8‰XíÍ>såDˆ¾•®"”:Nº›¢œ ©¬\È‹qÊC3§p¿P[”µ eo”g©×Á ‡›�F«Æ\Wj£7˜‰I1¶ÑYÛï ìY¹ÙÌþØÅ.p$QoàRGäbl ”¯{u­úòÇ.wŽJ~r€±DTïc—½ÔapÔ¢…äl²¥­xÅéý±ë;Í  ³ LÞA�È ]YµÞÑè­®��c|ûm«ð#ùÈ®ùË®‡�8ßôlù8H— $Ki)-ów(ÿÝ’ô—ÒmévÂ!âOäz[º#½:í§×pë¶ô"î?’yÜ(=3�I¯MoHoMÛépz3ÏÜáçÞNêѧÜN¹ ‡n?ô¢ô†›‰òÜ-éEK¯]º=ÝrÓ£¤·Ó«—^tèBzýÒ#éî›nY~€ºoO¯¿é5é‘Cº»�þ-=À3z;ïÅîáÇE{ô{(=5ÝI�Ou y€÷¿yéò‰/ÝÁsêÁ‹ø}"¿‡ˆ«?‡Ò(=šNoäïÕùwŸ'Ig–ß Ö/^z”=JKMÛK#ú–H¿(~žHé5Šð´Fj›¶?²¬úöÉyÛ¡7óä(½…únsù;—¶éñöÒÃôfD •z£î/½ÆeoYz3íº}éF,ñì[Ï;ió>×·,¥ôJʧ%½ñ­{=×Ûú÷ÄtÇòaZöÚv†{oHwóLZz-é÷Æ'©ç·‘÷Fê Æ[áý·QÃ6© Ôÿ0uN¯[Ž‘º#]x¢jMé�wâLezöðM‘Öïk—\75ß¶t'­¢ K£ô6ÞðVÆéNÒ¯KgnÙ¦äëôæÙ�<õðS_·üºÇ½ˆ÷¢·gx×ÃKÛé5ŒÄí‡îàÙ;ø»�¿GnzÛòmiô¼Òí7ÝMÞ[VÞÎïaÞ¤7_`Lôïõ xŠ?K·Ñ¤¦‡oÚ_zˡ̆`Oðs ­mzûÒÛ—p\uîÃzŠ{¯¤¶‡eÄèa:Çõç¹>Ì(?œ^Îï�Òë¨ë ©Û™ÇQú|R¯¦'ŸAo4®·ðŽ;iÁátFKˆœ;–‘ÚOðÞ»=#æä0O]ðß-Ը͟R·;Fß¿Ò{ú�þSçmÌçFñÎôJj½ˆVïËåŸÆ,·á� Zu=•_õü05=‘¿[wÛã?Žñ!ïÕô]#sjÃSù½%=zÓ[oJ‡½é-7ýÛMo¾éQBüiœ^Äß�<§ºpèLZ#­ZÏPßÃÔrŽ7¦CϤuwS›Ê&÷QÊ]¸I00ÿw;õf®Ó›Û—ñï \î ®äÒxª¥ú}*w§Û—/@™°ŠVÎ[—4w3v‚¨3ü¾š§µ2oNÏ,½ˆrg¸˜ü3¼õv­Ò¥o!þx•�-½•û�PâÍKw ªW0¢5©ð0q¥4K‹¸Ò*÷jÂÆ¥‹'N/kõ-t]Jï’n"$ÂRzù·ž@Þ˜§'_N�#<žþ-§›‰ßLü]¹_â7{2e…m¥w"¼3á é)üÞLÞÍäÝLÞÍä=ÕwžÈ;Þ…Ø­„'¥§qïi¼ÿi¼_�˜¨}™“kЈ>�rO'¼¿ïL-‰°DüvrÞ�Ô{¸ü¡ô(óž„gðÄÿåÞÍ”y/”|oʽá}É&O½O©­ïOxÏ&<›ø µ|×÷¤ì>ˆØã©ñ9Üÿ`Â��„Úw„·èM‰°Ä›VyÓQZ}á¹µòÏ#þ|ÂÝ„žLøÕ˜J/$þ!„%|ïûpZm¿HyJ:Fy½û8áa�ž<ɽyÞ{s:éç¢]§¸š 9C8ËX1áÔ’Ò‹)wá£ð$�Í3Ó:õÜ˽ó”½@XcV^Âû/rƒô%×óò ž½�¼ËŒÞã ‰ 9»Ÿðùš£—2¢·ºî”^FúAÂËÉye?‚Ð ýJB“gZ\Û„mì)›Ì Ë:m¶Ýîgñž›S�ð*ÂBŸ{;„3¦{CˆðaLþ„°æ™|VšRfÆ{v lVrù}ÊЧ«„�$¬žÁŒ?ÝmÖxD_?Šü'Sö£ CøX« GøxÂ'>‘ðI„O&|ŠÇì¬Âg¥O¥ŽOËïüt èV H˜÷3 ŸEølÂ#ÜÿÂç>�ðùä}ïüBÂ^ã÷?‡ñxwŸÃ8púb ï!4îšÓ÷ �K†kå­æûGy»Ö€`ÿ®ô%Àö—Òš/:¿œð¼ã+ ¯¥ÁäW„�¿šë×¾–ðu„¯'|áuÜûFÂ7ù=·¦of } }ÿVò¾�ûßNø<â¯'|ïüNÂw‘÷Ý”ùÂ÷¾/=l–Ò÷~€ðƒ„¢M?Ì ùÚý£¬’“<óFÂ�~œðÌЛX9?IÙŸ"ü4áQÂÏ~–ðs„Ÿ'üõÿ"á—o&ü2Ïþ áW ¿FøuÂo~“{o!üá· ¿Cø]‚Öäï~Ÿð„·þ�ðG„?&ü áO FøsÂÛAøKÂ_þšð7„¿%üáí„¿'üá ÿDøg¿þ•ðo„'üá? ÿEøoÂÿ0~ZkÿKHK7§%ÂòÒÿ3üÖÛ}ù'){Ì.xi™xJ�8O¸™p ϽÓÒ‡€S5†GÓ;/}hzÏ=‘ð.”.»•x�ñ'-A•ÉW“‰k>O!ýÔ¥cæ=�gžNx7ò7·SöÝ ï±¤÷€‹ÉOÂ3–ž�þ/åÞ‹pé÷&¼á} Ï$ïýïOxáðÒ Ó³—><­@‡@}H¹">ŸÃõƒ wŽpoÕïº9%~}}.u<�øó ŸÇHhßÄxÜMú„5`èëuÎ|Sþ…„!|(áÃNxáá8Aóp‚ëá$áá4á á,áÅ„{çë„{iÛyÂÂK „K„ûêGóË”¿Ÿðᥴïe„)órÂ+êïçÐ áÕ9Þ¸9}å„S¬îW.OÍ%ákÍ­ÆïCRkIëòÃR›qì,K]Æf“°õxú³Å³Û„_¢^ѱÅõ$® œËýW®0ÆÏaäÞ 듞�•ž½9í�7 ÝCÂ�÷TãýÑ­Á‡([‡_­»1y”0#ìöû„ÂUÂG> ¸øhêyAsRàõc¸÷±„W>ŽðñÜÿÂ'>‰ðÉôûSÿT§>�ð„Ϥüg>›ðásÈû\Âç>Ÿð„/$|÷^Cøb—¾”ðe„/'|á+ ¯%|á« _CøZžû:Þûõž›»Ó7�~Aóð�žÍÛ)�á7Qþ› ßBøV·¾�ðzÂw¾“ð]<ûÝ„ï!|/áûÈ{áû ?@øÁ¥ÓŒ´æäPú!æâ‡ §Ì.RúÒ?JXƒ#øÔÚ½‘º4�õyù1êûqÂOÞDøIÂO~šð(ág?Kø9ÂÏ~�ð‹„_"¼™ðË„_!ü*á×èã¯Ó¶ß þ›„·~‹ðÛ„ß!ü.á÷hÃïþ€ðVÚú‡„?"ÿ� BÞŸþŒøŸÞFø Â_’÷W„¿¦O#Âßþ–ðwä½�ð÷„ ü#eÿ‰ðÏ„!ü+áßÿNøÂþ‹ðß¼ó¸þ/!-ƒs—¥e§›ŸÏ½C\7©ïqdjOúf‚ø‡[È{'žygÂO$¼ áVòƒŽ½0=iù…Ö¼+Ï<™ðÂS¹ÿ4ÂÓ)ûn„Û—'e=¿8½ûrÐ×÷àÞÿ!¼'á„ÿË3ïEÐ:¸ƒô{Þ‡ð¾„gÞ�ðþ„gSîÙ„úó\?�ð£ôñƒ¸>‡ðÁ„; G«„£ËgÒ]Ë·¦ç.߯_x‡sôR<ó»§ç-¯Ã‘‹KZ‡Ç¸7=Ÿg‚†¿%þÞ2‚äp,é>„ð¡„#|8áE„§sÿ×ãËçáeô.ñ_·¦¼�prYxíl:¥1ã�§©ÿ A4}�g…ÇDë…ËÎRÏ‹ ÷оsËw‡­“¾—pžðnÌáÝÔq�º^B¸HØ \"ÜG¸L™û ^JúeËïEÍ7§IGàrÞ}éwã}H‹´ø‚jdb ^îûZO‡Ò+ï� ý Ükp}%¡IhÚ„õt ›¼'ä†å´Eþ6Ïõ–_b™ëU¤_N[Ô÷àS/Ró||¯ð|Y\ú­igùRðìÐm¿�µ_ÆSstkQî¡åg¤1aB˜zlß7Í–5¾õ±Œ¾hŒwyÿ÷ö Ô}•ôGÎÎø(ò?šð1ä•>~,ñWsÿãï¶@Ëhÿ'?Å3ŸHùO"|2áS>•ði„O'|á3yV|ÍgqýlÂ#„§SÇç,_NŸK=Ÿl~>á _Hø¢å‹é5”ùb—0v_Jø2ê¹�÷}9×¯à™¯$¼–ðUË÷Ã)×ÇF0VÆá�ôÕË/M_³ü²ôµË¦¯[~yúúåW¤oXþ4M�ô�˯Lß´ÜLß¼ÜJß²ÜNߺÜIßF}ß¾ÜM¯_ÞLßAøNÂw¾›ð=´çùôã{¹~á „ï'üái×~y¬5æ×âþ3èïÓÞ5®?ÂõG o$ü˜Ç+ý8m¹%=!ýõ¼‰ò?É=ÁÉOq_ôö§¹>J»oæý?ÃýŸ%üáçÉLý‚Ë·€³r?¥_$ï—¸ÿd¤/éTßLÝçéçM¤™g…ðd$7Áà¯Rî×ò;‰q8Ä»ob�½…ëo~IPuÿ:Ïü@~gÀñƒ®û7ÈÿMÆùñð-?‘ë©·} ©Qú†·ø�¯pýóºõ®\�hÚmH•Z«oZ¾q]�.÷X£Ð�åWq=”~{ù Ϧô;üüîrß÷Þ´¼ãë[–”8”~�÷þ>ýÿ®o]’s3ï¬ÓÉ凌ûCîçRî�r?<¾H£Ã?vþ½Å„7Nxæ¡ô'Ë£ô§ËãôgÜ|6#kŒíŸ/o±šoMoÎþœúþ‚ð—„¿"ü5áoKø;“‘˜sßÅø¾�ôß/O©_ý›Y?£÷ÿ¾ëÝõXþñ'ÃR”«ôûµø<Þ¹®Cü·èê?úyÉš’aSú§å«ÌÙAúçå¤�ü+•ýeþ�ðËÉ(éÞrúOÂÛÿEx8ýïå'¤ÿYþ(ÆJ÷ƒ/ ¥ÿ—ç_¶üÑ×ä“y¢ÏM“ß…üsã1~²Fõÿkì,à£Ø¹‡�ÙÝvÛUhq(îîR–ÅÝÝÝ)îîîîzqw×â\.îîÎE¿çÌ쮽ß~O3“œœÈ$™ØdÍågîåÇÙpo|ƒ¥;½aXÍ!̯…¨@°áß]ïgt¸À 2GÍÜß«�±�³Zø 6 *g«Š¡Ëôê·ª˜ÜÇBVJtlÌ8â��ò~ŽOx ˆ_ˆy�7-ƒUBó•ÈA…™'ªâæIª„y²*iv©póU ?¥¡ þËb–3Oeîxš×_UÁÜ@U„JPª@Us]U ùêP?5¡–yºªmžáM“ᯎy¦ªkž…½EÕÓågS’|ibî ;�>sÚ„m’cN©¡yo6Ÿ¬ñ<yŸI$~ã· ~šbJ»ÓÌP‹gÉl”Q—ª¾ú3YUúQ_û#7}Ñ=ˆëÁ ýŽ!˜CAÖ…"™ÅòÅs8÷"/óˆ#¸nOY‰®Ë¬PFyXé}®’ŸŒ‘‰9 Fƒ¤kŒØÃ8òBÒ;ž°'˜WÑæÏb"ö“`2¤Gn H�“p¤_Ä Zˆ.û›šj^£¦!7f 7¤Ì‚ Þ?³1çÀ\˜óAÚ�°}‹`1,�¥ åñY+�ñC¾q^ɵ‡™:·;!jù¹Z¯+FÚP7óê4êÔ:Ú.I£QÖÖ†Ì ­ÅÏ:ÂY`#~6Þfsµ�[¹Þ†ÝvÌæõQ:vb· ùݰ‡ë½°öÿulˆÒ‚Îp�pýOŒiq?¢Ç™¾’y£·½Û¤Ž™7«ãè�w ‡K£¬0ÞEþ$D§ ʉ䭔3šÆ{�q°¸a3’YNÃ^Êý)tž3ŸF;Æ8}ç! ?¾ö3«yGÔ;æòq?G<³‚èþÝ—týÆsù™ËÜ_1ïô¶ñôm¸¿Òî]'/np}óæmŸL»Ðg<€‡èh‡Û#®#ˆùcîŸÀSxϱOÆì­¯î¾ >/!+n¯h;^ëñæ�Ãì®ô1Œòò׺ôÆ+#u'’Qst].D½EÏ;xà#|BïŸð¾p¿¾Â7Ø‹Ýwâ#å –Ú÷Kx!ªº¥o,uTÊ–ÌGÞnÞO›r@ýÀ�1~:ÀL¹oŒÀø…>ŒŒåd@üj˜&0ƒôÓYÈT~à±Leµ°î�`;8ÀiI¤\ßxCÆÒoٯܖƒ”“ƒh:H›cÌëËóˆ`|-ëlÑ@Ê�‡pfcp9„\ˆŠŽ}-l‚Ð-ý�`Kk¾xV1ˆŸŒÍc" bCâ¹äø�‡@ˆ/+Q -GT"ËQ•Ø"kGÇTËq•ÔrB%³¸TrH)!ú¤¯�ÚbŒÑÓp/côÄGÆ6é0ÓƒŒÑ3`f«g”y�̘Y +dƒì�ä=�Ó�l.tæ&’ïy0C!/äƒüP B!ÒUŠ _

È  ‚¸Á,êwƒùVßû·Fc¬}xp/aPJ@I‡#Ô}Y�µ€RÜ—†2PÊAy¨@TyßV¬ U *TƒêÈÔ€šP jC¨ õ >4€†Ðã§ 4…fлÐZAkìÚ@[hí±ë¡t†.Ð"pïÝ¡ô„^ ùØ÷>z¾Ë\¼oÍFú$2/só27~“¾ÎMJùM½nç¦öÕŸƒIõCO?“Þ¢gWüìj nƒ`0 �¡0 †Ã £@êÍh¿Û´;v5c±ÒÇïw‡>‘EMà~"L‚É0¦Â4˜3`&Ì‚ÙÄeÌåż0V²E�ômEÇX‹`1,�¥äÁ2Ìå s#+0WÂ*X ¿ùÉ®—{´ƒµÙµ°Öã¶AÏGc¼w”:й hÈ+iÓJª�~áj²’o›1·ÀVØÛ¡Ïa‡ßµÓï!WñõÐë—ñî»!Û+æ\ä•<7ÚIêÇ^ØéY™»ý\K?ý€˜ÜÄ<‡áñ< Lj÷qîOÀI�= ;©=‘~�Õ)¿'ê´ßSžã#u·d„Õ‹÷]NÞeeh‡¤¼œÅ¿<Ÿs¸Ÿ‡ û†.ú=c�RüÝR¿óL/ñüþð»«.w×mm,÷Wá\‡Þü‹‰Þ›p nø‹Û=¸à!QFáï1×Oà) Á®q}ÆõsÜ^ÀK®_Ák®ßÀ[®À~xá=qÿqÿÒ·ûûÏ íÞ̯ð ¾ÃPþÁJ“�2û³£‹…1?ð÷gF lþì Ãt€\àF.D‡ †·X›ë8—ëxß_©è Á.!Ä"øDØ'†$¸%…d�R —™T�Ò@ZäÒAzÈÀ}FÈÄufÌ,�?Ù0³CÈ ¹pÏ !*¥Êƒ{(×yÑŸÏÿ©ÊÏ}�=S»ÈŸ‚ÈïÄ,äÿœºñœRð\/·…±/EÁ2QL×);EH‡w\’3 ûâÞðJø¿¤|Óîžô±Â@ÊZ,Ó+Æí´ÅÈ•‚ÒPÊB9( "T"~•1«@U=l³¼V©Ø¡R�ûêðÏòdR5°¯ µ ›é…ª�YžPëú¿RõÐg´óòþ1Úùú¸ûÚú\7„¿¶ù¬}a׿M )4ƒæØµ€Ú“–Äw€ö†~ÙRúFo_×Ó�¾i­üßÒö¾c|þ^µö/¨ÚøÛU[ò§þ¤­j�ÙÁÿuö­êˆN‰['ÌÎкâÞž=)þÙT7èÇèÿö =ý?®Qw¶P¿{!Mï×Éì'òÜÐ×û>Ðù~„�ßþJøÐ?Á`™C”wã2ÿ?iÕ%NF<‡"?Œëá˜#`$Œ²£Ñ9Æÿ3iyÙô3-ÒO´P/Çú7Rãô°¿RF¾’W_½m$ýiôzØIY™ë™€^Y›—uЉ\OÂ]Ú®É\Oáz*æ4Ìé˜3`&׳0g“¯s`.̃ùØ-€…°Ãÿïj©ÿòÛ(£Ë�[Žý X «`5v¿Á®×Â:Xü•Vž�OIã&ò'†å³ÚŒýØ ÛÈãí0¿;`'ì‚ݸíÁ~/×û`?Ô4}Pü?©ƒ¸‚ø�£¸ƒã\ŸÀþ$DÂ)8 gà,œƒóp."û;~.Áp®ø‡¨«˜×à:Ü€›p nø ÷à><€‡èy�á <Åî<‡ð^Ákxoá¼'ÿ?ÀGøâ÷3 à¹!~_á›ÿ7õ�|ÿá¯i²ï–I¶ŠYغ`Qf°€ëK&|²o—.²¬RŽÍº] 226±aR~u;;Bp‚Ëš�:_Qêß åÆ.šÕ¥¢[oª +k$ÈÅ€˜ b£KÞíq0ãêaû�4é?ùiñè¦Ç·úk ¬-ÄúŒ5Ã{*!úAb«]%�¤� ’C «UK‰™Ê ¥F_&¦i‘Og•vìµJo5i¬2WaÖ2ZµLVÛTf«ï=žSe±Ú´¬V»æf{ˆ5Mß3%{¨DÞ¡e#î¾5h©7Ù¹ÏAX²SÚ‘ù”qÍìÔÒâ–·\�ò@(ä…|� @AkYUÈêÔ []Z«[+J<ÖhZ1kt- ÷âP"¨›%1áœBižS( S ·fyH�[âT*![³ TåºT‡PÓ¤Õ²kصÇNÒêRµyup«‹|=L_ØõÑÛ@×Íü?2�p/ Sõö6D5¶«&äuSò®: #Û9ãÓv#ÛZAk�¼*N[Ó�¸¶!œ¶Ð$]1po #z:Agè]±‹ œnÐz`×óžï…9‰|èmM£ú��}­%U?ýyÓ߯m|åÝ4�pÁ`kL-ž¼54Ù?¤†XƒÔP†Ûp#aaކ10ÆÁx�4LÀœ“`2L�Öø™JÚ§Átk,ﳌ¡ùÿg>Ǧ~þ×3PjñŽ`÷d¬ÿ”‰©Í$ÜY0æÀ\�¸Íƒù°Ò¿�à ³�x-‚ÅÖXj ù´ÔW‹ö?u»Ô2k‡à0�£p Ž£ïœ„HÂ<²îãÛ7ušû3p•¼;‹ü9kÊyfuž°.XSiI÷ïpÉšZûƒ¶ä²5�vEüÃ5¸7¬i)“iÉGE™à]…Ý-¸ ‘ì¬�ÿ�¼’g&kÉÒTw¬éI{í®^ÇØ‡•ì7äú><@¯¬x:Ì€™0 fØ ó`>,€…°ÃX Ë`9¬€•° VÃo°ÖÂ:X`#l‚Ͱ¶Â6Ø;`'ì‚ݰöÂ>Øà ‚ÃpŽÂ18'à$DÂ)8 gà,œƒóp.Âïp þ€Ëp®Â5¸7à&Ü‚ÛpîÂ=¸à!<‚ÇðžÂ3x/à%¼‚×ðÞÂ;xà#|‚?á3|�¯ð ¾Ã`REÑP&0ƒüÀ¬�`;8À .pC4ˆA 1 &Ä‚ØâB<ˆ B"H I )$ƒä�RB*H i -¤ƒô�2B&È Y +d ,ª×Åì\K¹›M}�öÌ×&q€U½ý(ì_XËXDË ¹ 7ä�PÈ ù ?€‚P C( (a„W<�õYðð% «£„QL£d`LF|° ÓíJ/£OY{cŒ(mê!úõ¥eÝ©„&ßv–áº,”ƒòP*iIÏ2]ð[‰0+ƒôóª`VEw5¨5 &Ô‚ÚPêB=¨�lt5„FК@Sh†[sh-¹o­¹nm¡´‡�ˆö¬#úæóžì„\gèèR]!ºAwè=¡²½‘é}¡ô‡0ÁàÀâÚÌ¡0 †Ã £`4Œ!ì±0Žëñ0&Â$˜ S`*Lƒé0ƒpgÂ,˜ sð;—üœ‡Û|X a,†%¸-…eÈ-ç~¬ä~¦1÷Ažë´þyÕoد�µÜ¯C÷zðP¥6`nÄÿ&ØŒûØÊõ6ä¶ÃØ »`7ì ,¡í §¯-s.µ�üÚ 6ó£Ø'z¹CpÝG ‚—ËQÌcpNÀIˆ„S ;RO#&0ºv6ЮΖ¢ïZвXвXJ;èVp—ú±ÏTšwviÜJën‘ý7ïwcQ†þxÜËà^V»X޾1má\†+¤í*\ƒëp¿7Á؇E™ëÛp·»�e´{Äç~`yÆ$åÑY^¯+0‡P�û ÜW$ Ú?ä�Äá1æx Ïp{Žù^RÏò5Ø«ÀÊÔ©Êø¯¬ë{Mx²¦ð&° ùZû*Ø—ÒŒ´•ÒÞ’ÆwäùûÀ ¾Ú¤Ž�žøñ�M?r} $>žä¹GU%^.õ§þ\\ê3æ—ÀjZ"¾8£ö¡_ÆDAê+:¿ý¢ë;×?€�YÐge�>ã î%ŸŽ‚†}$¦ Ó ¾^“p,6—ò°BH˜�¶èš�NŒÝfW[ úS´Éøs�¢á¦™Ãµè¶ *ÈÆˆ�‡˜ØÇ‚L5ÉûšÄ¹&q–o`kq/ãö³ ÇV›¶Ì?Äå^Æ ñlòõß rŸÀV—¼¦/mã»H„�QNêé}«Ä„qØ*zù6‘øÈ:HRÌd�·°�‘h‘ˆƒñ�yJô¤‚Ô¶ZZdÛêiñ-µµ´„�Ž0ÓÛä;×Z.`vv•�<ˆKÜ�¹lc N¾í3Ñ_͈®LQ:Ù˵|™3+ñÎÙ!ñÊ ¹°Ï ylõµP›¬sÍymÒ?–qª|çK?ùm ´P ñ\ ÛjEˆKQÜd�΃Y °+ŽÎP±+…9Ž8KŸLÖÜdml7»{Ãy¶©,�ÈÛF¤¯és©Òè/ƒ|Y›ÏÙ¥Êéa¹Tyì+�G¡TF¦ T…jPݬjØ“Zæ­SÖAj‘ÆÚ¶&´¬ cWêA}ä@C[SýýÓ»ÆÐšB3ÜÒ‘ŸÍ1[ØšQdýDú¾ÍõrЙV¸ÉZ�¹Ö¶ºLìÛÚZÒ½hIzZêÏYÖHå(Ï«~<<Çö¶äZ[+Ê`Kí½©®Ö�l­Ñ!÷Ug[›_®Ûzåx´ZôŒÑ+rIIW~ÕÅ–_u…èÝ¡‡­=n2ªn�ìÏ9‚žäG(_P€‚ºßS�ã‹Ê  àï2.böFÖ5ˆsoèùȃ¾¤­2i”½¡ý°ë` ‚Á {P둆!\é Ã#ˆÛH£a Œ…q0&@qÚ‘‰˜ÌI”�É0¿­“6Õ&{p:3çÑ™xwþ—xSö ÿßöˆOC‡ÄÍØ#ŸgläÙtÂ’öp†MÆÖ]x”k˜i“]Éò•iWÂêJXò|}ùÌêé,[zÄÞ˜›�MþÌÑŸ7ž�OVÖñdüÉØ€´Ì³u§üŠŸ’j>q’9]_¯Šüâ²d¾g²‹a‰­'am€¼‡e¯ÏRì—Ùzéq•²gØËNuöïâ…7MÕ½†Ÿ•Ø­‚<Ô™{ ákX_Ü3’/ehÏ$¢›û¡WüÈs¦¿`“¯eå^d|i0t„!³Ú&« Œ]ˆÓÒ.ßÇ4DGˆZ‹Ý:XoÄXw90(ê™mðÆq#æ&Ø ’O²nLÞÊW¹[lÆy²¾vƒò°«Ör²‡äƒ¬unÃΈ7ýÂß;aì†=¶¡ú³ÛkF¯¥íÿ”3ì'Â$�²2»)0¦Átû:Ú‘eO%Ì£]’¸¯§]6ÜäÙÍÐÃßð/vÿÅNNð�´Iû''yˆѹÅ7öÞ¾œ%ñzÊ:Ílâh¼Ù÷®ËnõÊiûÌó“1¤ôç�w¤ø•>ŠèÝyÏÏÕýoÿ‹�ô3 ™wxÓëû.‡=£„k|g±3*n’ÞùäÅâ¸þšg¢gýxISˆ*…œ¼k!·–ÀRXËa¬„UÞg m¡‘ÎÝz?Sò^Â+nÚC™ü™ßÒ6¬ÖÓ±—÷‹/ÿX«FÏì×Â:ô®‡ °6ÁfØ[al‡°vÙ÷yÃ�4È7AÌwéñÚO�ùû9v´ øÙë�wqÓ�ÿƒÌÁÿƒŒœ´âK�ñþéK ‘r ýZ�~ ‹¼§ÅÍø¾q(�ú}ÄE¾o¬i’�Ù2þg�À›wÈ‹ƒ<‹Vì_:d?J¾Š»‘¯¬ûñ̽YÉ[‘?Î3?N�=N�ýY×ã.«fy ¿=é?‚lFN‚‰Ììé²F|™/Âý˜ÞHY4¾Ó5w)§ÇÑsNB$È·b²vw ·SÄù4œ¡î§²œ¤ÿ"ó;²m´=gÑ}Îø¿C$§ÑÄf+ˆK¤vÉ.m óè“>þedŒ~ýe®¯ÚOi×p{@_õ:ñ¸Áûà&ö·à6yhôCø¶Ÿë»öHížý´vß~R{`?£eÒÏ·$áfq<¤­þ9¿Û‰ë¬Ä5ç:&kRÙ K¾ñÏ�™û!”€\¤)þsCÇ#Þí´ ¸ç… ž³Ì;äãz;å\ÎÈ�¼‡S›,ÈÀ¾ zÒÓ¾z8ÅI¾o,„�ÌoRâ‘‘±‚ì›÷í‘FZø¶ÏñH!<É×O¼ÇŠríáÔ'«xÐWŒû0äöYDŽU,˜oz¡Ç­8úK@IJ;ŽY J㯠”u¼¤lsn×å¡TĽT†*PÕñŠ|ó�½#§K1o Õo(RßßÒgdM‹?5`mpMôHžÖ¿œ_Y³H;'Ï«®ãzìªå´¾ã=}:Ú_æbdœ-ù&߈‹®fÜË·ª ðÛä;äF˜�¡®ãƒþ^Y@þÉ·éR®.“Æ&˜r^ISò%§^ÑCP͈OshNÁ’rÓ9;úZa† #!$²ý‰ëiȵÁ¾-´ƒöÐÁñYO»|/ÁéYR–ÚP§ÚÚ¾r]TutxT'Ç7ÊìW-:ï™Îøé]!Âñ½b/{Œøn‘¸uǾfsÛòQÜø|Ëë·'ö½p—tõvh&vnüͯÉdöÊöAÖÃi]†K”}_ÝÞ/꾟~ïuß_¿·FÝËœ»‡½ŒgH˜F[5¹�º¬Íëf×ÍA4Zâ7˜x�¡È Ã#`$÷£`4Œ�±0ÎáäMÀ¬Ïv¼ÃEØìIàº8¦fv›¤¼‹ÛD�¾÷$Lyþ“ÑÈßu·)¸MuDGãPtË™ÓAèç;#ÚðéŽ`=žÓrÚû»‰ÓLGLÒå+ËFÛ5Ë‹t0�ÃØKú¦ò=×ldçÀ\˜‡Ÿù°r¿; Rz�¶¿0æÂ_J[½ –£o2+a¬†ß(ãÄŸwÐî×Â:X`#H["oxc.‡q+es“#=ý<ã,ÊÍ„±¹­˜Û0·Ã®wbîÂÜ�¹‡pöbîƒýpâvh‡”ì—6ÞWÔaòïîò[2Òs”º8Æÿ‰’çÌ‘S7ƒ9��/CØG¿YÙKïá„<ú».¶éþæ;r«“éx§N9ò«Óù^,¯:ãˆc:Kçðwžú”�6ñ×åÐØÌ�‹ÜÿNÜ.Á0·ËØ]�« {ö%LÙ·�ûëÈGææM¸…þÛpîÂ=dîÃx’‡��{ Oà)vòMÀ3®ŸÃ î_Â+x oà-¼ƒ÷ޏ„—â—rdÄ%&ß^øæ[>àÿ#xT<ÊWbõ ?’fÃ=žIæ#>ãþÅß$çBË{ßÛPŸhÇ¿âö ¾CIòܘ‡M —ÙLMyVñM?pããyý; Ófg<ÍâL`òs†P_d„o€Hg9b!gdÉÁß™�úb¸ó|­Núñ�Äœ{Îr&6ÅÄ=�¶Ø†}('éÉûÈŽ~8�IÑÊ9A\»!2Ñ!‚uùd¦•Œ¼IF|¥lœ{jô�ø¬°%GGrd’{eèòîùÖ7”Óú‚9Ñ/’Ѓ´Ä$ÎSm‰L±O¾m•4ÉÙ7±¹—xÄù%|Ù£;™çˆç4tÆw¦4EÇ>6å%²v�„�CH É 9¤€”è‘:‘ =2¿‘žÓÇDõåR›R£7�S¾“5äB‰¿ôdÌ•?r^f:L™»I�™}AÆs™¸Ï Y@æ±³bfƒì0ˆ5€˜9!ä†< ëD²~ÔB¹Ï ¾ïÆóq� @Aâ^ C( (a¸Ë7`Ź.%!~®}ë[¥°+ e ,”ƒòÄ]ÖÅzA®+¢«TÆí×5²*ÜW…jPj@M¨µ¡” O$Ϫ.×õ >49 ¸!º�œÑ³ öM¡4‡ÐäìàV˜ËÐåû¶½5÷mðÓdOc;îÛCè� 3t�®Ý ;ô€žÐ zCè ýÐÕ8 ª�0»Á0Ä)ßÃÊÙ.5Ô®†9CÔpá”9"9» R�$FÁhçZËÔæ´Ÿ”#g ÓXêR)»ïÛõ4¦qÎ4¦ñN—š�ãÕ$çL5¦ sª3­i¦Ì׎à&krD=êÁtâ2ƒøÉÖLL)³òœfq=æÀ\â sšó0çÃ:V 1ÁbXâLgZêô}ûÍþwgÓrü­€•Îô¦UN9—)ƒi5aýYµ‰ÔíŒ&9©I¾W_ƒÝZ�v£÷ò|×q/g®ÇÜal†-°ä;÷m˜Ûa¼æÞ÷üNîwÁnØ{aì‡p�¸I=?„)óP‡1��–£p ŽÃ 8 ‘p Nëõuß­e4�AÇY8rž¨¬Õœçú\Ôu2~ÆÏ%=Y�e½‰ûËÎLzûêgЊҾK»$yŸ™ö/3m[fÚ¶L´õÆ7ËqÉû+ø ¢õ¾êÌ‚ÿ,ÈdAÆ¥®¡ÿºîÆxØ™ÕääÔQvÄénc�¹éuÿ·à6ñ»wáÜçY>p#¾q¦|s*qa½ùGN»zìÌF˜.õ„°žÂ30Þ÷ѵçÎì´ùâ7‡é…3‡é%åïî¯ñûÞrÿÞ£ãæGøÂggNÓø ߸ÿý�N»‹~›+‡)):Ù?MZèÁ¸Â53P]”Ÿ‹ïaÁ ¾½4\Â@ÚË„Œ³l\Û�î rºxÎì±qqívå2Eså6Ewå1¹BMÁ¸Å€˜.ö‚Ã{‰{1bsâºdF^S(�~Ì}ßûѤݖõÍ\‡@BH‰Aò1‰Ücz8µ5©+?-S~tåGW^S2W^SrWvÔÀ®vœC¸)Iç✠¿©½zÒÏ´.»JçÊI‰Ë‰|No|ßà§;s¼� âäo°ƒRKñ-hºÄÞ«ŒøÏä’xd3eÆOWj-«KötqM¯ —Bè.„né9J{a¤Qú±²6óåݘ[*¬÷ ²nvÈÆšq½œËù¯9]|Û¹q“þJ�*ªûñ­?ÊÚ¢œ[ÉäÁ¾(WÆy yðcÈ#Ïxo‘y!äw…!—R¹d>ª8ýŒ`UýF¹,¡‡-ï9c« zÆâ_¾í.ä*©‡]X·cs<ƺN8~d¾ˆ3oÈû¢„áÑWÌU -¥ÈŠRz~«pSnÅAæc pB®Œ¶Kà¯$ùŽîz^ùÒ[FŠ_YúeÑW}²nPš�.27'¿wQÆT99o¢€Ä22†*ƒî"Ø[i·ÛãV–0ʹ¤wÆ.:Ü*¸Ê“GroytaNÓ¥*º*˜âê§óVÀÎ¥*¹dÞ°¼©2Ͻ ¤¢(ïy¦UÑ÷÷¹Ä¿Î!rÎé­Ò‰FÙ¨áMOOÏ_?¸¢7ã9ì¡óTíúÉÀ•p3ò·&þŠ¡§ÈxLÒU†ëÚPÇU™q“œ"\Y×U—´=`¾QÖÉëq]Ùº?Ÿ¼ŒñªðLåÔá*øñ铹¨ä|G+k7GTCòGÒÝÈUÑÔ˜|iÂuShæMƒ¼ßš£·ùÐÒU•|õµ‡ÕÐ] ÝÕÐí{žÌŸøW'ÍÕL­\F?µ5þÚ «-´·×ày‹û¡°oçªI»î“5ÖéÚc/ï_YŸm�\W-=œVØw9+UÎl åtYC—1ÔÉ•˜çL?DüÓ¾v!Îíµ:œH\‡8ÖÑó¬+銀näWaÚòDz�cn?=¢âh¬‡šS›bã.qè‰{/�ñMoLYG–pú€Ô£­¼§dÛ—û~ÐÀ@ƒa …a0œ8Œp ¦R#]uéïÚÕ(W¸ ÃèóŒqÕ3�uÅç¡øjæx˜€¿‰0 &Ø Ó`:qœ�9f�ôar�³±ŸsaÌÇmœä�º�ûE\/ó-á~),yï/'ÿVÀJîW!#gƒ®Æü�û5°Ö5Y­#ë]F_}nan›1·`nÅÜÛaì„]°Û5„oÆ%ír¥œó˜GíÁ~/~ª“Çû¸Þ@ά—z}�ë#Ì�Â<,×Èfã=}”ëc\Ëé'Jçqâ,ï�ùpûZj(ó–¾°|a2NËþùû4²×…¼A_$È<Âìˆyó œc_ŒÑþ¼ tès´£ K¾ó;çj@YUìÑü¹Çó<ñ¹à Ô~ž;.óŽ< XÑiü^‰ì mHßOæ°™~§½¼„¾?Hƒ´µ²SÖÚ/»d¿gÖ'YW„+¸_…kpÝÕØtÕ_Ý„[è½MØwà.n£9<ž¥±éö÷]M©;bÇØ�ûZ3ê‰]=DöȘö1öOà)÷Ï »çÜ¿€—ð ^Ôqñ[®ßÁ{ø ‡'ñ&LP í�´©qÿ%'óìCAþ3z¾`ÿp/iþ†ù�ûö¤óq(C†î•ææ­çfÞÑmÌ÷Ë,û.õw‰7ùý› N7w€#ì&&?ÜüAd¿ [Â5¾E¤·‰ýgWKSÝ/{,'�0l˜vp€\à†h¸­åý�ëÜÒGÅ0Äà>&È7u¼ŸbaÙ8—ëX¦V´ûFúâqûî&¦Ì„�c¿ÑqÒÜš2%òF¾$Á-©»©)™» ómH_oú ™“¼ß’»é+¹[›R"kÄ«­.“ÊÝŽOZÚá§÷RŒz#ëñ©‘Mi!�»=Ï´=rí‘ã,Qì|û<<œî.sRö2�Î ÞŸ OæÚ2!çáÔy§jiÊìnfÊ‚ýϸ´2e%��]-LÙ°ÏŽlÈénkJ`í`ÊåîhÊÊ©ñì'%L9³µ9\åvKûâC±à–rÄwmÌqI=%y!ä‡P½Ò†¥ }…¸. ?ãÏøÝ�GE�ûb í[ù^J@I‡RPÊ@Y(å¡T„JPÿ²çð1¯‚ΪPͽ‰§µQUwKûæR5ˆSMð­ë×roæ—Â|îÒþ•ä÷ Œ8×F篿‘!msìêB=¨ïΫ@Cô5‚þäCcL©³Mpo Í ¹;9k¾w5ûhˆgKh¾µ £OØYž­±�æí‡´! mÑÑÚ»»èõª×­ˆc'Èû©Äª#ò2Nì„{gwg“ÛAÙŠ "x~Fÿ¥ zº"áîʘMdºšº¹å”ÿnÈuCNVUxÿ"#g¯HŸ'‚_ ÇŽ{wÜåYó½ 奧;ÂÔ =½‰‡¬fgÝ£ú�õÃoS‹�þ½”W²CÕ®úéñä�ìþY†�_anR¯6ÒÖvŸ!,»â¶«¡¸IÙIù‘<Æýp�<–1¸ŒkG9×q$æ( c`,Œƒ0~*!%c¼;DMðêó…7wÑ5 s2L�©0 ¦Ã ˜ ³`6Ì�¹0æÃX‹`1,�¥° –ÿîäaò°‡7�²µ’x¬Ù7¸š´ÿk`-„P×âšzšÖ¹{ñ|{á·~eÁ·óøI¯0Êv© ÈÊ8f#¦œ º‰07ÞÑV·üJCoüöŽ WÆ_˜7‘²ŸÝ*¿àÐÛôžß(ÙæîKi’k™Ó6Ü=ªíίvôнƒ°<ª¿W^üÒ—€]îÿ�7ìE~ }Ë¿ê2Ü~Õ9ˆ´ŠŒìuøU¯ür„ÏÞ?_˜¢{eý¿ÜÕ?ô—8iÜíæµóée-Á=üéð¥{·{õOÂb¾Fχ‘Q÷òžôðKFèÛ�'2®,¨Û�޲;éóíÓŸÙoÚècyåå;fq“¹®0~ ÃHû¹�‹ ÿ€ŸñQ÷õû Q÷Fü&FÝË|¼‡_Ô0ôùqˆ8ˆžÃpŽº'GÅÛ7î2愦xóœþ8eêþŽƒ¬ŸÀ< ‘zøS£üŸÂî4œÑí{š2Dµ‡ÿlc¯07sÙsÈJ�?�y$~áw¸Àeì¯P'®Â5¸7à&ÜÂí6ÜAî.÷2_mü“Ô!ÎUÃî><€‡ð#ß%@æ=å›{擨KOá7@³®hÉ‚.`ÿA³gtQbA!¡°d BÒ:M𤥠v<¶Çž™7oÞ{÷“ÅäÓIÄDq¥««{tß»¿{ιçÜÿç&�\üå7ÏçœçÀûÑèî�Ï�{whÝ3äÀå�ë­Ë—.] <t.–¼íDH ¼ðBâœ|Äa�ÃX‹1g Ž{`€ö اúò£“Çœý`¶qt6DÙçB¼•X#p>ÄÉk,Î:´5hc°Ú`ŒF Ò ´ T ÌH =èõ׮fl].<À:ع#¯œ (Š£” û€Œ!ˆ±ÆŽ6µZ#PFÉ‚8,0.DI©`XÀ�Oº ƒÆ9ë9÷Lç@ÊebÊ"`¯�pé÷°þê4_x1Áú ¢x­5Ö:¬µXg°^ã¼GÛ]°KöùÙχœ>%xé„§ÈúÎáö€ Æùkþp)àòAÈ&ÇV_@ ¢Z‹Èz¬s#3‹6–¢0ඈ«wy÷ŸñÞ{]¾ýzÄÊ2hý€øO"Âûˆ²”¬¿Ú š_�H÷‡”êc®¢´c�— Ö)d ‘Ò„Žæ4¬­y¾÷ýã¬,u»hóпíÿ$„X�e’ã«MNž\e8Ф·°Ý]ÒN‡î `³7¤ç3´Ï©MçL&C¦¦›(½Àê±&§Ï,³½ý ív¥=Ö G ‘AL$t÷=�´ÔÒ}f&$•Æ‹øãÓ;¤ï ºy�´ÈQ:ãîV—ýNI?½Éd}‰F³A6´DÑ$RŽ®®÷ci@"DNâT€êöI&%�h™dí4¢Ö&¨Ü`1*Á¦ ösÚí=N¬µøóŸþÁ•�–+„Õ8âÊ$R–8WŽç„Î�7ï%Ƥè^F¥1O²vŠðÈ:¶ѹò�t‡vÚe·? 6U²r"äõ7NQúY†³Ú ø)ŒñãßçÀzðNPä=²ƒPK sG �9Úý ä.¹ÚB f°Z‰¤=Žh­(µ¢TQ”Ól Á€ýý–VC†:¦…k]À1§Ì xùìë_š ëuIêÑçÙx‹«7v±¬#£—)ËŒÒhŒرü¨Ë@S‰û4§§˜žªÓÞi�ç;”yÉÝíü³Th­8’h…ÜÝ&œ0HY§V[Æëi’É ¬N©M§ úÏ¡e@JC$KæiÎ̳quŸÍ­”ƒôi¹Çδw ®Âdì(ý.ÆÁéW ­“$“-ffZhwÀöí !*8'Çp£û[hI=Þã�w=óó†^X!Žç¨M–ÌÌxV–-A(˜ˆÉô&F[æêLVê,Íõ¹xéSÓ=´’¨{Áh¬8 4-ùñOüæ·]~øƒUÞúÎ1¸N}j ç< <‚0�äÊ¡µÇ™>B¦üúwŸrñâg|ù‹!§Ö$Æ<0?@EC>ADCCC=?cecmm%ihLkm/or lk;fhepn8qp?twkljokmrpTwv-npmuuJvx:xvEvx@|~vxR€sur{xYvwuxye|}E~Az{g€~M��<…†y{x‚ƒD��U�„Kˆ…4‚_}|ŒŒ"†ƒc…ˆOˆ‰J‚„�††mƒ†w��&ŒŒGЉ]ŒŠX†ˆ†Ž�a��V��Q•’@––-‰Œ‰�Žy“�^�Žt”“M–—9��Ž–—X�œ3••p–“…›šTš™l”–“ž�W¤£:££Ežœy¡¡a¤¢U¡ r›œ™¦©T¬ªAª§ZŸ¡ž«©b¨¬]¤§ƒ±¯F£¥¢«ª|®¯a°¯h§©¦²´_·µL±°‚«­ª®±Ž·¸Z·¹c¸¸n°²¯¹¸Š¿¾[¼¾hÃÀV´¶¹µ·´½Àp½¾•ÄÄg»½ºÂÁ’ÇÈq¾¾ÁÍÊ_ËÊfÀ¿ÌÌoÌÊ›ÅÇÄÑÐsÊË¡ÑÒ{×ÕpÉÌÉÕÔ¤ÙÙ€ÝÛvÐÒÏÕÖ¬âà{ÚÛ±ÖØÕßÝ­ÜØØæä~åä…ãâ²Ûàãíê„ßáÞìê‹çåµçâàìê¹åçäôò“èêç÷ôŽíïìþû”üÿ—òôñ÷øõùüùýÿüRV}tRNS@æØf«IDATxÚÕ—iTWÇYQ¬Q jªUGJźUT\«,JíˆlV$š£xDŽsÀˆKM-Èö¸ ZQHÁ-Ó*PÄq©Žˆ‚¤Ì” h!;ú&¡ÚcMøÖ›œ|ûÿò¿÷½wß}vvÿ‹€ú�u -t€ú¨Y­Èi&IRµuZŸô3 EmšÒ“*RéÔýƒ¢‚T†Î—ì[+ª¯u°Yï k.$ONZ#’.½º½¢ÜÖ, ‹´„,™²R$9^úsÃ�ª56Vò#£¢ö‘gpx”hϑҚ§Ôöú¶¸Gï%§OžÅ:¨i¡ZR¤6Yp7(”xLövÿ`äüÜÒšçuµÜɶ ì%'�2H .øðÈÃVªµeÛV,@†æ¢Wg�@0|‡_m}ÑN]-´°œÎÓ.0ǘ1Ÿ´ê)ªE2Îú=pÙx°~à ^ýøñã�éa_ºµ$]ºé€7zÿñ”þu?ÃJ€ý½ú¢*à�ÿ¹‹%l]/ Œy‡ëá¹z};u(Ô*}Ý¥ ^±ï- À‹W÷ôTë…$+r€â�´B×U(ôÖ,F¾Ý¡ÑÚ`ši4òèêÚ™oô0¼ZŒbb�B‹ä½Gò2Ðtg}Q3Ú°ü?ŠÝ@ôÔóm^ïZ·Il8ºOsÒцN2�ÎW÷ƒÁ6+¸N@09þL{¶¾C¯¬{\÷xgÕHw·iÔt~-ÊtŒ°z`'´/MÇô­ Vp*"ÛÚÚó3ªé.R]wû¢QZ„™\üoFe8Ñab˜ÚŸ?=Ê ðêf#_W¡0vjÔuw~¬6J¥Xðùƒ¿ïxÍ€8×þ´æ'ʧiÚ`ÌÕåÚ€¼òZN£17!þbP•Z³œaä ¯ŸåLj4²„‚æ“m¬¼ì|bsWa ,71Mb¹¶‡é�¦3×ÏæÜ�¡ÛÐÝ}OQPYWYV|úüéÈ.UÉ {É0è+æMü¹í¸$…0àÉG“*ËΟ>}*;;L÷¨|¹?ªeì­žy=_Åu=ôOMMMK›3ûûìì¬ÌÌÔÌ9�÷” üw #ûG V�™Ú�àëã76€,uVgUõ”0;01&ìÏQJü ®ÞÞ?b•P(ôñó^—º!mCZÚºY¤²j�?ò zLoc}ÞñÃñ\�ÙqU„0NèãÃ�µÄºÏ4ÊŠ^/;^™:zzXÐŽšë¥)\¢³³²²²“…q1 P)•–""„ €Ï«C-kR¸@:vè–.�!\±~uU——/[Ñ$–ã8a�tüq ìe‰=@Ž0M/Lò¥ˆ.‹�Xyl$YCˆ1Ù 0šš´ÚßÀq¤¸B¨Z¥V«×᪈¸yåuÒt1(‚ vé&ëâÑtô$ ça²/..+¾öÍ8�,!B”S'É%0Yz‰ì’ü&~—¸{8àîiÓ&ƒ*ffy¸¸Ld-,‹Øyg÷e¬‡Aq ˜8.»¥ÑÀÝì ßÄÄȘ%Îý£§š=|}gK-ü+Š` › ˜L&Gå�SÔÓ‚Xa··hPP< x€Ål€ß§ÚOˆÞÛTYœŸ’Éï´Ä ºK › (vî˳ Ô¾÷ß,�3L¬Üôà€–ÀåÀÂæ@¹ןïñ²âbá #üŠ�–K~'\ax£AÐ)’³÷÷Ú[sµ�m*˸‚7áf ÈÆÕ€ †SŽœ±îz†ü„aeÉšýlÀÂ.‹‡Oƒã÷¬µò~�ž7§8’\«}‚ß Áî^ï.Z¾ÂÊ#zÔ©Mµé[`a?²1žëš”>ØÚ':ñ”´6¡‰0WÁ\†Ñ¾Óƒg–X=eAÞ§¾"§OpֆШÅÛ7`F†õc”©Ê¿X,ìGFó}'L·aJ³ƒ"S¥jw9X9kÊ÷öõ¬²eÖuÉ #ÓÝA+0dˆ+ßûc‘-“ªS®ñüH†_’ÉÐÁ|>ßSeÛ¸>,5¤­œç²îìêææ14?ß¶´$¦ˆLöàóx#Ü\y|×`µ­Ï&§ØY*2|ŸïÆss6½YdóÛÏcÝJ’ÌÆsãñ&k”}xù� ÚM’õÁ!õd}_Þ}vü©¤%”ìúÑ®Ê�üA|_ß¾l·íçåÔwùÅßÕîÔ �c,IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportpno.png0000644000000000000000000000012715174607203017005 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/aportpno.png0000644000175000001440000000026115174607203016770 0ustar00rncbcusers‰PNG  IHDRíÝâRPLTEpH@€€€€€ÀÀÀfÿÿÿÿÿ­ÃvtRNS@æØfJIDATxÚc`€5(Í–e¤&CÔ@“r*DFM- "�pTS‚¤&AÄÀJRD  ‰Ž5¨SRD@YjÌZ} çk×IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/mporto_64x64.png0000644000000000000000000000013215174607203017332 xustar0030 mtime=1777536643.505914363 30 atime=1777536643.505914363 30 ctime=1777536643.505914363 qjackctl-1.0.6/src/images/mporto_64x64.png0000644000175000001440000000337115174607203017326 0ustar00rncbcusers‰PNG  IHDR@@�·�ìúPLTE       # # #!' "#!*"#$"$%#3%%'%'(&()'/*++$+,*,+.+.",-+-/,01/7752'315130231689496342:8796A<A8)9:8@=@:4CBI> ;=;==6P>J<X;=?ICUB@B?a>CD2ACAJEMD$NB.VEDFCOE5OG,GHFRI(VJjEXH$TH4IKHOIClGOM0cNKMJNNFMOMSR:VQ@[[RTQnWUVTVXUbaY[XgY>[]Zk\B]_\mc#^`]dd:_a^`b_ac`}a&bdaib\scCkgDoh9ti)khJueEfheuo&mhgpikhlnk{r>npmnNvnhoqn…vwvEqsprtq‹zsuruwtwyvxzw‚xly{x’€zy{}z}|†�]‹}f~€}ˆ~r€‚�ƒ€‚„�ƒ…‚‰„ƒ…‡„ˆ‰†È‡‹�Š��ŒŽ��щ�™G“’Š•”zÕ�“•’”–“°¤–˜•˜š—¥œjš›˜¶©›�™ª™Žœž›¦¥^§¡{ž �«ž�²±±žŽ¢¤¡¤¦£®¨‚¯«q¥§¤¦¨¥²°i³®t¸¦œ«­ª¯±®À¯¤²´±µ·´¸º·Éµ¤¹»¸º¼¹ÓÎù¿»½º½¿¼ÈÄ�áÓÀ¾ÁÿÂÄÁë×ÅÈÄÇÉÆÏͱÊÌÉÎÐÌÏÑÎÐÒÏÓÕÒÕ×ÔØ×Î×ÙÕíé|ÞàÝãåáåçäçéæëêáëîêñóðõøÓ÷öíô÷óúùÜùûøûýúþýôüÿûÀœ˜tRNS@æØf­IDATxÚí—mˆEÇwvï8‰Âž^ÊÝyHêÑØ˜JN»ÚèPµRƒŠo«¢Ô¥­Ú6\+ –ž=Dñ¥VF϶V¤ù S´yP©/=„n) ö¢MIL7½k7bcöi`%–^®àìÅÒ¯“é'ÑçK>ýæ÷þLØ]Eùþ}£uuiš&Ïwôô¼³Bë’>¡ûòù¯ôhïñ«äøÞ·îúaù lÙÀ†døy;¿¹yÝ Ý6¯þô·šÞ&œÖ´«w<ñȼ;ׯ|NÏ4÷´×ýÙ=w|xðÄ™¯ÿî¾ß,Ï4›v´Ã³éSþ¯³ÃëBK™×hΞ»­ ~°îÏæÜ쌣^óã3¹êG^+Ì£­{¯þÙŒõ›Ÿb_}ûò—· û JêÞî?Û¬b†Õ+ óµ'W/ÚZðö6žà=î?ïC*ŒP÷½Ë¯½þùù¢~�2 •é}¿Ïž¯îC¨ç¹_O~¶ê2Q>ŽÇÀ‡éÊ.¾?Ϻ’ó_¬ͯ…6‘1Ûv¨W¶p?B½œßÿ˜*º"•ùœÚ¥©«8,Ù§¢À¿ îŸX�u&§\NöÝPg‹ÎßÄ(¸(ñü&ìÝKnåý=Ô/¸€ݵo‚UÌá-R“°�÷?x“Û ! r%æ7ª€˰àºqØ\Ú/t€¶€¾?žs«5¨»@±°iDÍaþâQ”d`­6š`ÛŒ` §Œ$6°1j@‹¼Ä P®ú�Z™2bEéÅÉd|6’b„_äûÏñ“㌇WU4´,‘‹—ˆñº•�ÏÏyžßÔ;ÕˆÆÄöW:0 üœwmFM£SÕ‚�†oÀà6ÒÚ?Ÿg£¦�Zk¯ êü©9?º@‹?ÑÂGØiž¿h³Ql\ÄÅŸgªíAËoÅ»Ú÷+ŠÅül©hÅ2ùy¶åרÍ^0¡‹ˆó·Ø”2,¹þÅà|ÖfŒDc’~²Óuf~ ~ˆóž_(‘U†��Sšój?M‚©Ëðƒ@XÎó�¹ß>®¨ŒŽe½ZÞnñét[¯ˆ°#Ü_æ~U“y™Cäÿ’â•õ|ÇK—äŠ;*ù© û·ÏëÅbÞräý‡Š‡÷ŽÜ#íOï8~øã‘‘íwËõÏïÀ^Îoݾõ:Uò]¼ï•9~¡ªÈMè{Å÷#I^ŸªàȳOG¤ýœÊ„¥?CÔcœØ­Kó|œ€þKø�Jë v)<ÿ†Tå?<ËÍ´‘wSa´IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/mporto.png0000644000000000000000000000013215174607203016457 xustar0030 mtime=1777536643.505914363 30 atime=1777536643.505914363 30 ctime=1777536643.505914363 qjackctl-1.0.6/src/images/mporto.png0000644000175000001440000000032515174607203016447 0ustar00rncbcusers‰PNG  IHDR(-S6PLTE222:::???LLLfffhhh}}}ŽŽŽ˜˜˜¥¥¥©©©ÔÔÔÿÿÿQ :±tRNS@æØfMIDATxÚ}ÏI€@@0®¸ ùÿg]#ƒUæÖ)8Dä'Šäµg ԹψöÂ¥ž`£—Âmbò²z[_ ?fc±.þ_¢·²sNÏkY–\JÒIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportpti.png0000644000000000000000000000012715174607203017005 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/aportpti.png0000644000175000001440000000031315174607203016766 0ustar00rncbcusers‰PNG  IHDRíÝâRPLTEpH€€€€€ÀÀÀÿÿÿÿÿ6tRNS@æØfdIDATxÚc````K`€¡$Íèf aˆ(™*0(\“C˜€´H�5uM U©0 IN3L]“R””UB Rl‰ ] cØD º•Àæ…ÄŒÁ&… –Bœf>$Ñ]9IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/forward1.png0000644000000000000000000000012715174607203016670 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/forward1.png0000644000175000001440000000041015174607203016647 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ!4~8×qˆIDAT8Ë­“Ñ ƒ0C_o%Ó$3Á4åŸÌt| m¸ËUÔŸ–mYçþ‚aU²j˜¿@váµÒˆ-¾ 8`‰�qÅóÜ ‘Û^§¸¼¨Õ ó:Áq× „Hwâý‰œoù~ÊHÖwÓ€2‹<1û+Ìö;øy¼<1~&Rˆ7�~äØ*1s³VòÊ[IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/messagesstatus1.png0000644000000000000000000000012715174607203020277 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/messagesstatus1.png0000644000175000001440000000135015174607203020262 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®Îé¢IDAT8Ë�RKHTa=÷¿gôÞitD 󕨃`XIøêa%•.ŠDQТÉUËŒZ´‘ •(Õ¢¸TÑÀB°‚T mRñU:£9êÌÜ™Ñ{çÎ�¹ 5è%ÙY~ßw¾×9À*›&:²N=yŒ]‚@í *èÊ�z#F®`wÓ€sŒPÆ=´Úª‡“‰É’C9zû͉á�HÔBK+Ÿ�í•·8Ï( _Éõ˜ð éðŒvžLH1í8ÕdÍa“Ï bÖ'Nñë‚®ú`è^D`¡»oièv+á†3Il$ä�þÂgò/tÝÄ¢Bjèvn+† û5¤´˜¬ù‰˃Ý'î9{Õ/‚!œJ€a6WbãLoø„$˜“ÊóÏÕdwËúò[(k#Oÿj¤mödœN±ååŒÝñP¼*TŸS>ßò ¹§¡jàìÎѽEÒæ0p3}ߊUߦºœê‹ªFŒÅ¾#�¹ª�ùH©C_g6'~é· êÞÃ? øgõMÐ7¬ËCˆé¡‰¹WÛaU”ê$£ü®UWX2?xCÄô?[šR¨~ç¢&OTÿ–Ë­éH+}DÁ°vü)["¼tæ_ë¿ìÆ"kiœ‡ÈIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aclienti_32x32.png0000644000000000000000000000013215174607203017570 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/aclienti_32x32.png0000644000175000001440000000310615174607203017560 0ustar00rncbcusers‰PNG  IHDR D¤ŠÆ÷PLTE03'" ( - 27;?9 BEINP34.75)TM6:,X[<:.^<=;>=6?@.g#ACA e&m"j er&m#JL9v".a"w*6d })t/w�+ ~"(r!KZK4m%‡*VUMTUSWXE‚�/ZYR[\I�1({6¬Ya“nƒƒ}†ƒu{Ÿ^ª'�–7‰–)w¨‰ŠuJµAl™{{ž;�CG³fƒ�„J¶UE¶oPº�؈½ÖE±á,·á �Øœ­ÞR±á8°ßIÆÂ´ÁÅ´�Ú°ÉÈ™¦Ú²ÊÉ­ÈɳÁå5ÌÍ£ÍÉ»½äXËÊÁ½ä_ÂèFÇê/¼äuÀåiÓÒ¢ÒÒ©ÌèKÐÏÇÓÏÁÑÔ±ÊëXºâÂר®ÕÔË×Ú¶Íê}ÚØ¼ÏìqÖîTÝÛ«Ìë„ÞÚ·Îê�ÚÙÐÛñPâò9ÛÜÅÞßµØïuÚÜÙåóJÔî�Íì»ââ¸âòjáäÀÏëÔÖð©åãÇÞòŠèäÂáäàâæÕëéÍêö�æô®êëÔæ÷ ÜòäáóÕêìéèõÁøüsïðÙí÷¹îú«îòáçõèíöÝõñâðûÔ÷úÕ÷÷íùûø:^(âtRNS@æØfýIDATxÚc` 8£#07w€È›ÿùóç7üøñãë×O ð^¼xðÔ¬(ÿãÖ­[§N�:rêèÎ�;7€ÀÂeS—�}| d†ñŸ?uùÝMÝåÙ‰A�®VZJò@ #'!Áçyö˜XÁ³üoß¾=<±eþô¶Â‚(g°7ÔQRâ?{I¬àV÷û?oßýDR`i¦£)/à bÂï[Ýo¿}ûõáî¢é�…YÎ@yCM%y¾ÓgE š>üúáóç5o.çÇθZÔ”ã:} b•ò'Þ=zôêË�'%Y‡ç.5ÓQW’ã>vLâ†ìM›><º|ñòžs]±3Vu¬œª$##ÄÇq âÈo·ç/zuùâ™{Žß¼{nG{}k®žÛ¡C@F?Ž­YðòܹãÇ÷îýxûÚ´öÆŠ”˜t_ aÎc‡À&ü>åÓÙùòÀž=ë—¯úxûpGE}xxœ¯Ó!ˆ~qÍ+<³výúåKVÍé_ZŸÑZ“f ÄÃÁT ²âÛ)«¼„ýË—¯»?åp–WêÄðZ= !nVÆC;DÀ ŽhùûÏ[5íüÚÕçíí{Âã儸¹ØØ˜�™`üc·¼³sÕö¹»œ×–éØšÚä*Šòqq°³2:퀘ðu·–³½ÛñíU (°ÑU–ãããbceb´;´lÂW� ÎYýÀ82Ô1Õ–‘âãbgef´³;1áÓs9p;›ꨫ*ˆ‰òó°³11:ٱܛ`ôõùÆ@0ð òövwwwq±¶Ö·Ö×wØvp38Uš¿~ýéÓ÷ ðàÁƒ§O/=8}ãÆ�“'OÜlIµO�ËfÏ^¸pöì¾Ù½}½-Õ-¥¥¥Ñ(‰_öÙ­S;7LmHŽôpPáÅ’;Œÿüþúõõõ­Ëš«£X0¤“’’vïÞ½qãÆe gÍêí� ð@•O~ý.�½t è¸C‡mžT*‚¢@ÀÁÁÁ„ÁÀÄDEZ�—�^ì^q·¿gËIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphZoomTool.png0000644000000000000000000000012715174607203017747 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphZoomTool.png0000644000175000001440000000237015174607203017735 0ustar00rncbcusers‰PNG  IHDRÄ´l;sBIT|dˆ pHYs & &Q©©3tEXtSoftwarewww.inkscape.org›î<uIDAT8��”]LSgÇç´•2,6ÊG9 ?X§Hf6[rHÜ4Ã25:—�x§‹Ù¼X¶9ï–Ì,&î†dº›-!‹,Q"0c"µÊMX O« –"ÐQú�LAhËi»‹LGÐ%{’7ïÕû{>Þÿÿx}è€7€ÀªÝˆa`˜ž*�^4h1P]QQqôÔ©Suûöí+,..ÒƒÁÔÐÐý§Óy¿§§§¸Lj Ó¯ë�7EQ<~áÂ…oΜù¼tiiIÌÍÍ`6›)((@:::^\¼øÃo³³³W€Q`y=ðj¥õÍÍ×¾?tè�ypp�Îή„Çã™ >UUc’$m³Ûío;vÔ$IŠâIž;wîÊÌÌÌeàñz#Ø||þüùÉgÏþN_»v5]SS3| Ôï•ÀÀg{öìù£µµ%ùðáƒtCCCLų€e½jËËËË ‡C©înWº¶¶vø(rµ1é�` P»{÷n§ÛýgêÎ�¾ô‘#GûÅ5`P~âĉ:UU…žžÕår5Ý@PûU;q`½ÚÒÒ¶X,Øl¶�€5üR UUU–P(Œ×û x€(�D“RV¤€ç€ÇétÞÍËËcÇŽí9F£qûÚŠE`cAÁÃââÑh4¤A_ês�H‘±±±áååå´Á`@’¤Òµ`€T<GEôz½È«µžÝ©èrrŒ¬¬¨¨ªªfƒÓZöÅéé@Ül6³uëÖ2ÒÓ¿&�(²Ùl{ss�Âüü<³³³­­8 Ì L&55èõúj2òY _ý3 Ÿ¾$³+Ldd–Cf‡HÀ'ì�DÂéæææ´,Ën Z—µ‡••••™Íæm{÷¾§+++Ë3™Lv¯×kH&“¹Z…ÅdLR[__ÿEcc£ýÑ£QáæÍ›‹Çí _È‚ævY–¿jkk=l0Ä®.Vë[�F"‘hª··wn||<˜H$V«µ¨®®Ö"Ëò†{÷îápÜŽ755ý´°°Ð<² 6Y–¿¾qã÷ÃEEÅ¢Ïçc``·Û�°Ûí†]»v ………˜L&DQ$‹ ¡¯¯/ÚÞÞþs,»ø�¸ µ_%ËòÙ¶¶ÖÃK‰èóùèïïgxx8åp8ºÃáð“ì·Z­eùù¦QÔ OŸ>U§§§#Š¢Ü�ššrdÜ™@[›ïVWW×ÒrýxI‰ôª(JÊåruú|¾Kdöl‘öYùZ—K@x¢Ý/Èr§S”ûm’Tº!ãv»Q%ÕÑÑ᜘˜¸ ‹š´VϪ4SÀŠvÿË™: ßï÷ï4›7m÷ ^¯'ÕÕåêôûý?jÐç$©AV´vW—ѺV×1¿ß?‰D¤M›òKoÝjo÷ù|—³ ©õþW¬º'ŸŒ$mž~­ýÿøžwÛÀåÁÞðIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/reset1.png0000644000000000000000000000013215174607203016342 xustar0030 mtime=1777536643.507914349 30 atime=1777536643.507914349 30 ctime=1777536643.507914349 qjackctl-1.0.6/src/images/reset1.png0000644000175000001440000000107015174607203016330 0ustar00rncbcusers‰PNG  IHDRóÿaÿIDATxÚ­“=hSa†Ÿ/ÉMbn…+•þ˜Ô VS’‚Õ¥ØADé ˆàÖ¡ˆC)]…Rl†‚à&(ÝD¡“’Æj38Ø ¥E¥6´1ÕÖôæ&·ù»7Ÿƒ±1Eг¾¼‡ó¾þqD3Áœ¤UlÑkéTÓyÞwϲõW9Æ+Ãt~‡Ý@T-p+X- /´ · $šä7ôOÜOncg@ª„iÈ�%àŸ‚¹d0zm™™†Uj# hƒ˜�O ‡|¬ù G�¶ˆÊù)?ó±02¡:ÚÎ` :Ä«¹ò’�Uþ½zŸŠëiˆX¢y/ÈÀ`0‡éÒrœ]6 ¡•�Ú X4({Œ{8ìäÔ'á:@h„´""U¦œ5yÞ,™sI’>_[lˆ6…Óu@±€­TE`Åýr·Ù)[J5Ö+BÀI"*Ç›™­›“’ÎÏÈTX«z¬‹�.Äx“ÝîúÍ<�Yî¦ ˆ×:ÛºÅ\°²Ë­ŠDöª\|æÉæ…_IXtˆ%¥7¸ü2ó9f€lC‘¢~&B*рѥRs©|À†°*×5ì±xø…Ù·®»ª²¸ÚÊ•w‚n‚‡`Jج‚N>žãÁz™©ŸæýžÉÕî¤ßë ¿TCùVåcÎ"døßócå¼/të$TIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphZoomIn.png0000644000000000000000000000012715174607203017400 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphZoomIn.png0000644000175000001440000000260215174607203017364 0ustar00rncbcusers‰PNG  IHDRÄ´l;sBIT|dˆ pHYs & &Q©©3tEXtSoftwarewww.inkscape.org›î<ÿIDAT8��•]LSgÇç´¥e¥ÇW) ̯ÄL[R‰Î�øÉœ^�x1Ñ™¸dÆçÌ.–lf1a7$ÓÝl ºl¡3F¨ˆVB”#È‚±¥ T -‚ ØžÚö삃!·dOòæ¹zïó¼ÿçCàßM¼äÅ@.`D „€~à ð ˆ €ð  B³�Ò+Vì>xðà¶²²²Ììì,-@ HÜ¿ß5ÙØØØÕÒÒR ÜVˆÊ»ÀZ OާN�úúÈ‘/s_¿~-øý~&&&0›Íddd MMMÓUU?þ622rè �g#­¸páü;wîLëì줹¹9*IžúýþAY–å¼¼¼\›ÍV´{÷'&«ÕŠ$=ˆŸ8qâìðððÀ³Ð¤{Nž<ùäåËÊùó(›6mê¾ߪg?ptõêÕÍuuµñ‡{”êêêˆ(ŠÇËBÑþ Ž&nÞt+[·n+�Ï{{{Ã×®]‹Z,–o€åÀö•+W6¶·ßMܺժ”——÷ëÅy`P¸oß¾m‰DB¸uëvÌívÿt Àj4“b±˜V¯×$ž¾¾¾‹uuΠÅbÁf³-Šç‚ßVBII‰ett”žžž 0²hÑ¢õ_dggoQEÐëõ$''Û­Vëáôôôr är¹î�F–.]¢7 K´ó"�”ŒŒtÝÔÔccc!ÀÒØØx°ÿgïKÒºº¤nà±fžp&`ÕªU«v¤¥¥¬]»F“ŸŸo4™Löîîn1�‡ëëë677ß ‡Ã/[EEÅÑššû£G}ÂåË—§\®«Õ@›0jì‡ã˜ÓY·K§Ó‰7n¸)..Â`0ðüùóDKË_ã^¯wT–åhQQQæŽÛ³GÒ½{÷p¹®ÊçÎ�ûyrr²æ@m‡ã«K—þÜ•••-z½^:::hoo�ÚívÝòåË„ÌÌLŒF#Z­–H$B  ·÷oZ[[Ç~‰D"U1eAM¿Äápw:ëvY,9¢×륭­�ÞÞÞ„Ëåº 7lذ¾¸¸8ßl6éEQ#Œ��dž††B’$Ý~úô© è@ul~XZZú}míŽ99Ö·PI’n·ûº×ë=Í̜ͬjv"ðU?­ŠÿvÐ*I]N«57) ÒÞÞŽ$I‰¦¦¦Æ���ÓÀ}`Š™vŸ=³”Þ¨^™[^Àìóù–¥¥¥.éï÷ ÝÝ7n¸¯û|¾ŸTè+W!oÔtcÌYEóMD|>ßP(²¦¦šsëë¼^ï™9ÐÄBÿËf'š™™eiUÿl@MÿAþÜØ2ý¡ãIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphCenter.png0000644000000000000000000000012715174607203017405 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphCenter.png0000644000175000001440000000234715174607203017377 0ustar00rncbcusers‰PNG  IHDRÄ´l;sBIT|dˆ pHYs & &Q©©3tEXtSoftwarewww.inkscape.org›î<dIDAT8�••_L“gÆ­|ö+t$Û‚M„BbÆÐ!Ó´�,héV”NÓ«a¼ZâÈbÌ” ÞM½’àœ1Ù4âf›ÀbtÀ"±À–&`‘À@ii�™ì +_ûu}18‹ËNòÞœsÞ''ç<ç9:Þl:@¬ÀáÂ@HüÇÿ”€z Ød±XšÂá°zçN�j6››€M"¦¹¯ÙšU@ À:Qåî ¾ùÂf³Éóóóz£Ñ¸Ñçó½TQõO²Òô@ðž,Ë;>¼o÷îϬf³yíää$Š¢�™™ÉÜÜ_KwïÞ�ºråÊÕh4ú 0ü h©€—A·Øl¶º‹¿Ý%I’ÔÞÞñÂï÷Ï>}úôO�N‡Ùl~·¬¬,Ëé,7D"õøñ†###Í${ÿ ø²É€­´´´-žŠ_¿þcÌn·ÿj€2ñj€£Û¶mû½««+æóùâEEE­€M`¼Öëõ&“éÔðp@½v­%f±X<@`&9(ƒxéÂW‘““ã½}»;æõz–ÒÓÓ�ì•sÓ‰äÊ'N�{‰ââbà2 0o‰g¾LÀåp8úÆÆFû÷ïŸv,�^T‘8wíªÉ¹yóÖó@ Ð Œ‹¬Ô`0ì“$©° ß"0ÒÛÛÛzÿþÈóššê\àc�e(´X,M--Wç'&ÆÕÕÕ!`§¨Luuu�ÙÙYÍï÷kn·;8DÌìb4J�täîH"¥�»–Ìî¾éM€¾ŸÞjù÷½Uó¹íÿ8sxT@)Ã7[�tzdÿo!TzˇÃÎ�Ÿs×Ó°÷0DIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/qjackctl.svg0000644000000000000000000000013215174607203016746 xustar0030 mtime=1777536643.506914356 30 atime=1777536643.506914356 30 ctime=1777536643.506914356 qjackctl-1.0.6/src/images/qjackctl.svg0000644000175000001440000026046515174607203016753 0ustar00rncbcusers qjackctl-1.0.6/src/images/PaxHeaders/aportpti_32x32.png0000644000000000000000000000012715174607203017646 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/aportpti_32x32.png0000644000175000001440000000257715174607203017645 0ustar00rncbcusers‰PNG  IHDR D¤ŠÆ÷PLTE02/ %((' &('(&,-..*.!.-&-.,0013  5267 575524187463=<:7,685<=<<%9;8>=!DB>>'BA AA>@=FFCF#ACAJLGH IG+JJIH1IK(FJ¼Ñº\HY'½ÿÂÛ³O*¬2?Þ»úÍóëë¯öþêvÌ_þâן³W �<úùýØñ»‡÷-;žöìEþ�_þü9±I�øÝ»»Û÷-˜Ø6÷¸û…?w€Ò~o.�…+`NIq³¬/**šrÜxáŸ{¿A`it \‹Ÿ·…zBrdJÛ^ãå.|ýúíÛ¯CsÊÙn8ynŸ—wHddÝ^÷£¿g^xöâí‡Oæˆ#{÷ÎK×/$¤puÚãÇùË—_¸÷øÐ«�H¡Õ9ÑIÌÅÏ;a.Лéùý@%›ßÏA) E]VoïÀis–÷çÄå´L]2áU-Flq†Ø¶mx¼¼%=*?¿?ãv8ftJ¸µµ?¾°<¨"'`Ž>–ô Z8wá¥åýùéaö‰FØRŒe_ï½å³óc•l2ű)`Ëž±çÔòî²0I½`ì¹ÇnÐ…åËeõ\±'k±Â¹¦-ùJ¼bÕ¸²Ÿù²<>^>¾Ð\Y‹ÉézŸ�uÅ|Üù—QcÙó‡Õxó7?‹(B–°ò,ÉÖIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphRename.png0000644000000000000000000000012715174607203017374 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphRename.png0000644000175000001440000000146315174607203017364 0ustar00rncbcusers‰PNG  IHDRàw=øsBIT|dˆ pHYs  šœtEXtSoftwarewww.inkscape.org›î<°IDATH‰Ý•¿OaÇ?½‚�4!{$‚ i5Í!)щ8²9™ÀÈpÊß`ØéZ5L$,XR%Ò¡³&r¥Â¡¤m \ê…6–HŠýáÐ^SZ qñÙÞäžÏ÷y¿Ïsïÿ8LWÌ€& ¹tþ üòÆæ+ÀÍÀ Àét:ŸÚl¶!MÓŽJ"Ç@á lÌ@0:88èÝÙÙÉ�lÿ20´Å_æFå÷Ç3¯×ûXEs&“ºººîªªÚ¢ëúw@Žë0àC’$Íø|¾qQ…T*E2™äððÐÔÙÙÙ�Ç5]××�´p ø $IϽ^ï¨ÍfR©‰D‚xgæ»ßi1&–m‚ÞíyÏËùyë)*Š Ѐ'�°B§#ü+©u«¾4c% àáð‰9ÚÕ‹Ÿ–Àš¦gbhQ–¬t0èÞf:^ƒo-Zbø<; Îi(ÍþJ@ÔW䔦YYD¶p—Fï×0v3ŒcŠÇ ´ÃÒ|JÇ€y ·Ш°Lp�‰ðv†úBä_>"@¡²²²€»z…¯r—Z,�Œ»yu9yÄåTO’–sA4A,_HÒª^­>âSÙJ89DêÛ!P°X€\f™ÍµãD¤b5¤>ƾ|–ôä8m½^yŸ÷nÜ!ɳ¡¡Žýgö’~SâñÈ$:`1�²O™n*KfªxÍ“Þt¹ÐªŠ@?ªØÝ6ÈÆ]ûP^˜XèVå6º2µ�ÜŸ98~å( Ç(}_¢©º‡ó'fHDpÈ’¡“ç¼Wö÷]³šþ�>×Ù´§›úz(…Ò†L"Åë]¼ Ó~­°¤ØH™ó|üS�»pϳ(ŒCq!Gb¼¨ãÁÅ9õÔ«�@ ¿|nøPaã?ëaÃ/—uû¸IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/formRemove.png0000644000000000000000000000012715174607203017264 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/formRemove.png0000644000175000001440000000110115174607203017241 0ustar00rncbcusers‰PNG  IHDRóÿasBIT|dˆ pHYsììu85tEXtSoftwarewww.inkscape.org›î<¾IDAT8�Å�MkQ…Ÿ™LrcL˜246%t’’J‰‚I]”TJ)])]¤ ‚bE\ù ÝéBû\¹Å š�EÝ‚ÁJJ Iœ|½nÓdÝwq_8Ï98m… ˆI ôýÛàÐõoC·,ëÊ�ååÇ_Úí¿®ëÖsÚ¶7·î<:ª{ž÷Ý�PÔ²¬ÊËùy¯©”ìOMõ³¶ý°è8{?R©Áa4*{ssžiš¿å ¥î®­Uº.@~†Ãò6—ü²,i…Bòäµ®ËõÅÅ*�ˆ†Q¾Z.¼“oJIM)©kš|2 y‹Éz±øÙ0ŒË@dÔ¨àÂD2ùà`rRê 5�ãã’I§ŸNЬ] ™Ïf3v½NS)\¥HµZD•¿ƒàâîññF£×ãI>z™é[�7‰MàüÏi€}meåÝ!ÈíR©Tâñøö3Çé|Ðuqfgïæ(€\ÚÏåº;¥RØÎf"‘¸ñ¨Ppo--U�´6´Af{uõM,[÷Íšÿâ@˜£À„¿E0E•|ºú¼ì‚oؤÎEIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/connect1.png0000644000000000000000000000012715174607203016655 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/connect1.png0000644000175000001440000000066415174607203016647 0ustar00rncbcusers‰PNG  IHDRóÿa{IDATxÚÅ“K(Da†Ÿˆ…¢°���ËÆÖJlQl­$EYÍB²sY) IbEJ²p)™$& ã~¿Ž1Îh8ãÌŒsÎo�L�#³â_}õ¿ßÓ÷¾_ü÷1+_d«Z3wj&š.XÝž`¸r>>¦f] &ƒc¬øªx~#Sõ@Vl€Åpž@;ãp<Áî"V@@&sb”6Ÿ.³XR;9œÏÀ+o °˜€aŒÞ÷pjà-üSðvFLÞZ`+Zg<'¤p<]�Ï#H/„ÔÏg3>^n-wXî®Q^ݹ4µ¯ƒMùú‘vñ8lCëÝme/TÌÑ$HEGü¼m+`E¯c-èäp6‡üd.c¼�´€�]¡N• ¤ nµ”½Xï×QïjØuåñtYÆÓù�� A·)¸ß×Pü‰˜&h�°1(ñºœ@ß§®PŸ½‘ì'iW¤æ_“’s ¢ÃvC¿ÜBt-ÿìßV�`ÑY¨IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/itemReset.png0000644000000000000000000000012715174607203017104 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/itemReset.png0000644000175000001440000000110315174607203017063 0ustar00rncbcusers‰PNG  IHDRóÿasBIT|dˆ pHYsbb8z™ÛtEXtSoftwarewww.inkscape.org›î<ÀIDAT8�ÕR¿«Ú`½_¢Ÿ_Ÿ]¤ ÁN‚ƒH�š¡ØMèäP ]Ú¥€C÷þŽ‚¥S'×(t©S7¡%O24b‚H©ÁiÓ/5�¡ÞË{øúclÏt‡{î�sÀ? D$ˆ(üM/¹‚L§ÓéÍår)˲|¦iÚ×ß .‰çy'ÃáðŽa¯E1'“ÉmÇq("Šˆ( âÑÂÔ¡ð}ÿšeY÷‹ÅËf³)Çq ¶mßE1;›Í’l6ær¹�–e}Öu=¹ô" £Ñ¨²Z­ÞU«ÕBl·[ ”c ’$Û¶¿ƒ×õzýi­Vs !ûKìv;àœçcEpÎ�R ”RÐ4M”$é~¯×;á9„?5 „ì‹ÅâŒsþ¸Ûí~Z¯×†!´Ûígý~ÿQ«Õ2Ã0J)AðÄó¼G"æóùH×õ7…Báa§Óy?ŸÏ÷ªª¾m4ƒJ¥ò‚1™LR©T.v$"!`ë8Ž©(Ê×uår¹|V*•¾�Çc×÷}Œ¢ˆÄqü%�Nï~™ƒƒ¥ç3Ï…rçºiš·6›MZ’¤¥ªª.:ñG’i†xUþsüàÖõª³ »IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/asocketo.png0000644000000000000000000000012715174607203016753 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/asocketo.png0000644000175000001440000000136515174607203016744 0ustar00rncbcusers‰PNG  IHDR(-SÎPLTE#%;*+;.0;<8=9=:>:?;@AT5.Y:.Z:.DD=Z=,LNHG=IH=LK=ML=ON=QP=SQ=\[UT=VU=ZX=^[=gfa_=ggb_=iieb=fc=ngmnhf=nojg=pqli=ffftmnk=us pm=uvvvso=roItq=trIÿ00ws=yu=ÉMA{w=yvI}x:}x={wI}|4z=…ƒ �|=‚~=€}I�}Iˆ‡…€=†�=ƒƒHŒŒ�‹ Š„=‹…:‰„I�ˆ=Žˆ=�Š:èZLéZK”�$Œ‹E‘‹=’Œ=�‹I�ŽG”Ž=˜––�=›“&˜’:˜’=˜™—’Iš”=Ÿžœ•=�˜UŸ—:ž˜=Ÿ˜=£œ=œ›Y¦¡,§Ÿ:¤¡Aª¤-ª¦1¥Ÿiª¤I­¦:³«Iµ­:®©j·²1¼³,º²:¿´-º²I²®}Á·-Á·.µ°|º)·³|Á¹Iľ+Ⱦ:ÀºkºhÇ¿I¼jÉÀIÎÄ:ÇÀh¾ˆÎÄIÑÆ:ÓÊ3ÑÇIÒÉ?ÈÉÕÊAÔËIÍljÝÒ:Ðˈëà:ôèAõêB´µÛñtRNS@æØfÕIDATxÚc`ÀéÉq‘¡~ÞîNö–`�´iSz&u·64•ši�§0¶L�<¡«“)Õ,ÝÑ"'.ã�S ë‹Ðí�ÞŸ«–™ ðoWèÕfa‰ÉŠ W x7pÎ`™9“½&ÉW,àVÉ?‘uæL¶2Ogi°€c‘A©2{p�—•XÀ¦ÀC#¯º¢1>ÅH,`^Ül窢ÏÈ# 0Îfί¯­ 25µ èÅúX»Øšp[Xp ‚4Ue¥¥$ÅD„xÁ ZH€MÄ6çr�öIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphZoomOut.png0000644000000000000000000000012715174607203017601 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphZoomOut.png0000644000175000001440000000251615174607203017571 0ustar00rncbcusers‰PNG  IHDRÄ´l;sBIT|dˆ pHYs & &Q©©3tEXtSoftwarewww.inkscape.org›î<ËIDAT8��•mLSgÇ÷–BQ‹�–2|a�" Ù¤¤83�!¾Dg6£Éb6—,qâ·%3‹‰ûB2Ý—-!‹,›„—“Q NÁŒ•0µ€TÚ"ÐPè‹LK¡”öÞ}èe! nÉNrò|¸ÏýÝsÎÿœsþÝTÀ* 0Àj@¢@pcÀK ÈÂ+€‚ÕÅÅÅGN�:UµsçÎ\½>/ ÀçóI< Ûl¶‡wîÜiî)ˆò«ÀiÀk¢(»téRÍÙ³ŸÌÍÍ ^¯—P(€N§#''Ahkk‹\¾üõ�SSS×€a`~%ðR¤Õ ׿:xð ®··—ööŽX__ߘ×ëuÅãñ¨ÑhÜh6›ß8zôˆÖh4âtö%.\¸pmrrò*0²R Öï_¼xqìÅ‹¿äë×–÷îÝ뾪€RàMà]àãÒÒÒßš››� ȵµµQQφ•¢-***úÞnß¶Ë•••£ÀGÀE¸ Å3�\ jÛ¶m6‡ã©««S>|øð°KL«�¢ãÇ�WI’$tuÝ‹ÛíöŸ€?��d+®S´x:<<ÜØÜÜâ7 ”••mLi)ePúòòrÃôô4~`jݺu»t:�1‘H¨e9)¸ 2�D"“¡PÈmµZ¯©9ÿáæÍ›24ͦå`HöçšœœõêÙÙY‚Á`ÐÛl¶½^Ÿ�F…D"€$I„Ãay|||ñĉçFFFžÎÏÏËjµZ0�©`iaa�ôôtT*•ÈOžý©R×Ô@$ Ì”••ÉÌÔ333LMMyS/&€ÉÞÞ^oeåþ­{ö¼·¾±±±(�×>å¹¼LAôÀÉ“'ß ƒŒŒ<��Åbc©eHг³³’œN§|æÌ™iàÉ]¡4$ÛmÉÝñÁ¾}ûº¿ÜÐÐ [,P¡JN ””””Ðét·o[UXX¸Z«ÕšûûûÕ‰D"“d›é�`uuõguuuæÇ�‡…›7oÎZ­·j�na4 0[,–s--͇ÔjµØÑaÇdz�FC ”îÞ½r»Ý¾X,3™LyUU•‹Å’~ÿþ}¬Ö[ õõõ߆Ãá:à™° Zf±X>¿qã—CyyzÑårÑÓÓƒÃሙÍfõÖ­[„ÜÜ\´Z-¢(�Fñù| ÑÙÙlmmý.�6`APÒ/·X,ç[Zš ù¢Ë墻»›ÁÁAÉjµÞöûýÏvïÞ½Ëd2fei3DQ%<þ<>11p:�÷ÆÇÇ­@�"p em¾UQQñeSSã±ü|ã?P§Ó)Ùíöv—Ëu…äžÍŒJv"0LÏ”3²¼kà¨Óù°Åh,H÷ûý8œN§ÔÖÖf½<fIŽû’/µ¦,*çR‚r)ËãñlÑéÖnr»=BŸÔÑao÷x<ß(З $¡@•tã,û¥š ˆz<ž‰@ `\»6«à×_[[].×ÕePi¥ÿË–6ZÉ0*5UÒÿ_P€¿ •Eä©3nIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/session1.png0000644000000000000000000000013215174607203016703 xustar0030 mtime=1777536643.508914341 30 atime=1777536643.508914341 30 ctime=1777536643.508914341 qjackctl-1.0.6/src/images/session1.png0000644000175000001440000000102015174607203016664 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎéÊIDAT8ËÅ’?HQÇ¿ïå¼Ô„¢ñT»(©ˆ¡-t,8(Ø¡¨céPÄníVœDœ-AD,.m‡Ò¡!Š¥Å Ú”´j‚“x—;½K.w÷~4!E‡þ¶ï÷>ï÷>|�k+mž-‹†“}Ö"ûì�Y•rŸ_z7ˤÒ&½�›Iý´{AœŸ£)¯§Ìš–ÁmwémÅ ž~�;_òßöBóLý½¨r�Lo@j}4WŸŽÌÿ‰…†îÈ] ¼#Y?PÞ�xžÚL`û}÷/+³Õ^è ïûêƒÍþFÛòÈ’ –®iñµ…ñ•×%% )7î›É…'SVfk´ô5ºÔoÞþ�„ì'r!û›$_c×-=¶úÀ' p2Óëy5º0 T Hü_Ð   µ=ží“}ÕD® ¼`‚1oMûAÙIÂuÁž@E}üß9bWÍ¿n�xáD–É^vÁµmûB�ˆ„ð5ÜñtOE‡o6�ËÆ–A˜JîÁÑw�Š'+È1ôÓêÚ.I‰°1%bTÜ€ˆÈPv„p «(íFí½‡¼ªê òŸ®Œp² Í6§Z○˨E<ñIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/mclienti.png0000644000000000000000000000012715174607203016747 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/mclienti.png0000644000175000001440000000037515174607203016740 0ustar00rncbcusers‰PNG  IHDR(-S?PLTE€@@@LLLQQQYYY]]]```kkklllwwwxxx€€€ÿžžžÀÀÀÂÂÂÈÈÈÌÌÌäž³“tRNS@æØflIDATxÚ]� € Q¼‹tÿÿV{ˆA‡`²”Ÿô!å]C#Nè0!7÷eÆej@ Â…d­"3ƒ9¿‚ô(“p¸(ìl., ÌÿÄTk8d é"^þJ¥à}ÀúüËkÔ}Ôí –� ºÝ5TÌIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportpto_64x64.png0000644000000000000000000000012715174607203017666 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/aportpto_64x64.png0000644000175000001440000000373315174607203017660 0ustar00rncbcusers‰PNG  IHDR@@�·�ì÷PLTE         #"+,"  !11"$!+)56 34&(%.,!+,*??==-/,CBDD<=14'231";9IHEE574NM981:;)6?0:<9USWZ@?8QP7BC>@=ç=ï9ÿ¿u­�&Ž´Z8óŽ˜ÅÁºuìÁ(g½w6nø�7ŽŽqÈ7Î�u¯Ç'H„='8˽1Daá† Ø Ä±½°ç3¤nA6̆k¸A¬íÞû‘Îb1q¦–[˜»A�æ ìƒ=eˆ�³ ´—ñ‚$ (ºÞ÷¼9 *8ƒ®éÒ,‚ŸòÀ^ØïóÐû“¶ú]¬VpæqË�Ù[Å 3×­kªW8dr>Ý^“á–ö²òõâE…ãÞüÇ{Ã1�îÒyå[¤F}îb¡ÅgyèEàâסý¿)Uxõá[xøçP~]R¹Ã§�À påwí#ƒ[哳òEéG<{¡ƒçã)b±WÐùÙ-wÌüU?ùm;?•uÆŠò£ˆEDcž.._�?ø ù¯d êÇ"ˆüÒÈÛlô‚üç—82¼(næ§×/ðIý„ߤáx«ŽO;Ñü¸BþMŸJ°Öªâà xJ]WçÐü¨Úî#ˆxŒ_c…¡-Pû›ù¶ënÁ¨ÎÉØ0ŸÛ¼~ͤ½_’aeã°ÓÕu}PýQöæÈ?ÿ&€ø.¬±:úi‚”öÙ\nÛñ9Ìæ…ÇHåVG-¢Àá  DRÛÂkŠRŸbz"üm«"Q´…Õ÷÷È…¼ôžù‡%T É·ƒ¾BŒN�¯ÊÌHŠò3~(–¤ÙM›Ø`¯ÛÜÆ¢S—ù­“š±KD$+2ڢ᩶¼´5:6zn¶SÏ6N‘Ò7HÖ%Eú!Ñ3Ó)#eú€ÀU( ð¥K{fô²x ÔÏ{;9èË=(‹§ol ð]Ò/ ~åC�C/#wA:@� qsÜõüYr[mn€ˆô Á €™9;*AZsÆ¡,âÑ%š{4 eqÕU¿N "�ÂV"ЧËý:ˆÓ'†8è “�>>@@@BB0AA>AAABBBEE3 ]]ddGGGHHHhh ff*YYiiQQ<%bbPPPkkSSSWW@P__V^^\\\]]\Tbb^^^aaG}}3qq___~~```bbbddVTiiffN6zzakkhhhVsslll9‚‚nqT)ŽŽ=‡‚7‰‰qqqvvW<ŠŠttsxxX<��[��vvvxxx>’’zzz{{{~~l6œœ@˜˜‚‚_ƒƒ`„„dBžž;¡¡‡‡cb””D¢¢ŠŠeˆˆ†‰‰‡��gE¦¦O¢¢G¦¦S¡¡ŽŽiK¥¥Œ�k‹‹‹E©©J§§ŽŽyZ£Ÿ��z��z���’’’\««…››ššrœœsœœv��xžžt›››���a¸¸Y¿¿¦¦z¢¢¢_¿¿§ª~¨«€gÃí­€sÀÀ®®€°°�°°‚eË˳³„rÉÉuÈÈ|ÆÁlÍÍjÎα±±pÔÔ¼¼ŠpÕÕ···½½‹¾¾Œ¹¹¹rØØºººÀÀ�»»»ÁÁŽÂÂ�ÃÃ�¾¾¾ÄÄ‘¿¿¿ƒÝ݈ß߃ââ�ççŒòòŽòò�óó�öö‘ø÷–üü—ýýáááååå:�ö|tRNS@æØfvIDATxÚc` øk9›úã‘7›ºkÛž–8å•j»wìÙ¶k±>.óK¦ÔöìØµmQ[œ7m›RÛ½sã¬fì dæîªè\6©H»Gÿy{vL®É¯K—Ç._°ÔÞº%¥iaþXÝ œÔrø„ëÄêlòrí�+öÍ ö�OñÅ&/Q¿þX`ƒ“½;Vó…«ú=, 0�ÄD|e3¼¶G¹Ùá�g+œï»=ë¬'yÖœUá@ù3gÎ`—WK]ƒW>nKæV°ã¤4»M¼‚Ôæf•=ˆgnjHËüw‚‘ƒ‘÷?ðx.ͼ:à…·cIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/mporto_32x32.png0000644000000000000000000000013215174607203017320 xustar0030 mtime=1777536643.505914363 30 atime=1777536643.505914363 30 ctime=1777536643.505914363 qjackctl-1.0.6/src/images/mporto_32x32.png0000644000175000001440000000150715174607203017313 0ustar00rncbcusers‰PNG  IHDR D¤ŠÆÚPLTEiii  '$ )  $" $" """###$$$)&%%%('/)1+,,,6/ ...70;3 222320333>5565777878888;;;>>=DA%DB)@@@AAAIH ODDDDEEEFFFQH#GGGNG8HHHIIIMI@JJJKKKNKGLLLXN%POJPOOWR6QQQSSSTTTUUUVVVbY,dX?\\\ha=```mc4dddseLpiBtfMhhhyiJmmmnnnoooqqqrrr{xDuuu�vmyyy{{{‹p‰‡tˆ†~½„‡‡‡À†‰‰‰ŠŠŠ‘‰�ÃˆŽŽ�˜‹€ŽŽŽ�ŽŽ������’‘’’’’”””•••———˜˜˜±¥±¦ššš´¨œœœ£¡„¬œŠŸŸŸ«£p   ¢¢ ¢¢¢¤£™£££È°¤¤¤É±¥¥¥¦¦¦©©©«««®®®±±±´´´¼¼¼½½½ÆÆÆÏÏÄÎÎÎÐÐÐÒÒÒØØØéæyÞÞÞãããæææèèèéééüüîþþùM‘ tRNS@æØfIDATxÚc`0À*ÁÍ„O^N×ÃÔI—¬��b©ª‚oâ mìòJÞSì¦ÍÉÄ*Ï‘ÛX6uv¿T@}m6y6¯šª©³'±ˆè`‘g·HÎï�”jMÀ"ÏiÚÔÖ]¤”ÏàÃf¿{DeWO\ƒŸ`s?6÷»eÌ,Î ²ˆ ·RæÂb¿kvßôöb;5Y ua,ú�ò³¦¤9‹ñÊË«Hb±@ $_é#Ì8—‘“‹¼pX^’q.` ẉxå\ÚÛÊñÉÛD¦æ™‰ã–·Œl™-ŒS^?¢eR§1Ny�<3.Y rðËÛd¥wà•�©ö7Ç#Ï "ƒ'‰Û”ØzJã“/tµÃŸ‰¬i›I2 [› ([IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/rewind1.png0000644000000000000000000000013215174607203016510 xustar0030 mtime=1777536643.507914349 30 atime=1777536643.507914349 30 ctime=1777536643.507914349 qjackctl-1.0.6/src/images/rewind1.png0000644000175000001440000000040715174607203016501 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ%:ýì?r‡IDAT8Ë­“Á € E_Œ1Lcèn£w;S= &jPJü Âÿ¯@ZøMQðmÞ¨Š[¦wHT½{{CEyõ­Áw@E° ˆ:×u—�sXÂO@ƒ®‘?n�‚TxB �ÆP©–¼Ò dÏO65’Äçdy`ؽCõð@`à¡AœO#L‡IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphConnect.png0000644000000000000000000000012715174607203017556 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphConnect.png0000644000175000001440000000164115174607203017544 0ustar00rncbcusers‰PNG  IHDRÄ´l;sBIT|dˆ pHYs & &Q©©3tEXtSoftwarewww.inkscape.org›î<IDAT8�¥•AL#UÆ3­ívSZpév¡MÄpáâ!LŒñ@=/ÄpXL¼c$á¢O$r¢—õdÂ�,'B8B‚ô%š–@]Òl´âÈ´Ì2,Бöµ}{èTl—t÷yïÍá÷Þÿ›ï{OáÕKi˜ËfÛ…©€ xÍ^W”€êË€Ø =€(¿'Η;€°Óé|°¾¾þ]0¼mY¦i�Çÿš��ýø¹°bCƒÀÈ·CCC^˲B`Y¥RéppÞ®k©ÚÐ.àÃéééo"‘ˆ?›Í²¹¹)óù¼B ëz0€òM-û�7�·�€/FGGSÇÇÇÕt:-gffª;À ðð‘Ý‘ÚêÄ*Ðíõzßñûý}���Ý===÷&''B%‹�ÇÿÈd2?¿çÔQ¢æ�¦åÞ‹F£{†aTs¹\Õ4MY(¤®ëryyYŽ��__!ÀÉ5ë¶:±8….]×!n·¯×‹aœœœ°¿¿ì§@…†pÔulUÕÃÃÃJ2™¼'¥|½¿¿_- œ��Q.—1MSÝÛÛû ø�Z0þ§e³’ÀE6›}"¥ccc!är9|>ápØ�m­ë2´+Ôbêí홟Ÿ¿ïr¹”��–––ž%“É¢eY¸\.‡ªªžfÐfàzî/..~êóùÔ­­-‰DaeeåQ"‘ØÈd2Å«««ººº.x�êÜ|@ø,�þ�ËåäÚÚšœ˜˜n·û!ðð.ðøè³»k ½KÍÜ_ß§4M«¦R)955U …BK6ð6à¶G�Ý]S)œöŽoÍÍÍÍE"‘7ŠÅ¢âñx”óós%‹É���Çš¦ÍO€«›Zo;�î@ ìèèpT*ŽŽŽØÝÝe{{;ŸJ¥~7êy\ž¦Óé§š¦y Ãàòò’ÓÓÓÂêêêC ˜í@á¿Û+@íÇôQÓ° èÀ¯À1µK¼­ª ßøÌ¨Ôòï3õ¸¶n¶nÖXÏóíHÖd)OëIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportpto.png0000644000000000000000000000012715174607203017013 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/aportpto.png0000644000175000001440000000046415174607203017003 0ustar00rncbcusers‰PNG  IHDR(-SiPLTE_@@000542@@@``0PPPPPUTR@``€€```5trjhd@€€€€€@  ÀÀŠˆ„���…¤¢Ÿœ–   ª¨¤@ßßÀÀ@Ÿ¼¶ÀÀ€¿¼¶ÀÀÀÐÐ�ÐÐÐßß`ÿÿÿ ,OšgtRNS@æØfyIDATxÚ]ŽÛƒ D¡bñ–¢"A[RZÿÿ#Õ�hžvÏd7âom!ØûýaÆ€�š™�?µfà=>µš�ù6pÌ—Ò ¾_Vpó]Ã}+¡‘H!�ᕯyŒ¤Ò‹¦Øúˆ è½>(µ‹³=%ÜqÞS —ÿ7›^·ëæÁÚÓ%IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/apply1.png0000644000000000000000000000012715174607203016351 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/apply1.png0000644000175000001440000000040715174607203016336 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  d_‘tIMEÚ|€$:‡IDAT8ËÍ“Ë € Gí‚6ð® X‡e¨e`6àê° ¼ƒ â'1n²— “�G²ðÛ²»o­°@ã¾KB0FnfÆòšèÜyzÅ&‡Õµ\Û§}Á§Ç¢ ­–�»hq#g±B*9•ýÀ[~ˆp[ß�ðx¼‚—j>;ºˆ›u+XîG6IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/xstopped1.png0000644000000000000000000000013215174607203017066 xustar0030 mtime=1777536643.508914341 30 atime=1777536643.508914341 30 ctime=1777536643.508914341 qjackctl-1.0.6/src/images/xstopped1.png0000644000175000001440000000050315174607203017054 0ustar00rncbcusers‰PNG  IHDRÄ´l; IDATxÚí“1jÃ@EÌVÛ¸ÝRw˜F'М“¶é¦Ñ!”+æjö)·2¸»AiäÄ(Ö§Ò«v‡Ïìð÷°²²òÿ¼,î½1såœÛ†.ªÚ{ï÷>zÁZ[‰Ècœn‰1N"2Zk«Gú"2N "#€â.+ˆ¨†agŒ�?�~‰èp@J eY¾{ï_s"3WƘï¢?šÎgc ˜¹òÞgM¼af8ç¶9â\lœs!\rĹ:0!¨jß4ÍîjÝXq%¥Uí³ã@DOI@Dž“ck-Däºy]]×ç¶m?ëº>Qw÷¤Ë•ž£‡ùC¡ªÈ�×’/‡±Èž¥*‡IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportlno.png0000644000000000000000000000013215174607203016775 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/aportlno.png0000644000175000001440000000026115174607203016764 0ustar00rncbcusers‰PNG  IHDRíÝâRPLTEpH€€€€€ÀÀÀÿÿÿÿÿ6tRNS@æØfJIDATxÚc`€5(Í–e¤&CÔ@“r*DFM- "�pTS‚¤&AÄÀJRD  ‰Ž5¨SRD@YjÌZ} çk×IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/formOpen.png0000644000000000000000000000012715174607203016730 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/formOpen.png0000644000175000001440000000105215174607203016712 0ustar00rncbcusers‰PNG  IHDRóÿasBIT|dˆ pHYsììu85tEXtSoftwarewww.inkscape.org›î<§IDAT8�¥“?‹AÆûGW—#É ‰Mšà!±8V–%ì‚} I!)mü *h°Éw°ðˆ,‚bac¥"¤“ ×¥HHÎsn&�wìy/!¼Í3ÏóÌÌûÎÀBû]P«öõÇ€ ¯Ï€—@¸~_�ë0ã ðEF4j [52Q8o#JG;#dDWnt(z&3d%mCb QQD2b@�+RUB{ †)TVS!|�/@hNƒ ‘+Bv^_LVbX ”-™1B}›4ebUcdPOnZfeL’;Ÿ?gf^efd ž/ž'^sf8–E‘srXqr^sqgkvk¤P`�)/¡E,«(}ˆk‰3'©N`•l‘x†An—}p9¥]N¨‚‚e€€z7°H7®Zƒ„oŒ‹5x ‚™Œ˜t¦ CµEL«mŒ˜,B³fŒ�xˆ™IŒ¢V»,••S‘‘u��‡~±“”m�’ƒŠ­ Nºu_¾9”ª_¾Fd³|˜˜�jÃ*�©.Ÿ°pÂ6ŠÂ 𻣤|fÃ}¤¢‡£¡•hÆ©ª_”¹HuÆYqÅr¦¨†|¿”¯´W°®‹—Ò�Ì�}Ë’¯¯¦³²™¡Ø”ÕA Ùº¹Š¶¶­»ÀvŠÑ¢‹Ò›¿Ë=¦Û/›Êª¾Ó#¹Ø¢Ù_²Â³ÁÈl«Þ>ӷ㽿º´ß(ÄÀ²›Ø¯±àMÅÅ­ÈɦÉÊ¡¶á\ÎÌ�¼ãV²à…¶ÔÀÑÙ\Ëé"ªÞ¼¿äh¿æqÊêBÒÓ©ÏÏǶâ¨Îì4ÓÔ±ÀçÏÓÃÝïÛÞsÄÚÌØ×§»äÆ×Ú¶Àç´Îë}ÛÙ¾âñ3ÜݳßÛ¸ÁèÉÚð^Ñì‘ÂèÐÙïu×íˆÞñpàâ¼âàÄéöEæõTÖï¥ãäÎ×î»ÐìÙàò¢êé¸çæÝßò³îùkð÷xéêÓìêÎÚñáìíÆèìÛêìéðìÝýýaúýsùû…öüŽóòÕîù¾öòÏèõëöú¬îùÈöòãóõÞüýœúý§òöåõôêÿü°üý¾üýÔúùðùû÷üüìýþãž'+ËtRNS@æØfÝIDATxÚíW{T“ç¹DÊÂe¸™´jö!« QJ ¬X«r§8¤ºÖ¢ˆ× 27ÑÈňhÐV$VH€¡€a[1#’r�‹6 BL!x! ™€ û½_Hg§è;ggÏû~ù¾s8Ïó>¿ß{û1kÖÿ ,\V½^8à½ÊßßßÅB�>‡7ŠcD‹×Õë¡úúú&¿úúžõõuÃ+}ŽN€7IÇÕZ(Tj•BƒN9´6ÍÍè45¥ë Œj ¨Õ££ˆ+SËåj™½ä��m *4<ø•´I$ÍÐ$m.þ“r�—™ =�—?ZI;¢CÜ‘¸¸ØÈ¸ô|‰D,ÙN ¬Âéa¶Ë—|ððpuu]²d‰ƒƒƒ¥ƒ¥9ÉÒ’4—„Ã@$š;}+n–ˆë < (¾(..ÎÎÎNIIÙ·/&&&8x-ÃÓÃ07g �æL¥R)dGò|§f±X²`J`ä‰í·]ÏŸwuuÕ×ß.)ɾš•šz4>fkpx8‹É`¸Áƒ€až4•Bq$$R±hJ`d”·üŒ‚ÄýÛ·K®fe¥=¿ukÄÞ½kX txÀ‚3ð©À·'ò›¦‡ÀûèV¼ÀÄÀX;H9Š+ìݽ†Å¢3Xt&C+|² 1¿[߄ݣˆß?öÏ«Wq ¾…Åb0éÐYn� SÉŽ66¸Ý,ŒŒ>á ÀÀëþþþîÉâã#Ö²èh|&† P4æókô¨GP]�0ÐþtøYYçþ~ 0‚ÝüO0ßÊT$• m§å ¸þ~×ýûÃý>mÏJm}õàoïÓJe fR€£½��µ•)¿I,Ô9€%Œ @~ë‹þs_4(À,$$°”¹×•Þ˜369ƒˆ?—Ào’N[‰<�âÛõõõ?"­uýw_U—Õ¾�ð-̆;œŒÞ¯0Ú$Ÿlc=òÿÃAvIÉí’‡[¶¶Ö½xõ²´´à_�ˆØ½{·2ƒÍ¾P€Æ§Rq> ø5B‘�Vö_¦””´½µîîpCYiÑà7k@  …Ãf_üÁ瘅B!C`|É„/éfÁ ¶0Ï5å*Ì~ûÓÖººÊ»ÕÀ/Èk¨ŒØâý•2—ÍNLüáÚµK>GÈ€µ••%ÉÌ„_SÃ׿Àk乚瑒ÔáeAQmuÞ §¢ƒüÄó磞ýd©&€¹$sc~“pZÒ\SR`òû￲ øyEy7”½Êlöé‰;vDGí:‘üéB0›šh̯ó­Ÿ×}©©)ç^5TVWÃøyyy9=ƒ×•=¹0>âGGmÚ´ù‹íŸÎ›G2#‚€T(š6 Kö�ª,«ll|TZ[[ÔR{ãÎ�;=w¾ï¹÷ý•‹]8tð`Ô—›7ÿqÝ矯[´èW¿B�Î�J-Ø~§^5–––•A\î•Á{¹?÷¢ D6¬Û¾qÑ{ææ¦¦F©P ›p�é{ç/K‹ŠÀ~N7‡{¥·÷çG¡¢7lØðÅö�ï‘HD3SS‚¿ªf*ª!�øºÆ äp9×;¸//^ðgϦÍÛ7þÁŽEÈ�`ˆB˜r C¶*€Ÿƒè\.§¥`õ�Õ!��¨ÉNvŸo…ŽUÄ71ÒÏ�×È�,Í!8–þ7ƒˆ�S1x…ÃÎhL »…„;� œýl£û<´ˆp(LŒ UzIR«2-=#Ö®Þ«ä¢Ñ[^¶°9ØAXˆOÈ¥]Q›¾üù·óð`†ø&Ɔ|½$®R=—eZ¯Y¿~}øà.—Íí½®Ìàäö®Æ0ºíÒÁèM'Üa ZZYB¦È€‘�@?µB XkYk×++€Ÿ« ,hɸ×à†9‡øÒ>;µ'ù}€LÄ`ll4!¨L%Q¥�¥‘0Ÿ¬²ëœ ö½RïÀ†GÊ@Ìs©Û2*íXr²;ÐaÂøD€±á¿ªð²ÎÁÐ�<“„Ñ�Ï8ÝÁfgô`Ñ 1ggš�/Å~á'îh’tŒŒ ßè'ÑK¥Bàðf0•¹œŠoø‚Û NA_8ìñ=h9×ÌœH051Ñ .OÍ‚\šÛëtOnï7ü€kŒ²l)BdëÉ=ˆ€L€@¡ÀNç`HŽ;@7Àêe­7“á†ßB4ª¯/:Å­a’ðˆ04>$q* $@G10™Þ«½a|Öä5¶ì}{{kàk ð &ÆÁÁe�ƒy'�ˆÁíƒSs c4 ®QÊïá²±²ÆHÀg LL¼™Ý­? *…¼í74–�éÆb¹ÑAñÉ Ú Ú-`b¤ à�Ë0$qÊ�B!»é`1£¸aò¨4 ~�5ÓGÂ0A“ƒ7oÆmeý……g´–ËåŠ6…ü»ý±ûgÆíGùX?LÂm‘µ@%œ¢s``H[ âµ`ß³îg}ÝÓñS÷OT&é Å›P ¶u¶u ŒÃ‹A±¤¹ J9(¥$b‘X$ÖUЄDœ Õš¶ùš"R† ÁfT¶�‚ºHŒÓq„|¾@ („ç2àäÎ9zÅ®WXllXPPPX@PÀÇqÛ !lƒ�ȸHüVjðÀÉâ ïqTqòP‰¹?66ÈßßkÅâÅ XXXÌ·Ò/<ᲑËoJò¿KO?|x[dd¨ß‡XÌzgD‡ÌÊ%“ _‡"…9ï,€øÐ;Û@�Ÿ q_‡†úù½ƒƒq[´Vb‚bÃ"!«+W®X±ØÉÎnþç™ø.å²òòr™öŽ×cS†ÞÄçC8v3Œ¯èÔàñãÇÒgRisSs³´©¡ªª¦FXxùLÒN¿_ö0Žþ¥�Â2ÔAË=x aõ'íÜê4C§Ÿ<ž~<ýäÉÃÐNÇ‘„zRRÒqàB&?t²˜A`|ö[ðÖ,þÿü(3§mT&b<IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/qjackctl_512x512.png0000644000000000000000000000013215174607203017742 xustar0030 mtime=1777536643.507914349 30 atime=1777536643.506914356 30 ctime=1777536643.507914349 qjackctl-1.0.6/src/images/qjackctl_512x512.png0000644000175000001440000044444015174607203017744 0ustar00rncbcusers‰PNG  IHDRôxÔú pHYsŸŸKœ3RtEXtSoftwarewww.inkscape.org›î< IDATxœì½÷“$çyçùyÓU–ïªjïÇõ ‰!h$P¤@®xÚ;*îVZqu±¡Ø»_¡ÿåþEh8]HqwÒr—:.A�€€3 0®g¦§½-ïÓ¾ïý�U5=�` ‰K£üDddU–é̪Žzž÷1ßG(¥øE!„§>±ÿ¬c§½þY'­Nì?ëØÓ/þE~111111¿Bˆ_„Í{NÃÿ¼ûÓÞN7â'�ýiû“¯ûÄûÄŽ@LLLLÌo:ÿ¬Àç0ü'�e�I`Èîçs°é@x€4�pì ŽÃgþg=~òvt vbbbbb~CùgsN1þŸfø5à*ð"0¤Ÿñš“ïuHàxÜZœnðŸuŒSöOþ@ìÄÄÄÄÄüòÏâ|†ñ?nøuà À×€Â3ž{ò=NÞ>Éñ �À&ð°Æ' ÿó8'ß3:;11111¿Aü“€gÿÓ€%à÷�‰SçSö'oŸÆÉP¾"JüX'r žå ȯ{fZ vbbbbb~Sø'9'Œÿ³Vý à;À+§<.4M€®ëºnš¦™H$ Ã0 MÓÐu]3M“ ð<Çqð}ß÷!²Ç!‘‘€@JðIÿøoD5CGà¸CpšsÀ)û±#óëÎ?Úxã/€ià�â)� MÓ4]×-Û¶sù|¾0===;>>>;666aÛ¶‘ÍfµB¡@»Ýæðð�µµ5ö÷÷e½^—RJ_JÙ•R¶¥”RÊý0 ‰ ÃÁù z\Þ!*"þӂ؈‰‰‰‰ù�çå<§ñø.`pÂèkšf …Ù\.7™ÍfÓ“““©R©d���¥gff’ããã™±±1­P(ˆ±±1<Ïckk‹ëׯóÖ[o©ÕÕU©iš!„§”êJ);a¶Â0,+¥*RÊ*Ÿ4ì à¿ò$-pÜø´4Aœˆ‰‰‰‰ù�Âø¼/xNãÿUàÛ§×u]O¦R©âôôôù‰‰‰¥_|1õíoÛúêW¿ªåóy8%arܶž={–©©)Çaê‰D‚v»mÔëuÛ÷ý\Rá !öÂ0Lu¸RJ—'«þ"ð=àQ}€Cdø‡çw< ù$êØóžúõz�\.Çøø8BºÝ.RJlÛÖúý~¢Ýn…š" Ãð@)U%j y²Â_þQ$à'SSS|ãß`zzšD"�MÓ¨Õjìììày¼÷Þ{d³Y._¾Ììì,år™f³‰‚~¿o6›Í±½½½lµZÃpO)µ ÔyRpr•? ü;¢)ƒ?*<5ø,IáãÄi�˜˜˜˜˜_*§v|Êêâ/X'Ž›¦iŽ���-%‰K𦕂 ©ú 7€«W¯²¸¸ˆ¦iÜ»w�Z­Æ÷¾÷=~ï÷~�«W¯ò×ý×O¯ø¿@TÿðQ¡ {ìóx%Á¸P0&&&&æ—Æ'"ÏXý¯ðÏNä€ pÓ41 !ããã\¼x‘ûoÿ-µZ�7ß|“;wîpñâEþìÏþŒ+W®ðÁŒ4òù<—/_æÒ¥K$ ‰Ä¨EÐ0 4MãîÝ»lnnÒn·9::¢Ñh ëúȉhµZ´ÛmºÝ®8 a§ÓñÚí¶×ï÷=ß÷ëí€}¢�¡œðɨ@›¨Pðcžˆ =K;`ØikÄÄÄÄÄüÒø4à4Á øWÀ—�Ý×-ù©©Éñl6û[Žã¦=ÏÓƒ ìù¾O†„aˆa躎¦i$ ²Ù,ËËËxžÇÑÑB¾þõ¯óçþçòøñcnݺE>ŸgzzšÅÅE˜ššI‡aÈÇ©Õj!‚MÓÈd2£ÔC:�Æó<êõ:÷îÝãîݻܻwoÔJ(¥$‚Ðu]·Ýn÷{½^/‚V†í0 ëJ©‘Á÷ø¤�/ÿ x|챓рӺâ11111ÿ]y*pJÛ<íDc~Ÿr„I˲J³³sEÛNd«ÕaâyÞH´G)52°†aŒVéaÒl69::âÞ½{¤R)ŠÅ" ¤Ó‘Tðõë×ùàƒØØØà_ÿëÍk¯½ÆÙ³g ‚€V«E§Ó>|ø�r¹ ÀÂÂÂhI ;ŽC­V£ßïspp0Ô ]°ïûºçy©d2™jµZ¥f³º®ÛBJ)÷¤”!D{0iÐçɪ’hÚà:QÇÀŸL <«upH?Òu}4‘pgg‡·Þz‹r¹L¯×¦„9À÷ý„ã8 ¥”­iZFJÙQJµÃ0ì !jRÊaWÀÐa:üx—HpèÓ¤…cG &&&&æ¿ #àªÇ78sì¾ð& …±ÌÌÌtjzfZ+•JCÕ=¦¦&étz£Ð¿mÛ†1̳†áhu.„Éüú¾O¹\F×u‰RJòù´Z-®_¿ÎßýÝßKKK\»v�••2™ žçÑív Ã�ÃÃCªÕ*­V‹½½=z½.‹‹KLOOó /Œ&£år™{÷îñÎ;ïP«ÕÐu}”�2ªÝK$Z:�Nöûýd¿ßŸ Ã0PJu„)åQ:ÀåI a‚H3á À;À�ÁcÏ ˆ;bbbbb~!œ8-ô/€@?qL3 -[*�gfgfL¥${{»ìíí“Ïç¸pᇇ‡ìîîáy¦i¢”Â÷=€QDž¤€§ ‡ÛNR,–xç�wè÷ûhšÆ×¾ö5Þxã Μ9ƒmÛ¸®ËíÛ·Y{ôˆÝÝ]Ò™ ,--±´´„mÛ#˲žêL¨T*¬¯¯óðáCfggùö·¿�mÛƒóõñ<�v»M³Ù¤ÓéŒÎÛu]=‚ŒÂ’R&4M+„aøPJÙåɰ!I”:ù‘#ð&ððØçø,EÁã§Îˆ�€˜˜˜˜˜Ïç¥NFÎqbõ躮›ù\¾055¥ùžO¥ZÅ4M¦§§9sæ µZ Ã0(•JhºN¿×£Õj"„62ôÃ>¥º®�6!(\×áèð�ÃÃC:Ýî¨úß²,Z­û{{ììîð`õ½^�\.G©Tbzzš™™™Q ”’^¯G£Ñ ÝjÑíõè÷ûxž7šCpíÚ5„¤R©QjàÎ�;<~ü˜Z­6ê(0 C†!Â0Ô\×5ƒ Ð¥”–®ë" îRÊ ÃÐ 6‰œ� à‰FÿØãÙŠ‚ðìt@\(ó�Æ€g†ÿ�ßÀ"O;º¦iF"a‡VÂ+��k»»»”Ëeææf9{ö,“““´Z-Çavv€r¹Ìææ&ÉdÓ4ÑuÏóFJ~C§@)‰’‘�P­Zåè¨|ȇ|@>Ÿgmí?û‡wP®}é5þð�þˆ\.7ZåE‰|ßçhÐV¸¾¾ÎÞþ>õz�ÅÅΟ?Ï«¯~‘l6G*•"™L¢iìììÐív©T*Ç„X–E2™Äó<Ûqœ© &5Mó¤”=!DSJ¹E$!ìu ¢"Á?îo O |Z�ÀIbG &&&&æsq2pZø"éßü±cBÓ4K×õ|:›ÑlÛ¶2™Œð}Ÿ~¿ÏåK—Є`õþ*NßazzŠk×®±ººÊÑÑÉd’ññqR©ÔHŸÿxk €& �Ï÷1t]7ÐtFÎ�çyìïïóÁ7iµšÌÎÍóÅW_åÅ_"›Í¢i®ãÐë÷yüø1�¯±··‡‚L&ËÄä$çΟ'›Í’ÍfÉå²ärùÑyø¾�ã8"ív›0 i·ÛH)1M“t:=F Úí¶èõzf†MÓJ©´Rj&‚GRʃAz`¸‚¸|H$&4ì(ˆ;bbbbb~aÀ44jÕ2÷î…4› VV.òÅW¯�Æ[¦ÉîÞûû”Ëevvv8*âûããã”J%––¢‚ÀñññÑߥ¤Q¯Ól6hµZ4 ¶¶¶i6›$ fgg±m{TO0¼îcª‚bÝÐûý¾î8Ž5PE,288ǧ^#’~ø€'‘‚çíˆ cbbbbžã9ÃÿSœˆ 躞6-k~fz:?33C>ië³,‹J¥Â�{÷øÊ—¿ÌüÜ<žçQ­FùóW_}•b±HµZåý÷ßGJI.— A¤©Ú O1êã÷Ð5E1—¡Û®S¯7) \¼t™ï~÷»¤R)t]�¦^ÿ9ï¼ó6kk�ŸçÒ¥KüÎï|“……r¹ÜÓµ@0и{÷.wîÜa�r¹L½Þ C˜˜˜à›ßü&ËËËØ¶M­VãÑ£G¼ÿþûܾ}›F£1š`Û6–eá8žçBˆ Bˆ1ß÷m`GJYãé|~ø6ð*Q}À}> x–´ðñbÁ؈‰‰‰‰ùTŽGžþ?îÏÿ'“I»X*•Rù\Ž�í|Ï#ŸÏ!eB�Éd˜��¥ïôyïïÓjµ˜žžæÒ¥‹loo³³³3Êé���aYÍf“v»ý”¦¿”�ÄÔB0%JA»ë£ÐÐtÓ´ð<���mÚ­åò‘ÚÚÚR<ôͦZ\Z2¿øÅWµ—_~IÌÏ/�ÍfÑu×uUýmvvvØÙÞfk{‹F£I† ¦§gF)‚¡XÑÂÂù|~$q¼¶¶ÆÝ»w9<<Ä÷ý§& !H&“²,z½ž®”³,ë‚Rjè†aØ“RÖ¥”U)e‹hå_þg`ŸhôðÖ‰Ïÿ´BÁÏT„¸c &&&&&âYm€Ãýp+?¦iš©ëz2•LæÆòy3‘°yøð!R†”ŠÇE(‹ds9vvvxï½÷¹¸r�ùù9ÆÆÆøøãÛŽªõ‹ÅÂhÚß“n€èô”’B4bèH�¾+Ñ4°µHbxo›÷Þ}[•�*llnÉû÷ï‡ÉT:\^>×¾ôšzíµ×ÔùóçÅ@ HÕë5ª• õFƒF£.vww#'`k›âø8óóóœ?�ÅÅEfff( #Í`ÔIpttÈÎΛ››8Ž3ªaBp<¸bš&Åbß÷í^¯7�’Rš¦uÂ0< Ã0ì „„†©�9à%мT‰ cbbbbþø´€á~8ðxþ?¡iZ¶“¤R)” Y[{ÌòòS4 ‚  P(àôûÔëu:íçÎ�cyy™ÝÝ]*•2RJæçç¸xñ"…B�·Þz ×uH¥R†�R*ª�Šß% ”0Ð M@úîñÞϪ¬Ý¿Žša·çµFÛã�7¬×_ÝüÝßý]Q,F>L†¬®Þç'?yK­=zH«ÕD)!––Ï07;ÏåËW¸zõE–——G"@¦iŽ ûPÄhss“Ÿýìg|ôÑG &&&&æsqZÀÉÛžôý�[š¦©T !¾Ðíö0M Û¶ùðÃ[¦Áôô4�Fßó8wî,sssø¾ÏO~ò6�N›ÉÉI¾øÅ/`YµZ�n·‹ïû£®ø¾‡B bÞ=2¬ç@¢!i·\éö;2ÄRºikÅbÑ|饗ŒW_}U+•J´ÛmöÕæÆzpëÖ­Æ­�nµìDb¼XOK%íêÕYXX$—Ë�t€ÑŒ€ƒƒ*• Õj•Z­ÆÞÞ.ëëëT+UÂP’ÏçÉd2”J%æççÈårØv€v»M¹\f{{›z½ŽïûX–%²Ù¬è÷û¸®«K)5Ó4—Â0Ljš6&¥¬*¥ZRÊaW€¾Hä ¼ \'šHx\CàYNÀg AìÄÄÄÄüKây”Ó'î MÓt!„iYV´"ì™–…6·¶˜�™a¼TäÑÚAàsõ…+ä²Y�øùϯsö쮾°ÈåK—xðð!< Ýî „F*•À¶md.…BÍ­ª¥¥T€¦AêÊ—"”*Ðó¶©OMM‰••±°°@£QgýñãðîÝ»ÁÏþnss£Úétk_ùêo§/^¼d///sñâE&&&FCƒÇ¡ßïÓív©V«¬®Þg}}ƒíímö÷÷pÃ0Èd²,ÌÏ£€©©)–——yùå—™œœ�!ÞÜÜäÖ­[Ôëuö÷÷éõz#á#Û¶1MÇqLÏó&„)e1 ÃM)å‘¢®”r¥”‘�P ø&‘¢à�‰tŽ 4�6~øøw{ÜøD}ÄŽ@LLLÌ¿†Àq£Ï‰cö‰ûB)eº¦ ‚0D7 ffgÐ4h6jX–E.Ÿ'“ÉrtTF)Åòò2‡‡lnncZ++¸pá•j…Û·osëÖ-,Ëdzz†……Â0 ^+ÓëT@Ó�Èø+¥@I>¦*Pªïi¡ ÃÐL!†®cÛ Â0dc}�ýðlllôöŽ­v·699›ùÒ—–¯ž¿pÁ^YY1.\¸0ý Ã�n·ËÁÁ>Ýúˆ»÷î²¹¹A„¸®‡ç:HÅb‰¹¹9¦§¦X\ZââÅ‹$“IlÛ&“É`š&BÇ¡\.óÞ{ï±±±A½^¢È0’;N$CGÀ ðdFF)µ(¥¬A°AYJ9 ýK"m†?^#’ÞäôhÀÉÈÀiÄ…‚1111ÿÂxž‹§�¡iš!„ÐMÓa¢¤$›Éà8aDCvl›Z-Ä“Ë噜œduu•F£ÁÂüËKKd³Y>øð‡‡‡$“I®\¹Ìôô ét†í­ Ç%”b°ò×'¤B)C()d¨�]BׄЄ”ŠÀwéµ+\÷ǬÞÍ9ïÿüýZ¿ç!Ñ5©Tvqi9÷å¯|%733Ãôô4¹\ŽZ­:˜[°K§Ýäèð�{÷°»»G£Ù ™L‘°,òù1®\¹ÂüÂ¥R‰B¡Àää$‹‹‹£Î‚hQ“z½Áþþ>ï¿ÿ>÷îÝ£V«†i’H$FuC¤A݃Þï÷õF£a9ŽciÓ4MMÓÆ‚ 8�R6¤”=žûYàO€ à‡ÀŸìˆ cbbbbžâ³”�?çx ¡kšn™&a rÚ&Ýn€Ù™¤ Y{ü×õH¥RŒ ´Úm\ÏãâÊff¦‘¡äöÇ·éõú¬¬¬ðÍo¾�m'ØßÛ§ÙlR«5 •‰!žL Ô…Tº&Ñ5]¹RHÇ“¡iº¦ëCƒ…Óï¨ÚQOýý÷wTÒ©µÝ­¥å‹ÅÉ©™i¥Ôôââ¢þ¥/}‰L&32Úë�׸yóï¿ÿ>ýn+ªòoõH¥2Œ�O�N§Éf³LOOó¿ü›ÃÙ³gGÚPfØu]êõ:wïÞass“ÍÍMîÝ»ÇÖÖ6åòR*,Ë"‘H�:†aH:�&�N“HDQ‹~¿O:�æèèÈl6›9MÓrš¦M!Ò¾ïoÈH!)äɰ!E4©ñ#R|›¨PðyºâBÁ˜˜˜˜�³³³¼üÒK”ŠEövw¸ýñT+|?@Ó´QO½”ÓP”ìö}_¡k†iZ"z(‰¥ú­¶ê:NÐD³üL¾´Ðlµ³ÉT&ùÕ¯~U[YY!�Nãyµj…��-Þúñ›Ü¹s‡££2†ib&™lnÐp•™™ŠÅ"ù|ž™™™Ñy5 ªÕ*•J™Õû÷Y[[ãðè×õC‰a˜,..2;;ƒëz(¥0 cò×´h(D­…úß÷±íHÉu]úý~FqV×õPð©”:*<úx‘¨Hðˆæ<«[@òIbý€˜˜˜˜|Ö4@xbŽGt¢á>¾ï¡i:AÒwú„2ªœïv»LNNbYwïÝ£Óé266ÆÔÔ$««X}ð¥333,//Óé´ÙÝÝfowß÷I$hFÖ IDAT¦uH‰•Ðð}W9n © Mš¡Gqt¡BÀ“–A/ ƒ^½åõý@“–¥’v ŠµZݲí¤~æÌ¦§§qœ>÷ïÞf}ý1[[Û|8HE膉m&˜˜˜äܹs¼ð £Áá*]JÉááá   B¥Z¡Z­ðàÁCvww‘aˆašØ¶M:�D2 ’ÉÔH@èøìƒ^¯ÇÆÆ<`o/Ÿ,¥D×uaÛ6†a˜ý~ßô<ÏÐu='¥ìJ)³RÊŒ”²<舌zø*Ñœ�Ÿ·‰"'ë†ßïs§b' &&&æ7ƒOs 2þÉcRJMJ©ëšFxžBÊÏó"¹^]'ŸÏ155I£ÙäÇoý„±|žÅ…yR)›­�m¬> T*233Ci¼ÄÛ?}‹‡Wiw;$ì Y;E"‘ Õ¬£¤K1›`gß•ÍN ³ÙŒeº»%ðÐè+˰ÊÝ@uªMßÈçó3fÂë;}êõ¶m333C6›áèpŸ|ÿÿæöí»Ô[}Zí.¦•`r|‚L&ÃÊÊ ßûÞ÷˜žžÆ¶£:H)åh¢àÝ»wùOÿé/év:8Žƒ”!}ÇE�ñññÑdÃT*Åø@Xèë_ÿ:KKK£ÁãT*Þ~ûmªÕ*~øáS�éº>ŠH)SŽã¤|ß—RÎH)+®ëÞŽ¤”ÇWù‚h€Óÿ|‰HQp�œ~@œˆ‰‰‰ù ãÓ”‡ôN>AJH)×ó•çùƒÕj8R¿s\!étš^¯G½V£ÑhréâE¦g¦©ÕjøžG±XàÚµkLŒ�S¯ÕÙÝÝ£×w™˜˜á•/|‘d2ÉÑÑëk=ªGuupÔU~ D*•Ôu=’F@!g£Z�N·\mù^(�ôX>_L$©H3rSóùÿ~ðwüì�7i6ꬭ=¦Û÷±6©P‘Ë�qæÌY^|ñE®\¹B©TÂ4Múý>�¯±³½ÃÞÞ.»{»lmm±½½ƒmG¡|]71-‹‰‰ VVV8{öìH>8—Ë1555 ÷A@»I7 Ö××ù/ÿå¿pÿþ}|Ï‹"'ÁuÝHy0g!›Íây½^O‚ �H$¾ ¥<ò}ÿðØ´ÁãÆ{øwDÀ�€CNï8-%pœØˆ‰‰‰ù áä,€ÓèòPÔ€?ÈM£:š&F¹z×�”l ‹V«E§ÓŲ,æçæÈçò<^ßÄq\JÅ"W.`š&;;;Ôj5L+Áââ/\¹‚”!�z ‰øôzaX²ÌÑZÓ”4uå¡j{žª;¡Èiº‘K&“ùh™Ùµ|ÆÀ6loï°¿¿KßqÐu“T*E&“!›Í‘Éd)Ž)._¾Ì… °m{4pÈó<ö©Vªtº*•*ÛÛÛÔj5¶··¹sç�N'*Ôu„&PŠ‘fÀ0]·†išºã8¶ã8³A¤•R©Á´ÁaËàP;`häÏKÀGDÒÂÇ?«[ ® ˆ‰‰‰ù âyÆ÷yúG_éºî !ün·K»Ý¶� ‚(DîEÅnš¦S­V Ÿ³g–Y\\@�ë×o",/-111ÁæÖ&÷îßÃq=–—øÂ+¯P(ÙÙÙdkc�z£�hh¦%4íIG@Â$L¤Ûk6º=§Ûé+#™JŒf"™%‰!|ò)�lÂSÛ››^«¸AèËd2“Õõ®6 ÛOMMñ�o|ƒb±ˆaôû}~ü£òýÿü·tº®çãÑèâ±±"Éd$…<55ÅÊÊ —/_fyy™\.Õ/ Vû®ëÒjµ¨TÊܹ}›Ÿüä-vvvi6[£k‘JQ(( !ž’Ö4m´µZ-ºÝ.®ëâ8¦i¢ëºp]7ç8NJQ ‚`[Jùè9OùW€ Àß�y¶ði�¸6 &&&æ×ƒg¯ü‡(¢JòÌð@†^~¿ßÃ÷#£(<%#Ðë÷°,‹d29hL0?_ ªÕ[[[Q:`z*’ÙÝ?`wg©…b�ÙÙÊå#676iµ;øèFBXÆ@’@…hÊÃ2”£ Õ©µ�ªã ÝNåæ ÓLkš¦Z€F€P�¾Ùí9ôª Ç •H¦‘ ©õûQÅýüÁð�ï|‡b±Èææ&ëëkìloróæì”ñü€„m“ÉdI$ÌÍÍqåÊ&''™˜˜ X,2>>>Òû�®59ÚÛÝ£V¯Q«ÕØßßgkk Çqš �Π BŒVøÃ"AÛ¶G�¾ïÓívéõŸ¹�LBMÓ°m[7MS8Ž“vgQÓ´Œ”²§”ªA°E4`hX$(ßçï ¶¡“p¼6`øýŸtâÚ€˜˜˜˜_s žîÿ~ž8* C? C¿Ûíâ~T8|#!èõz#Öï÷±,‹ññqšÍ&{{{ôzŠ¥“SS4uŽiµZÌÎÍ3^*‘N§ùèã�ÙÚÞ¦×s°“òc6éLšv»M¯ÛPF(¥~/e£ãHOhv1™°'Fg¬†Ððe(¿Ñ¦ãªÓwašfR×M"E¾0 yñÅ«¬¬\àèè�>¸Á7o²³³IµZÇóC¤‚D¦P(0>>Ε+WøÚ×¾ÆÌÌ ¹\nd¤Ç¡R©Ð¨×ØÝÛU?þñ[lmnªF³I¿ßA €t:M¡P`jjj4eÐ0ŒÑ^Ó´Qz ÓépxxHµZÅó¼Q—ƒÏ|`µT*•²,+Ùï÷‹¾ï»J©1 �R¶µÃn�áªÿu`øyZ;àY»}ªn@ìÄÄÄÄüêó¬ÀÉð#¢B24Mó•R¾ã¸Â÷|üÀ½@�~ß!�Î`YÝnMÓH$,¶·w8<:bff†3g–)•ŠÜ½s‡z£A2•áÅ_dvv–V«Mµ|H½V¥ï\=‘³çÎ13=ÃÇÝäáêm¸}·Óñš­ŽßN$R ºaæF'/%Jú(-Di¸¡¤Üëù®†z2™œ0 #9 ¯§Ói’É$½^—›7opãúuÖÖÑj5)Kxž$”–e’Ëå(‹üÖoýW¯^eqqÓ4ð}Ÿ££#66Ö¹qã�>`g{“F«+}?u]—étÊÌd,Ý0L … \½z•‰‰ ÆÆÆ( ѤA�Ã0 ”¢Ùl²½½ÍÎΫ««£º€áó¢Ï^ŒR–e‰ ¬^¯7mFÑ÷ýý vÂ0Ü$Šè¯ Xþw¢”ÀñN�“þ´´À©Ñ€Ø ˆ‰‰‰ùÕæ³Ú‡?â‡ÇJ)}¥”ïyžjw:JhBDÅnÑÊÕó<Â0ŽÓ'™´±,‹~¿�&WV' ¶¶·ñ}Ÿ™™iΞ=ƒi¬­=äà ÓÉåÆ8wîŸÌÎÎ233ÃÌÌ ³³³d2R©ÃéŠCÛéyÝn‡��îܹ˻ï¾ËÚÚ2 4u Ç G—¤``¸ ÃÐs¹œîº®Ýï÷¥ÂÖ4­Áþ@DÈáI4`˜ø)ð3ž8ðt:`¸ÿÌvÁØ ˆ‰‰‰ùÕå¸pòGüøþàÄë‚0 ý ÂF£)”BCI*�¿U*ê—R†˜f49жmVVVH%“4 ööH¥’,ÎÏ111A¹|ăÕû•ËMg~fnPX—åÑÃUêÕ²×ëõZ­®<”Xs†¥Í WÀ PÒG3¤JYBÖÝ Ýí-7A*e¥mÛ.®@b…!ú|tëA¨Ón5)�O‘µ’´Û¤RärYyíµ×øÖ·¾…R Ïs©ÕªÜ½{‡?�÷þáÇtz>~a?°I155-ÆÇǵb1*ð[ZZâ…^`nnn4rØ÷}ß§ÛíŒòûAÒjµ(—�¸yó&oÿômþë~@.—#�NciMÓA<×%8ÇU‡©˲°,k¬×ëåz½Þ� ‚@)¥*D)�ã"A¿ÌGTDO§†ÿÏ ˆþbG &&&æW�ÏŠ ÊÍê ~à•R~†MÇé§3™t:jÿ‹ªÿ“É$º®Óï;!0 ÓÐQJb“Ôë ¶··q\‡ùù9fçæhÔ›lon±»»ƒçùÌÍ-ðÕ¯|™|>G«Ygow“v§Ý�Jëè¦qYS"+ƒIëÂ)ývßìöúa/PÂH¥Rg,ËJ�¿”TH:¡Ð”¤Õr Û*ƒ p±ê ‰çÏŸçå—_æ›ßü&gÏž´9:O6›) )±½³ÍþÞår™j¥ÂáQ™Z½N«ÕÄu"yàóçÏ‘HØÇd„£.ÇPÊ‘ãàyŽãŒF‡a8r ÉDBs]wN‘ Ãðn†‡|²ððˆê¶yÚAø,G€c�q4 &&&æW‘çMøD†`8G“RêaŽã˜®ëÒíF½þ†U²»®G³ÙD× ,ËŠ*ÖÓ2ÉdÒlnEÃr Ý`rb‚‰‰IÊå2GG‡x^4@hjzгgÏRoÔØÝÝñ›õj¿Ûs=% 3“NŽ%Sé„iš4ê5<·�’¡Ò¾ïÓêö¼£PêIÃÔó–•Èéz4-Hh �”Â@3l Ó¢ßñp½> Aöéõû„aÈåË—9wîKKK†ÎÆú:wîÜæþý»¬®®R.Wéöú„J�J$)‹,-/311Áôô4+++ÌÍÍ1>>þTE»Ý¦R©°¾þ˜í­möö÷¨T*T+ÕhÔU¿ïº€f˜F"—Ë255E2•Á4 õJ)‘R²¿¿Ïööö°3`Tp!„°m[†‘î÷ûpV‘8& 8­ðd*à>ÑÄ9ˆ~ÜRÊ\†úpxM&“!™L¢”¢×ëÑívI$XVw hY&V¢\>boo�ÉÉI¦¦&ËsçÎmjõ:¦•`¬PbrrŠb©¤<¸Ëúã‡^·Óª8®o=‘+•JúÄä$©Tе‡>�¦«T(UZݾçÖj�öþØXþr2i�›¦9È�+LM"D*‘DOäÉæÆè8„N$ §i¾ïS©TB0>^Âó<ŽŽŽ¸sç6ýýŸìP,M`%lŠEƒz½Îøø8ËËË\»v�W^y…•••QAŸRŠ p‡v»ÍáÁ�ºuëCõ·÷·²\®h®ë 8NŸ ©©©ÎÂü‚9;;›˜œœ¤T*1666êéHI¼ÿþû¬¯¯ãyA<%4L À¨XÐv]÷ŒçyÉ t¥Ô¡RªMä_ñÿ0üg¢”ÀñâÀãÿ/qJ &&&æ×ˆç‰ ·GD†Aì]MÓz@Êu]ò,”’È0$ÂPæD}ñà y©Á¾ I¦R¬\¼H~¬MÂsœÁ@ƒÅ…%ŠÅ"ûûû”wÃjùÀ«Ô;ÃJMLMMg_yùe-�NÓïuÙÙè O)ÍðÍ^µïJU(ä¯&‰œ®ë¡D’O…8Nˆ˜\ZY! agg×õFôQ¸\¤ܸ~�Ûߢ\®°¾¾IµR!ŸÍ±¸¸H£Ñ × Éçó\»v�×^{�³gÏR*•FÆ? ºÝ.7nÜ`mm�ƒƒCvww‚ÝÝÝæÎöÎN¶gr¹Üd>Ÿ¶OêçÏŸÏ]ºtI»téÒh„°eYÇ[þïH&“t:]‚ ûr5ÀS­‚£vC˲4ß÷s½^ïRKA 4<­y�hÔðÿC :>-2N ÄÄÄÄürÒxÖd8E´2ÜVˆ~ä;À¶”r.‚ü ß,|ß9C…À0 ¢)yJbY‘bàpVÀââ"–iR«Õñ}]7H¥3ÌÏÏ“I§ØØxÄáÁžÛl6½ ©ñ|!9?7Ÿ8sæ ý~�zíP¡¤ CÙïõÖëI„fdlÛžÔu]-Z„&L…¡I” BEê�Âõ<Ú�ÎÈ@FFR¡k‚±œM¯Û`õþú}‡£r…r¹‚¡ ìdš0”¤SiÆKãLNMñÚk¯ñâ‹/R(�RÒl68<8doo‡�í î­>d{k‡r¥J½^u{½~W×�ÞÔÔ”?;;ËÜÜ…BA 133“X^^fyyù©•ûP·`¨9à8}*• �Á5„a@à{�ÿä+:º¦�¤…ï%„"‘Hä ÃPív;B$…†”²*¥¬+¥ZƒïÝrD)�·€÷ÿÿ¤”ÄÑ€˜˜˜˜_CàYb@'‚Ÿ­•Rª)¥üX)e !²ý~_‹Få>©D×4 MºÝë,--‘ËeQRa™&Ùl–‰ñqzýû()I¥S$¬³s³ønŸÕ{·Ùß;jwúA˜ÊäfççÌ3gÏP,–x¸ºÏæúCÕsdÐu´êÞAe7�É­$m»4Ì‘3¸°BF‘4$Õ××QBñàáÃQÅüñþ{)%¦c¯ßd{s�VÇ¡ÑjÓétÈçÇhuºlllŒZ_ýuŠÅH"áž­­-þÛÈ�ô®¿÷6Ó‹˜v×õH&“½ÉÉ© ŸÏO\¾|9³²²ÂÊÊ ‹‹‹LMM=µb?¾â�†uiµÚ°±±ÁGÝ„ÿ|ÏÁ÷ßGH¡i '†�ކTŒ¾£á5†A¡P0ºÝî¸ã8%ß÷ëJ©}¥Ô ÉÓâ@¿ ,u ôxþ”ÀÉLJ×Gbbbb~ œÖxüþÉmØ"ªð¥”B×õŠ”2ëû~©Ûíêétj´b C�J¥Šç{x®O©P¤X(ÐíuQ@Ò¶IØ6µz�ÃÃ#öö÷™žžâ…«/€’ÔkeÕn†}Ïu +Ž�µ¥¥%1=5Åææ»»»t»=Ùn; ×õT*sζí¬a@×@!Bºt:’ ?ÔU:Wˆ‘ØÎ“p}H1+°-è»­vÓ…nßÃuÜѵåóy.^¼È׿þu®^½J±X$‘HÐétxøð7oÞäæ�›á�»wz¾ëhW_ùRÒ²R°Â0L&&&²KKKöÕ«W™œœ´‹Åâ¨Åo˜¶†÷×ÖÖØÜØ`{{‹J¥B³ÙTŽë…ƒ: Ñét´n·#\×c¬P¤TÇ0 LCÃBÚ��ïᾌºމ ‰�xÐðsÈèº>†¡†áƒ0 wxºðxJ`‡OO ÄÑ€˜˜˜˜_AN«8ÍðWt x�H9N¡”²ª”J !lÇqR¦iºžù¾O«Ýôµäó‘�k6›(¥HØ6š&pœ>�f“N»CòÌY–—–h4îûÍz½„�ÎŒYsssÚÌÌŒ°“6[®sp°+{½~Øé9^�HØöD:�Æ4Í(:úHéáà‡š®ƒO…Õu]‹,—�Zˆe ,ÓÀ—6ŠHبßïãz (•J¬¬¬ð•¯|…W^y…¹¹9\×¥\.³µµÉÛoÿ”wö.~x+<8<¬^¸pÁ~ñì%ÛNX"›ËQ*�311‘\ZZJ^½z•L&3Rt]—F£A§Ó¡ÝnÉJ¥ªîܹ£Ý¿Oo`¸ý„èGß‚A±Ø¦”R¸®kèºn†aüÿì½i³$Ivž÷¸{¬¹Þµî^{×ÖÕ{÷l�á`ˆE’ÑH3P”£™~ƒ¤ÿ„O"!Ф!Ê8Da `ºg¦÷êîêZï~óæž»»ëCdVeÝ®ê鈚É×,-3#r‰w‹süœ÷¼Ç˜Rx¢�¤ »»{,,.P«U‰'¢5Æέ®ÒlÔ)ŠÌކCÆãÈGùKÍæBessùzå Ýn‡ÝGÈ’ŽãH?hx®«U³YS[[›âÜê Zçœí"…!ɵ¡0kAJ…Rr’ÿ–K-´H Ã/hV@Ã1§�!ÚØ'¼Û·osãÆ „žÒ�Žõ}ßyå•W¶oß¾-oݺ%nܸÉòò2P’ƒ�N‡^¯Ç£Gù‹?ÿ ÞÿùûãÏ>»sÁ�íímΟ?~cccóÂ… ܺu‹óçÏ‹­­-g}}Ý™%.NUó<{ÒuÑÚRz9MSÀbŒÆh]¤-%›!'UˆgˆÕj5t]W ‡Ã BˆÐãcÖÚOe„–€?î?™Ì‘or¦‘�gøgæá<*0ÇsÌñÇZkgVY³­_ø¸lLÞK­õ±RÊXkƒ$I®ëzÓ€Öš^¯GQðÆë¯Ñl6I’„ÁpD𿬝¯Q©Ti·»£%„çúÎöö6çÎ�ãô´ÍÁþº�#ê‹Xy®©×ê\½z…W_y…ÿòÿ9îßc8ŠG)qf@º(Á“±” kK ]G(‘Óé´8n­Ôáï÷G)yaƒRv7 C\Çáßÿÿ–÷þæ¯pÜ{ð˜$+¸xé2áÄØv»=Â0”/^ôGÄõë×ÅT$iŠ/>¿Ã/~ñ >øð#Ò´LƒaŒéœ;wnwcc£ùÝï~wí�7Þ¸vóæÍÚÆÆõzý‰Àtµ?E¿ßgŸƒƒ==zÌÇȲ×u'¤¿RüH�ÕvÈaò—ÊE9±¸%9Òu�I'Gßs§>�ƒ$IÖ�¾1æ±µö«ÉßÏø›ÀUàCJÁ>Ïwξ~^ééܘcŽ9æø‹Rg�󜇦\éý1 'ÛbcLGk½ lI)W'Ò´J#•RJêõ:•J…““yžVB–—W�Rrtt(º½ÆÂêê ›[[Tª<¸O¯ÛEkC§ÄIŽ1†›7n°¾¾QJìöŽN0ÆÁq\kÈã)åDEOMr ŽÈQXS�e‹" %Ež’e9i^jèËÉÊ_)p•f÷Ñçœ=ÄX‡,×Ô› „•R”(Žc¶·¶¸úÒKâõ×_·nÝbee!£Ñ�û÷�Š{÷¾Ê>øå'_}uW'i¶î¹®ï¹®Óh6¹xéRýâÅ‹;îÎÎÎÂöövsssSÖj5”RcȲŒN§C»}jÛ§§¶Ó툣£#qxpÈÁÁ'­“¼Õ:MÒ4ëZkE­V][Xh8ŽãH×qI’‚(JÉ’ˆ,ŠH¢˜qbHµÁ ñ<�Ò�$�¯p\!-2ðƒŠ/„Ôiš„ÖZ©µ‘Æè=cÌ`2wf ý[Àk” ’�x±0�w³qæõô3O0wæ˜cŽ9þîø&)àÙ›îYg@O§”Ú?˜î³ÖÆyž?tÇ)Š¢™ç¹B8RJÃÑ$„^™¬f=ƒ²" ÙlÒh4 úÓéöp‡­­MÖÎ�ÑŠ÷ï2E <:�ÃQ)5¼½³M½Qg�ñðSDHg /ð±R3Ž’'€µlÙ ÈU�ž˜ )Á‘š4ÓäF¢i.Ša IDAT�²ÙX ƒ†hxÊ §ˆrŸÕÕU<¯\ù·;=¤|ç;oðãÿ˜wÞy)E¡‰ã˜{÷îñ‹_ü"ýOög­�>þäŽTÊþèG?ª¯¬,;¾ï;qœpãÆ�Õ7^}åÜÚš¬×ë"€‰áO‰¢Ø=}|ÜJ?ÿü޾sç3ùèÁƒ°ÛëÊÑh$ÃãqTÄq2ö}kkK]ºtq©ÙlªZ­N0Q ôú¤ã!ãn‡~»ÍQ;b%6#¬€±†A_úày‚alBÏ­8Aà9ãq´!¥®å¹ÍŒ1%/`–í?5ö·�[@‡ÒøˆRRxêH~SÄ ¾ž"àìû¹#0ÇsÌñëÃ�òÆ)¦x%žwS~Qà”uáç&ßÓ@¦µn^ÇkÀ‚ã8äy^†–=� Ï F£1J•c,Q3�(ò‚¥¥%nÞ¼�çû zm¢~‹$II G‹‹ \¾t‰óçwè´ÛÜùôcÒ¼`�̆ÄQBšå„aø”ioÁUW�5 cÊCö<(Œ ?Ö(ÇE©§¾‘G\©hN;)Ò ¨5ZsrrÂáá×®]çí·ßæþàØÙÙ™(óøô“�ù7ÿúOùä“OÛíöŸF#yáÂ…M)eX¯×Ý .pýú Î�;'Î’úŒ1ôz=vwóå—_æ÷ïÝ?¹ïÞ‡�vwóÁ`ЬTÂ7———W¯^§Þ¨³ºzÎÛÚÚZ\__šÍ¦�RŽãH¥ ¤ì¡õ]Šâ¦¨ ‹òt›,J)¢ §ôz �nL«�¥9½AʃÝ�~Î`\0[�JÒ¼bŒ¾d­’Zëû<[%`ÎÑxˆëz4šM–——¹{÷KNNZDI�†T|�`4f{ç<7nܤ×ëÒ:9b8ì³sá*ÍÅ•']÷¢(ÂqÂ0Ä÷ä–8)Gš(Íq”Äs]’Ì ­Ä÷Ÿ¨áa)[ 0ŽrÚÝ”¥åE×#ŠË~9FÒ,ãêÕ«¼ýöÛXk9=mqÿÞ=þâ'?á¯ÿߟò‹_~`�¶í°|üàÚõkW^}õÕ—~÷w×ÙÞÞ¦Ùl–¿eŒ-süm»¿¿'?z$~þþ{¡K³¬ø’fn¥ Y÷ð¼R%Ñu$•ÐÁsÖ“�§™r±V T-+LsÛãBÛ“¼°‡„)熙™'Ó955ðMà‡À÷)¹ïù%î}‰”Š��m´•¼ÿþûdYÎÖÖ—/_¦ßëÑi‘g9ºÈ) Kè¹ Úh¤t�§’À‹šÀ5Ha9í¦Ä©Æót¡É¥~"!,eÙa¯ÓéðÙgŸqttÀ£‡xôð‡DQ„ëz¸UŸ���­ëׯïüþïÿþ¹W_}-ØÞÞabLÉxôèañå—_$<�FÃ+£(Áõ‚Ðò£ýx}{{»~ýúõüâÅ‹ÕõõµêÂBM¸n )?¢L·KJá¾b2<Ó×ò̰ª§Û ,b1ÀõµaÊvàP_ª°ÒMؼ°Àõ~F»5bçĹ¡u<&¾Á4Úí´xt8NºéfëNšÙNalb ™µ&Ã�™g�éC¯/÷(óužg¾7‹¯¥ æNÀsÌ1Ç‹ñmÚOŸŸÎ�F J¸÷(s¼Sç °Öö€f’$…çyÒqY êò¼`<.Åãß§uÚ*¥ƒ M¥†yžÓëvètÚd¹&ŽS‚0äúõë,--Ñï÷8Ø{H¯ÛÆq}’4#Š3Úí—/]âò•Ë\¼x‘/¿øŒöÉ.E¡q‡ZÍ#Ï4Ú” yB*$eν¬�7(©Ñº -rÆQ†ŠÀ÷Ê;ð¤^ÞŠ²lî«»Ÿó_þÒ¥ÕjÓï÷é÷{´Z-²,gaq‘õµõðå—_®¾ùæ›Ëo½ù–¸tù2Ž£�†ôz=}r|ݹóiëgï½ßyüø‘S©ÔW666ƒJ…óÍ‚0äòåËÕ .T76ÖÅÊŠ+šM ´'—¿ |1y¯€�gû=Á³½{fÔ„B T%Âñpê–pES;—“f†,ÓÄýÚ w>>aÔOœzÅsÞÿø¤êº"¿}­9|°å÷÷FÄ©öŒ!7ZdÚšÜZ2kȵµ#k‰�y’“˜ð—(Ë?§”îñüÒÁçŸë”c:wæ˜cŽ9fñŒð2 <»Z›]‘ͦ¦‘€�)WrË“ýгÖ.fY–gYæQ&×µ.H’”Ápˆ1×óH’”ñ8&I2êµaà3  { û]FqŽëzìììðæo µæÞWw‰Æ”£ðTÈG}B–„aÈëo¼Îí—_FÁÃ{Ÿ“Äc’ÌÒlÔi6ë<Úk“DYiôOÍ¢1HQ „¡7Lé Ë&@•Ð#C„(…„ž ˜À{ó_¸÷ù/ªKœ¿p™•së<|´‹6–��MùÚk¯­¼ûî»üáþ!®ë>!ùðé§§?ÿÙÏ>øè£~ùÁ‡666Þ¼víúb­Vcyy™©ÐÊÊŠ¨V«%Ã&—|ÚµwŒiL†äy˜­º›ò輦FD93‰$[€k,6€°äú�^»±ÂI;"N çå—–=§ÕH³T+éÛÞ¨°ƒQA– cŒM¬±ãLó°Ðbß3í[|6÷¸L©:ùsž%Î~vÞupŽ9æ˜ãï€_€o&Î:Óøòßÿ35áÆ˜¾âAš¦kJ©%k!Žc‘¥ �ïã8.Ö²4!KKc»°¸H´Z-¢8&×i–sac‹+—/ÓhÔÙ}ü�ÝÇ÷E†Rà§Ûëá:.çÏï°¹¹‰çy|úé'´Nް֠œ�´P´{iI´–‰O€àH‹.4§QJš!ñ=×óKã?åL›èM-( …Ÿsç6ÐÆ²¿·O·ÛãÜÚßùÎwÄ÷¿ÿ}qëÖ-|ß'Ë2Ú§§ìí=âÓO>nôÑ»}ôé''§íþæææÊíÛ¯®¿òÊ+ ¯¾ú*ËËË,/7YZ ðý�pÝGÀ„8†”Î!Ól®U©øif¨†.õªÇêbÀf7f8ÊIRÍpœ1e²7Ìä8*œÑ¸0Qj|+ÅyáE/7…=œ™c>ðßS¦>=sP³†ÿ,7`îÌ1ÇsœÁ¯Ã˜¾~Q$`6 �S·~ofa­ícq£ÑHH)E%dYNQ”á{×õXY]Áó}ÆÃ„hzH’äyÁ¥Koqõê\×ãøø€ã£C‹Ë¼òÚ[\¹ö }ôív§ì  Jã&°Xc°Ö`q¨V},’(J±ˆ²m°|j­)OW(C®ËF:Õj•,ψO#²¢l°øÑxăû_ñÓ¿úK†ƒ‡û{Üð€Öiפ¹MwÎ_ØzíÕW/.//Ö®]» ®\\ pvQâØ@ÂL†kö²Ï �� ÷‹Ùˆ¸¤t_7î³ÃûaVJ¼4‰hw#|?àÒåKa‰ã˜$m—Q€ã_¶Ö¥‰Kl®¯Òjwé%C„�H!(Šœã“#¢Q—{_~Èå«·ðý€^·K–¬­­;¯½ñÎÂúÚ¾çˆ×^¹)×—ûøÅFØ}ã»=[�9»ð=;$³F-˜Ýw6=Îd¿šÙ?]õÏè>™‚<ÍI£Ý £„<Îéöbâ¸À‹ë²ÜÐîÆ`!ð¯ÝX!I ’´ \W’$ž«X^8¿Y§ÝM8íÄ´: £qNo˜Šý“´æ’’¢™æö“{l éÌ�ýcJ%£ŸÎ\Œ³˜zA/$Î�€9æ˜ã·ß&_�LŸÏgS9¥ÄëïÎ싌1]à$Žã¦”rAkM’$ŒÇÆZ\Gá( ­IÓŒ8N‚� çw¨U«diB4î�¦Ú²,gi±ÎÕ+—YY^!Mb>ýäŽ0ÖVê<Þݧ×ë1�X\\d{{%%ƒ~‹Ó¤ÅõëW¹|õ&ï¼óý×?åã�?xÂ0¦”¶Ö”) p”A‰‚q‘ç%—ÁQcLÙr7ÍIeÈ(r‡Œ£˜“ãS„RÔ ÙlÔe³j©9-ÄøC´Ó£ðöqÝaYÆO®S²_44vºòŸ®ô§Ÿ}^¸Ö ˜ý̳Ñt›ç0cŒFš$͈£Œ4ÎñtJ2Jö“R¡Ðô‡9 MW ŒœfüλßçG?þoyç�·¹wïõW?}Rëo­ÅèÒ �¥˜„ø‚ŠÖ¤Ÿb�()QB`¬ÆèGfTš‹ëhc {žœ²¶¶Žëº¤ñŸ„ОÒyô!jQ 1øOðvbâ�Š’8ËÞŸ|÷™ €gÃýÖʧ¿‹Åš ¢œv(²‚$Ó †)£qN‘k’¤ 7ÊÙ\«¢Éq;ëxŠfÍ£7LÉr��‚ÀWT+.­n‚’‚Z%$Ë Ö‚ãH<¯Üo,hk±j)…soo¬ÈíU¡ñ %úÒšñ$05øoR–BüGžÖC³^Í,ò¹s'`Ž9æømïŒüš„ÀY'`ª?ûð;9í%$iAµâ2ŠrúÔ8)·QsÉ2Ã(tXn:D‰Q£H¯k¿Ÿkqì�1ŒfNöeJ'àßMæ×ìIN/Âìóì\ž;sÌ1Ço%¾m `Š_E|^³ )WiUž¦FƘ(MÓ4 C'IÕŸ†ç'?/ÀŠ¢¬ë_Z^fii‰£Ã}º� ÂŘŒz½Îêê*++ËÜýòKz½BH––WÇ9ÇÇ'AÀÒÒ7nÜ R©Ði·é÷;dyN³¹D»Ó¥×ðþÏÎÞîÞ“•¿,•��B¡”À‘$ E!(LÙ9Pˆ’�5SLÇqÒAë‚~¯Í8ÎÈ °ÂEÚ�Ž1YN)F#�Á°ŽëX„(WÁuRŠÒµÈ5J"ÞäB W!|þ4*`Aä“TÀ¤ÑÏ3Ã6±‰Sg2t’¢ãa lžb³˜b˜¡3ƒuJH)I¡-¡¯ð=IQ”vÓqBÊ'aýØHŒ�øž¢¹àã9ÇíãúŠ Z*ÆQF^ŽZcmÑ…¡?Liu´¶$YA’jŠÜ§D%�Âh[) í[˜œ Ý›tÌ&'wø(µ¢™“?‹¹0ÇsÌÁ·t~!ðW•¦ÀGÀ÷x(´Ö0�Çõ$Ieæ¢L³OÃífr74u–——©V«DшN§…ëUp¼¥VWW8wn•jµÊpУßïá8;ۗɵ ŽšÍçÏo³³½ÍI«Åݯîr|tˆ‚°ÆOþü'´Zm¾üòžçâºÆ”#'틘rÕ/¥Å Aa½'Ê€�¢T?6V#•‹ëyTCE–Ætº}Œ¬"¤‹¢ jšƒdŒÖ!qâÐé¥hcÉò²Q’””FÔX„*­–j,à….2°`( ÊEää?“¹™D¿mùÞBéÁäCòn�ähˆãJ¬…¼0(%@ ¢¸ ^u |IžküÐ!ôãœ4×›ë!žï`$xk+¸ÍÚtÒ`ÓŒfè€#(\‡4Êñ]�”‚½Ã1£(§Ð–n?å¨5Æq$­NB»›LüûÄ:»®a œ8á²€ªµÄ`­1Ï„<Î ükÊöÂS<�pv.Ï�€9æ˜ã· ß:ð…ÀoS¨�_¯SÒÚ ­µGÖZ•eÙÕ¢(„1ƩժøAÙh81�I3M­V£^«‘¦Ãáˆ~@¥¥>‚…f“ ˆ¢ˆÓ“ý.nØ Vo’ååBðâÅ‹¼úÊkEAûä�ÓÃGt»=r IfIÓ”8Ž ¿\ýñÄñ\…´`µ!)$¹V¡Ê“5m4J”v$×Ï“„žÀèŒ\ƒa©z(R™"\€2Ç>Î�ÌÄîxžB HSM8…¡?Ì0üÐañ\•ª#ñòÝ+�‰SóJÃ. PÓ…ñ” ÁH3F½ˆdÓ𡧤¹FJ‰rÊ|½Ö„ ÞP˜Â’§AÅÁ­{ÈZ@5÷¨á*\W¡”,µ‚²£b ŽK‹è4F§ ‹;‹ z1íÃ>ç·ëø®äî£>ç7k4ê�F4ª,OÊ‹Â<9‹Ð“(iE¦é»âÕ¼à¡ÆîiCŸ2²°ü+à£l$4½_›Ò|ƒVÀ¼‰ÐsÌñ›Ž_7p¿ª,pêÄ”]kÞ™~ÞZ۳ֺƘÕÁ`Pðîû>B@žçe7½Á€,/ð}Ÿ0 кl™;–Úq\²Ð—–— ü€n·G»Ýb0èãW– G%}¡É… ØÚÞ¦urBëäȺ§v8¹¦0VØ,Ë|­µr5=àû.�ç€)Ðr…–[jXkX¤R]`­Áq®SÊ'™ž„ý‚%r\™!pÐZ‘dNTþÝ4½o¬Åq$qRLHs.®#ÑÆ"•DeÞ¯�§$fœ!\=³Îµ“Ë®0Ú`ò �N2â~iüuœy¥ã8ƒEX�#R€�7pJM+ñBU P•…�P.Ò›•žŠ@>µ£BJ¨„€Aèœj­BnA¶†¬oÕ‘ŽäÁÞ€­õK ǧ1õš‡ï)Zݘ©í5Æ–¹)ÊB›�‰à+¬e8!BÙŒê_QFZgæì,9b¶Frzáæ‚AsÌ1Ço~-à¢Óçç¥f£¯Qª¹MÓ#à°ßïKå¨z³Ù$MS²,§ÓéÐëvÑy†G•2¼yž3�éö‡DQB¥Zãܹsø¾ÏñÑÝnŸ~€—JŽ�O¨T«\¹|…�í<×c�ãã#¢$1Y–µcktî:Κ”²ZE¹– „eiq‘z­ÆñÑ>£âÌÁ}"!lŸô.¨Õê }tž²ÜpP"'M3F©�1GæH¡„ÆuË2Ç,×ôEn0¦Œ2h›gÓ«<Žr>ç·ë¼|}9áf¹Æ:Y÷pâœ2b@ÍÁäI¯�$D�˜Ý£ ŸÅ†Ç`˜Q©¸,.ŒFiZPˆ2  IaÞrU«!œHÄt8gy³¤Bž¾å>x(· ÒÁw\–«Õ�™«Xøì”µ• ã¸@IhÔ\”ôè�³I:B’¦šÜ„°ž+hHÅ02RRÉsD¡í��Ó™iR¦þ8|Îtž š;sÌ1Çoþ>€³7ÊÙÀó¢#JùÖ7f>›cŽ´ÖÕÑpTñ\¯2�œÁpÀh<¦Ûí•}é•)0Z#(Iry^ •C£Ñ`uu)ûû{$IFš¶7<ÅXC¥R.^Àõ\Z'Ç<~ô€“V#ùÝï¿FQì<|øÀ(©�ö\>ß$8.9 ™¯`BP´V”)@IA½¦üqdÎå%$ŠS`»ÆO&¤¬øÀ¼˜0=ðYá¹0ÇsüÆâï˘âlà¬8ÐÔèSн>û9­õPÑIÓ´’çq³±±Ž.r’4£È5ÆŒÖäYFžeX KKK\¸p�0 éwOöZ¬­­³¶±Ã8JØßß++––8iµxôx—»÷ñÏÿèŸó?ÿ/ÿ+‡‡ÂZùs«Üºu |~çJZâ$ÒE‘ÆI/i!TdŒ9T¤”˜².ÞUXS”Ç¥ ´©ðƒ)-Âdbfí�¥\ñg…ÁX‹' ÖÒ¬Ìû{®"RŠRÉ0p(´á«‡}–|VC¤’dQNIRÐm�©kÐIÁð¨ÏbèaùâA�õÕ �Ïîî€FÕee) ÛI|6./ ƒ**¨âø„£&«ýÙîºg þg;ðN·=ÕxÚÃ`r„C &ÂF• žÛg±áqn£Ái/!½¯yéâZî=îS¯zH™Óé¥eÅ…hcA”ê µŠd٦иX$�2c÷yºÒw)ûüeêEx/`v~Ï�€9æ˜ã7'à\€Ù%â7qþ¸N©o7�'�­µ½4M7»Ýž¡ÎŸß¡Z­=‘â-´&޲,ÃX�r++ËœßÙAA’ÄäyF¥R!É GGGÔku¶·¶ÊmqÌhØgey�áþ½/ć~ÌÉI‹—o½Ìææ&ãhL¥2ìGƒÞéi4Žîj+ŒãxMG)‹@ ‰£,žc‘¸h-ˆÓmÚ–¬xI†°Ón¶;Yåƒ�òÙÐòÜ`�%ÏK›³Ø ¨U]|¯tâ¤`¡a <ÅÊ¢�ç;HO²¸âWÝ’XóH£œþÉQXt¦é÷R§$*®.…c‰âœfÍk§šÚÖµ¥Ábë¸å!]Ÿg39Ï+úÏy/Ïl›>fe‰Õä•Ex.ZÓ\ p°l¯UÉo­Ð¨y Æ6ëÝA†Ö–,Ódyé­ˆµÖ}­õ¸ÛíúEQ„Ù$ǯ”“Ê€áhD’&XcQJ±´¸ÈÆÆ:EžE1…¶ä…¦ßˆû÷ð½ï¾Ãù�×%ŽF$ÑÈž[]¢Ó>áÿü³ÿÈ�Ï¿`}}S¼ûî»äEÁ8Y�eØïŒº§GRŸKé®!–…”Xi­A*…ëH|«¤¢ÐڤĹF ¡‘6G�=£Ú;mØg™xÆ’[ƒÖ¥�1Ʋ´�ª‡�‚B[:ý”Åf@%pX] q=‰p$‹+!VI mèǃaFÔK�…ÁXHR�IÊ:þ­õ'cÒ\sù|“Þ(g�[Ö.¬PYhRŠ=ϰ¿È¨Ÿrf¾;;ägÓyºÏóÊ¢�,£¾Rã½;ë5–Ž�Ǭ-‡Ü¾¶DoP:3yahw´ÉÐV”� ­@S’ëåŒc³”åÖÏl�Õ“tÀô@~L)Jõ—£(G¹GI¼ªÇ¨—p|<æîã 5—óç*tú)Ž4…. ãi'&ô 5©$‹;K,Ô«øµ©,<;Œ³Ã9;ÄgߟML?3ë80óz&ý®‚2’ÆÈ@Ö%qÁ—÷z,6|6תü‡?D^.ï4ÈrMœä(©ÈòRvYʧdÊj(dˆM¤4Ijïž9±ïP¦~rædgŸg[(Î�€9æ˜ã7ÿ5#ðüÀó¢ð×”!ÙéçR­õ©¢ÇqãøøØSJiš‘ç9išÐéjò¢Àõ|r ®ë¢”Cš&eU€tl·Û'NRjµ++Ë¢^¯Ó �F$I’uºÃ–ëeÏ oÞ¼ÅÆÆ½^‡<ϸxùЏùò«õ°Rs|ßoÞ¹óYµÛïûQ4F8R ‹-ÈŠ"FÈa’~^èÀXé+‘#ÉJÂOlìäÒÌšŠÒ’¬.õrÔ¤Û_¡-ã8§*\¢¤ ׆n?A)Á8*øâ~�Ó^ÂöVƒýƒ!‡#%ÈÁÑiLà)´�v/¥^u‘Ždœjš‹!Áb€ª{8� ²V93dÓ¡ší:ø¼(øg«f3@/ú<åw„¡@ðp<Ðeo8žbaÁDZk+!�§8·rÚ‰‰â×Qô‡):*�Û‹žH!TCå iTšr°¾GVöT†33ÛD¾Y,hÞDhŽ9æø�ÃßËø–ê€/Š|<.0‰#­u;ÏóÆñññr„~žg"Ër’$e8Qh‹V)ÈËò@Q6 \סÐBš,,,àyûŒÆc´µYQ˜]ÏW+a.]½z…ÕÕUú½>�ÓS<ÏßýÞÄíÛ¯lAÀ/ùKNOOÙ?8 M¤#løv8ìeqw¢DïFãñª,U+¡§D.„M13Æ^ŠÓ8Y¥BI®Ÿ¦”’ž,uþ­%Í4•ÀAƒN Ý~Š£J©ÞÏîqÁk£œ{úÃŒüƒm†ãœ»Cn_[ÂZËîшKÛ êŽ¤0ºˆ… ªé \gbÆfU›g}µ)¦Ãõ¼(À,IžuÎâ¬C0yïºàÖ‹�S !q¤Äó.œoõSFQÎÕ MòÜP ¾zÔgçx®"Ï IZÚíÂŒxúß_J%l-JŒB`¹c±ÙŒXÀ-ÊüÇ¿çi¡YÌ›Í1Ç¿±xQ“ù¿^düŸ×-ð§mÑ:=å`ÿ)%«««,.|¾°@–F£<�â8¾§�tÃйä*Su•ñ\YŠY[Jî?s!,Ìš‡©‘šnÓÖ"ôäK¹%\§@N¤†‡ãœv/a8ÎYjúÔ«.í~Jµêe‰]^hâ¤[væ«×<¤S6ÞÁ‚ã)”+)ú9øY·`'ÿù$0ÍÑ«™a;`æý,QpAà9Ÿƒgmætø™üW�P Uq±…†"Ç©¤©Ásb5mÕáâVßU|z·�R’à­·¿ÄÝ»w„µ†²È‰ã˜Ë‹K^¾x�ÖšËËKþ‡ÿþ¿ãäô‚,ðÕ¯þQszzÊÞî”Õâüôdþò[MYÍ“áäq’$oe:�ceH"IÝxª:X;ÔëºU—HÑ&âúÄ8ç1”Ô�§nhVRPV†çÇ+>~¾ä?üí×xü`ÌlÙðôÅ’«yů|é�“óœ?}ç˜ßúµûî‡Qȃý!gÇ+Ʊ iòsÖჾ¾pít^÷Qèǯ.1ؼœýK¼Iøë/�7¹ý׺*\W$j¡’ ¢U$Z²{ÂÌxb­¯AÀÝÃ!J ŠÂpqÜ•Xkp­lpp— ÒÁBˆxU°/„øeŒû¶÷¾t7Ãù]àïü.¹Î†6qÛ‰¸‘[¡-¶Øâ3�Ÿ póqŸHµÙ�„±À ü^o[k­½”RŽ‹¢¨ONOe’&úµ‡û^ÇaÃVh¹XR•‘(¥�Ǽþú#æ³ÞVœŸŸ¸ûŽáϾöuqçðP<~üg«å‚ºÊÝåÅÕYY×Ë<¯ÝÞþááþÁÁt2™òüÅ3¾÷Ýï¸ó³Óf•WÆ%»‡£·iòæpÇ©*e$Ep!(j%0ÖaLøÙ:�k[ý³™6u:›$Vd™âÙËîùÛóu>üdÎóã¿ú•CÎg%—³Š?ÿþ“aÄçߨÁ8ÏÉeAãû{)J ³’⪠Ӓ²2ˆEIKd¢ƒÞ@,Au†>]¼»TýKÚ%·ý¼üáÚ𶉵±­Ê�"'Èv‡ÈHÒ8Ëhñ¿v©\–|áÉ.Ui˜/kVEÃñYÉl^¡µ@H‰s>$mxŽ´ÃÌÉeîG‘O¤ «ÿ®µ7VüûÀE¨¼¼yunô=¶&B[l±Å/<~" À¨t÷·Mô[ßÞp]X9箬µççç£,ËF/_¾`¹Zá[¸Æ˜µ;`Qäx爢˜ñxÌáá!/ž¿`vuå�i˜�žæåó³f•çãñoþ†~ðàuÝ0ŸÍ|‘/Ýl6ÿär¾¼¬j;}ôú›Ó{÷î‚𜟞òìéÇ(%ìÝ{¢û¯=Ù¿—¦Ùç¾þµ¯Åõê©:¯°6¢®=«"ø!0Eƒ¡ÿ.Ü+¾ÿ}/Cò/DëvyÃÑAÆ›¯�9ØË˜/kþá?yŸÿàßÈ ‹ø_þÉûüòöùÂ;|ëûœ_–Œ+öwS–ËŠ?Yð•ÏïÁ0b±ª™_UŒ†1‘„²h( C”ÅDÂc«•¤Ý.lewyúU€þj½Ïí¯úo%ì£/°×ý­îw®Û`AÖ $Âk²q c�Tÿ|Á V|îKœ]–”[ݳÊC+ M‹eCYD‘ �ñkwE%“�T‹ÂM…à—…ä½ªöß•–e›Œœ€?Þß8ØMl“€-¶Øâ?±àG¨l&]p¼Cð �„‰€Ò9wfŒÙ›ÍfZJ9¯”Rè(ÆKY–, ªªFékÃ[  ©*êªDIEE{“q÷hÊËÓœH+~åK‡4�åÏ¿w�R‚á@“¥aV~oš�FŠl‘ŒbÞþâÑ ÂEŠl€ZÕ4•�,ÆI ’x)ð>xÐ!ôFÈës:7/ñfé¿ÛNõ¶ÝÔèÿñî÷ÚäAèðºP()A„~õ¤@GŠ»GClÞ°¿›rzQ0DìLb¤ÌW5ÎAƒƒÆIi&.¤b<�jY¸Ìy$±�uã?Äù‹ž‰P ü§Àÿ|‡WsºëÈ6 Øb‹->óø‰V^¡ Ÿž¸­ �?!ŒeMÚmjï½µÖž6M“æy>ˆãXz�pÎÑ45yžSäA0J2¼wí*ÚÓ45Æ4BG1Iœî&YÄkî³··‡³ŽËËKœ³;;ãã ÆY�ª Z8¬­$Iì‘‚°ò‡–h®œì|[¶·6ÈØvÓR†Ä`0Ðk`k/NVœ]íxóÑ”ï¼wIc*þú—ùö»—|ølÁç_Ÿ"„ iYªÉEIÒD‘ #ÞÜM™ç§éÞ�(ªe…H"Ð’`C¢Áweÿ~«»Ioó è?ö�ÙxܯÜâ½#$á£)„Tø¶d²{4Ä䊼²<¸7bKœqÜ=ðèÁ%Ãq,ó†¼0x䯓­öȤãLéeáöŒõÞ7ÆŒógmÇÔÿc‚VÀ7ùÁØ$Þ8øm°Å[|ÖðÓhôÑ_ ý0 @Nhü!½™kkí©”2.Ëò(Š"©”ÒÞ;V«œÙì ¼A ‡sŽ$‰H’ÔMCcQ:DE9ZGÜ¿�ÑhÈjµäåËçì‰?øƒÿZ½þÆ›òüüœÿóÿD‘&_-8=~†mjž œ?çôä˜Ï?`7~Î0)16ÌžG‘$ŠBïYȰHl¬CiI{¼ð¸´ëU¾÷œ¿^÷ �">÷xÊÝÃÿæ�3ŽöR~ã¯ñ�ïœñò´àW¿rÈë¯M˜/jþÕ×^PÖ–A¦)ʆŸÎyþrÅÞNÊî4a¾¨Ùßˈ<(-´ k)%:RˆD!½Gø@š“ÞÊI˜ ¸q ûŒÿ~ ï:8ýd¡»äý¶½Ÿ7?ýD¢/-Ü9:Ð)øï+Й¤d”sÞ »½¼G¨tÑ¡l �OóàOÞ9GÁßóñó%çWEm×äÁº¶àÁZÏbY“Æ*8Žc¦“ciª1ÖqqQ�í¦ÈXq1«pƒˆ‘p8-ñœ©qð-ÛU¿T\K÷ÿúýKºY‡OÇÉîã`z¿×½®nù½Ž ‘ILt´ƒŒ<®nˆ2”’(ïyòÆó«’ªv¼ýd—ÝiBY[†ͪÐXçñNàd»„üFÃTRTNzÇC@{‡1ø çXõvæW ‰éÖDh‹-¶ø…ÆO»·³Àn«ô[øðy®Í‚¬÷¾6Æœ{ïc`P…Ô`�a�!QJ!Tu�i*lSce„Š8NÐ*ÂÃ*_ùª¬ýÕÕlq9[œÞ»{çÞÞÎt¤•bµZúóóËj¹Z>[®VWIªÙÖŒ)Øä”j¿Õ… ³þNâ «ïai)+‹�-J*ªFam¨(JÿÎ%@�$’Ù"´.&£˜ª2ä¥åù±äø¼`™×DZ®çÛ—yC¤Ã{=;^áœG+ɪÆHû;)Ö8"-©kËP’Tc¼ÇXJ‘ ¤û¢Ö|SƒˆÚÀ…H)6Wçýýmí€Ûø ›ÂWÅÁÍ÷‰Ã_••f@…Ò–ÁÞ»ª0«š�wˆâ%Ï?™ñækFƒˆ÷ŸÎ¹w4DkÉñYÞþ h,™{{�&Rá‡EåŽ"0Âðܲ!¼5Úb‹-~áñSK~Œ±À~ðÇyÖ¤ÝFc.½÷BJy¯išH)%Á#BiúÿBP–Î6à U%‰b�Öº%àyœuXk=ž«HÇßüèÑøÎÝ;ck óÅÂ_]Íêå")¥L&ÃøÎþ¤J&™B† $,2!B˼1!A IKvÇ1Â}ë‚: o½Rr�ë×#�Ççw3î 8=+¨*K^4ìíhü•åëqN âG–z„ IDATX¶ö·kWóš(’!X,êÆ‘e'g9/NW RÍt“&ŠÆx¤d©FÆ*\„Æ�–`=nQ"Ç´Ç5È´"ÔÌ%Â÷Ñ�]i®uºËÚG¿…Ð'ýõ' úU„¾T„&Œêûð^Π”d¸;d6«¨®*Þ< ¶ðâãKÝ‘¦Šg'+Þx8a:Ž™-j„´hÝNb´‡a[½! MBÈqQ¹/HA*,ª•îpg"ôa=:x¶IÀ[lñ™ÄÏ¢?ÜXàm„À ‚Lðos¬snÕ4Í»yž?ÒZß“R¶A´Y‹¢ ,+ªºÁ �R’(Ò!°ÖÒ45Î99Žv÷÷Ó»÷îíîììA¡Å°Ó·Þþò¯×ÕRÆb™2Ÿj}ã›;$í‘I!À‡UeU[òÂàœg2Šˆ#…R�`±j(+KYÊ:l«”D+�–pyUQ–½�„¦q|ô|þfã‚|¯lOZïŒVµÁ£ˆ´Â9Ï*o8»(¸˜••á[ï^pïp€÷ðíw/ù¥/ð•·÷99˹¼,Y\–Œ&)¶±¼žóÚç #' &w,Ã}‹÷Yˆø¨]øo®ôû<€þä@÷¸o2Ô¯ô“�ÛZ}nA'ND`\"€„Áx@ì-z I‡šýý÷Ži˜Æòøþ˜�IÂ{Ï©*CmÖ@ÝØ ÕÜ‹ÁÞC „�¬ w¨[¦¢5þEc¹ìíÜ#‚xÕ?æ;ÝÇ6 Øb‹->sø©&¯à¼j,ð¶*€þ-Á,è!×­€ÒZ{,¥œ®V«ƒ(Š´sN„2¼¥ª*.//È‹c,Bö·Ö�§1 u] ©$ƒA6œî쇜��’$‰xòäIòÆ›_xðñ{_çäãoë­úÅ⛥×?m‰_©°*‚õªÛ¶¶¿‹Uð²·Öã~/$a¼¯n,óe„|(}Ch8q�|ã‘2œJß¶Î/KÊÊâœçé‹%I¬PRðÉË%{; wwSæËšª¶?_ð¹ÏïÑ4Ž÷Þ»d0N±; ÇÇ+œ I‡Œ"t"Ñ΄…¾ì.— õôõ¥ƒ›Á½Ÿôo·qú'ÖßòšTû£ïëƒso4Hˆ´…X3Çܹ7b8Œ™NSž<ž²;MXå �î�(+K^68ëYæ„ë A¦éšÂL„ä`•»5UÀ!„·nÖj@0ú/ &BçÝg”O£Ïé~¾‘[¡-¶Øâg†ŸzàG ܬˆÞãN�fíZ¶U ,𦩫ªI’HçÖ:–ËOŸ>cµ\�÷xk[¦½Â¹`\Wq‘¥;Ó]ö÷÷ˆ“ˆããcî?x�Ço¼ÁW¿ú7øGÿíÃ?þÎÿŠ�Q*[›út¬þn®_´Ò¿q$dE¢™/*.g%+I¢€Ö²uýs”µE Ö+PÝK"^ž®Ö[J±æ „„¡mA´'C)0Öµ8°\ÎuÉ0‹PB2›×8ëÙ™Ä<º7b4ˆ(kKUYNΠ拊½ýplÏNV<:[�sœ,jÐ+ð�îV­ìGÁ<ÈÛÀ¸A lËóëËÜ÷êöxsEßO 6Çè7�ÞGCÆíc©†dx&ÓŒácÇÅYÎtñ‡óM¾ñ­.®J¾üÖUe9¿,©ë°ú¯l“]˜ªèC+Áp Ò¼à5!H„qåù>Ð.¡ð?-ûØœتn±ÅŸ ü¬Z6 �ý/ÃÍ*@÷mo+«ÿøz‰‚µv&„8)Šâ^E‘RŠù|ÎÅÅ;;»TuEÓTéx"!-€ª®X.fìììrçÎ!ISÇÇ/°ÖòâÅ3>þ𮞽ǣÇGDZãÜu`Â#ePt>¬Ê­ë=ucCåAÀd£•DkÉÕ¼âj^ñâ4§h ë“á@J�”áq°³õa±Ûn,C§!̲žel�jgÜôRÐ qœgw'°áë¶EQÇ�ƒŒ4Q\\EÜ9à½çüÞˆÑ8f²“òùq‚­ Æ:ÒaŒ°!i‰½!ܪ‹kýàÝ7~ìkü÷=ú�}ó#оŸ ¸›ÏwrÁëÅ8P×¥‘Ó)rÖ� í$ >ŠÙ�&ígü˯½äÃç Þ#¥¤¬,ZKšÆQVæz†¯MÀ"-ÅhèY®Üü£$²6<5ÆwŽ�‚ ^ù_8Ïø4ú„ˆm°Å[üÜñ3I~D·À.øoN¼<áf+`îœ;vÎMò<דÉ$šÏ真_pppHQTÔµA ‹À£[� ŽP×JIvvv�J‘/\œ�r~yáMSóÞ÷þœ‡û+qçpg½Ó¢—h%…ÇãQ*ô�…â@‘–¡ò B†þÿÅUÉÕ¬ -yó”ÜüÊk¢!4<øÖ4`ÝþÆcmø]¯\Hêðk¦5¼¯ë0ZØGc'*L*<ž¢Ú}PR�&š{w†D±BiÉý½„ã—KŠ¢A·äɺ¶hë�¦e?b@µ+yÑ/Ý÷9›A¾¿ÝæGas»Û:HÝcŵ`� DEW†©…,&N"D$Hw2†ã„ÝÒðèþ˜¯ÿÅ÷ŽT•åùÉ ­%ya¨ÚªŒ÷àíõþ(! T¶,¬ ƒ®3� ª�U»Ùø»À?>Ü8˜Ml“€-¶Øâ犟u~8BàmÚ ðO «¬´}nÕší !tQ;MÓp~~Îññ1‹UEe<Ò•ባ`§ëœÛ�Ä1išÅ Î9в`1ŸñÉ'ϼ³%¿ô…#‘h‡’×|³›á(¬Î•”Hé‰õzňµž¼´¼8É©Mø®úbÅùUuƒ/Ð!¬æÛ¬G¤φʀ£›Ö VÈm ¾¿X×­u¥'ÒrÍ+8½(¨MÐ 89/xúrIUYŠÒp|^pïhÀ£û#v' ËÜ dÁÁH“¯jæ‹{•㬧,-YY�‘P[;�DÚ»Œ |*¿ƒ›+øþ‘w¯wSvý¤a3èo�$Ýx`H �c8Ô4 ‡Œ&¢2 RÍ?·‹Ö’$–¼<ÍÉRÍî4a¶¨™-j” Ê�ÖÙë#ð $ŒR/ · h!Ä jÜ_88ëíTF˜Øšm±ÅŸiüÌ€�*@¿þÛþÝs¯’ ¾"´¾Úmã½/¬µ/¤”qUUï½X­Vâùóçä«%MmQR�ÐH)©ªŠ2Ï©ª©4Q’Ç1ÞCÓªªÄšæ\+SO2s”Äh!;†Ö�ïg$¡ïï �¹+¿{G«(ƒTï*ohlPñ‹ôMÒ›)Á ctÖ:ªÚá¼_»vÅ©Z" o䏿"¸69hÏwÐ�Á¬ÈØÐëNc…óaZ¡1¡b`¬çø¬ M¸à‹Ó³,ⵃŒ"o˜/jfó T¥av¼`0J¤·ªÀ€ň¦ ç(êˆzžë®în£‚tÏÿ ܦ²Û{MˆR 2©I‚7WXî�ɆšUiØÛÍxÓx.çGûŸ{<%/ Ue9ØM)JCÝ8"Z*ÎùuÂ&b”)½Ìíáï&B6²ñimüÓÞlM„¶Øb‹Ï<^eÜþ³Âmôp·qkëÌëÛ7��z¯×ÖÚ3kí¹s./ŠÂEÁéé)«Õ*�ã|�‘õòe�iþâÛg<\íòDI–óY9-‰ØÊ²ºª?Ü%%�W�é¶%Чut{f¸vüs¯x|ãÃÍ`¿ùqép[…uÞ'p´ƒ·ß8Ô(C#˜ ø�ïÏŸ-øðÙ’·Ÿì²¿›òÞÇ3&ã¥$Ea¨¤E4®n oÓæ†d‰D ¯ŠÒ¤‰üµ¦ñï6ø§mÐ�7|‘P ø#¶&B[l±ÅÏ?7à-_`?,!°O ,|€Î«Ö ïý…µö¤išªªk¼‡å*çâò’ª,©ë†ºn0¦Â;ƒ”’¦®(Š"ôéeEU­¼nØ5Û–þ!�ö:ö¿h+ÎBˆ Ðs5¯xv¼b¾¨ƒM°çƘüdq°—r°›­¿už¦ ôYªfš4Q ÃAD+"-×ïß�µkdÍ pίYì�yPøû€¸Ei(JC^V¹a¹jÖŠ‚yÞPUg|¸ÕW[¤– <¦¬ñH„”Hr4/$^Év`ƒߜð\óú—~ócð©šÆÆ6Ž›•n»~ŽØ!$BID6DÄ)2Ž�ã •†óúú“]>ž2jÞ|4áÑý1R vSŽö3€RÑ�8ç©jÇÅeE™+ág9Z iÄÕ¢¢n,¿-g%öç§üžRìLž/qyƒ=¢w3IJB9Ïà �Â"Ê& ÄŠ ÜïÕw¼€~BмMÀßòsÿc³‰®ÍÞçxP¢ !=É8F'cÍÙDüÁï>æý®øèã9û»éú�N/ ίÊàæ4m饿gJ †%W¹½'¤ûÚùÆJ®-‹ÎDè“[v¼_ Ù&[l±ÅO Ÿ‰à'Ø ø¡¿úzûzm­½B|$¥¼Û4Í´i¢(RJŒi(‹‚år‰s­<‘«ÀE8«‰´ ߸Þë0×/DœRT+ÓnB^Xˆ²v­mp—,x”<¼;äÑý£¡¦1c=¶2kÕ¹�I‚u~MðËKÃå¼bU4d©fo'Áùë„`MÞ+‚|pGTt>¼·ÿT�¤ tÁËÆuÀªm+4ÆQ”–ñ0Béë6DU[ÒD·Š‡)Éhqç0#RA�p´›QÇ*o8¸7¦\”T…!ó�¤q…G:À«6þ*†½âÒßö|›í�WýÍn“ÎEÐ�Áþ€Ž$Xƒ’�Dˆ„h� A4NŽ"vSÞxc‡�_,ùàéœwG4Æñì8ˆ'Õµ£15][Èw ‚ÖÆ- w$p ¼á þ¢—$ÀBÐ ø6·s:l“€-¶ØâÇÆg&ØÀm˾¶0þà÷ÛŸ+ïý¥1æÊ9·ë½Åq¬” cwEQruuI’&H?b^úv¬L)»â®P¡?ß�ûÙv�‚`°û=¿,qöæî§±b’p¸—2‡²~’(âXaMH:«ÞU^cŒco'åp/%�EehŒãâªär^Q”)EX‰4(*CU;¬ §®C®”k.žm+íës+n”—�hØÇÙeI^’Hñþ' .®*¬ó\Î*f‹Šñ0æh?CJÁ|Y§Šû‡'+Ê m+[ ø¦D9çMÙrï®'7;­¸éÐ]êîò‹[~¾­JÐô¯BÿcÓÿø„3æ¥ÀK YÂt'#vžxšðú;T¥a4Œ˜/*ÒX1Ǭò†E^£”lG/m§®@[e’eá§Bˆé ªvþYo‡#à cƒïü%q[od›l±Å?4>S À�Ñ ØL¾Kh¼ÕnS{ïOœsÒ9÷ZžçÃ$Ib¥UUq||Ì£G�ÐYÊY½¤®�‰Ö}uÕÎùw·@°kGÿ$¼º�óä¼ÀZ^k wÓqÆ[oî°¿“†Õ«+ë¼GH�ðÁ±/ó@Ìó>L(,‹†²´èH²;M‚,oi(ËÐ:°Î3[Ômëœ×|×[ñ úD€g7ȇlg¤¥¤ªÃÌþÙEÉ2oXæ†g/—4íáûŸÔìí®0ÖóîW“�”"o(sCmƒQLk8_‘L2FGcDU#”F #„èùˆM@¿þª ß‡èÝ÷¹›Ç-¹æ Bàð8d¼‘‚Éá�A¢ˆìŽcÞ)É›�¦”•eUÎ. yƒ1­Î‚š εU—v7 Té<·™÷Ü:hç/œcÙî˜þ#‚­ðŸ¼âàú'hs¦r}r¶IÀ[lñƒð™Jà¯4Ðç˜ÞãA œÂ{ÔιØ9w7Ïóh0PW•8~ù’;wî+GS4MÚ’þhǼÚYɺ¯×±´©óEÍéEÉżB+±ÞNÁî4áÉã)ƒ4ôÑ]W†ï¤j[R”28UÈ�ei«ˆé(f4ˆ(JÃå¬DˆÐ·§%øEZâ¼»&üµ«pçC[ Yl×¥ŸŠ¿·qŽÖÇQVp1+ƒp~Þ{8ŒøèÙ‚Ý‹’ýIÂ'ÏCbpg7)hËÕEÎþÑ�½Ã!ÅEÎè !Û‹a^ u„ X»JÁµ6NôUïò÷«â›-€Û*¯ªt¯õ?þšNcJuìMçî ð‰ÆÎrv&1Í�!åªáñý1£aÄ·ß½¤1–Ú8®æ¾ðH©(+»æbà}(ú·ï:(%J·_5^ƒ0xëeï¿JHþxãRõ±5Úb‹-þÊøÌ%p# ¸­ÖûÃzäÀ?þN·�÷~e­}_J)ʲi­% вä;ßù.ãx1Eê ­ªøq=}~¥¸VÛ#ܯò†÷?™1_Öí~xG¥%;ƒˆ�qB©õêÚµ¬}­^·9kÝÚk@IAI´N¤š‹«cÜ~÷ûJIÒX!¤hy–ª±­š_MÓIÖ¶ãiBl†üëê}x׊Ô͵ç@ †ò’(’X·r‚�qLs4àhÀ“Ç;ÌW ‹UC6ˆP‘¤±Žº´dØé$aqžch¥Y!FÂõ$ï Kï~Ž'7ö¹¿ªï£ŸÒ{}³rð*~�g-A,�'›n$°_Àérºî¶YöïÇ@¿ñ|Ÿ/Ð~Sk Ÿ]; !!JÃd%^kœ1Ô•EORÆ{»; ãX±»›‘%šÃ½Œ½iÂŬ¢1ŽÑ í€&¼�±�ÌÙ}f: R átUsÔ~,jcü™uÌ{;þƒL„:ô3¦þÉÚ&[l±Å+ñ™M~B¶ÁøW•À£n;kí)`•Râ(’Á` ªª"’’q"¨GUæ} "Ñ… �u][ Ýç)*ËÙeEYÙõŸµ¼àp7eo£•DµyDGôøÖØG uèßË–oPÕ–ÚXŠÊàZëàé8FëЗ?)sêÆ!­À8Ocù/KJ…vEQXê&Œ¨å¥Á:»&¥]ŸLq£j¾u5 "FMë@iL”V ge0Ç©çW«¢áþÑ�Æ8¤Ìç5wL' Ïž.0Þ£I”($[Të?¡(Q\� S¢s„›�|“ó¶ù:Üž$ô¡ø´Áæ6IXù+3gÈ ƒaB2JyüpÄýµ$M‡{_xs‡ï8£, ;“„¼0ä¥iÝ!ݺŠÄÍ;²D )ý¸(œò ñH�¯œ[+B0´ >�­‰Ð[lñ#ã3›Àlô¿èúßô] _„êF(§Bà,›¦¹pÎEJ©Iš¦­2 ¤¬eeÑJ¢•Ãû¶ÔîÖ^s„+ãy+�³þ’§ òaTng’Á˜nN¿�õïúöÖ:šVÎ×ù°²ÎRM’(ÆÃ˜—§9um×%¬Ê£aÄ šW3É…ûU×aÿ—yƒs�¦šH·+\¸`Wž^ŸÄÞêTÚñ¾Ý—nÔз¤Ek=Ö9œ .…‹eÍÓ—K¢Hb�ç{\QËÑÁ€¯ýù)Ÿ/ “DñáWı LùÆ¡¤dy¥ìÖd£8˜f@²¹bïйvÕî¾B`5¿)Ü•¸åq— u¤À~!¼—VšÉ(Fi‰Ã c")ˆcÉçߨa±¨iŒã�GÒTQ–†ã3ÕJ< „°xÎ;¢�*é…á$€ˆŠ‚;"BIŨªý»Î±êÈcà?þ¬ ƒ·a›l±Å?>Ó À6¿´úU¸®ÜF <þøM®[…1æˆÊ²H)eÅÒØ°Â.+ˆ#H“ömú1¦­¤#³EÍå¬îéñ‡�Æ£ˆ;û{; Yªo&á7Á@Ë^„½Ö TYª‘âZ‹@J�µÁdÇZ�V’$V R½Ö0Öálèç+Ùò›�ðÍò þ:R8ïmœð„à%¤G·¯5ÆQÖOHl拺q ÄDkÂû`„dÀ«lƒ%Á0èïú©ιK!Ä»ÖÚ׋bªµ’£Ô‹,­° ­@˜£p�¨€“ó’—g%®ýªíVõ£a ‹u&Aª]ýºv„ kt<ï¡�S*ðâH¢” ¬,Mã0ֱ̌õ( {;)‘ òÄËUÍ2oxv¼BŠPžÎ‹ Üw´Ÿ±X)V…ÁÚ�XÔMà ¬÷»Çkèì��ï£Ç8u�¦  ÞC–(ŠÂðôÅ’_úÂû» §çƒL“¥ºUNôXãÙ™&­‹aŽÎ4±–Œ2MK” … ö¼ ¾ËnŠºUù«k› A‡.ÞÆèè;ŽÀ&1j¥²šH ´wŒq'+>~:çÁ½!{éZ®¹j,³E�R‚4Qä… Uý¬Œ2!—…k-^’¸jü»ÿ{ïù#[–e÷ý޹&\Ú—Ï–éîšöã(��ER¤$@¢‘™?Q4"A$` P"@?ÍLsººË¾z.]d˜ëŽÑ‡}î�›YYÝ3a¦«^l ^䋈Œë"cï³öÚkyÏr´ãGì�€Wwô.\²/ö±�}Ü_‹àN|U+`\ŒÇÇÅÀ5ðO€¿Û?c\ÇŸ‡òºiâr•åÇ3Unk�e™Áù(æA @Æ»Pàc$t‘뛎åªcZ S_iE‘³ŒÃEŽ1ò}¬•È̈qO‚þ•|ùk%ºý.Èã:µ´QØ4vØÞï k4Y¦…D˜I¿9„ˆ6ŠÜörÃÂ3È2Cæv.|JÉJ?&?ûtx w2 §8$TÞ+7j»À¶ê†}Z®Zž>sœ7_¼\+%ã€.0›et­ãÍ›-�kG6±¸.Ð6¶6¨Öª·Ñ˜Ü¢¬‘ªÈŒ Ÿ’ð]Òû}�¯zl¼î¾A¸ïõZÆ5€Æä9ºÌÐÖb­¥, '%U̦gÇòÂprX0Ÿf´]à⪦é Ì­Qi60ŽºL±V™ÅL™õ6œ È²H­ˆÆùöWÀ)ö&BûØÇ>þ\ñµ)~‰JàWµîãü!T}/ý¿‚sîCeÌòfµ~Ç�Í\×éãåªááéD’¸JëÁ˜lx}`³ul+OÛ&…BE…ÑšƒyÆÁBD{tj¼‡¤ü£•˜ç„~F?õöû¹Àá{8}M÷DA£“t€Më¹¼iXm¼�œ—d™f1Ï89.EÈFÁÕ�è\¯šD ÜlEnÈ3Mçd�B¼åÃ×» & ¤¡øè#³:Éq£8Z„ vÈYn¸Y·|úÅšù4ãfÝÒ´žYa¸¼nø—ÿò%�žÎ '¾xµÁe†£ª#lZòÆQ4ÓÃSZÈ,”:%^G/Ù»»´£“5>ý‘Ü% *n'}uç=âèwú÷ºOžØ ¬EMD# ›t,fYi9{<çïüõwèœçõe�µš“¤ùâ͆åªÅZ)ÜBì[Ajø|ô[2æ�¯ëp¤¿®Q³Ã&Ħwœ"äÖß>º³“wc_ìcû¸_›îmÀíÆíWµîò~Q <½O}¸D¡^_Vg¹)'‡™ !*ïEÉM'2]‘ºöܬZP‘<×I•/’çŠg�gi…ß'Pñ‹ÈŠoGfPCÂ…ŠO=ú„h%V5.�L ›8 ‘ia©kÇÆÃÕ¦AkÅtb) ËÉ¡/|‚«e#Î�>ÞΣ^ÿî|“Új�5Æ�ÒˆÉORºÓZH‚Më‡ö@HUk b�Âáä¨à7ø€if°(ž<[`J‹×Šé£¡ñtB^¿í°Ù­4!áív|7¿û£FÏõy®ƒÆã…÷i ŒkF¸�'wˆƒ*,è dÓcxü½Œ5¨6rôxNlEa©ÏjÝr³iyöhÆ´´l*‡ë¤ÕÑt»¢Ïù<ôþÆ ¦Ú¬¶am|Vj­Û.~B<�&íT ü×ìM„ö±�}üãkU܉ûZ¿Ì0¨¿ß"EÀß=ï nbôíò&Χ¹º˜Ïô©óÁ:d¶^)T8¼iËUƒR‘<“~¾óç?}8ã(™þÄ”EuZFLJ՞‚¤ß/·ô®†Õ?J® *AÅ’¸‹Ü Òx^f4mâ4­hä¹ðÄ{²‰e2³ ¦Ô¢Ÿ\èœ}!¯ø%OÄÔ€ˆF¥‚$M&hEÛyVaúl·ŽÕ¦ãô¨ÄMÔrq³œ¾uÈ$3X£xôtΦñÄL3=›Q_V´+ENt¡vÄ9`õPüìâ>qŸ±2nã•þø¸¾ªe0&Þ7u€ ¶,Å\“—Šî²¢ÅspRÒ­[¬Rüæ3þøÃK.¯kÞy<§È Ï_nS›Î}@ð*I6§ÍôiX+Ôbª³u޵c†Áµ‘ˆçì�€ ø/GÁß¿ç îà}‚ öEÀ>öñ6Å×®øÿÁ0¨o| ü”]+ .:_]­ºõÉÖζ•›»Äp—¹÷ˆ6šÖ–ëï:%½ÁÍÉ�Øöö+`€û‰ÒD€Ò ;” Æ8 ²ê&%tEžÉ4�s�ÖEº.P'¡ ˆÙ€*¬6o®*–7-§Çâ,Xמ²0. ¦•c³mYWbdã\¸µt4©8éy ý1ö÷!yè(œ…×ç[¶ÛŽ“£œŸ}¶äÕE…A±Úv\¯NŽ N� nÖ-Ei™/rlaÈ| j0™Â(01 èɼGG—�÷ÀÀDày�|ŒûÕ¼Áî£Ÿïæ·¾.Œw^w÷cÔo·¿O„DeÁ̰¹g1õLsøÉ«5«uÇô€WWê£kž<œcäÅë-‡‹­›­ŽI8çwà�<›hSU¡@©ï*Ec¬b`{gBà?CŠ€ÆWÇ}&B·Ð€}°�}¼ñµ+àÏÜ ¸Ë#ÿ7ð"?3 !ÄUÓøérÓUMëËÎk:™ è§ÚNp\ïüLJÃÁ<£, 6±óeQ×ãû»U¿«1­jÕ­C�×Ä(+í¨(P|?6˜Y5¨þe™Cš.²^9šdÌ&–“Ãk4G¢FX·ž˜æøû¢C!ï§•"F?ò:¸ÝèwôVÕÕ¿6­ l*uÓªã‹×!v�¯7t�H?±¢é<ïf|ñé MˆÌ�K6ËšÕyE~6'óž¸í07[tÈ1y:Ó*€ÍAõ—µÏe÷Ýî¢Þýý8éï®ÀýísF� F${­Áhô$ÇØ)‹Ã£+fóœÓÓ ï>™óÎÓ9«�ð!¾õlAY^¼Ùb­BM£Ãh,sw zõæÙÄèM¦1ò¤Ìuè\|îB|3rø[7à÷îÌøç½‰Ð>ö±�¯gp'~Y+ ¿¿ÛpÀ b¹ú�žS1Òø@µ¼î|Û…®sÁF , ³6éì{nÖÞíõf–Ó£œÌêÁyoÈ£ ÒWi…×�ßõV½ãïÚ^g?FAˆ «üAiE¦zšQ&³Ÿm ›è¸¼i1Za3Ãt’‘YÃl"Š� mŠÕº¥nüÐŽÈ4�îþd;Î'bÚÀYHcký {[§×÷„Ǻñ™!xsYQ†²°b•"óiÆjÝâ]àéñ„WÏW¬Ï÷¿wBµj¹^ÖÝlA+bë‰ë«"ÚbÒ£XƒŠ£Ü¥ÆI¿�»&A㸻êçž×Æ;¯í£G ЦmC4Šh2Ì|ÁéãŠÃ‰Æf†ã£’o½{ÀÓG3>¹!³š³Ó y.j�ea !Ò4}¹—L£BÆû"2ªÙD­9j;Ž‹#$'Á†Cò™�OÜ®‚öEÀ>öñÅ×¶ø3´àöTÀ]àß?FVÄ ‚k\ UëÛºñÕ…A·„¸\·ÃJ:Gg§ŒUÃK+Õãù€ŒJ«`œlâÐ*�·Oã†È8¼|k”2_/ÚジøA"Ø ÛÜ{A D¥°æâªæä¨à`žs8Ï™”F„{´ârÙ"ø’Ù�$Q�ø¿„D÷=Y Æ : &)Ý…ˆ±«MKÝ8±Ðu:q(tï#³iÎl*¢Eßzç¯$�•”¥Å”=µØÓ ¡ Dk!/ˆuQ¡zûÞå¿}>w—¾—¿æ¾@ÿ{_•ïÆ‚Dãºr‡è|g]<{0%.4&Ë1EFQZfÓŒï瘿ó×;ÚN¤šŸ>šQ–¶õ©'ê�Fö³÷�K5OŠÄ¼‡¢ #:âÅH:X!&Bî7ºïD1zl_ìcoA|m ¸·0þ¿»´ûE£�ÿøO¹…ÄÚ9.Î/ÛØ¾ç�I0»ShMØVî–PYæS+I?-ý‡�‰ý·®ú’¿}÷h@Œ»Ád À÷.|é ¬VD«!!”(*¤X)sÍlbÙV–"7˜DÖÛVŽ® æLKËlbñA$…u2"êœq”xú©€!ùÓE9°ç/X«é:OÓ*.®kòLZ"Ÿ|±ÂùÀS=çòº¦ë`çk´•sA×$ûÞ>é� {ýÇ`Ìî<úš6£Ç{[âq�p·X¸«F(¯×™üÏm&ϱYÆÉ6 UDeŠîÃk¦¥å»ïòÑg7ܬ;ÎNK꺣i:ŠÂ✧n«­Çûí}„Ü*T ÛŠ‡*Ã*MÖ¹øÒ{.G;õqüGpKRø¾ò•Z{¡}ìã›_û~)àO«øGˆ[`?à€Øu¡þüõ¶ytVÚ¢ÓÆIjbŽ#› Afé­xÙ'ñO ãã>n¿7·ÉòÂ>á*nRßZñ¶ˆ�I<ƒE›ßEÛIQ‘eR”ˆr书u åtæÓŒÌjq PÕŽ�Š‹¤g?wZ鮇ÿ¡s”Ÿ� ¢t˜ÎÓͦãòº¡i=UåxsYC]{\ȴ·žèa<t Z)’bHJ‹F±¶ LÙ¾â“ò§‰¾F¼ïñû¸c^A?‚èQF£‚Çf(k˜6hÁln˜ËÓG3þÊ�p¸Èˆ!°]W¸Ö’–¦MR ,Ak�ØAšNì˜}Åäé„馎ÆD0˜„@Ý„0Œ >dg"tÉîo`{ÿ€}ìã-ŠoDð b¼üe­€iüæèñØ´¾¾¾n·Uå§EnŒ÷³iFˆ=üÎCÝ´Ò”¹Mê}"ù…·�Ü{ø¾‡ÖuÒQ)‰;'ˆF‹ŽÚÁ¿ð‰÷f�Jn¹jXõ·)ÙZ£SO_\è9Mã©kG];^¼Þ²\µ|??b6µdY1 Më Qä}Åx(й´Ý;ßùcæ¿÷q3j¢Ç¦IˆfÓR:+¦A�G)Ålbi;�®W-ea(r¡,ri£üð»'=Y`gO؉EYEv:%z06—¤¯5Ä.U$㮎Ý3ºÿª¼5F Æ`Ñ}IÿN7¼¯"9¥ Ya 3 3òƒ´¦‹–ù¼ y¦ùÏÿö»¼~sÄ?ù>g³ÌP>G+ÅU 4­æôȤ±Î"›mÇùUEÕxªd¥ÌJ�oëð®RªPÛvñçìZÇÀ�˜½¼çÀ`_ìcoM|c €?g+`ÜpÀ¿1~� lZ¯þä“›ì½'Óâp‘#Tµ,~3«8ZXŠB„­#1€O–º½ï;ˆ�¢'öm�Еè½WÔ 1Ù§ßÑ*m�ñÁõ-ï#Q !mX®d¨�â`‘ó®R<8v̦ZAçžs}ÓðÏÿí+~ë§|ïÛG|üùŠÇ«–ï)X^VèLÓx#®«‹“9å$£]mÉ�ü@A[ƒÎÄÂw0�ÃôýåæÎó~ô3ì¸ã¸[LÜýh�ù¥s±3ÖFP¢¶Cg;)ùµß>£]®‰�c»u¬oZº xçÙï¾s (–›ŽÕFÚ æMÙVŽËë)¯/·¼¹¬¹ ]P1ªÙD³­Â�B½�AwÄçÎÉ^s„°7ÚÇ>ÞòøÆð•EÀ˜½5ž |¹x ¼AàR¨¦íÔòÕy}6+uT׉�XË*¾·îMûAŒjH‚ƒ&@¥„0´ä†cÐJ¡ (­ËÝžù?¼>¤"`4N ‚Oï¡õA•ŽØ!‚´1TªB¬‘I4CÒï “¤‚åÌ ¯@ÙiH¯?ŽSB"ã�Š TÜômçÄÒX)ù¹n=En˜†?üé%LJg'ž¿Ú€V<<*¨6��\_×<~z€1Š×_¬ÐF“› Õå†h Ù<‡¶QYÆ®ïF9{¬ p÷ã·çýïËmã$?NþwÃH{Â¦ß ž¨-Ñy¨6Lò€*õ&pñ¦âÍeCYæ––"·t.p|"­¥Îœ É™Rt¦“ k{B)l«T¤¹Àlª'Û*dIdJG¢Kí€~ 7úŸ�Ÿß9¸»±/ö±�oh|£ øR·Ûýý8ñ�[øà,½.:k­ýÆ:oÖÂ@_ç–MÕÉJ�ÎCÒû¦_ÍËweŒH/†^¸$UÙ"ÐÃýb½»{ Ð(ÙVŒÍ â×û „QÁ h£™[ÚV2_®„<)-G'‡…$}'m�ùÔâ\àÍe…󗜥W/Ű#)�‰¼þ˜F²ý}òw*JQƒ$þ,“DÛu�›UK ŽK¦¥%˜–VL6 ¸¹iøèó“$jôÅg7>™stZЮZìÜÉyðEÀø˜Pý€ð9“lï-’`ýÇ¡Ïmã¾>ÜNúã�Õ˜^߆"ÊxŠÅ áúݧŸðɇ+šVsptÀO?Þ°Út¼ÿì€õÖq}Ó°\µœ-rþøgWx9:UÇ<‹¹æô¨Äº¼®¹\6\^7¨(ÒÁëm8E©=|9áÕŠž{^3.àv �´­šè*|S±¾jh/oè®<Šœ#o.*æ9Ea©’OÃÉQÁ¦êè…O�K6ÛŽªvÌ'¹a³ bkåš™ÈTWµ£ª=1¢æScוŸ�z¢ ë…sñ9;^@o"Tÿæ+z¸¬Ü.Æ�ï‹€}ìãkßÈàO!ô‹¸×ÀÀ;@ �Ö«X‡F�Ý… IDAT»Míãl¢/ÜbéÇT´.�!Œm­ÕÀØ�× $¯†¾T{ö^é¥é¸z% ¸ï·#è�lC튋Ѫ\| ¤XÌ2I"µ }6U'½i†í]Ó¶ËÂÐ4ŽMåhZAÚ(£†ÂTøñŒz¿³ìŠu”ç½SRÑt�UZå/Wí �Y�µŠüµæÝ's)LÚ(ò„tm æçõ¦ÁPB]£óI’ëw(m…d�—˭ƉqŒ‰w?BcžÜøù¾€0CE|GðÑ­͆f½åú‹ õ�÷�—èàÙ.k!ÀÅu3$óÃy1F� ŒV\ß4⬔¹!d†,3X+É?ÄÈzÛq­ZªF<æ3“o·!ká½H41²�‘Õ¨"‚U ²Øã¸ “ìM„ö±�oP|# ¸UÜ…,ï.á_Fþ™�Öˆ,puð´›*L¬Õ»¶½E¾ÂÊʯN*zS ZAë"Ö(r-½ý4€MÌÿú/|�Þ€~§Õ®\ïÓÆµ–Þ¿G çw ‚Ö¨ô>´.H^Á¶¬Ö�ìçIJ8(¨~RšV±ÚÔ|ü|Åá"'ÏŒHüÍt¢É3MU;6U—&dt°¯¹† žH‚}k¢ín,×b�ã}àåùG?ûtIÛþÖ_{JÛþù¼æïùÀã³}vƒSP/k|qƒÍ—œ=>ÀĈo:fUW05báKÇNرûè“úkŒ¥#ú«Ó“{gÀbaC»¹¤¾YѼq´u mxo¶\­ZÞy2£iÅpjSu”¥åƒ£’Wmç™ÏrªäYæ†ù,#Ä ™Õ¼:¯xy¾e½qD˜MÔ̼£ïâ¿kŸ�ào"#°¿ÇíÄ?ŽûĵöEÀ>öñ5�olp'ÆKº»Éÿn <€¿Iÿ�éBˆ—A3­?™Nv€BzûE&Dººñ䙦í4JË*½o-Ž‚J©ABW«�_€Ö=Ap··é-v+ꔜ´–6A¾E‚î‘…ÝÑö*~ÆÈó“BXéU-I¨K3窑âa:É8>(˜¹ªsÖÛNL„ôß“Ò@�­vœ‡ñYïÛ}^‰‚Šƒ[¢÷çÊhZ/Ì÷܈º¡�±È5*@Hþ õ¶c{ÓP”×x\+’ÉÑyªeMùÈ‘å�ƒØ•U}ô‡q.‹wïÛcò`ßãï €âš ífÃz¹ÁÒë–Íu‡1–2Ïp�´p¬Õ£bPP9Î0´ˆÎ¯j¦¥e>Ëøüåš²´ÎsŠ\S7Ž7W³œIi©›cóYFžP�,Ó|ò|ÍrÕâütɳG3=˜R7žžw2ŸŠzãg/ÖÉØÉryEÿ¡´LJ(’®ÂrÕRÕž¶“–ÿ´Ô™Ñ1«êð-e™Æ.nÐ0*TúÌçÀÿ’þî#ÞÇØûØÇ×,¾ÑÀ�øE(ÀÖìo½K` ñ˜¨Úmì´Ô&ùâí rëMÇͺÅhÙ\ˆ«3²ë÷Œ}çÂðm -‘éɨÛߥéýzí}•&ä5½PŒ1%{i‘Ä(…ÎÌNH(ì‹Ö(¬6(m1ZÓv¤W¿Ü4¼xµ¥, “Ò`�â`.äÁù$ãfÓ‘ÙíÀ!h;¹õã~}÷eÈ©€‰Aч¤i Nš ÖhÚVF•–âĹÀÙiɤ0¼x½åÅ£ JÁ¤°IA1�Z|ãéZ�Q`3M>ÉÐZ£<Ä&¢B�ŠÅy0>�ÔñGBïvôK½ýþñê�@#«þz UE¬ÚÊ£\ÆÉ‰ M8>žÐ4Ž‹ó-&3¸.²½nÒŸ¼³sBx,r�Ñ¢&ùƒLö¯n¿ùÃtÎã“Úd?-Ña�ÎÙVM©Tt¬mÇ{O改áÕyÅzëh] ÌDm¶M8É3õ›ÞñóŽøé;áïøŸØ›ícߨøÆJà>À D(å}Ä-· �¥ñ"FN½�FÆà"ÎJL\¶•“v@Êé•VD Eê£CJ7 2ïÕ󆔣zÝýÝk{D½ç h%bBr|òÚa}ª†¦¤¿ƒÚ‰BŒ×i!OèD’³$ä<o�"ßÝ´eÀ¶ ÄRÞ£×=0Q“Û”ÈÒ¤B?� RÖ�qT¤�Æ„tøQn—KBŒ¬7mèœçÕù–ii¹Y·<)~6‹YÆú¼Ã^T˜Ls~¾e¹l8|8&çe…y½¦+-qÝ0ɶd! ¨Ð ¼› PÁXÆ÷ö”Œ{ÿ1¶·Ðl¡Þà«5´í±…ä˜LfÐédF�Õø(…`‘KA†!±ÿÞ2+�«ˆ˜7y!ZΧ–-®²¦ÖŠ“£‚m%Ä̺v¢¥PÚÁWaRZ�M± ™1× «u_$(£”Ê·5±Ñã•qÄç>Ürü6âð?Â`3|_ì‹€}ìãkßøàN| p_›àwI�ñZ>WFMë6äó©VÎCHÊxM‚Ó{¦¶N½r¢¬Ä•‚hubä  wìs£ÖÕ÷’¿ «Ãåq! Bž%u9piûJ‹À‰dç}�$¨ÒvA)M°ŸVïU*^B€éÄ¢µN«RØlu-Š�>ÁímÒa‘너™Qð²Ò·&�Ì:&ŽÃÈìˆtždC*T’$–âòº¡*¥EñüÕ†® <:›ò³O–4­yþzÃùUÅéa�µš×—Ñy9ÅY ×'èè1JÃt&"I?Kƒ.ý<æ·%Ò`”^t/Q«Šxè:Ñ[0¥EkOìDryq˜c�æê¼bZZç¯/¶äF3?ÈX®Z¼˜B³­.D¦¹¢n¤�l;•,JÃÕ²aRZÎN'¬>X_¦$äú}þrÍïòàx‹7[º.0+­ð7Œ–ñQ#ÒëKYäç™¶ZE»®Â·´â(ÄØD)tÇ ýðß!ÒÁ×£Çï’iìM„ö±�_±x+ €¯@î+îŸ ê€O"›®‹o<"ª¢íâÄ&½ç#7IrwS9F™×VZàö¶õßÉëûBLnzZ éo×*‡$5ÜïvH£}�KV½aÇ°ï €ƒ$/}Ñ $ávÃII0­HóL`åm)+J Ù:nÖ-!„4:˜óèlÊdj™•m8X5¬7ŽmÝQ7î–DqDôÓ�:�í »'EBú…#:*l߉‰a@bŒT�Ck…Ñ"“\b`tv2AkÅ~í˜ÅA΋79�Ÿ.@)¼ÕžN˜Î :­!W¥Ñ:Cõ*EX$ù�ÿ »³ß‹5À l+⺦]W(0Q �ƒèÑ‹ÐÒ´4tµ§SžùËÙÔ½¬yt:áÍeÍ岿Ñé”Ó£kenÈ­A!†Lu°V1›(µ©ã,Ïô�;žø±l`0z€˜ýÀy:!=/àîßÔ^0hûøÅ[Q܉ñÓ¸Á{_À#³ÑÿÂhÑÜ8Ï+¥È«†r1U(ULÐB7“BS–6ÙâªA¨×ë�ºwø‹Ôp1$7÷-i CYH‚µ¹a6ˇ‹jKKÓtPuL"ª“y]™ˆÌX8¨ìMEt[tÜÐ^U´Ëº„Þè^{!Òu~jÊŒD“tßëO-““LsºÆÆhA€P䙦*&¥ÅùÝ2é8É3‘sîÒùɬæÉÃép>˰H„C¹Nš£E‘x‘Î ¿B©NÞCi¥tÌ6Ûð«ä”©ø…÷,‘"@G슀»&B}Œu†K˾ØÇ>~eã­)¾Â'à«€qAð1¢—þkJÝv!~ªÀ­VMÐÓR¾ÜE¹Î“ušåª�9:—²´V²s�²IÔqòéWóýʹïÍ÷é½G v¾#ùà´²î wýÁ†4Á&«nµs%ôq”±4YagF“熼0ƒ­X¾ÚðÉó'‡%“‰I$¼Èbšq|XðùË W7 J)Ú΋aãw}—~Šaôóîú쉢mß»sÒZ™Os>}±æÍeÅbžóÉómë9<(‰ˆùÑGןL˜Ì3®/+šÆsl57—&3<8ž × ÊEòyƒ\¥O퀈´6¸Õ„ÕŠ"L¹¹hÙl:NŽD7¡«]òV€®‹Ëg �k¦™Æw2Ç?)-‡%××YfX•¼|±†yøpÊ/Ö8'm�óËŠÍÖqr\&¯Çbž FJ“cË·ž-øü嚦õ|ÿ;G´­˜>½¹ØrzTòÞÓŸ<_Q7ŽÌj&…ápQˆ´ÖX[sµ[fQ‹©6ë*¾QñÖ_¿ŒУÿð"™"Ô>ě΅7!ªCkÕ$·j�àm»Àz눱wö“eÝbž“�j§8$é#úú~XÝ«[I²'ú©Ô&€Ñ¬} ­z8:B^Ï»3VZ;È�a]¶-Æ?FƒÑf8†ºöt�$�ù,ãø°$&‚Z–‰òÅuƒs"TS7ž¦õ¢Ö§„ì¶'Vσ6Án_åÈñ£þ˜”¬b2ÞØ»n·Ž¶õƒBÓz6[ÇrÕ¢´bSu¼~½eq�óë™áåË5ÆŽO¦,¯*:xr,xñÚñÇ^ñîÓ9�N¥-%“0më•Wâ°­Â$¢>@1q>~ÅD¨œÿøÇÀ‡£�ß]Nì‹€}ìãW>ÞÖàÏJ\ÿ ø`?¿ÁÅçJ)½­‚Õm�E…È�42Û¦¹|/«ö(§À¸k[ô­�]A°3;Šé}c„Õ¦[“TåšÆÓµ¢!p}Ó€–ãØT­=¤ÄWµŽà*x\åɄ֚*x¦¦{½&*K[)nV-yRÜs!bB$¦âÃh5H7Ç¢¼$Å—Qt.\¤˜è<]ãYL3Bl7‘ÙÔ¢”#Y#c€*Ív(vZ ý¶"¢8Ùs^žoYL3²©9©jÏÑ�¨8¶�ÇhÍ~…ã­*þœdÀøÀ€@ÅÈ�÷tNG èuŽ3mt„ÎEŒÓ›Wç[V›Œ]Él’Qd†²0l+G׿ù ýë\«w6»@D ½`5úú4#8½×èçÿ ªD�úûU¸µ’‚cŒt è\LÉW6b¬afD¼æú¦I“ Šuç¹Y·q°È NJŒV.rç9ë­cµiYm:ÖÛkT± ÉYVÆ:M=t.hÇÕè\À‡ž3ˆ!¦óÖá|`>ͨ¼}~Us|PpzTaqžñþ³1FÇ%Ͼ}ÄùuMç#Å“3fãÐó]ÕäÛkÜjMóüsôdBÓÀÕ¹#ÏE¸ç{ß>âòºæ‹—Þ}¶Àuž«eÃÉQ‰1ŠÍ¦¥(¤ooE*)x"¯¬´¢®;2£xôpFUuD"'§®¯d²âƒoruÕpµløî·�8¿ªyùfË{OçlkÇ닊³“ 1ÀëËŠ"3Ì&ßyç€Må¸\Ö|ðÞ!ÛÊq³i¨ÏÉQÁøWŸ²Z·lkÇdbYÌrNŽ„„:)[–7-Î×ÔA&/fͦG ~¬EçÐ�8îýgÀßC±ýËþìøò”@ÿø¾ØÇ>þã­*¾"îòîC<2ö¿#>ê Y„WÞÅ—  PVU(¦¥Î´NÉ<Š®s�õ¦åå›-ÎEÎN%iZ£!ÕÐ*ŸžÀP „ô5ª`°îoZI-ÓW7²r–dŒ‚À=2½qà D@…6âYà] óýŠÔíŒÅ,ÇC´Fsq]ãÒʵi=u›´rCž—„P£´§Èuòµ�¸x› �õ܆�«a/;¼MfDà¹^5âO Ÿ>_S7žƒ¹,›ª#Ï4ð',�Îf¼~µÁGxñó+Úʉ’¢ï0�Áæ³ç(ï±YÉ‹ÎkŽN&T›Žºö Ãb–“YÏÕuM^XÇÚÎcQ³œ®utÑWè'3¢H�yÒGð>Pb¿\m;&S‹÷‘å²%Ë4Y®9¿¬AÁƒÓ W7-ZÁ£SVk!ç?~0á⺦i<Ó2C%'ÀÕ¦cRž=šñê\�ûƒ¹¬ü×ÛŽë¥�(?˜Ræ;JÝŠÄsÓx•г­â¤…gBY%†ÈUlG;ÿ RüÓ;Sã"{LÜC9»/ö±�¿œxë €;&A}Ü"Ðóåä¯ÓýKäËîo¤ç”�\¨uÔ´ÇJ=-µî\P!Ho8ÄȦrt®¯û‰¡,,Öè4ΧÀʪ:Ò«äõ;v»§©wΈT§v­„A‚7ÁÑ$:"ÓR[ìZ :U!ìF 1#Úhò´ Ï3ƒšÉ8^f5J+¼O�²pñ¯j§“’Ii¸^¶ÄLõ¦rx/¤À¡ð�ŽQù2j (t j¤ç¯}`½½­¯/¶)y9>}±F¡xp<áÃ�—,f?úöW— ¸þü“[ŠE†«ªT„9ª/ÎQ6£<;áæ¦"â8{h©+‡ëM˜”–"7|þjÃÌ(Ê’UݵfšêÚÒd‚5ýù”9|B$·šÖÚ˜–RTumàð¸À¹È›7§§ò\óêõ–£Ã‚ãÃ’Wçen8;É¥0Ÿe\Ý4©]#ïg�æüò†2/99,¹¼nh;)š³ŒáùË Ç‡ói†IFN"¸$û½1Žªq8‡šM@Õœ*°*â:5š˜Ú=ìÿ7ÿ€ÿ“Û‰wÕ6÷EÀ>öñ+o]ðñUðÿ}„ÀƒX‡„À{Ï2†øGY¦>h:žjË2W&F1HRìL'P52__'x”ÈÚj%d1mdf¿‡ò½O".©féGûúè'F�Üz²/(bÒÂתç(dÞžÑ̽lO!«Xc…œæ\€LÆíz‘š"7Ì&–G¦„)’ÁÐfÛ¡´Vü۪ù@–õ\…5»^~ßßæNò&Øããm“\°´"d4ÑÍÃÓ g'%óŒ}pÌáAÁ³Ç3¶IKàý÷æäÖP¿~C]u(ªœ²®#_|xÅÃÓ møýßÉ·ŸprT°Þt¸Îc3ÃÓw¸Y5|ôó+ž=�c´âüåšù,£( MÐE/ÊS‹G 0k ³ÒR­[ˆððÑŒå²Æ¹Àûï.Xo:Ö«–¾uÈͪåÅ« ßûöËUß|tÍûÏh;ÏïÿñO͘”–Ÿ~´äу ‡‹œãÃç#¯/j¦“ŒmíùüÅŠ÷ž.(rÍÉq Q&&ÊÂp¸Èñ!�YÅAÒ,xþjËjÝÒ˜– ¥˜ßE3sŽ "<–þ÷nÀ/2êÿ¦ö&BûØÇ¯H¼íÀ]ÊÝ8ù÷\µ»(€þD&õiÁ7>âUˆ/Q˜ªá‰1äÆ(ãýN¦·m¥‡®€Óãc4›m—¤y¡K«ì"Wt1+É>nÑbO»:%ý¨"*ì’ºV#¤@ÉáÆÑûjÃ0ƒ�BÄr¢(†¤_0),!D¶µ8–…Mf3bå "qœ[yNkÅ㳩!)aæo+?ˆ� �q–cjØ'Kw.P7^dn#\^7ØÄ�¸\6Ìk.®kÚÖãº0¸ æ…ÁÅòóWÔMÃA–³^v¬nG§sñIèU%ŃҦõ,W2Ê·­UÛr\ £p¹¡Úvd™¡( mëéØ�„â À7œï(×Åöÿ òÄ̇�©R—¦ ¦K݈Óƒãr <>>›DË'åçºñR8YÑÇ™O,ï=] ¤ÍÇ%]'fKMëYÌ2Š\S憋«š¦õäYr, ^ÈŸ¥Ê´˜=ÄF¥œrŽx7 GÁ¯#í€Ìý&B{ÿ€}ìãW,ÞÊà2 üé‡[¤øûì„â½÷¼†èµR󪎇™‰:mF)­“Y훵0Ê'¥%Æ(ÉË!n6f½QúÁöË—(ÞúGÝZA²Â¢’áC”þ¾,H‡,;žèIy}§6 ,÷aç�ii™†uåĹ0\\×’ ´H{D83ë¼K0õõM˵m€HÝ|;ᘊ[ગ1?ˆ:¢’ƒb¯hX"zù«M7˜-}ò|EŒ2÷ú¼¢ío.*2«° ®–ÿäg¬/¯øñ_ù .VðâuÃ3%Ö»“Òpy]3Ÿf|÷[Güôãk–«–Þ?$"úùMÃ|š1?éÝ<ËøþwŽøùg7¬·‡‹<¢×7Í Ô¶žËk¨jIú™Õ87Ìd0) }¸­CŽ�1:¥ 6! Š� ZÿÑ Øûìc¿â¡ÞÖ¿³;ÀÀ¥»s3éfÓ-QÆÈÓíGÀß¿N)&Æp’[ý~fÕ³ƒ™Qƈw¬B Zÿ‡‹œƒEÎ|&’¶'‡“Šþ{a0JVaynv°½VØÔÌv´’™óô˜=ãnU?à±CŸŸÄ ˆÃ{“˜Ð®A/Ïûˆ ‘�Ôè6•ô4ŒIšý! xSu|þrä‚ÙyZU*dL°n=ËáëѰiü m›ò½oñüõ†ï¾Èû_|‡Ï¾XÑ4-ON2|\m?ÿ¢åé£ï?]ðüåšIiyöx.OND�Ž�KPðùóL9=žÐlÅ1Vcsær\\T<~º`RÚuËt–a3C[»46©•¿Ò51 m ÛmGôÒVY­[š.0?ÈÙ¬;6ë–ã‚ÍV¶qö`JÓ:>þü†wKûágŸ.“C`Ƈéç'g3~úñ5� .rêÆs³é¸¸¬yþjÍ‹7[Î/kÚä2Ø$T@Ð?ˆ2 Ÿ‘äGÑ´¡«šØúÀkâó¶‹Ÿ1òìŠåWˆ‰Ð)šûçÆ¯‰£ûQYzzK¿ ö±�¿€x+ø3¡÷µz$à��9¢�Þ—Ú{Þ8K¥(V[t0×¹V¨#1ÈBgS¹a#™Õ2�¤†‘À<Óè4%I&AiE?0¨TZÑ«~×zèŠþÉáN’¿êé‚òâ¾-ÐGR &áCÒÊ8¥‰H¢ê‹Š<“•bçY&+Ç<Óä™Ì¤Ï&bÛB¤,Åeocûc�ø äy­ÀHBvŒ„ŒPƒ´mLïÔº@U{|ZWON N,ç›uMµ©©n‡§‡èl†ÒÒŽ¸Y û>Äțˊ£ƒ£EÏÁ‡ˆÍ4“©¨¶�'Ë ]'|ˆEa‡ãõ�Ç…Í�ð.ZŸ¤�Õ­s‹ï"È2)C^†±šL1h-X+"HFC–é¡€+s‘˜6Z±˜çâ$¹X7k99.ÙVÂÙiA½x³¡s�éDÌ‚^]ÈØæÁ<ìže4TÌž¶uÇfëØl;|Œä™ÊŒ&[×ñ ”Í Þ©øÊ{®FG�Ø™�§Çîþ­í¥ƒ÷±�¿äxk €;q ÿbê Ïm”À¥ÿÿKD!í·Òÿ]ŒDïâ+"Ak~°Þø|611�ô©A'¾^Â5FI¦ÞGºLÃ$ÃhM0)Fñ p^’žÖJíÔ¨o¯v;Üçÿ�`­EQO§^ºO~ÅZ Ï ¦–ÂNZ8&2žÜÛLc¢´'Š,ļåªe[ô¹ IDATÕ\Ý4.r´­úƒyÎb–qzTPÕ>MA:'É1ÄÁUÅ0Žæ\KÝtò‡©Åt5ŒN…ƒ�ƒ´±Kâ>F‰(жvT�ç?þ÷Ϙ†ú¯^ðàÀàœçÃÏ7<}ªyÿ]Ãoÿà”�Ÿ¯øðš¿õ;ÏhZÏýìŠ|爳ã gÇ%Ë›[~ü£3>ýtɧŸÝðýö¬7-jÕ°Xäüð{Ç|ø³k6«–>8æúª¢Þ:Q+:ÀQQø‰>â[Ït*Zÿ«ë†éA�¶B*,rËÙƒ)Ÿ=¿aRZ¾÷í#þä£+´VüÎo=âgŸ.Ù´žßù­G|ôÙ /^oùàݼó,ojž=]°­<ÏŸ¯Ø´7ë–—ç[~ôk'<>›²\µüäÃ+^]lùÁwŽ™Ï²Atiµé¸¸®ysYñê¼¢n<Þûdf¥˜OÔ|S…R)•+Gæ}\§�^ßûïýþb­=æ ——}°�}ü¥Å[Ûèc„¨ÑM�î _nÜ×ø;ˆP�Atzrm˜Y£ždV=)2õp6Ö€è4J7)-Ö(æ9ßýÖ¡X¸¦Utf yßKÏô „'Îxãû»3ô$X^Ldww½üÛ#…©÷.ƒqL.Lm€]Ao7Xw.Ò´ŽªvL'RO^Ý4ѶžËeÃzëxr6¥už×çynD÷ª¦n=M®@¯ê7�ÙM˜tebì‘ÑM(’*žó‘ii8=*øÎ³ON Næ–�^TèÌòÛ?:ãåEMU{~ýû'X£©*Ƕv.rž>šqq]Sd†÷Ÿ-dZâVÌJC¦5W«†éÄr|PPµBFœ—–Ö¶•ãê¦áô¨¶ÕQN2ŠÂÒµNZ;™Þa0\ˆ ÁdB*t�è4�§©yiiÇjÕ2ŸeTµçù« OΦdVóò͖ÂÓÓ)³“)1+ð&£˜Úë5ןžó“Ÿ_q~U"ÄŸ<¿IçͲ©:¬QÃ4Çr%ºÏ_m¸¸’óu¹¬YmºA�"„èÖUèœçÒûø¼sñ¸ä6bÖ¿‹øiøÑí>½�};`ûø Œ=°‹»(@ß·úÕÍ}E‚~™‡~7ýb+#ïñ¥V˜NQ®«0™OÄÀ{Ò²Ö +÷‹«š"³i&«t‰A`]­% ›$׸|W¿ ýsØÁ€Ö;(}h ? �ªÝ²lˆT4ÄÁÇA�P'¸>Ƙ\EÊ¶È >Í»ûä= �NïÛZ=@Õ]—V‚lh%bC2*Tú#“ÇS] ƒP�q�Ì€U�¶iùÙ'¾›ñì7ÎhCƒk@\™E×à“ç+�N9˜ç\¯¶µ  J„—I4G7«†‰��M51DºV4z—úñ¥%K"JMã°iôBõŠF¤n@‚îAÎkðò±*sM½E´¦ÆÈAY˜aÞ¿È­´?\`6Ï(&9Ÿ/=ó ¿wˆš¨¼ ¨Œ®j¨‚ay&#Yf˜–6±ýÅéä¨àÅ›-m+ê€åÄ$÷EË"µ>úö‹s‘zÇû°ó©±ë­?UJå!âP‘;í€øˆtðßþt})öHÀ>öñÿ{oÚ#Yvæ÷ýÎrר2#÷Z{.Ý¢9$YIc�$¤±lÈlØ€ÁŸƒü~oÀ€_ –a½Ð@–,y$�%g¤’Ã¥Éîê®®%+÷ÈØîzî9~qî�ŒJV“=#R’‡ñ�ÊŒº{Üóœÿó_~éx%!p}q_¿h^M ì.=à7�}ÖP­Ø ´8´x- å0‰ÄK‹°Ö>.8Ð’;û=îõI#EšÞ>8”^¨ÕŽÝχ=ÑN­-öÝíáñ‹àõó­~7¿Ún9‡pþz˜¦E¸iœí¦íþ/»¥iÚ™û²Bi?ÂXd†^ÐK5˜Í+fóŠ(T\ÏJž¾X´�Ó�Î.}^’hò°l“»Çß5αâHàükà#Wœ„’íôMi²yÆÃû[üú_z›É¬âølÉ�§üůqï°Ç?üOØßIøÒçv9ÜK9½ÈøÁ£k~ãÏÝ!I4ßûñï ØßI�–™'?>|0âì"ãÉÓo¿é¡óº¶T�%ÛÈGOȲšÏ¿=ÆYÏH{!´Á 5sÂyþ‚‚P­š‹enˆÓ€(ÖL.3\ã-‰Ko¯<F˜DAšô·Ñ‘ò®†R L�YæLž^óч—üèà o>b­ãƒÇSîôHÍÙeÖúLxàõ´äòº`o'¡¬žŸ,V&AMcyülÁ³““YõRþ‚sÎ-sÛÔ óڸǵqß¶–š—wú ÞIóÛ¼ŒÜFÖÉ�tÑõïë¦ ØÔ¦~>µiøTEÀ«�Ÿ6 è.#|XÊv÷7B+)AÀC­Ä~Šay… è_­íïþnÊÑž·iöC¶†B@k¶†aûx=ü­•\iÁ»Pµ2 j¥u-³Þº›ý†ȊݽÊàÆ8È/¸íuæ&àÆ4kŒ¥¨šÖYΑ·óþ.mp2+¹žUìlÅ4Ö1�—þqâwò“‚ë¹÷®_fÞ‰®C9:ûâõû»A6XI•DZ0HG{ ÷{Œ†ÓÌòã'%ÿéŸ;dw;äûNH"µâ(,2CY>÷Ö6a ™/¼g@¿0ÞŠ™ÍK””<¼7 ªʺ!‰T¬ �TóŠXK_ó Œ†>õ¯¬¬± úi�Þ_ ŠX×r½BÆ4ÞaQxeà wŽºl¨*C°•� Ò~ŒQ!èÅ@ƒÉsfÇW(”p<}|Ír^✗6�EIÙò1Z<Ú1™–~*®gµ±«¥Nðâ<ãì"gº¨˜LK¦ó²Í‘ðÌÍEnëºaÚw\7îÓpT¼¼Èÿsà[ܨ>k°þï¦ ØÔ¦~µðŠ€O¬�ÖG·/3à·ðM@ÎQšÆ5BˆH€È+!¬ŽB©»Å™Ö%/Ë W×¥Oˆk�îºà*V(%½·?í,¿ñ:yHnB„@¬Ì p- ƒû×Ô«V-Ö›ßHÑ¥ú£:I£ªU ÜÜçl^yƼ“+¤<ÑqÐ÷:y‰ß¹—uãö”Á4>¡ D2íã^wÖJú_¬ƒ^?a0ˆI{!ã�KSðäÅ%Çg9Ã^Àû}ž/8>[òÕ÷öi¬ãêºà“çsŽöSŽöSž�,1�ã`'Å4޲ª™-|¾€V’ù¢b'lmÅœÏkÿç†Î›a¹¬ #âDsòb�.%:ÔTUƒV‚ }�\KºL[[e×zh A(©*Kc,IªRR Eo‹x»:"°ª�"5”yNv=gñb‚p§ËE…V’Ñ äÙÉ‚ØE>ê¹4(i¢‰¬ãä<#H¶GóeMY9”– û!McÉ Ãxä“ û=�’`š†ÅÒP?t¤2\n»ôH˜çLÃ%¼äð—�Þ:x½Ößá�uð¦6õï 6ÀZÝ"ÂOÎùo“~×ÿ*$à?ˆ»c… ÔJìZ<Ð’Ý^*{a V»ôÎÍ. $‡{)ãQİx·¶H!¥?!§‰nI�~�Dze,¥wãSR®]²ö ¤jãqE;‹^-΂–þrQ· _…X…­ly�_Pž`‹©-Î9âHSVÖw–…a:+9>[hÉÛG<}±`Yîö¸¸*8»,¹ ·é¼ E2:#j¥‚¼rQÈ_ÿËPJðìÅ‚¬h8Üëñ«ïíñ÷þácвáø[o’†ç' ?›ó…·Ç|þÍmþÙ·žÓïüÙ/°5ˆ˜LKþàûçüù_=do'áG]s¸—pw¿‡”‚ëEÅ"7¼õúeaøèãkÞ|}‹á $_zɜ֒Á äô"g:+yýÁЇ&å†0P |®tù`%!XI*MÓFš0TÔUƒè÷P»cT#uà?RE†Ë–4‹Ç'3¦ÓœýaȤeïÒpv‘s´Ÿb�ãÙÉ’ÃÝ!ï?špç ÇÞv̇O¦+‹ç~/àÅù’oÿ‚¯¼·O?Õ<~:§(=:s=¯8½È99Ï8½ÌY,½ÔPû>Ðe…seé–ÆºãªvØxŸ€u? üøx’àíÿë~v¯¸$`S›úy”úú׿þïû1üSßøÆ7n�¸õû«®»ýÿÝ¥.ñ™]a�Õ”"jj-””7�‡u7pwgéê^ G‘òisݵ[u×ÂÉRùEÚ9±Z¸;s%e»‹÷±“Øu �u«àŽŸÐ�j»ôA¯Á¿�º³o7‚�mƒ±!oQÛÁßJz®ƒ@ÐKFÃ�²òA¾YðaBUÕP7~ŒP×þ¶|¨QÛ‰É6× }; {ÌsB°¿›0[Ôå-tE‹b|ðÉœ$ò1ƳE½�ôS/»<½ÈI"½²`°2Óé ô(Ô+)£ô ô‡¡Oú3–8Ò>M±›HA*ï’ˆ ŠêºÁ¶�üj[ëº÷´í4Ó5èC2@ Fý>B*lUÑL§˜ùœbº`v5§.j¤kÍšÚ”Dÿ¼/�TþýVÊû6”UãI™@V4+Ëè¢ôÆEM;æ µôMI+ãôÉ�²E|ºñŒ·‚à„!e¡DRá tî%tm Üqƒ¨Ýþ^½Š(øÒõßøÆ7Äæ¶©MýÉJþû~ÿ!Õ­ÝÄ«vŸÔÙ×k<~›µŽs,kã^4�;kÓeîëǽ«“n'ú˜œ_Lf•ŸÛ6Öï®�×Ïw?UÕ¬~—Ýân;6}'¼I¨kŸëÚ\½“ÊÕÂÚù t��ìV¦ÎzgmñWR´ñ¿Š0”~G«ý\ÛóX²ÂËÀ“X3Åí§ìŽc´–¤i@/Ñ+~¨åjñ×J"ºö ÿ8¤¼!:ç˜ç–ñ(æ�{}>z:ãùYư±;ŽÀû�&¼ñ Ï;¯ùÖwÎyôtH^»7¤6–÷MØÛIØFŸ.ùøé”eVó¹×·˜/kžŸ,�<ãêºd:¯PJ2ÞŠ™ÏJêÚr÷Þ€ÆÂlQû÷E ŽëYI(övòÂ77R Œu˜æÕ°�_D…„0ÒĽÝKa0 ØÛG·p(l]Ó,ç4×gW—,'3f³’@ †i@Q5H [ÃÈ¿~�d/]-ðãQDU7,³š�íçàâ:o}ÄÊÛÁ9xxw@YûøcÙºvñÐ[ȃ݄£ýt¾¤Ûçìœ#‰…Nb1ÔJ|^)^“RìJIÌ ‘Vñ™C^FÕäÚ¿Ý»¿~aí_D[Ÿí[¾©Mmª«ÍàõSl‚×ÿ]?Q­«n�Bà=|lêj„ ©Òâ ÅÛBŠÞ ‘á*¦%�$‰wö{l "¢H2DžTiâXjï`Š$VÚ§útñ®RÊ5æü�¬Îá%†-p°‚ó͚ܯ=på Ûݬil;{÷cÚÆ:êÚ®¼-Ày†o±\TL®rŽŽh%Èçý~@ú‘�DÄ1r0‚(€ T8³ {6�²$é+NŸ/¨rãÿ²š¼4ıf¾¨˜Î+Æ#¿À/‹Ú7Xµåâ*g¼£¤àÙé’4öN�?|4aÐ 8Úïq|¶\"%±b¾¬ùñã)÷ûô{OŽç­�“ ªÎ.sž/xz²`:¯¨k‡Ö)qUíÈr—7Î�—5?°Ö]XË’—é 7®�ë¤À�uð¦6õ ¬ÍàõŠQÀÏ‚þoÿ|{·r�o»ë4xS8„MCj±Jêõ`|{`»°F‘Z�úÂPy�þÆ­ØÿR‰,ïÑ{A§å_Çë×M�ºG¸î!pÓþøG×ßqp7MÂ:¢ Z¢ ì ü[ó ¦ELë'¥ ª½dn4ðéu¦±tVCÖÁdZÒXGë¶)ñzxÙÂãZ:´ô$¶ýÝ” PTµc8[}è …-\\”•åáQ%-œÎ+¤”ì�#®gB’H­�ˆ«ë’4ÖôÒ`•w`ŒEkŸÞ×éæÁÑçeš´–ÍêÆ·$Nëð¨@ûtGiÏý5ªŸ"Ò‘öi¡8‹Í3ìrŽ]Îif9¶ª}r¡ñ‰�¡’mžƒX)1þóâSûׯ±Žºñ6ÀJ òÒxB©Ô­Ç@)-qxÀh’¬höC’¶a¨ÛDÆa/ô|üí••w¸l#¬…RB(EP7Dþ­UNµ´xx†Úºý½zÕwí•×mF›ÚÔg¯ÍàõÇÜÖ4^=ø]à}Öv5Mâ¨Ü£¦qçÖºrY4–ÕœÔ/šUÝpz‘sv™SË23,²Úÿœ{÷¦UT•¥lýë;ÿýºönÛùæ¯s^ZÄ;„_I±â ¬7~î ¬Æ ¬íøÅм…’@ûÛ°*ã#y›Æù¹·sD‘â`/åîa��­�^ê}틊¬ð®|�Ÿ/ÈrÃî8Y!!G ½ThH#A?Œ‡o½¾…Ò’§' –YÍ݃„_ûÊ>=�òáã)o¿6¢—jf‹’?™òÅ··øõ?{È?ú�c¾ÿÁ5‡»)o>RU–ßþÝcvwÀwtÉó“%J Þ{gL–¾û£+¶^ŽùèÉŒëY‰R’½qÂt’3Ÿ•<¸; * §' ´V$i€ $“«€;w\O &“‚þ(B’FkÄö¹=FöG)qM�+˜«Sê³sêÓ9¿˜/&9I¬é B–¹�”ªö?;Û NˆU#°,jŠªa8ˆ(+Ë"«öCŒ±ÌwúôÒ€ëYÉÖ0d<Šh¬Å:G/ xçµQ¨¨ê†;û=âH³Ìj”òÁV‡{ û; Û£�(Tj?W� R‡Z¾hñº–bOJ|SÜÁü¼uð›¼<&X ¬#p¯ÀO x›ÚÔ¦>¥6#€ŸR?ÅàöHàöÉêÓ<Bà?^_?V+¶%öƒ@¼h‘ô©ýýû;î¬�“È»¹ílÅî¥ôSM{Ó›.|'�;›ßå !‰ÉË;ýv–ï��/ûtóýÕ¸ tÇt'v-áÐĺFÂÁÊ ó)¨�%/¼‘Ž”‚gUmé§š.kKYy!­½9�s µàäÈ)”L¦¥�[Ž4g—9Eiˆ#íMŠÚ÷Ñ£A‚ëYé €Bp9)8¹È8>̼͘mpQx^ƒÂY ‹¼YšÆM�á‘iÜIc™ð2Ü_ã]ÀÆ:xS›ú…ÖÆà§ÔOñ€ŸÔ*–À?þpÔþnLÃ58+¤è�ÛÏ ;Lc¹bé>}®¸‘Ãy8:Zaö®½ukVt²=ن簚ÿ‹n®ÐÞ9-éÏ®K­Ûo޽ ‚Ö²·½�îì+»Ðûöv;c£N:(¨öX¯ÿ7ž°ïð€¢ôܱÆ`WJáJø¿k´Bi‰Eb�`¶ðivq¤˜/*žŸ.è§~7:›W¥!‰‡» ׳’ëYɃ;}¶Þ èÉñ‚ÃÝ„‡w<údæñÆ �–˜ÂòÃGîxs¡¢0äEÃõ¬Z1áO/2ÂP¡´ð»ðZ!B…$UÕà¬%ÖXLÕ°½ßG&ËZ¢úT’€­±E�-s¨ še�-jl«úPJ¶ï†}Œríûä­¤}¬WZhíÇÒú×жžQ«ÆðÅ­Ue oÑ,„@ª鬪†é¬d{û×sQ‘Æýž· ^æ5yaØÝöÿ }"Z§šÆ{9)a�Êþ"³¡s΀Pà„³Ì­—vÍõßÀ¿uë»s»Ö¿{níÿuØxljS?µ6#€ŸQÿ–ã€õ‘@7(€ÿ ¸âfgcš†eYÛG¦á¼6PT7‹iÓê„ðsÙ‹IÁñYÆó³ŒÓ«œ¼0Ôuã/¦ñJ�æ&ж¤ÀÚXêºU47š¬b  iI7ã�vqÑ>šV)IøxÚNf(Ú…¹[€ôš#¡³ž}ÞÝŸV‚8Òìl'ìï¦ìlÇ {�7ØYÖœ^æ<9^ðèÉŒ«i‰V¾‰QÒ(Z¤C#‚©=q®¨|PÍdVr´—"|ïGW\ÏJ½�÷~e‡Oùá‡þ¯’ï¾Á·xÁ÷ûüwãu~ç÷^ðûß=çW^ßæîa�é¼äïþƒØ†|ñí1¿÷�3>ødF %_úü.¦±üö7Ÿ1ê‡ô[Ûà,7ôÍxqq™ñüÅ‚{wXçøäÙœ0Ñ Gi¬È`ÄøáÂ^ ¶†r†¹º¢zqEu¾ãPI@Y[lãZu…çyÔµ#NCâ4 ˜•DR0F4 „Z±=ŒQ��_V^ž‡±Ž²¶TÆ#qâ}Â@±7Žé%MGû=¶†×Ó’{‡=Üé3™ù¤{G}Æ[1(놷ŽØßIX,ký€»=^»;àh/ew;fÔ׫f|ó7He…â�Öâm¥Ä}!éó2ë_¿Þ^:4MÝ:æ3�6ã€MmêÓk3ø õŠ“È§�ÖåK·•·;ËàN¥… ÐJìZiÅQË$ Zо…ÛE럅’;=ŽÚQÀ ®Èji¬ÙE~Žß>Z­ü®oÂ÷�_¬kWÞûRŠ—·Rm5Ö½ 7ã»63aoF �¼±k;&S¿+G€³>Æ÷zV’ÄÞäèìÒëñ‡ý€�ŸN©Êš~¢x~š3Ï Rë›(¼t0޼‰�lIm¦±Œ¯Ýr5-(ʆ0ðÎx=�ñàNŸ·_ÛârRòü4çÅyÎ×ÞÛ!Ž$�žL9Üë±»“ƚ󫜪¶|åÝ=Â@­Æ ƒ~ÈÑ~ÊÕuA %÷Žú”Uã š�ò¼%iK:Šì÷Ñ[CT˜ „†º¤œ-˜Ÿ\`‘8ŠÌ ´$ˆJ´É Î�ƒ„¸Æá´G~lÕ´M¢7�ªjK]5¨VNY´Œ~‡Wytвeñ×­Õo'Gì|þ�sþöªÆ[kïBiÇ"«)ˆ­aH^.'ÅÊ˧—9g9g—�¸d…wK”-bµ,첪]fŒûÄ4î™i8ã'áþïáæÎRxc¼©Mýœjƒ|†ú”“ǧ!ë¦W¡0þ!�·Çç¨Lã.kãž5–«¢°EåmV_šË›v»XÖÌæÓyÍ|Y“å†ef(Êf5w¯ë-€¹Yµ=áO¬žD7V舀7²À›§Ý…¿¤7ðþú+ÔYôvêÃ.ú¸C„hå �<Âàçâq¤è%ý4 —(âP(ÿ¹Á´�EYúEª#.‚eý�ª¶Lç>à&޼GÁGOg”µewœpç GY5|ôtÆÎvD¿ðü,ãùi†ià o�1Æúf$ÑÚK?~:#+jöÆ Ya˜Î«VÇïÏé¼" üóX.½¯~*„’¨4$Úí¡ÂˆÆXòÙœÅÅ„ìjŠÉ ²EÅbYÓßpÕUã;ËvÑôl¯üpmC&•ð©ˆtÄL· urÒÎNZI±2uê~Wm#(AÊ6hÊ«.l«( ÂÕ¨ s}ôáD5U}£,0�#/ ý4àp/åp·ÇÁŽOìÆ Ö9Ž^"{q(ÆZ‰{Z‰{J±Û’×wúïâå•£&?‰ˆ[?o�€Mmê3Ô¦øŒõŠQÀúÏŸÖ¼j°~9þ~wcñç÷Â4îº6î™±\æ…[ió[Ùý ¢?¿*øðɜɬb¶¬™-ª•$°ª¼ÓœÂÛÎÂÊ�®Û™ØÆ�ºëTKîrÝÜ¿•óY¿®jI*„Sûñkçþh¿ÓV]„µÞ1¯S5�¤ß ÙEìlÅl�"âH‘å —×%§“낼¨XÒÀQU†?Í)�5yé5…~æìÇEéG EÙ0_úPŸÚ8Þ4a‘Õ zî xq¶äÇ_ó—¾v‡ñVÌï}ç„o}û”~ªø;û¾÷Á”õ‡ç|íÝ}îö¸ž•üŸÿø#t ù _9äý�¯ù£]2_VÜ?àüƒßþ„8Rî¥<=ž³Ìüý�ú!Óë’�žLÜ2º7ÑrŸ¼àøÃ3fKƇ}e˳Œd+&LLe©ë! Š5ue)‹Æ›#Y‡©üs¡"F,³loÇÐ6VãaH/ÖY^ûù¾V˜Ú;&±¦ß ôÖџ²5 1�m]ájZÒKýÿøÉ”¼¬ÙÇëXf>aÐÞtMY6 z[£�ý�„Ã�”ñ0$ %MãQ¤±�I$vµoZ¼#c~r� ø¯±Æ¬Ü IDATñŸ¦øL†A?û›¾©MýòÔfðǬŸ¡ X߉¬�~šQP€—>ýµµã¥èJì+-îhÉv¿§­X‘óº]o*Žö{ôRM)v¶bú½€$Rl�™2Eìí$h%™.*–YÍ»oïÐK5YaÐJÐK4;Û1u囯ñ(‚D£{ûG}âQŒ 4OÔ³‚Àú´sÞõЊÖ7ÁX’P‘ ׆#ZâZ=ÓÊý„ðN�A¤‘ZP,kÀ�!Î!GÝ8ªÆR5þ¶…óc¡eæÇÃ~Hm|èO÷]\ıWiœ_匡7:YøÆ2T4�c¾¬˜/*ÆÛ1Ue9>[®B¬Œ±LgUË[Yrz‘suíU�ºD(k—g…+šÆ=«ž㎹iŒ;TíotÍOWÜnÊáå¦}3ØÔ¦Ø ìúØÿ,Ëàøø�µcë¦a^7ݳÆ2_,›Úïž]ÝÙüúØ|Q1m/׳’Ëë²ÝûqAmšÕI×¶è¸7Oæ¥gæ�Xu÷/«T›£X5¢eÿwn„BÈ›œ€ÕíßÜ£V^:·= ÙÙŠÚä9˜Í æ¹ÅXA+\+Eì§RBU[ªºñ1»¡jÓûÊÚx/û@±=Š(kë¡zë ¼÷ÀMXæ5î ¤Yô…·F¼v·Ç7ÿàŒç§a xëሲjxülÎþnBkN/2^œ/±Îñƃ!ËÌpqUøÇa…±>ao'ag/%°Žj^2¿\²8½&¿šcˆ¸5ß™]åh% #ʬ¦, N ?ª-y^ûTĶ�òMƒGx„sP[âPyNGãZî€hçùž?ÐKƒ•š@’ïB£šÖw¢û]·‘Óa é§AûyÜ?¬<¢H’&Þ• I4oÜ2ì‡Z’ÄšAß§ î�v¶#†ƒ€(l£¬Û�@ФŸÈm­ÄýPñP+Æí8`]f»ü·À.¯F>Ð>� °©_úÚ Âúc"ŸÕ#àkÀW¹9©B�D¡x­%Žû‰ÝB,ÛE8 $£¡÷è%š$VÄ¡fo'Y�ˆÓD£µÏ™EêÕîþåÙ¿xI~Ø4vÅÞ‡›û]ãü­~�6àzVñß?çÝwÆìlŘþé7_à€¿ó·ßæì"ããgs”<8êsg¿Çüà‚4Ñ|ù‹{ya¸š|é+‡¼ùù=âQÊâdF~±`o¿ÇåUÁ³çs>Ü¢1 Ϟ̸{Ô'I4‹¬¦(|3³·—²\ø�õÁ~áyV>s!ä ÒZ⣓-eÙ "E)²™Oá BMQFÔ’3êÆ‘eqàUYnümIAV˜UNA–ÕTíÂ7[ž\©[÷Áç'K‚@²= 9¹ð$É$ö�E^Î.óª´XÖœ_åœ^dœ_\·]ê]µ(lnŒ;mUÆ=Ç7Íë õ �œòéÖÁ$`S›úµñøÖÏðè®ë4Ê·›…Û×u¿ÿ>žìôn{�qŽÜ4œ‚ Ô"k’~ª¢îš6T&Ë ‚‚¢Ô-‰ÎÛèZ¢{AK˜ó½‰G,BȆõð3B¬ˆZ²˜\Ùüú€kí€o‚Ú;gÁUæ~Æk×N»Þ&ø†tèS =±ÐâIn¡öÞ�±Ôe ÎDÍ¢¤)²Â�ÆRJ™w¿ ´d<ŠpÎ1›W«T¿²ò ¾�xsœª¡j Ëš@KFý­$um9½È‰BÉÞÚn „ ÷{¼ñ Ï|Qó»ß>]ù|ôdÊóÓe›eSÇ~ïœ_yc‹­QDJÆý�ØÁò|Éåé’åeîÍÚ’FšË‹ ­û{©oX–5q¤’v:Í1�£×O#Ÿx1) ɰõøïfç; a Xd5Öz÷À0�ä¥aÞÚ ç­‰RkŠÒp=«CÅÞ8aw;æÃO¦Ì5ï½³ãw¶§K>~:ç‹omñåÏ�ù½ïœrz™³=ŒôCN/sþõ÷ÎØÝNØ„|øøšÉ´$ŽŸ{s‹¾–ÌŽç<ýÁgÏfÌ5çgÖ:ööRÎ/2¦×%‡=3œ¤ƒþ "†L® ¬ƒíqâe}ÆÆiœ”¥ñ‹½€²2¾Ák“ú¤S˜éQHÔ^§Þ´»rÕ ÚHÛ–kÐ*Ñqέˆ~ýoí�]·±r+$ÁYw³ýr-±°m‹¤º‘4 !pÎÒÔ†lYrq•ñþã9Óeƒu‚^P”¾ÁôBÒX‚‹IAQZv¶#¿Ã5Žã3/Ù;ÜóD¼²…þ·Q+U“+ââ2¯9ØM9ØM8¿,¨Ú]óÝÃYnøÎ/ùÒçw¸ا6–o}÷’Ó‹‚ÿâ¯Ü'/j=�1„ì¦Ü=H™Î½Òà omST–É´àùé’ûG}îìõxq¾ M÷{˜–»PËþ^ŠÖ’«Ëœþ $Ž5岯X‡Ð’ÑnBUf—9ãq‚Ò’"7Þ"Z{€©½oiÂú÷PŠ"«ijï²XZ=¬ðÜ‚ºöÒ>(ÂH1Ÿ•¤±f2+©�%�5Y^SV^�^n·áI˼öïqÓ`�aë`@º5@Æ)½á€$Tp}ÆG_ñÝ÷¯øÃï�q|ºd‘ËjEÌìÎFh,f‘ÛÂÔî¢6îqÕ¸ÇÖ®²5Ö­ƒ Ÿ³Ñ]¿±ÞÔ¦>CmF?‡úã€Û0äíZß•¬ïRþ1ð›xÂÎQ6 �œ¹;¹pa Ýt:~á=øY�šø…N)ÉåuAšh¬ ˆ IxM¾ÖŠÆZÊÊß«V „¼‘vùxV¹s~Aï8þAû…ßáÖr:kb×6¾Ùè^/ l†vž è@2©¼®©@8ªª!u~ç~°“PU–Ú4„�f؉†EVÓO|¤n)?XÔ {Áʧ¨š6¸F#ð.vËÌp=ó‰Ã~È"«¹¼.ô¢HóÖÓiIU5¼ùpİpy]ðãÇSîì§¼ûΘ?™òñÓÙ /JÃïüë‚ÝíÄ;÷)Á|QqÒ²æ­uœž/ÙßII•¦šUÌæ•RŠüBžÛš4ÑTµ¥4–<3€#JòÜxø~6çäcèàÙnÎß¹û­8‚Ì/ÚOUwRï�…°Ý±J)VÄ@!ÀY Mƒ’°Ì& ÃöVÌx;& %ËÜ …àõûCú©ÆÔ–É´bkqï°GQ&³’¼4í%Ä¡äÅÙÒÃÐiÀ ˜/*.¯ ÀÑX¿ë•Rr=«xr<'ŠãÖ¦÷Ç�§L¦õ×î‘~þÿG?¾âµ»)¿ö•}~û›Çñ®{îóe�R>j¸—¤‰&ið„€ý–[p>)ø—ÿæœ/qÌ—~e›Ef¸¸ÊÛ†Â7QeíøÚ{{Ü=Hq^œg8çxï�„ôŒø¢ô�9wzL¦%�–ì�¬ð¾ eéŸ(ÒL&q0Fç( C™× R@Þ…¡Grœu¼ì±‹Cÿ±k¬ÃÖ^ BIUxû_ZW¾¦ñFK]ã7™(%oÅ\^åëØÚй¾.ȲšPK$'%ftHkÌöVŸ4ÎÁ”T³Š'O§œ¼¸æêrÂïçŒïxM][ï°¬[9êšEô(ÿjF­3yáê¢rWƸ§µq;KÞ†­7Õÿ "t;“c3ØÔ¦nÕø9Ö¿¥[à§y\â½ÐW':ç(Œqg�q'Öq™®6�³·ï4Ë=œ>[TÌ–þß«iÉbé�Û¦óÊG» £¦ í±ÖŸœ�eEì[©n�ü—Xÿþùû…§#þu¶³ˆ4A´FDJ ´Ÿ\l) Ãó³œeaÑZQ× ÆX””ô{�×É/kx³�­k­ß™¦£aH/Ñ«YòÖ "P‚¢j8Ÿ”+W¾º¶ä¹¡ªÒDÓK4ª "š/j*côýý=?ñÄóñ(f§5¹¹ž•í%˜Æò�^rrž!¥àá�þÊ�pؒጱ|r<§ªFƒ�¢h˜-¼e³sžÄxv•(I/ ¨[™]ÓÎþ�±ä­£ V‚ªð^B d¨ü¨u‰ôÖÏî&“¡E9¬óñ¿J‰Vrég2¢%Ýé.y±D‘F…ê†ÿÑAóÖ¡Io”pçµ}Æwìíòƃ-<2>ìû†£.1Ë)'ÏN89¾DJI–7ä™á`7e¼¶$Ã.ŸÂÆZ ©xy{¾"“"tË8åžÖâa ÅC©Iý¯ïðø‹ü$1ð6ði~íç|ƒlêOm€Ÿs}F£ Û#�OSt Á1ðOY#99¨KãNêÚ}ä [æÎÕÍÍŽÊ:¿35Æ�=McÉòš‹IÎdV2�Wœœ/¹žyW¶²j(KïÎ×íøë6ÁOv㼩O7×÷N‚?¹Qt#ƒî5áÆ· • Þ$:ãs N' ^Sž„м0œ_åŒG1»ã˜¦é2ì-o>ÒK²Ü0[Ôl#Þz8b‘Î'9yi¸sÐ#Ž4¿û�KL;)£AÈ"÷zôê-ažÕ<9ž“DšÝqBHžÏ)Ššÿñ¿z“G ?üp£'3вa4 ½#`^Óïi®§%?|4á_üþ v¶cÞ}g‡|0áñ³9ªacùæž°5 ÙE<~6g2-‘÷{,'§Kî=§š³³å¼$ $»û)×׋Üpç­mŒ„ëY¹"ûY)X­R¨(2C¾¨±u³Ê^¨rÅzåÐ4Ž4 °¦óŠ»÷† ·b>zâIŽ»[ÏŸMIûo|~Ÿ­×ïrøî»<ü3ï1 #Ì�æŒêü3›ŽŒ�D‘æÝ·Ç|á�1o½¾Å÷ì�ÂPšPûÆFv‹¾èP¤W}¯ü¿I$‚$»¡_ÒJ oÔ-öÝÂþç¹Iü´&`™ë>¶›&`S¿Tµü‚êç`t[àýþÒÚßJ��8ÐZÜ ”8è¥)é³ Ž#Íhp´—2hGZIïÒ6ŒHbM¶&3Z¬ �ºxß$À' üß©Ü:ŸªmºÝ\7:XmNÛŽ@ G OŽç<;Yrzm u·“JRTÞ×Ðó�×CýMãØ¶PxaxqžÓK5£�·³�̼â݃žÿ›Y…³Ž~¢¹sÐãì*÷ä¿D{u@ª¹žy4Ä9xínŸía„”ž@YËö(¢ªfóЧ/–\Ï*ªºáh?%hwëñkG$±æ»?º¢—èÜv™3_Ô|õÝ=’Ä›îTµeÐ ¹{Ø#/<±ooƒ€Ê8²ÊÏÜ{-û> ý~Hžçí.ë(5I'k,J”8á‰|ÖZ’øÆðÆ ¬ñQÃÖ9<¢åƒøYÓóã)VjŽÞÇr [J‰ƒÈû ú‰\霼EoŒ*ú½€a/`k­ÈoGû)£A´’Ñ)åIxÝÂí¹šwϪ#Z ­sÖy¡À/[’&ï¼¶Åx+âŸÿÞ1»Û1_}w©„{\ä|ù »ô{�ŸÍ CÆmˆSVxFÿƒ»}²Üprºdo/¥×÷n‡—W9¸soÀtR°œ• û¡—ô9¨kK)zÈ|YƒµD�Biÿ昪�6`¨ÈkO$”­Ä6í#ãûèpD:PWµlßM�kdsÿ Œ4õñ5®n �¹¾˜a�ag;æÅñ‚Ç f³’GO¦¶Æ]Ü"6xyà?æ¦¡Þ ›Ú ¾þõ¯ÿû~ ªëßøÆÏÚ=tÍ€ã»�[Çtõ ضº+Z„ÝàåàÒ:’@‹µ¸Ù Ú»»Å‘¦±>¿½3�)Ê­ýNØ´žúp³+ˆÉOtz¿ÑÿF=àÖáÜN>زþ»Ë2«9>ÏÉk‡s7n�]’ŸV>^¸sŠëvýIäãk‹²!oÓë¢Ö#™œs¤±Ïp^œe zi¬1Æ�¬³í÷PJ°Ì|X’’Âç Tž(8o-ƒ‹²á“ã9WÓ’¦�»=¾ðÖ6_úÜ“iIVFÿwMãøäÙ¬5êóâ,#/½SßxË üñ”ƒ]ßp)é#zóÒxŸƒÚû‰& |°ÏdêyÛÛ1eeq�£ëÕûy}í9iì=ÿEѱ,Û�?Ê6FYà›6Û";Þ‡A$Áö!zxˆJvˆRã !„4í§Ðožý{íJ� � d¢z)RZ$–jiX´dÓ²ò÷Gš^ Û´À²òã%%�¿åK^¯þV@(%„’BK A·ø;‡Y;îïøxíºWÕífý¥úÆ7¾!6çËMýiªÍà\¯Ø5ü,bàmùÒí1€ÁǤþàëÊ€†ëÚðÜw^Õ®Ì küc`eù[ׯQTÞ_?+ ó¥7¤¹žyOK7+V:Î/àë’­èònvgnÍ'àÆâõcuÔ•!/ Ë „ðólë Ð>y.M”ô:öa?d8ˆ´7õ±8öÆ I¬1�c™×$‰æÎ^)Ëvñ>ØMÙÝN˜ÎkKCHÞ{{HJ®¦Þþv4½ÁϤàòºÄYÏ™pxRàù¤àì2ãrR ¤`o'æ`7áóomóÕ÷ö(Kã'S>x<å�û}¥ü›ï]0_Öl�"z‰æÅyÆ>œp°“�&šÇÏgœœ-1¦áÎAÊlQq~™¯Å¢ð�_´‹úÕ¤ + ý¡×êWeC]6^º©%ÆXâ$hǾT¡�ä- ¿ %0mÓ`švÕoa÷‡Ä£‚í;[GDý1*(@\‚ÊÚ%1Äoù…ÿû0€ DˆÙOQÃGD½h²EEc¬1jÉ•oÜòð΀ûwÜ=쓦Á*90äÊobÝXj�$x‹,(-D?‘c­Äƒ@‰»Z®’57Pÿ¯â‘³O³ ~Õ8€[?oÆ›úSU›À¿£zʼnãÓF¯² þ´ÁÞ#`Ü/¡Vb7 Ä}%ÙO"Ù‹B±ZœxCž–D¶¿“pç E A/؆ ú!I¬ÐZ’Dþ¤l­[9Æ ü"éIen¥%×J"E»ùç|3»íq(—— .§% ·Šîà^) Öz’Ò{Ü÷Sõ—•e{è­}˪áÑ“)ý4`w;&Њ³«œg/Ü=èÑKüNùÑ“)Ö9>ÿ昬0\¶ùôwzÜ=èñþ£kòÒÐO5î PRrz‘q1)¸œú|…/¼5æ­‡CÊÊúñÀ d8ùáG3þÑïó_þµ¼ópȲ0¼ÿh‚uŽ¿úîñã�§¼ÿÑ„7îyëÁ�ƒÝ”ÿç›Ïé%šßø�ï¡´Ï-89ÏxãÁ�Ý­˜çgýÔ ƒ6ç`¶¨xð`D W9i¢ c �$_Ô8cï%Ô¥![ø¦(RJªÊxs¡QD“œ±D‰Æ¹„BŒî “D4U‚\ÓöC#Û�Û:u¥ûè¶?; M ø÷Ë.ç”× f´’<«iK]5Ÿgœžgœžeüî·O9»ÊIcÍùU¶âBc[U ÞkÒÝ ðòÏB€1¶^ä®jwl>©÷ÂZ2^†úÿ_à_ñ21ð¶WÀzS¾>X»ï͉sSÿÿ¯ÍàßQ}ýë_¿=xUCpû÷ŸvŒÀŸ´žorcëì„wì­…ac] Zk±Z�»»iü¢®¤hCƒ|ÌkYßç¬|ÿ-+è_všmX…9ëVjënvþþݰºmc1¦á|’s5«ÉÊö1´šðÆz¡0¸iRò»Æ‘ö÷–¹!�u+ãóMGYZ¶†‘w¼S‚¢ôy‡{É ý˜ÌJ’H3èÌ5yiÉò†ñ–ÿ»EfPÒ/È×óŠ³ËœEfè§w{±�,s} %q¨Ñm:ßÑ^âI~óš³Ë’8ÖÜ?ì1�U8ü®¼GÂŤ í^¸ IDAT$A ÚÏRV ƒ4ÄZŸò8hS ›ÆÏÇmãÚq†×ù÷ÒÛ8ŒihÿÚ‘¢*½Ån)o Üøü)@iIƒD&#ôðÑ;„8Ah bäø5°ë=×SœÖ{Öõõ±ѺC9 B"CM4‰R�x^I xqîQ‹Q?`2+qÖ?�Ef¨ª†¨E„|Ì´¿ß΄êÓJJ¡´¡iÐÿ{ïñ$Y’ßù}ÜŸ~¡#ufUe—h1r‹Áì‚F€8€äÊÍÖŒÆ=òÊïü?xâiÍh\.I,HÄÀ°3˜Ì`TëêªêªÊʬ¡Å“î΃¿ˆŒÊÎêîi€D×0~fañ2Ä‹O÷Ÿÿ~_�ÀK™5+»‰­¤�¼ü•>ñ¿ö‰ûëys¿ ±nü/ z;àêîä*C`Ñ`ÍPÒÅó”a–æyQšçJÓO2£ÊÒèÅ‚¼ â`2+xz2嬗p1H¹¦œ^Ì-ý­Ðd…]�–´±íoùæ²Ä¿Do‹åû˜Cda EQ2žå gšqbH*éZ­ Ò±/°hW¸®¤^óq¤ ̓QF«é³Õ�P¥ažXË໇MšuŸÉ¬ IKZ Ÿ¯Üí€Læ9E©¹±Wc«ñᣃqF-ö¸s£Aš*~ñþ€vÓçæ^�zÍã¬7çÑÓ1Ï/æÌæV=po+&p%yn“…FÝC)ÍY/¡Ûôù×ÿô6R>z<â¼—°¿mÙôϘLK¾õõ-ê5�gϧüøísµ×àçöøàã‘ÚŽé 3>|4¤Q÷*‡Œñ$Çu%»Û1ƒ~B¿ŸÐj !Iyb± ~àrÑKH MÜ( dU ÇuZiúgs›ø>©ö(£ÄÆmD´�p4pŠÕžÊ°â“>Ÿ,P-ªè‹@ƒPàhp Hƒð}¼FL}§E´Ý$èÄ‘K{ø‘Ç8-ÐÀÁN�[{uvêlu-øÑsmÅÇ¿ÒX zI;×Ô"Ùr¥¸é:ºŽØ–’€Ûÿ)¶%ðyÛ—Ý«Å�u+`¿±nü=ÄçÔ|Rïüe­8þó궃õï©9®Ø %IK^;hXÏúDqt:¥yìo×˜Ì zƒ„ãÓ9{Û1Qà0šœ÷çh ßxÓ‚øžOÑÆ°½rc·ÎŸ~ï˜ÇϦx.ÜÜ«±Ýµ½{ǑđÃ�Ý�ïP”†ó~‚1Шù4ê–±ðW?9å×¾ºÉ­ýƒqÎh’!%|ûÛ<ï%üôÝs6»7vê4ø›wÎQÚðíonW¯»PŒÙۮѦÔb�Ý­Œa2+8í%¼vز‰Ï(#¬“_)“IN2ËÙÝ«[­„INû¸ž´š[]¼Æ&Jl"}ƒã/rÉE”հ󹬄/ûÕù⪲®ª®euÈ€)1FQÎS’ã>®0ä¥á?þà¡çðÖí6ýó3Îz �ïð§ß;âÃGCj‘ËtV0� XVp`q •êaW§±¢Ôå<5™Òœ—¥yZ*s¤ô‹¾ÀÞæÓÛŸ*¼n¬ãUŽuàï!¾€ZàÕÉéª\p<ÁŠž,'0e˜+mzeiŽ”a4It®ÕrO¾ÔÈKM’*Æ“‚‹ p–f%ƒIÆ<)(*µ¸RY´¶®ÐýÆX¡U™¹,Ž]ÎŽ‹‰Ù¢þM%O;K­»œïI¢À©¤n¥uœsaèøB ÊÒªÚ5jŸ µ¡(qèÐnXãdV …`³Òi£IF³æ±]©ÿ…BiÃáA�ínŒãNÎç8Žàî­žk¹ö¥²;fSU7âÐ¥ÛØÞˆ¨Å.ZÃ<±àHG ¢ÀµsZ Ÿ­nÈd–3§Ü=l°Ù ™'%÷OHÅ­½ãÊœÈs%�V€ë >|4´`¿ØC˜§%ã©Ýý—¥æô|F©ÌRF7MJ’´Ä�lK"MmµÂw%RXðŸ*5¾ïP9 I¼}€Û<@ĸ5Ç/±¾Sój­2RÃó…Ñ»r-x1?]ä¢ç…-ºp$2t‘q€ßŠØÛ­³¿W§³³±±·Sãî­&ÝV@=ö¬oEìU^ –!VöáWwþW÷ã¾'ÝZ$kŽ`ÓuÅ¡ë‰޳ÄÊ,Nú�;|ºyЧ­+ëx•c�ü=Å/)tÕ=ðe¾bNËÇ+Å8ÉÍJ™çÚ0Ÿ¥ÚTëÛò�”2\ 3ž�Íyö|Îtf…púÅM)CQòÂPªÅîÞ³Ê K µkÙ]¿°Î„ÕßÂDªÔÊ �# ¾'‰çJ²¬¤¬8øAµËÏ+¥8ß“ìoÅ�5šìmÅÜ;l2šÚû®#yóv›n+¬ „ ;ßþæ6ž+™LsËË¿Óæµ-~øósŽÏæìïÔ8ñ;ßÞg«2güüƒ î6ùÊ�?{¯Ç㣠BÀ›w:(exç~ŸÍŽu|ôtl½„àëol0g<}6¡½c¤ ßO™Or‹WØ«Ó?Ÿ3et7"Ê<%Éîöë8µ[YGðèWÃi±x >™‡^‡ƒ[-V­¦ªJ»0T„T;.<¯ãl6ð¶Ûܹ»ÁÍ×Z1a# Ù ØÝŠé´:­€Ãƒíf€ãš5Ÿ(t_\‰¯´àÅ–À"™Œ"YwÙø¬$`ëxåcÝø{Ž/(ì®\_møX-ô°òxé8t\G쾸ëHÕ#é,ÜþLµ™[¼a·P�m+àÖAƒí�h)¿»Ù ð+[Y°@?Û³u^�û½ü|àƒV%ÏŽÇ\ sF)D�ƒãXvAXùam¬ ¬ÖÆ×u-/|žX Ÿ•ãÕÖ�o�²»Ñjød¹â¬—2K Þx­ .)'çYþÆíg½9ýaÆ4)é¶C·%p­+ÁÊâwñb/îÄlÿ¿,ãYÁñ¥¬[ëxcMüÄ/¡øËÄV­¹8` e©ÌH �hc¤ïÙ‰KÊKŠ`QZ ßöF ‚J=NGa`mkmyÕ%/,õÌqì Èj\”hËB¡Š’,/éM¥–žý›W-¶îBªXZÝ�0pI+}þ(t­?‚Á0# \u���ˆÑ$§?²‹ûF;¤Ó yðdLQö·ktÛøàá°ª^„4jýAJo˜rc·nu\‰ëŠ*áp �Ù¼àçô¸{«ÉþvÌýÇ#òBã¹’;7šKÊ 1Õçˆ=j±• >9�Q”š8òøµ¯nòìùŒ½}Îí›MìmÇüÙ÷ž1O þ«z�û�†<~6!/5oÝípxÐàÿúË#Jme€w6cæIÉÛöyóN‡fÝãþã‘5sªyÜØ­1eœ]̹õZ­5½·Ñ ¹{›ƒ×�¨–"Ę‚ŒÀ©UYÚªîÍb�[ðü«ѵq5o]}ÎêzÉåµVË¡¬‹ /”x�_¶»!Û7Z8¡K»òäxÊó³›ÝGJŠÒú3KÛçUxâ§…k“JGkB鈚W.Œ¥ÌÂ¥ªæ³Ïñr«±ü¿\Ï¥ëxÕbÝø’Äg]�Y_&´h ,<b¬PÐÖÊã=Ï[®+ö|‡ƒÀ—aˆÅº½,©z®$Ž]¼Ê ÛØêFlu#ºÍ€Zìnµø âð’¶U*³L(Œ*ÉÒ’É4ãÁq‚Ò(çT°Æ`í<  ªÛv­°g]êÒ\YÖB'$I¬o@š)ÚM ;ï'Ì»Ãßߎ1Æðü"!/Qà°¿mÝÏz Iª–”Ãá$cž”…â­»´2üâþ€n˧ÕˆBǺúÍ nìԨ׬R¡UìÖØÆs@@YòžçîVÌhš/[ »[1·öê¼ýaŸÓ^F^ÀWï¶}Áã17÷êlw#Òªäm0ü£¯má:’þ0µ=ñ†Ïîf�iRàJÁþv�Rir¥‘¾KXˆÚ1as?jâÈÈ[ «á¡¸Üô–¼˜À‹ ÀêíërÑ«8�ÕâUõC› „ÄA9!$HÏgðñ9º(hlÕyç''ôÏfìl×øáß<çíw/Øè†�Lyï£>…² •ó´D•f…–z©DyuJ[½;O´)”)Œa¤•9ÎOÊÒœbÕ5 àÄRkW«jŸÅ X·ÖñJƺð%‰_B2ø:PàËÜà�°’nKA©L¿,ͳRÓËr�f…Y¨ù.�|J£œþ(c<ÍI’’Á(ãô"!ÉJ’L1g¥®ØU; «Y é�—ši¢–ŽtJƒëZ${^X�)ÅRVA^Ò µ1øžd³â{’R²LÑjøìnز¾Õš/ÙÛŽi7¬©P’–¾ÃÝ›M|¯2úѶ߿³3KJÒLUþ•Š¡²•‡VÃçÎÍó´äb�°³ayý¾'yðtÊó‹di˜dŒ¥öG)Zv6cÚMGÂpœQ‹<÷d™â¼—Цìm׈B—¿s�”‚ý�ÝVÀY/áÑјí�˜(ré3ŽÏæä…bk#b8É9ï§H)0•\so˜âx’N;"Ïœ¸A÷æ.A!Eúy5à²ê½:œ^ú[Šzåþ§1W_‚•Te&‰^áÂññB'tQR0Ï5in[7÷ê|ãÍ n4i5|´�¼²^}õ%¢V’³¼,è)Æ¢@GâKAÇuÄ=ÏáÀqhq‰¡ù'|6 ðSå‚×±ŽW%Ö À—(^²{¸:;¯.þŸ'c“€ùâ±Æ�•Ê óÂ<,4gifþ—çQM¤æ’*˜æŠÞ åèdJo˜qÖKxrñ³÷/øƒßºA³îóîGC¾ûã¢Ðåw¿½Ï/>èñÓ÷.Bðúa‹zäñ§ß{ŠëJöwj�Îè�R¤çrxû›Û‡Ý%=9"ë=¯°½x¼+CjQ<_”ïáÅ$àºâºX9®Vž¯®YX<l‚ÀA9ŽØó=q«²–À×±ÒÚ×%×e>/,þk,À:^¥Xc¾dñ’ÁŸà!_‰—ϱow±“ØMR)@H�(•ñ]W¸r)è³òYd`VXþy½fÁvE¬E—mYÉ »Î¥¯»Ñšþ(弟-|ǹÿÅ¡GXS›†ÀuK´�³ÇKe*‰`Çä$]dõšVõNÒnØ~¼V-/ ]+á[êåNÒó\iwÃY®|» *mÈsÍy?%\j‘U4Øï£Ù<ÁlžÓª[ŠZ³îÛ¥pá€X­eiÈ EV(âÈÃó,Îa4É1^»Ñ@+CVhN/æøx°?Jñ=«Jž�Ζ`C)Y^’•†Ý›]6ö·©mnâ×kè"%\ eŠëD¡Ául»¿Èí0‘ð¢¦ÿ {êk†Òg=fuhÊ•¿¿äõEi$¦(p}‰_‹ñ´¦Vs‰»1Y¢è÷æ9›1�ø¾cõ'ªÁiÏF` ½¸Ü°<„�.be#oÛK!D( ÄRAÓ¾lò¢fÀws]¿ãÅoo]XÇ+kà—8¾€FÀª*Ëu²Á>ððû+ÏñAäzâÀsžëˆ�z$_� –K¾¿Wíöë±G·°·iÅ[jÕ}KcÓxŽ­è3N.RzÜf# Ýôi5|‹3P†$-Ù솴ê~eà³èÓ¶*@UUp®ëT?P¯\þòB1™´š>íºÏdVÒ¦ ÇwnZ´þdVpVµv6"ÆÓœq¥ØmY ägÏg\ R&óœÛ7Z¤YÉOßëQä%ífÀ?üê&oØçý‡šõ€›»56;?üÅy¡ÙÝŠÙê„ à¢Ÿ–½ÎRS¡?Ê@«� %ÏÏg¼ýaŸßýö>í¦Ï» Ž35ŸßûÇû|ülÊÛ÷ûloDìX/ƒŸ¿A£îó{ÿäGHš[unÿúŽI‡%Ï?>"j:û1^!‰A!ý´)« E5„^`\·v}jÕ{e(ª•c«‰Á¢[µö±Æ8  ûw)ªÄèc Î>:磟�ðg߯{õ9:™2Kl²Y–†RK”vÐVЀ%�uñÙªk{¶Új򾁻,Hrc´6ý47?ÐÚô´¦²4äà�yц{x�ó p \Ç«îg?d_aŒ1+IÀuÊÕY^œ…á“3÷ûXáߨîÊ€PœKŒ#Þ4QµFìöM �Á–ÍóR㻥oe}O{ E©9p%ÃqŽïYP�q ZÙÅ ^ó1ÆXW¡©ÅžC¥`…]¢Ð³'T¡»ÛÀ–Ô¥´÷�±�|×u+P ¦¯mI^kŸÍBXÖ¢��fŠ­n„–Û?žæx®äotyrƒÜØ­UØ zìvBºí€¸æµšDõˆÉé©g”™Æ8 #]ÊÜ%B‚1O¸m×Z¸WÚd`±¡·µ0¸ºè¯öõW+W+ ×U˯¾‡@œ•÷s]„Êy†.E©0ƶm ¥’váG q0Ò±›÷t‚/ßO¬ž·ÐHc0²Sâ;.Y‘ ƒrAÝÀ »Øà+À�€3^¬¸-úW{æò0B±NÖñe�u àK¿¤dðuî�Wå‚KìÄö .w2e©Ì Wæ¤,ÌS¥™Ï¥P«…6@YiþKi­lµ6œõÎz)…²ê{g½¥¬¦~–+æ©Âs6;ž')JÍ<µ¾ðAà°Ù A’̪ÏÅ‘K³æ-­qe%ø¢•&Ͼcµîí.PãJÉF;¤(5'gsŒÑl´Co4˜Î úÔ(pØÞˆè´¬èO©4aàTÊ‚Šã³9�ï°·sxÐ`0JO2î¶xã¶m|ÿg§_{½ BðøxÆ» xí Á��ǧsNÎ-ZÿðFƒ(tIsE^(ÒL‘åŠ8²ùöB(]~ÿ7o0šæÜÿxD-öxóN‡ƒíþýg Gßx£Kš)<óîƒ÷Û|ëìÒÞŒpš5f¥àùû§œ~üœñtL¸ãx.I/!%dƒ„âbŽž¥˜4CÍæ˜"ŘܶL FqiÝxµ¼]E`µ5pu¼xþÕ„`\¼ÞU�KOtìy9EjÙ'Ea(KPÚ!W>…)MŒÈá¸Hé"é8H¹¸H p‘!eõwÇ ‘nŒ‘5ß„ƒmD¼XQû ^lüR€Àu¬ãËë À+Ÿ£pµ1+¸¬¼l’úÖïõîâE´f–cŽ‘D œ$5õ8bu3§”Ì•#ÍdZP‹]”ÖV£^B³îã:69OKM¨Å>;u5Ÿ¼PŒ&�çV€>�з^÷ƒ”zìR‹=ê5Ì%8ÏöìdnŒ! ìi•ZS Ot±Â¶Bk( M–)’¬DkÛÇv:c0ΘΠÆÓœÑÄöÙÓÌjâÇ`<‹øÏKeyùÊà»Qèâ8Ö@iC8ÖГËò®ëÚ…Õ÷$¾/q]Û˶ò¼.ݦŠØ*CI£æQ�½ÊÝÐæCͺ=fA‡¶°³á{6±0Ú°³±½Yq�Bãz÷n5‰#—é¼Àu{[÷› †)ƒ„ZäÒm…H>2¥¸ŽÅJH)Hó¥4¾oA��š7Ž30•’+Mìwwk¿N«Ò3P¥ÆPóº; âvÄlš1L™�­ê �Ï‘8…ÂàÖ!P pc­5ªPH„Ò¶žnX"W‡Òê0ƒëuÌ•û¼äzµbîbwû>—ÁÕiH¢”GšDL’:£´IR4Éu e*}+á"ÄÄWµú_–Œ¼x¹|Ž­ é5!¿!¤Ã'p5¿Îç7 ZWÖñJÅ:xEâ ]m\e @ŠõD_5FÑEižO”¡_&Ï ËËÇØ@iÛ“÷=»sM ŽNfô‡ÃQÆÑÉŒççs&³‚zÍGiÃÉùliê³½bŒa6/Èr�ëJšu¿Ú‘KŠBãH¨Ç.�vXºŸ¨ÜÏÚG�³4ÌQJE›OO¦qìGÖX( öªÅ}¡ï_”š»5ö·kON¦4j>‡ vk ƽAÊ›w:ܽÕ$ ~ö~�0pøg¿wH^j~þAŸý⌽í˜[û ÞùhÀçcæIÁk7tZÚ°´µ5@³áÃQ„¹« IDATÎÑóy¡øí_ß%Ëï|Øg£ò•Jø»?>áþƒ¯4ø�|ÀÍ›ÏÞÿ óé?Šè´BºíNHM ›L4|×R2ƒJ[Áh…g42/Y‰Ð aJEµt}V q½X÷V³zìjK`�›“ØÅ?Æ& €à¢Xå>e1>ortÒáã‹.©ÙÀñêø¾Õ‘�×.ö_,¤t£8ð¼`Óu½&—YÉ⃾D\ïði'b‘kFÀ:¾Ä±Öx…â�€«q<ûºã«¡�§Àmì¬ v)0Æ� )|­M$Òqìt¶œ�ÊJ9/ ËñÇs}ÇÚúV»ô¼Ô8® Û +C—á$'ðíbî:r¹œ¨ oà: °˜¥.Ò Q 9R\vª«�´ëÚݰR†é¬`RíÚ]ÇAk¨×¬Õo©tÕÒ° D)Ų_o ìlÚd¢(ƒQFºlu#²¼dž”ô†;›1¾+yïÁ€FÍ£Ó ¸{«ÉdZpÞOi5üåîþ¢Ÿ’ç ϱ†¢48Ò*ºŽ ^ó¨GQèðñÑßs¸¹W'ÏrÞüÆ¿ùoðoÿ×üûÿÏž˜ÍËJYÑÊÏçç E®¡Ð<}2&Ÿ4AÿbN’–ø�‹šå¨T¡,g¡´Eã£T­aA„—åü…Ž?Õq¸,ß³òx±:¾ £¬ôø©~¬e[ÁŘLHÿXpü±àèØáäB0œ Jí¢‘ÕgÕ(­ù;®¬ )¥PJùŽãÄØêXiŒYd-,ðjµí:¤ã'b=Ç®ãËk À+WðËÃÕõ¢Gy=çêÅ„`õ2ÂRžþ9v·ƒ1¤EiÎ… ®p“Ìl ¡=Ï•a1cei–2¾M¯ÁxH’L#[Ú÷›…®õªßop|:ãèùŒ7n·9Ø©qֳʄ“0çöÍ&ƒQÆÉùœ§'Sv·b5¿b7(&^Q%@โFͳím¨Å.BÀ³³9Ãîv þ!~=àø,ã¯pÄÓÇîݪñæ�Že*­I‘&³‚ÀwhÆ.*+ўĔš,-Às1RPd ”Áo‚Sj( ÄÕ—'Š~Wûö«xµrûjë`uXIXPô–õËÇc�é" Ë’Dpz,8?uèO I.qI»ã�+*ÇI;\çó9Zk´¾ŽóË…BAà§iÚ®NXE!´ÖçÕ x›Ë À*ચÒjodñúk,À:¾”±N^Á¸¸z{uW²ªñº×;þOà¿ÀV`ŠÂCú"œ§¦Y�ŒtñÂ¥™âùE‚ëj¡ƒ$ 7L˜ÌK6;¯Ýh°·]c0ÊÉsÍ“JܦÛi·Î{ § µÈ#Ž\GbŒÁ«¬o=W¸§RDXŸS%®k“ƒÐna3\––�à:’ÍvH¹ô)ãiNš)nîÆx®ä´—0ç´›·o¶xr2a2Í99Ÿ³Ýµ‚ÆÀxš“ç oÝîú.?™^pÿñˆ[ûuþÛý5þç?~È{hc8ܯ³Ùùó3œä¼þZ‹Vc‚ÌiìÄ8Žíùou­ÇÁ,)˜Ì Je¸w«Åv7 ªùüîòëüñÿþ>ÿÃÿ¿±ÿZÌë‡5”±ͲԌ&Šýíí­ õ†Ow#Æ‘¿ámÅó<�°Û`<Î)ó‚Z-ÂÉHsDÝ©6çÅÊ�X­r¯öñ»øU¼ÀêÐ’+� VG.—k§•¨0: ›Ö¹8<9š1KÒÜCKƒù4ðÐÆV�„KzhY–äy~©÷ÿw¾ï»Y–5|ßCáj­ÇÚ¾á.ÖUsP}¨EtÕ>ñjð‰d`ëø2źðŠÆKÚŸuÿ걫½Ë)¶ÜùÚÊqc Z”�ÂSššï „øäk/䀥„4W•ìîßjøxž$I-µKHA·à:–®5�øž¤Q÷ð\»È(e–¯ë:ré¿�ܪJ€=®ŒÕŒŸÎKæi¹tŒ*s¡ZäY6ƒÖèÊ”¨{K£"c ¡/q]‡$-ÑÆ¶ÚMßV9*jŸç9lu#&³‚¼Ð(¥©EÊþê§=+GÜôÙì„Ì’’gÏgtšÖY°Qó˜%%yn%ŠE%Фµa2ÍÈò’­NÀÁá&�­ýÇ|÷/?àþƒ º‹f‰5:ÊsKt]‡RiÞ¹ß'+¬YÎ�ß>g4ÉèÖÞ{ï‚á0e«é38�0�dø˜ä謨ZõR)�Õ&We ܪ�sÙ(¹\èkßbc,¹4£ôø$#ÀÁ˜t‹dÖ`Ø‹�C&3�$s0ÒG8>®ëáz>žçã8.žï!¾ïã8J) lTWe/¾x8Ž#²,€#„ðljŒ1™Öz!¥ÝãzìÍu—b=Ï®ãËë À+_@(hµQ{zJ÷±ÍÚß¹|’¬0Ï„À“RDÓDÇõX:b tº|�RÙÅ $y¡é 3¤¶ ï[5¿Ñ4ÇqÛvgîû罄yZRš(´Ø�¢T–¾'ž»èùW^´±o¾ÜÑ¥u“Mr”2¾M(-‹vÓÃ``ãI¥ Øô)•f6/éS¶7#šuÛ§Ÿ/­…­G@©4ý”N;àÖ~½ªÌøàш¯ÞëP”ð—?ºàôbN»éòÆkm’Lñü‘çŠìvƨ—àxådN2ÍH2E>ÏP¥F(MäexZ¢ƒp­Xº¹èý¯¯ëÄïIÀªåc¼èõ; UD‘5˜M<†}IV a-Ä)K<¥–IZQ”øADרÕêÄqLK$¿Öšù|¾ú?qÍ¿Áç )%Žã­µ#¥l !B¥ÔXk=ÓZß>äó±Öm€u¼±N^ñø‚j�Wãj%àm üZuLC–—æØ�ù¾|}žêfHëdXÚöæ¹!Kí¦Oy”“œéÜ:úždo+f³cuõÓ\ñøhÂáAƒ�NHZšÝÑó¯4hÔ}jÒe0ÊÈrE¸ÖL¨2r\Û0†¥�ëH&³‚yZZ^-äp¿ÁdVXÇÂy±Dã%ÖÍPhÕ-þñøtÆhâЬûÜÚ¯sô|ÆdšsÖ›ÓjøÜ½ÙDkÙÐjܹÑ`³ðã·/HsElP‹\Ƴ‚G^;hP�&“ŒÃ×¶98hS÷5ÿîO>æßþ‡Gx&Ãh§¢aJ£—@E J㹂VÃcg+bo«ÆÍÝRî°Ñ‰ØØˆøê]„ïPÛ­LrŒ«©ïo2>0O‰k 4Å|†g„ãXv€¼ª4}Õ wµär¹ø¯æ–‹ÄÀG—-ò¤É` HRí¸H¡'�ŽC–(­q]—<ÏÉóœ(Љ¢ˆ0 ˆ¢ß÷ ‚×µX�£££°›uvñ¾€BøŽã4•R ­õ./Ò?O`yJ_ø„Ö±Žÿc�ü Ä båöË*ßÇòµÞ\ÔŠi�AºfŒÐs£»µè’Iª5`,"½T¶gÛjøÌæÖ&øô"Ás%µØ£Y-¸I¦è�2Ï·×u)òœ¼(ìo›gÄqÄl6'Š"ºÝ.o¾ù&½^�û÷ïó“Ÿü„�?þ)ÿvÌfDZŸ©Ú±K æ8N½,˘ϯ°Žu¼±N~5ãjp /¶X9¶:‰ý–p¸xQ¥˜æ˜#ÏbÆkóT»q$�6]Â"Ó‹RÓm€ ÉÃI¾ìÿvа<øI¶TËk7Cj‘‡#ÏNg)h·ê±Gš Î yá.[ ª¤ƒÊ"VÓ[T |‡FÍ' \ ¥ })D•( Ðm‡Lf9ÃQF’”Ôk»už_ÌÉ2ÅtZP¯{D¡ËYÏT¸Ãf7DH ~Os:­€ôõ-¦IÉÓ“)�ޯܹÕ" =¾óÃ3F“ܽÙäÙéŒwî÷©G>;17÷jŒ§9AìóÆ7oÂpȃ·Ïø³ÿøˆGOFÔc[ñÐŒ¶^ `ý†ã×-˜ÍKžO™ÌrzÃŒÐwðÉw¾Ì›wÚ|ý^‡¿øÁ Qèò‡¿uÀógz£Œ·Nú–=Q(ÒÞ¸x®À3d!ÑŽ@¸Â16—€Uc¼…”ïêÚ'1Fb´D«:yÚb<ðP:é#O‚P†(Šp]o9v„8BR*EY–”¥B©’²(˜Æýïy7nÜ ÏsÞ{ï=...øè£�ð<�O’d>\I „”²®µ®a“áUIà«IÀ*ûæÚ6À:Öñe‹uð+×ЯKàzš ¸r½¸�ü3`§:V*ÍT(žc]‚Riê¡/–Or$V�/)©ÇµØÅóbzƒ”Þ0#/†)8Ø­Ñm‡ Fƒ”ðÙ˜;u:-„ /OžM¸µ_§{uúÃŒ$Ulw#\Ç~Ȳ4]%¥FµØe³iª¡ ð%»›ãiAV(òBZÞ½ïò¼7g41 �FÀÔ-89›“šfÝc»Æ³Ó½aŠë ê±Ë›wZ<|:f4É)Ê wn4¨E.óÎ9ǧ3ÚÍ€ÿæ_Þá»sÎ_þø¼²,®Ónúüèçœ^Ìùíoírçf‹ZÍãá�>b2Nyøñ€''s¦óGVhKUÉÇϳàÊÔQÔkí�¼2ZÚì†üÖ·v¸µß`£ð¯þð5|O…oÜi“)ÃÖÍ&£^Bnr7:YA¯Ÿ°³[G†.e2Ç>Žðl@¬NúØ’¿Ïe%`uh’'1óiLš(€ðÂÇõ=B×Ãq]\Ïû…«ý}]exJi´VlW €RJ‚ `4†—àÀ¿­îΕç )eMJY«>t„¥I|VÿÍXÇ+ëàW(>G°Ú €—³V«s¬Zà¿:ö}ÈKeÆ�&$ÓBž¦z—²4¤(FÓœvçQóÈsÅt^Ðe<9žàº‚N³C-rÉ2ÅùŠ�n³î‘f–10ç!¬yO¬È2Åp’ÑnúELç%“y�ÖÍšUÚ[ø¾[¤¾]¸ãÐ.XÓYA¹Ä¡K£æ3K Î{ [݈¸âüg™b2³‰L«aU çi�ãZuŸÝ͘ó~Jo˜²³±Ù yóv›á$g8N¹±[çÍÛM´1ŸÍ6:!íf€ãŒí͘4)øðaŸ“‹„''3†ã|É€Xý%48­!ËÕ²Ý2Kì÷4OJ. O*ëÜÉ,¯p ™ÅL2Î{ I¡Ø4 S&“œö(E—Š<)˜ŽTæà¨ÇM ,@–à;&À_¹,ªvØXA!—lV#MbÒ,"K}”òñ‚Çõp� ñ|ßîØ¥ó‚DïÊx^¹­1†y­5£Ñˆ÷ߟÑh„뺟xÞßAø\–7hÆ_¦°\ü×@Àu|Ùb�üŠÅ ºÚ¸Z ˜üK¬�Æ0/KSH!B02Ë ¥ÐÒs…ÐÆ ö¨B3e¶ï¹–JÌû)ÏNgxžäp¿A³îS†šg§3Îú Qèrk¿N»iÅy.)JZu�­nÄl^ðèé˜Ðw¨Ç>¸‚,ÏŽ3<×!m|¡Zج¹œö3 Dô…e8’£çJ\W²Ù±ú§#¢Àe³r÷fƒ?3žå4ÝV@£îñþƒ!Ó™ó9Ø©!¥àø|Îpœ³Ñø�ߨç;?xÆ££1qäñµ7ÚÜ;lð¿üÉ#&ÓŒo¾µÉ[wÚd…âb˜Òé%(exû£!ŸŒ8í%”%,¸–Ka‡1$»è[»a¥à¼ŸTú%Ú&ÓœÑÄz0¸Žäôè¶üôý †£ŒVì3KJfIA8Ä� &G=TäR¯y¥0‘¾)®‹Å‡ØéÃTçf×A£=´‰˜ ëLÇ1©vÒÃu=/À÷}|ßâ%ÅïóÅe•AkMY–¤iÊ“'OøÎw¾ÃóçÏ—ôÀ¿M\³>/úþ«Ò…Ÿµø¯qëx%b�ü ÆK„‚®Ê–¾Œpu"[Üîc+ÿœËQY”æÂîmpf©é4""Ká¯Üú”¡?´tµÍN@³î!…åüŸ÷¾÷7Ïùúö·kìnÅÌÓ’GGc9±=Çbþðò}˜*m¤TH!„œ¥FÖ#é9RT WZÉï¾ÚÙŒ=[‚|<Áó$JÃí k””—¦Ÿ/”RdYÆÙÙ>ä�wÞá£�>âÉ“'L&Š¢ø;)ý/*+¯•¯\¨Çë’€E¬wÿëxeb�ü ÇçÔ¸Š^^\¿ŒÒô1ðçÀï/(ÅD)3� ®ð§‰n×#iÕûÜÊB¸4œõRßáöAÓÊ ÃÅ å'ïö¸dÜÚ¯³Õ�¨%%G§SÐnølu#ÂÀAiC’•L¦9Q±¿]£Õð¹ÿñ€VÝã`;ƘÎr𠝲.µÝùDZK’–Ì“‚ZìS‹=ÂÀåãg“°»³Ý�8¤üâýw›ìoÕ¸{«ÉÃ'cŽŸO‰‡­NÈf'âçï÷,€1°m‹8rùñ;xž¤Ó øíoíñ£ŸŸñþÃÝvÀ7ßêðÕ{-ÞýhÈÏÞïqÖ›“¦¶l/�#¬’¢õ>¨ôïMU6جªú›¢’@6†yZ’WâHƒ”Ù¼ ]úƒ”wï÷)•¡Ý´~E¡�ŽY žçÖ¸I¸’á`NºDޤè%¤Ê¥~ÐAHïÊð�äsŸá©ÏéÀ#+]üÀG—#4adUý<Ï# mß_|ª^žçôû}¾ûÝïòöÛoóäɲ,#I²,£,Ë¿_€+-£µN”R)Vðó€ÿàS’€5`_¦X'¿âñ…‚>�(€°�àÌÊdW(ó0®'ä4ѵz$=Y¡Ø¥0”U TŸí kË›ŠÉ´d6/øé»|õ^‡½­˜4�˜§%ï|Øç+÷:l´Cö¶bãŒÑ$GëêWZQ|J¥Is ó}‡ØXš^©,*žÊãF)ƒïJ´”•˜ŽõØÞˆHÒ’Ó^Âf;¤YóøÚëfIÉÉùœƒÝ;›6¹¦(mØìDî×¹fäáÇ ‡Ã%]oQ(Ëòï´°cLjŒÉ°>Ÿ…ø¿.ÖL€u|ic�üÿ ~I¡ Õø´™úo°Üèo,[*†UÃ:r±5Ku£9Ò‘H)ÊX{Þ$+©Å­ºÇÞfŒçü?ì½é“\Ùyæ÷;çÜ5·Ú«PØ�F7ºÙD·¸Y”hYš˜ñxÆ-óEþàpø_¡þ‡Ã¦í°F£‰!Q2‡¤»!öŠ}-  µåz×sŽ?œ{oe K£›$ÚÌ'"#+/nÞùnÏû¼NÐæú�¾‹Â–ñŸ•fxíñåd³føºâèà3õ>ýÒS¯òÈ«~Üœ^¯Ô ÒÜ^3Ú>6šlœ[Ù7½O‚5pcÈ^?ãÍ ±Ïco�ñó_>áï~¶ÀêR‹¥Å˜ÇÛ wŽL æz!Ë EájÛû•ˆÐâ|ÈÚr‹�~Æþ 'ô Ý�8t’»Ö¸È?ðeóËÜŽ½ƒ¨ØX:-�Sk-òÒ©ìicY[i±´ñàшí½)çNvÀ§·öÙº)‚ßzw™4Ó<ÜœP”†s§{¼y~ŽÁ8w)ù¤d®°º³¼Ñnû¤¹áæýž/év}×÷¯O"ŽœàQðS7®.T†^W…vެp#–�1¤™f{7i¦%nï&L’’$uŠÆI�‚þ0£È4-O€6xÆ0§$�¨7|g2,yxSóÉ%6rvã´R)¬µ!QJá)…ïûx¾ÿÒ¤?c yžsíÚ5~üãó“Ÿü„k×®1� €¢(H’„4MÑZ%ÑQGÙjÐTËŽ#È÷y†^{Ì2¿%xI¡ Z-ðe‹©øO¸®€3ÕçÂZl¡Ù´Xi-§Ç‰‰Û±�²êó¶ÖIoë{,͇œ^k3ç Ç9�Çüòó._\àÔZ›Í'úÜ?ÙæòÅyz!‹ ‘›Ä—;•¿vìÑi{hP–†û�F,-Dø¾$2I®ÉKC;öRV)sG¸SÊ•T5q°ÛòI3ÍÖNB¯Ò08¹Ú&ÉJ¶vNTF\*g8�±œXiqz­ÍN?åÆÝ>'VZÌuB.œî2 †9yád‡Ç“‚¹nHà{ø¾by>B˹S]ÀR”.Moqd=p†þ)#×ÜM‹µ.’¯í�µ–B[D•ýŽ t鲃qA·íZ*‹R3 |O2NJîo B°¾Úb¡°Ô P¡¡"OBú{pÿ<Ù4ôû £,R�!%R*Çð—!•“øbêi{¾�LÓ”­­->þøcîÜ¹ÃÆÆý~¿1ÎeY6?MSÒ4Åó¥km“Y¨?[kµ1&µÖÞæxM�YJ†¯5fÀo¾€Zàqx^Ýó?à4–«ÏeQÚkѧe –„íX4¥kc`�³×Ïùî•e–B–+UÀÁ(ç£k»´cßÕÕ;>;û·îÜDA_UBANÖW�T’Àw,þ�ý”'»ŽpØë´c�ýANž»ò@H”híZ• —@ ëF#ØNšÎ‚õÕ�ÙígŒ«Y�vÀg·öØf´[Kó!÷6FÄ‘çæ¬uHÒ>Ûû)IÕm0,/Æ´[>B <%(KÃÊbDš• LjªµÏ—¡) CixŽDïÊʶ̎D¨µ¡nRb–Ùf‚bàKÒ¬$ð%E¡ ‚’(T F9{ýŒ…9ç�,t‚®�Py$éï¶nÜö' c!Œ �%$‚Zô;O¿ IDATÌG"„DJ‰TÎxQl\Gôµ¤ï?þã?2 žb÷ëJØC–edYö¥ÉÖZ²,;ºX™µ65Æ\ãé6Ú§6säßfÎÁ ¯=fÀo¾„Zàó~„‚zÕ²Bya¯yg)8-…ñãPxRЦùPJxðx„Åò½÷V¹yoÀµÛûìì§üóç;ä…æwÞYfu1ÆËæ“ E¡yãìY¦›V¼Vì±8úŠÅ^„’’þ(§( §×;ÌuÒL7òºAàƒ®n!ô¥/Òå Ú-Åém†ã‚ýaÆÊbÄÊbDH6¶ÆL²’“«mάwØÜNøàÓ¾qqžùnÀ÷®¬r÷á�[÷úœ9ÙåÉn½‡CZ‘ûï&•d4v�G[Ú-c,»ýŒVäÑŽ=zaEöô]4ŠÐ’B޳wÖ‚Á"j± @x’¢´hSÒŽ}ò^ÿý20sfxí0s~ ñŠj�ÓC„ê÷éWçüŽˆµäZÓÂn �Ÿæ¬)‰ G[¯ÓðýQŽ·-è¶|Z±Ç…Ó=nÝðøÉ)ó½�3ëN®¶Ùí»yE¹G;öiÇ> ½�4Óܾ?àô‰vµûä…cÔï2Z‘› hŒR4™¾D °UYhÆ áÄ„ŠÒ�†½ANªI`mÙÚI˜ë,Î…ä…s.„,̇,-D<~2áú�>{ýŒ0PUË�d®Ðíø™fÒ-˜ï9]%)%QàïòB7Çß�Ÿâ‘±)�.Íè`°U¦©Z/a’–áº$ÆI‰'Y®+R%L&9;{ ¡/ÙܵQ2Î5ûID®cZŸ0”X^Pý¢Àóã˜þGŽï8æY–äy΃¸}û6ׯ_gssóPÊß•Œlãc(Š‚4M)Šâ+‰þóݶÏpR0šô:>žçŒU­±/¥p€uÑw;ò�B³ÓO±6 Wñ¶vžì&Ä¡b¾Ðëܾ7`{/¥»RDš•\ýtc ‹ó!ifˆ P95¥6a«¹‚¨R/Ì2MùS�¥›X9LR:–ÿá›Y½U¢Gõ�1.-²LS*�R‚ñ¤ /4�¯èrÆ“‚nÇu*ô:IR°½+H2Áv¿ Ó9QËàG=–Bx…�Š ŠøeQ„>𔪺,RN·6ÏÆÆã1;;;|ðÁ\»v�'Ož¸ãž2ö¶rÆêH¿v¾lïm‡�1�Š`µÜâúÿÇEQlWyš,û<'`Æ ˜ákƒ™ð[Œ—P |Þì€é¿§_�¿þõÁ~HKm÷â–¯ì©IÊi!-¾x•èMYZ&IɃÇc¬…ïk�û#>¹±Ëíû´6d¹æüé'WÛxžÄó$y¡1Ʋ¾Ò¢{Üß‘¦š·.ÌÓ‰}$°›kc7W~a.¤û¤ÊõÆG´b[~k,J¹S1I0 +‹1IªÙäÌÏ,ÍG„�ãd¹fu©Åúj‹'» ?½ºÅÊbŒ”‚Õ¥È1ò-„�»°Iª™¤EáXú÷Ž0ƺѤ + ¡/‰*EùN@^¸ÝK^h’TQ ¬„ƒ–@¬;§uàÞ'‰f¾¢¤d<)(µÁódÕ1à”uä1œ”Låd¥Á CK§g˜Óø>RºŒÅd2AJEÅH¡�¢ê²° ¥¢ÕjáûÁ¡‡GkM¿ßçÚµk|øá‡‡¢þzªß4#_)Õ|¯,ËFè«èý?bü¡2þƘ¸¤<Ý)óÿüs~ñ‹_°µµEY–ÈJ4œòŸÖß÷›”]ë¯3EQ4ë}QLz’$9´ÌýiK­õŽ1æ*.úŸÖÄ8êWh¶u̾gŽÁ ¯fÀ ÀK9ÓÝGKG—ÕŸÿ ïÖ �a\b7�À"ÊÑÄ,wÚNuÎó„²É47ï °.žéò½÷–x´5áÞÆ€�ý”¥…ˆ7Îõª(Þ²7ÈxðxìRî‹1Kó!RÀ£-'tóÆ™ݶ�µnl®‹Ž¾(Ob¬#‚À÷$�ç¦ðic�ð»p§ã)�݉ ㉠´¼ÛÕHÞqR’e%Q ±BЂ0rýðÚXÊÒí¯, É`\�åN—¯Ÿ‘å.M¿»Ÿ±ÛOYYˆ™ë†ä…!Š<ò\³»Ÿ:†¿6�Ã"«þQµþ5í�àZôªãvço«Z¼ Pᣠ1¶½k)J€¤YŽeŒEºž¥�Ê« ¸¢cÚôz=Þ|ë-ºÝn“º�F|þùçŒÇc¤”œ8qk-[[[�câ8òã_�çy�á¯�€/›þ?®}ÐZ›[k‡ÖÚMàC‹aýûh6`Æ ˜ák‡™0ópôGkZ(hºð¼îpj�à<€µdZ£vÓe®EW®\id|Ÿ§0] 8ŠéÈÿh&à¯p‹Õg­�RŠ{(KžÃX·"¡D%dŒ%I5?ûå.ož/ùλ‹tZ>ûÜÍ�ýÙ6ãIξs‚0PtÚ>÷6FäU:½Ýò+ÅÀ�Ý~†Ö†Õ¥½N€°±9f®°²á+‰5N¢XI}ª*àfëU]±õ¥ø¾$/ žpÑþÞ¾ëT@Ô‘«3úŽü§0Ö¢*ÅÂÀWN‰W“O³’�Ý~ÊhR°82çì­´\fÄXæº>¾'Ȳß—”¥åÉn‚”®¦Ÿ;e‡øSdA Æ È+×ÖÇq-{·Ý �5c-YÅž—RrþÜ9Ξ=ËÜܾï†* ‡CÒ4E)E†�±¯#üååå¦ö_§ú…Mš¿zš”ÝX«Ö™�éu_„iîÀ4ñÏZ;©Èâæ\gôŸ•x^ `†^[Ì€ŽÅs8ǵÇ8Ú8 ý{ íöAR–6“B„BX/ÍX“ÒRÕuì²´ÜÛá)ÁùS-L‰§¹æÁãY®Y[Ž9{²Kyìõ3¶vÂ@qöT—Vä±¼±?tC‚âÈwsZn:ßpRŠù®‹ÂóÒ ¥AU‚6²º �´u#x«·Ö®Ÿ¦%y¡AH”<¸dR€Pa]ªß¯–iãzöÆi‰®RÚE¡+ÆUí�u’À^EÖkǾëb�DqQvû)R8B%Uêÿà®MÛFÇp5+C�{5wïiCZŸ‰¨ �äEáÊÒy5á¯6°µFEÄqL†Ç DÃð}!D5*X²»»Ëp8¬µø«ë«9ÓõÿiþÀ4Ž[>­øwdy©µÞ•R^­žÓ’ã�ÿËr8æ}†^;Ì€ž‰ç”^F-ð¸�lçü × ‹Ò>¶V”a@œ¤vN£¢@"%ø¾ ×Q G)ûÓ‡H\ä½8²?ÈÙÚIøÛÚàwg•o¿»Ì©5'ßûù�}”'9}¢Ãâ\@໾÷�Ík+-ç"Þº0Ïæö„�­1Q­òçùŒ“ò�0T¢:MþÜ‘è°nˆÐþ c¯Ÿ�$cÝhb„ATmlÓŠ§�uƒ~êÏÚâ{ß“t[ë« Í|7 {ôº¾”ÚÐëø�râFý” �ÎòÒ@éÒýÓª†ÓòNnŸ€ð"Ñx1/÷<4۳ƠuIšå Gcö÷÷ÙÝÝ¥( Æã1ëëëôz½fzßqˆã˜ èt:ÌÏÏÓjµ¸~ý:EQÐï÷' î¨ëÿZë§"þiv�M8Š,Ë9SȵÖ—eù O¿<îÀq]³€¾˜93¼,¦ÌßS?vÏR „§3›8NÀø¸À2+µÝwàß=Á¾{‚IR²³ŸrïÑ�ÿã?çüþ·×øW¿š•¥ˆá¸à£ë;kÝ@¡•6ûÃŒ$Ó Ç9B8Q ³';ìö3n=pþt�ùnÀê¢d0*H²¯2ÀAEÆó=‰ÖŠ­�!{ƒ ¤DTô{H%�V ¤ó^ÌÔ(_)\'AQ:Y_%*pY‚0�`}V—"Ú-�v˧Óöñ|LJ¨³ƒaާéïñvBàˆè2S7B[, !P1B¨cnɃ”’0 XXXäþàøã?þc.^¼Èâââ‹¿ü¬¬¬T• —/_F)…µ–ýèGüâ¿hœ„ã0]¨5êÇvZZ¸‚BäÀ~QÿdŒIy:ú@mð§=®™#0Ãk‰™0ÃKáW¤øK  ¼_ÿ»¶L0v»Ôt@œ˜$f¡Ó’(éFÝûž‹¾7¶&ܾ?@Ðã�Kóüòó}>¿Ýg4.¹qwÀéûœ>Ñf®0š”<Üc­åâ™qä!¥`8)ªÞÖNÛ'IKöFV#Â@‘UTÙ,w“ôÆ�ˆ�h”­­sÓä;!`*}휥êJ@JAä+¬qªˆµö–•Õ´>w‰=O¸öEß9%'VZ.[�–Õ½¢Jý»Kn­T5Ï©/º%_ B‚ `ii™ï|ç;|ÿûßçÊ•+ÄqÜt¼Ê6‚ `aa�Ë—/#¥lH‚7oÞäܹs�ðQ›:mü�.×IP/®ÞÓ¢(¶¬µŸU²¿Ç1ÿKŽ/¼¨ÿÖ8Ã×ÏÏ¥Í0ÃŽD2ÏúÑ;Ê�~Öj‰ûÑýGàúô:Z3)r{»Ôö±Ö¶OŒ5æàÕW¿úéW?ÝæÒ¹9ÖVÚäÚ¥Ùï?ó“_‹s!Û»)7îöy²“"¥ ÛöÉrÃNÕ5�šNËçäZ›Ñ¸`s;!ÍÜļ8T”…&Ï yéú𣜽~Réé;cë^U}ºn·3®h.+©ÞºÅщ Z‘B)7‡ÀS’ PxJ2NJFãÂ9“‚ɤ$ÉÜì‚(T,-D´b�n'à�³=–æÃªD ¨vU©þ BFdŽxIÔ¤¾V«ÅÚÚßýîw¹|ù2qJ¹¿*¬µDQÄùóç9þà”q ¦TMuŒŽ�ï «€©º<¯nÑsÆ¿¬†im±Æñ†ã”ñ¤$IJÂЕ Œ¶xžû¾S%TD¡%Í-Ò7ÐǶ1øGôŠFy:Å^Ëò>|ø�ÍÍM”RsÝ�o¾¹À©m,0\¿½O^t9¹ÚæÌ‰ƒqÎÍ{NŸhW­w‚^× =ÞžPKZÍ Tédw1)${ØÔõÿZŽwº,Pñúš>~­mõ�¢§íØ£×q„ºü¡�%ÉJòÒÐë À“%4Iî“écÕ”;òå1]S¯¹A°··×ÈþÖJ€—.]byyù+ÛwE¬®®òþûï“$ Y–qóæMöööŽ:ÊPJQ–eV–å®1¦žd�‹À]à!ÏöóE†þÌŒþ _Ì€^Ç”¦õ¦ß�+ ÄX[‘ûœPÐÒBD»åXèµ(Ï$)ÑÇ´sgØ\q0’WTÖÚ¥ýE£.XŸ¼­®Žë 8ðD%T%k­ëFœ`ŒÅ—‚¼4()I—€8 1¬°7€í¾Åäºq0¾,Œ1�pT†7ÏsF£QC¼+Ë’,Ëxûí·Y^^~Šø*ß÷ét:\¼x‘4M›n­5ãñø8u¿Cû ‚­uå· _á[kkgôû¸g.áÕŒÿÌèÏðµÄ̘áKáN@ý7μ¨P¿üwõ Ú26…Í¥ BxãÄ,‹–¾ç†ö¥«…rcŸ4s¿ë—Îöð”äþOñàñ˜À—´"Å{——¸pºÃ­ûC¶v²Üpå­Eæ{ݶÇ/?ße·ŸÑíD�" �vÀÖö˜É$‡J€ÈZŸ¬ ¾µUšß±ì…p+ºõëÚ½Ó�¸r€# :AQMD¬†!¹Œ•X�a8Î)µsÊÒT“ �8 ;·ÊÂú·¹ûp�ì³›Øá š{ÿåíSmø�2ðóz®®½0ÏóXq ÷lê¢(²êoø}\öiº›eÖæ7Ãÿ¯¡~øÃþ¦�a†¯9~øÃò—ù—/ ëŽÿê÷g}oˆ‹ÈÎM-³Td,!„§K+=%ýºßÝ�6d…a4)éuæº!«K1IªÙd F%�/›¾­-Ñ3bž'é´ýj;–G[”riþÍ'Ü4wzÿMOµÄo¥ª×�ØÜ:¦Žðq-y¢)\ó$ÎÐ×6ÚµîÕ“îhă”xž›XX©3šd™&Š$§Ï½ËÅ˿ǹ7Þ§Ývƒy†£Q)¿Z Vés²Âå3�ìtF ”$ ý~¿q¤”DQ„RêKqêt~EN�QJ’$iöyT%°æT% Q…�RzB°BˆÒZ›Ðnq¼"à4'ड़�Ùoë ¯;f€¾|j�ðt&àc |¯úŒÖì;Z %Äh¢ý^K)©RB©¡?ÌOJzŸ7Îöøöó< IDAT7–I3Íõ;}®ßéG Ï“¼wy™(tÃu=£$´[ s!¸~g@¯ãº¶w�V€µ8u?Œ]×oRúÒõá5†ªl~C•ò·‡ÁX[m·2Z´ê+%*þ€ ÆX&©›ŽçyŠ……Î^ü&gÞø]ºsËtzK(Ïg8Q–%»»»hm^%º•¡­Ó÷Ó£w�[hÆô*¥¸}û6ý~ŸíímÞyçÞ{ï=¾ÿýï³°°ðÊzõ~¢(bee…wÞy€´M\EQ•ümàû>aŠ<Ï;žçÉê;Æ“WÁ³ÀïáÚRŸy¯tð3ÌðbæÌð•á%œ€çñ¦ß§—ÿˆ€+õ2­cï A …ˆG‰nu[JU ÂRjÃG×ö(µåÔ‰—ÎõÀÂϹÍg·ö1Ö²0qrµÅ©µ�ÙØšŠSkmç"ÞÇc’” ÇEukcQ£ÏZšÈ:Z—ШÊ#gÕLêC`k§ATâ=¤:Ð:Æ"¤s²\“¤%yaH²’½ýÏÓÌÍ/²vú{¬œ|‡¹Å5”òXZZÆ÷Š¢ <þùê‡L&©Uü¨#ÿ:Í^ëï×€z�£˜&N&Š¢ Ë2>ÿüs>þøcNŸ>M«Õ¢Õj½Ôq¼èøê™J©f�ÐÍ›7™L&O‰ÿÔˆã¸VŒ<Ï;Aé—e¹i­-€·€ø1O·­uP§_vj�ê¶ 1ë˜áuƬ0ÃWŠW(·þÑåÀ0?µL»;F "m¾Jȃº(,Ea'%ÝŽÏ\×Ç(JÃxR�ä®°0ºõKÃ^?'ðQ¤è¶}vö3öú™ë¿×Žâ ”KãËJuêÈÝR§ó«LõýC-Çk«kÊõÉ™ƒì�6nxP–iFIA’jŒ±tçVY9ñ6§/ý. ËgˆâJJ”Rø¾OE!ȲŒ$ͪzý³#ùºôPÿz0Ï´ªÞqmwG·QµÖÍxà4M9Þn·‹ïû”eÉxS–ö‰µRQ°<ÆkÇRH‰PÒ­í½”ÍÝ”(\ç�3]Þ{�OoísocÈ/>z‚ºí€ÕÅc,Ú-ß—´c�,ÓL’¢!õ5r¿uÍ߈ôÔ©þêBTFó€è'de9¬›`kì�sœþÓÃ.œc’š¼4Œ“‚²„V±°ü+§ÞçÄ©Ëøa«q"¬AÈÉ“'ÑZ“çiV�e“Éä)2_s‘+ƒéû>A4:üžçrž•b¯·[Gßµ`�RŠÝÝ]~ô£5Sþ.]ºD†¤iÊ­V«™#ð²N€‚8ŽY__§,ËFA0Ïsúý>Zë§´êï¶ÛmF£RÊžçy¡p’¬µ6©}— øîy=úšî™eføZbæÌð•ã%œ€çÿg¥XÁµjý9°P¯k ã¼°·}KA(¥ñâP )]í\PÖòÏŸí2IJþð¿:A¡ ¥6¡ßzg™Å¹ˆ�®í0NJ>¹±‹1–÷¿±Ì\7@ë6i®ÙØšGn˜�ï+7rW:’ŸËXòâàw]°Æ1ë:¾ rª÷zYu�H„Õ–Ú6â?£IŽ6zÍÊ©wX>õ>q§‹òü©+&vN½“æ.à{+++|ë[ßjz·oßFk]EÂqÓ[Ï‚å þïyív‡,Ëb:í_·>Ëp×™€ñxÌÇ!¡º}°ÎHt»]Â0lx/ƒš¿°´´„1†4M›ÖÀ{÷î1qêã®ËI’ „ð”RkÖZ%„ð‹¢x µÞÇq .ð"#>íi<åTûž93üÆ1sfø•ãí�Ó¤©çÍÇü p7/à÷öCªKûD"-ˆGÓé¶TPÛ`O9ý½— îÀ\7 ÛöyóüŸ\ßãñ“„$Õ´Z>ë+-²ÌµÝyž$ œŸQ·üimÑÖˆ*JµG­‚­Ö?8ÍZèè‰4kWë Ei]ú?+1ÆÅsÌ/.²zò›,¬\ ¢ÆØÛ§ö]í숾çy´[m°Ñ¢iŸsÆßoDŠjAuÿ°Â"íS¿Nµ×‘u]F8šö?ŠÚÀ×D½,Ë�R¢µ>ÔvhŒ¡×ëÚæ‹P; ív»/ª3RJîß¿ÏÞÞÞ±ß ‚€$I$Ю2ªj 4ZëN�"þš§Ø£x¦Pë,0Ão3`†_ ^A(Hðôà é¿ð!ÐÅi¸,€%¡´� ä�—Ç©º-Õ´ëI¦¹÷hÄýÇ#þèwOò½÷VÙx<æÎ`È$Õüü—[Ì÷”€Õ•6§×:Ìu|„t“û\tªå7m�uÿPëßa;ìH‰S'Òw`œ0�¥, “IÁhœEŠù¥7X;ó}VO½Gwaµq:.pM8ˆÆ§ëF’IÂæÖ›››ìïí¹Ú~5³þº3¤ŽÀ§u]°X!)§ ªïû !°Žà�*ñ= ®”P µæ£�>b4ÑétšeGK_D=P)E§ÓáÂ… A@ÇMIcÿØypÈ hyž‡ËßÄ•žþO\—@�ò˜C™93¼Ö˜93üÚðŠj�Gq4€þ Žx¡þwcI)í^!¸o­(ljYiÇ)@©ÃóýGc:-Ÿïû«+-þéƒMFã‚(T¬,ÄÄ¡WÍ0 Fã´d¡…�_׸©„ìÁ¶­#NëX[g' Žú•pS ËÒ�çšIZ2N ò „$ :Ì-œdåä[D­.JJÀ9#ÓÝ‚šç>Ôû4Æ0¸{ï?ûÙϸ}û6ãÉ„ ›Z;p(z áºÞßx2SäÀv»MY–Mä>u¯_x#§[ ƒü1Y–’ÖZÓétˆcW¢xÔÇïy^3‘ÐZ[÷ÿóèÑ#ƒÁ±Ç8åk­RJ­RVå€]àðï�ÿ 'W]ã8'`ºãeæÌðZaæÌðkÅT <®pÜë?r €…\[ŒÐlI¬ÌsZB˜ É@ɪÿ¾JànnO�Rð‡¿»ÎéΟžÐ‰=âÈõ¾g¹f<)èÃqA’iÚ±GX¤•8�ÁS²9Qì�„¯À‘üj`*/AR ´vé‹<פ™#ÿcŸÞÂæ—Ï3·x?.‰¨ •cÁ”@m@ Yž³¹¹Éí[·¸ví{{{h­ŸÒæ¯[÷¦…꺼ÖzÚjáyQ1??��¦ý~¿ýy‘`Ð4„ŒÇcîܹsÈxO‹ Õ†—Í2L—j=c Y–ñÑGqïÞ½F+à(‚ @Ád2BˆN%PͨÊ瀿þWÜÜŠG7x´¼5sfxm0sføMãèß³„‚ž§c+p�µF€ÊRÛ>‰À'·'¥4AH×§”Ʋ?ÌI3ƒç Þ8×ã�ÿè�/ÙÜIø?~Â`œ3f¤YI(Ú±O§å® ,+ ²¾Å÷]¿}ÎÀW2¿U+¡­R®Ü@F3Æ�æŽsPš,×xJ3×ë²vþ{,žx—0ŒYM÷s5w7wà ó0Í´G¸�¸qã×®]kZâ"[ת«¡Jð�âzyE,--ñþûïÇ1ƒÁ€ëׯs÷î]},uÆá‹l»na\__G)E·Û¥ÛíW¯^=T˜ÆtwU:%Žp͸›°üÀÿì?ç0fNÀ ¯%fÀ ¿v¼¤Zà³ð¬,Àø¿p©Ùvµn©�¢Ù@/I¬�˜vH)¤›°§µ%+Ó?Ë5�·¤L҂ݽ”R[F½’¥ùˆ0ð0Æ“‚IâÈyq¤ˆcYm˘©ÑÀSixìA¬n+–�Ó)péõ¼pŒÿIZ�$%ž„îÜiO¼ÅüÒâö¼s'š¨ÊØR<¸PZkvvw¹uë67nÜdãÑ#²,Å÷<„’8ibWq™Š§ìÒ3Ö××yë­·8qb�V+æÄ‰,--±´´DYjúý>iš~!N€µ–ápȃ0Æ�$ yž?e kmƒ—Aý˜AÀÂÂB³�ºdq÷î]¶··ŸéTbAPJ©Åê☢(i­wp²Áÿ#Î Ø<îª÷g]gNÀ ¿1Ì€~#xµ@qäý8ìáÚÿî`?¤eis)ˆ„Þ8±¾�Ö }áIH�¶–þ £?ȹi‡€E)A(òÜ`ŒÓ! , R רQè¤~óÒ`­ÁW¥œ¡®ÛþlŨϲiù£büš¼0¤iIVhZQÀÜâ9–Ö¿Mgn ?ˆÊ âE—ÁîñxÌ£� >úè#îܹ[MÔ()±Æ`å®b$4ó Žë,¨3sssœ;wŽ·Þz³Ñˆã˜“'OÒét�'\¿~�ÍÍ­Cm‚ÏCÍ=ȲŒ��’$iœ�ãZ�j ¼Ì¶ã8fyy™7ß|³Ù8Òßx<>V6¸Ö�Çm)¥ò<¯îÿ/´Ö#µ.lpüÍÎL·½Îœ€~#˜93üÆð+ zügà_1õC\”vËZŒô '3'ÛÊó=§(¬ 4ްçUõxm,E©‰cßÜy8tC‚ÅÂ|ÄúJ‹¥å)eÁg¹Fð”D�Â6£|k†¾‹úeÃö×Ú�f%IR’¦m žR´:‹,,�aií"~WõyÑ\ º‹leÀàzàs66ñÙç׸zõ*{{û-wÆ�%©$ª*%LK÷c¡bâO—æççù½ßû=Ξ=C¯×kÔ[q \ºt‰ÅÅ%þæoþ#~ø!�okXŸ­5ãñ˜Ç�7œ„ºÛ ŽÜkõ¿/RPJE'Ož$Z­VÓ�põêÕjzâÓ™…º« 0L£,Ë>7Æ qY§¿~ÜzÁ¡L?ÛO9Á3'`†_fÀ ¿QãÆ�ìíí5¢=u�ßHó×Ä:%Tè'Nþ<ÏY]]åÂ… \¸p�……¢($ð‚0À|°Ðét‰ã˜oûÛH)ùÙÏ~ÎÞÞišê0žéÔ¤ÃápÈææf£L(¥lx5©ošä÷£ÚF«Õbyy¹&ú5m‡>¤ßï;õPJYg¤1&�R.6‚tªáJPÿ ×¢zô¹œÆ4׎<û3'`†_fÀ ¿q¼@-žÎW˜Îü˜Þ¯WЖ‰.ì=)ð„Ñhbzݶ”B ¡$ø¾$ $ei*�{È 7XˆŒ¥+<å¢þ½AÆ$)•ÀÀ—xž<8 Úåí]¦¡Žà«m×r¿Ei(*½ÿ^·ËÜâI–N}›ÎÂy<¿ÉË�°Žug�“ 6¦@„ 4†ÁÀÕÑ?ùäîÞ½KY�1¯uòk‘Ÿ¢(‘RáÒÿò@•°bÑ´÷ Î�;Ç•+WX]]i: t¢BÊÉúzBáûï¾û.A²¿?¨Ê›ÇöÞ?iš²··×㣄Àz[Ýn÷ ‹µZ-<ÏÃïûH)ùàƒøôÓOIÓôØî€)'œ±_ò<¯JîØ´š"ðßâZSÿ¡Þ-Ç“X�ãÌœ€~m˜93¼xE�€•~‚Sn{‹ér€¶›X¬Ä›“ÄÊvŒ§”‹Ð=ÏñZŠ7Ë ¾'iÅJ ’TóéÍ=:-ŸNÛ§û´b�Vì1™””ºh„�„%å�@=úWLe 7é¯(5ÝŽ¤·pй¥ËÌͯO¥¸-õ˜¡ƒ–¿æÄEU`6šd’pçÎ>øà677ɲƒÈ{úuÀêO1FS–>B¸‘¼‡™ñ–N§ÍòÒ2—/¿Å¹sg‰*‰ÞzrŸ•†?Õ˜d)ˆ£˜ çÏó'òÇüýßÏñóŸÿœííí&‚Ôm{uçBžçMg‚ïû�þ@]ßYb 8c«««‡в,¹sçÃáðX'@7Jx2™P…/¥\ö€ò˜Ÿ_à›W®ÐëõR ”爃‡Ü®ÊøK~‚T®EòÊ7¿I§Ýf8píw[Ož¼øA8‚Ú ¸uëVsNBˆf`P�ø¢SërÀ©S§šr@–e<~üø)ÞÂ4Zÿ{ïÝ-Çužùþö®ÔñDäÈ$A )K–¨‘íÑ]ÍŒå¹s¯×„u¿ÌøÓÌšq�‚%Ë ¶)‹A 9 "àäÔ±ÒÞ÷�]»ººO÷ `IÕÃÕìêê »ªê}öž·V³¥Š�ÖzÎó<)„p’$iafý F¡ò?c*v& c\Âë.æßÇ�.¬D‰ $%>í8¨PÐ^h3Ðh’‘m<ð+-úð„ëêº#ÅÐÜÌd놡µÉ>oÔÈÛ`¸•/Pˆõ[ã?¨NKÓ”Z­qž—^ºÌ•+W˜žž6 ƒï7y Êä6 ÑbP™ µ uF4èÔéÓüáþ!Íf“_¼ö­V‹8Žøó‘‡,¬' ×ëåã/¶¶²Á‡ Ø{277Ç3Ï<�+Þ¹s‡ííí‰ûU«U¤”ôz=GÑtç\µZu£(º�%‚ úÿ€ÿ�ig=ê±*––ýJ|b( @‰OC# ˆIù[µÀ?Æ4s Uz„–R×:=uDJŽBØ"~ŒQK•1˜R‚#� ŒÒ\ ðŽÌUISM§—äZž#Í`µFŦ4ŒìoœiÿWšUÍ9fŽ^¢Ú˜G:nVò'ÆfDïŒ-�[^^áöÂmîß¿Çææ&q�­¿Ï]ö…e­5*MóR;Ó¸ÆÔÔ/\à©'Ÿ¤Tð<GÄ•ј¬ºa×� òjÇu™žšâÙg/Ñï÷é‡!7oÞd}}ý±ÃqS¯×s—¿Ýß’‘É4`Ë ‹RÃö·oßfuuu¢ qæuÝn7f…®Ö:BÈ,�3Àþ °!‚Iê–% (ñ‰ $%>•؇Œs™Ž†ìºâò¦oÀ·ç!LR­€[âNO_lÖ„Q7o¾ÇÖv‹^?$Š¢<Óßfþ[ã5Ú¾7¿©*5½ú.ÇŽã…^à©§žd~~Haô’8ÉgùyR¢´Á‰ÑÑšˆã¸Ôj.W®\aþÈr” Ä§Ð°Ë£a�ÑÙñõ6æAüòà<„I¢75\á´»©hÔdU¬œ=`ª@bÂB¬ƒŸÊtf¦<¦>q¢hubReÑ'*ó}³^£6}–Úô9\¿‚�Ažñ÷#¿/ôû!kkëܼy“»wï²¾¾1Ö°cþù a76¿AS7==éS§¨V«€Èº*´ÊfüÈ)Å¥ÈÀ4ÆHNMMqù…PZg²Áï³±¾Ž: -³zý~Ÿ�� :�Ž OdºÅë,z:* P©T8räÏ>ûlN Þxã 3Ö¬,qÜñ2Õ@Ñétü$If\“€¡�$ÉF¶Y øLbà}v~‹²‰P‰�%(ñ©Çc”î °x Cžµ+RMW%: µq·¯Ï׫Kiïm–{šjúJåµøS ŸjàÅŠN7AkA§øŽô³šÿv7¦&øÁAã,�Ù'¨OáØë5Fl¨pè~ ���î?¸Ç[o½ÅÇs©ß" °uó6áNJ9°ÇS*%MR:œ>}šS§Náy~>óBæÕRfŽýÌ;!…(„-ìÉ{ È¢§rñž/¼ðŽÌá¯ÿú¯¹þÖ[ììLJ’�8ŽI’„n·ËÝ»w‡ªŠ ŽÖµØ.‚¾ïsâĉ¼3 ïû(¥X[[êš8nßL:ØKÓtÚuÝ‹BˆšRêM¥T;Û¬Š!ÿ ¸]Ø}ôoµl"TâcCIJ|&ð!4`|y ~‚5Ìæz IDAT™��Ë>'ZC’è- n ÔT½"»DV*hf÷®cf‰Ý^£Õ.a¤˜� ¨×\¢D±ÝŽÔÍ��Íí!~­Neúi¼Ê,Rº¹Æ½46¿H™)ý]ÿQsïþÞÿ6kkk¹ñ· mEwz±�¯ÝÆ~7¨÷(•æÂ;|ð333œ?Ž£GŽR©Ú@¦1»ƒ–ü ÿ¡q›�½v,õF�Ó§Oó»_ý]\×åµ_ýŠ0sߛӌŸ C–¶··Y\\Äó¼<àºnþ²á€ ÆsÜ9ì}œžžæÉ'ŸÌ+’$É<.ëË…4 Ñív�8ŽëÀ‰ ž‹ãøA’$+@ŒIFý¿1*7³]')Z0z+K­€��’”øÌà14YÞ�¬n4þp4[—¦š6‰æTP«HwÌþƒx½D±"I"¶Û†)Iª‚íNL¥D‘bm«ÏÚF—fÃ¥6ã’:ó(|ÒT‘&¦œM c¼­±=cÇlooóÁ°°ðív;Oôƒ�ñ²%rv¶:j¬Š¢?Å’ºÕÕUÚC:�O?qâÄqßÌ®íô^™ÿb(À¾‹l,šŒ¼,h6\½z!+kk3·V©ÐqœüxE=„ƒ"Ž=ʳÏ>›—TJ)­àıÚÊ‚n·ëÅq<íyÞ@h­#­õ¶R*<àÛÙû[{ c (ƒJ|(” Äg“4Š�ƒŠá€qž€.ð]ÌLlÚ( <’‚*àI©§*¾ØõïE`þôUŠMÔ“BW]úaÊêF�­�!L¹àN+b»Òë;hwQ_¢Ú˜§Zkc*k¸î ~ol¦ÎJꌰÐÎN‹…Û ,, ÿŠ÷Fëûí Ø~.JýšõÆýo·M’„••¶¶¶¸ÿà>Ï=ûÿú_ÿ'NœÀõÜä|†›•¼ ŒÒßv+¢Ý‰q]3SŽbE&&i0ò覛lGïQ­5 ‚ ÇŽÇu}\ÇÅq.ü¢a�¢ˆõõuÞ{ÿ}VVVŒ[z$»¿˜Ñ_¸o{¾,�°7Š"Â0¤öÑJãyW¯^áé§Ÿfjª‰ïŒªZäj‡6pÈ_=”5HNÇafz†‹Ï<ÃöÎBJÞ|óͼSßAPL ´Yû¾ïç›áû>išR©Tð}ÿ@ž»�ïûÌÎÎráºÝ.`¼·oßfyyy¢N@½^Ýn× Ã°é8¾ï‡Y8`ÓDÈÇä§L˜5þE¢[’€�…’”øÌá14,F €(,¯c<߯$hˆ$ÕëR)Dµé#BjÏsE•>ÂHþ aBQ”Å ×8Ž Ó—$ Ä¡P€ŸYLаyy‡ ºü=Æ+Ìy“”DHý�£úú„¨Hé¹BæÆ_Ø1™Wšjt6!TÊt,žZ ¡Mi�ͺ¯×릔ÍÓSƒd>¡IUB·ÛãÎ�»Ü½{—V«EEC†½˜ü7*úc—ÇÞˆ †¿¸_š¦,//£µ¦V«qåÊžyæêµžï¡õ ÉpвÈV è|²oÚboC‘' zžÏÜü/¼p™n¯G’¦Ü¼y3÷–´lnn•óø�BAÅÙ71߯Ö¥©¢Åú–çr¶ÓçT­®#„ÒÃ'ÎôsHS 3]s:�“•ÐÉ|ã$IØÞÞáæÍ›xž‹ïùˆcǨժ)Y^^â�wÞÉââ-£ÊW0 Öà[ÀG‰QrDZ§ëòÊ×_áì™34MTÆ‚¤¹»×=R`��—<’}ŸíTo4xò‰ó|ë[ßâ¿øo\{“4M8,¬NÀ½{÷òäÆá*•w;ô<ïÐÇo6›<ñÄôû}Ç!‚\1p/Ráû>Zkz½žç8ÎÉjµú•8Ž’$Y*ä<‹ñü/`¯XHIJ%(ñ¹À‡ ²õü#ôâà<ôãD¯Hð„Àïôôt½*}Çÿ”×#FИ:™½»˜Ìõ”Å‹8R2Õl’¦ 'Nœ Ûí±°ðï¼ó««+ôz}Ò4ÍfÿÃÙüÙ½8À¥Žë`v=.ñÎ.+¥xôè*UÔu’$áé§ŸÎ h®-T¼«Y` @%°·yP ómÑà{óóó¼xå qÓítyøp‘V«E’¤CcÚﺬlpǹ»Þ^‹ ØÐÀ^ùãÁP8ÀV¼ÿþû´Z­=½1A)¥ÓétšŽãT´Ö @E�Ìú/`ÊTÿ†’”øQ€ŸWŒ{Ðã!€IøŒµ¾’m—h a¢¦š~ÅÏwûÚ¯U0zÿ£gß�0@�12R vZ-nÝ^ ×ï' ¾äÆÿÝwßËÅglò »ê?Ìó}R8aœ1ìõz,>\äïÿþGt:]f¦g8rtבèL.¡@†–mòßpE ¿¹aP˜LýcÇŽñ•/ÿsssüàûßá½÷o±Óîîù£�»¶8Žév»,,,EQ^˜¦)žçáº.¾ï¸�p®ërüøq|ßgff†4Mq‡ëׯ†áž$ ËE�Ýn7ð<ï) H’dKW޽KO1èÐ9ÄPm{t,I@‰"JPâsƒhD(hÜëUÌ¿•ËÙv©Ö„*ÕÛIÂÇ%íö9Z¯š�f,{Žt˜ P4²š8ŽXYYåÚµk,/-³±±ÁÊê*­V‹8ŽóÙÿȵïyo‚ÑY1°g†|š¦looóî»ïR©Txéå—8wö,�F£�T'F µÎs"lô?ÏÜ,$ ªLTȬLMOóôSOòõõ \¿Â«?ÿ3k?Äõ¥©‘:VJñðáC¤”´Ûm”RCý¦§§s �ÃÜ7!L�ƒ3gÎðÒK/!¥Äó<Þÿý<�r<ϵZMw:�ÀuÝ£A¼˜¦é�,`gýg�ÿü9Оp¨qe°% (1%(ñ¹Â‡ Ú ÿˆy°>oW¤šn”êGž@J¨vzºR«HÇu¬{Ò 'ŸÄºß;�.·nÝæÁƒE3ã�c’ÌðÔÏî¢÷@J™ÏV÷:—g†ñ:&ÁzÒ4ess“(2vÛ0©xšÍfžÈwo€õ\ºt)×°Eû…<ÏÍfS´Ûíf¦ ”R)°–‘€8 üWàÏ€­ ‡*I@‰¡$%>wøBA0<ó]ÿ3Ì¿™gìÊ4¥%ÐKFÌFœíöõT–8Ñ  8o�¢(—°ý$žÕyŸô€Éa‹n·Ëƒø—Ÿÿ q3;;› ™¾BJ¤­Œ:ŸERÊLý-©°7ΖÑ�8®ËìÜW_¼JµZáûßÿ;Þ{ï½C_§Õ ÐZóàÁƒ\Ȇì5{žwèÊs]‚ùùy„ø¾ŸË߸qcˆ°Œƒã8ÔëuÑét|ÏóžBÔÂ0¼l¨A-é øŸ«ÑAAÉ.·pø]$ »Ö’ü–¢$%>—ØG(h }ˆ× Á�³}/dëâTѽ,$ÏAtû4«�!»OÍ ~ÿkÊè?¬!:(ŠÏ­uN<¬1̤kóm–,ØÁà-#eüÅ/~‘sçÎR­Vp…‹È÷Ër´©™TZ füv ØÏƒ ‘y<ÏãèüÜË—ét:Ôë5®_ëÀe�¶iÐÖ–™DÛ€Õ°ddjjŠJ¥r¨Ä@!®ë2==ÍOê °j�OÚ�“T¯e–Ýq%óa¬ZCf;òS �ì—%ø‰£ßï†frY,'ô}ŸjµJµZekk‹v»M’$4�]õ„ôû}=zÄo¼�‚ß­|¦§ *®ãf†×$·‹lŸá�)$"ê‚‹@hÐÂì;7;Ë —/£´â‡?ü!oßx{¨Äï ™CQË¿Xàºf̳³³y{áÃbzzš§žzj(œpíÚ5¢(Ú³+¡”2ï$œ ‚ ÇñÍ$I–•R�l³Æð—Àƒ}†R’€C( @‰Ï=¨°_^À8üÓ¼å’9ý$Õ›¤ð„#µöÂXûJ Qñí!�€NÑÚˆ}‚}ÆÛÒÂâw™Û_×ëu<Ï‹”R­$IT𦮔rªÓé8�FC b1wàÎ�;Æ�®Ï_~žóçÏ#|9P̨T¡àÐx´>¦�`ÈBF2ÓåÇŽãê•+ìlïà:..Òëõ¬`Ã,6pÿþ}Ç¡ßïå_!òpÀAŽ[„ïûLOOóä“Oæ$K)Å|ÀúúúžÂMŽãˆf³I»Ý®ŽÖ:B¸qßËÄ‚RŒVÅŸÜÝg8% (‘£$%~+ð˜j�Å÷Ñeûù'˜¸ìsºa¢ûHjžÓq¢]¥´¨2›Â¦h�fqð�àÇ�ÑX?ão5ŠÙô¾ïëf³©«Õj¢”ÚY[[{Øétâ8ŽkžçZëJF†òl¬|mm�N§ÃêêÒq˜››GLI<<G„Áh .p¤ÌŠ*Móò@ã`±$@P­U9S9Í¿úW_gvv–ýýyð`‘�¨µow¾â½�RÒï÷Y]]¥ßï�MÖs×us¯ÀaIÀ‘#Gxî¹ç¨Õjø¾ÏÏþs~õ«_íBÐh4D»Ý„O"I’)åŽRª—mVþ_Œbà­}†S’€@IJüá1Õ‹9ãB?Ç�€/Û “X?ÒšØsÅR0•**�¾¢ê ¤:�äo5þÅg½-� ‚ v§³µµµÞív·;�N;Žc DQ9žçBÌv:�Æ.ã%„ Š"–——yóÍ7q‡—_z‰¹ù9¤ PJ˜Ø¿�ÙB lž»Ò…2ÄL[aTZ¸X10??ÏóÏ=‡ÖŠüàÜ»Ÿ™™™ÜXï«}`gè‹‹‹ù:›€¹xæççóDÁÃÂÊÛ¤Ê$I¸ví[[[A0q?!õz�n·+´ÖÇ…^EïKJ)« àÿÓ;àæ>C) •$à·%(ñÛŒq¸âƒq{=ñ¯aHÀ×R͉VBà9Ž˜*ÝP;ž‹ð½!”òRî’Ëù(1N4¨èö·�R*×u•”²¯”jU*•…4Mïloo×’$©!’8ŽB8Âô³¯µÛmg”Øp@¯g”÷*•€‹/ròä)\×é0(0w@ YHBÔéšU ÀJëì³0M~Ž?†t$+++loï°½½�»ñí˜öºG6 µfss“$Ið}?× ° ŒŽãÐh4«�� ø¾O¿ßÏ/oݺ•‹M²»RJ[P|Ïó")¥Çñƒ‚X�þÓ?à-&{°&…½Jð[„’”ø­Â!Õ‹w0úí¿�jÚi¤ß÷\Ú¸"v%'¢'ZÄIŒçA á€Ld¨3$% yéš ‚ ŒãxYJùê�7®1¸?W�ãZk•¦évÇ"«•?-„¨ZOÀè1…,--Ñjµ²Æ;šééjµZV`ºš±/€ÍÂ(ýå­�óL@3*[M)0d£Z©pöìY¾ùÍo2??Ï_þå_±´´tèÄ=[EQNdl=¿R Çqrí€ÇñXñÌ3ÏÐl6BP­Vyíµ×¤ùÐh4D§Óñ…¤”µ4MÛÀV&Æø+{£°ëè@‹ë£U2f‡’|®Q€¿u°´=£$`Ò~\NÀ- ü_˜ä,’TojHÁ†º*à%iâö£M7¨Ô+µZ£*¥ôÆh|(ŸÝŲ·$J©­0 ·£(Ú¬V«¯ommÝÔšÙzÅ×�ßæ³cµ� w˜ív»Ôjµ]cp‡8޹}û6žçEW¯^åØÑ£x¾‡ÐYc$!Lˆ¿ •4$D¡9‡ñs4¦ë¯1à£ZÓIÝ‚ ��T„>Bù"UžR½©(J¦jµZ3W>Ž5Ù}mCËI’ÐëõŠçJ)•!B¥TWk½ÇñZš¦?ÞÙÙYÏ®Ûûú¦=ò”ÖºŸ¦iÌÀhT´Ö¾©V«Cc‘R¢”b}}�wß}—8ŽM¿)9zì¨qýÛ™?Ãã6wWì[6™ÿŒjõ§OŸF:’$IØÚØdum•0ìã8äi=è"ØëõrÃo‘DZÊ}yùáaø›çyLMMqáÂ…\€ ŒÇccccÏDC!„%[Uà†tê$I–Ó4í2è$ø Œ'à÷Šý[/–ÃîR ,IÀç%(ñ[�’€½òv2{ßþø]²þZ¦“Òí`L›'ÑŠ§ô!ÄÅ(ŠœJ¥²gBØa ”*iË©u¢µÞŽãx5MÓ�4M[ZëVKìµGCò  ¦µVI’l8EQU‘—Ë!¥d}}�n·K½^Ç‘’™™ð®È,¦oÜþ6n?|S ã,37h­QZãû§OŸæw~çK¸®Ëwþöoy°³CµvðGžý³°÷îÖ­[ôû}jµZ®ì'¥Ì§‹`–áÏSO=EµZÍå‡úÓŸ{7cãEÈþ~ŸB42¹àÕtØÍóU ø‡qCÈÞíï\l–U’€Ï9œÿößþÛoz %JüFñ§ú§�ëvßo? ,bôÚO2 ÜÅYunlµÖ±ÂKÓ´šÅŸÅaâ×ã$}MM|¢³uJk¥iºš$Ér’$kišn)¥¶´Ö?V0nââ+É^ös<Î�‘#­µ"!„B8išúRÊ]Ö@§iJ»Ý&Š") |Ÿ ì*'4¦ÇûEÖ[ hìíO ²ð�5UÖ‹ ø~ÀÔô”ñ0HI«Õ>po…âvÅ$A›àyÞÐx§w€½Çq¨V«T**•J~Ÿ¬2ãû Ïó •R®”².L¡¾Ö:eÀ�NSÀìæSãBYÅp@þýŸþ韊Òf|~PzJüÖcLb ŒTœq8ÀèëŒTë o@­ð�tš¦m¥T(„ð„�ÖºÒív�~¿/|ߟg5Ö@EQ¤3w¿ÒZÇ@ª” •Rý$I–’$ÙÈÖ·01âÆÀ«Âû¨'ÀbÓáOk݉ã8@¸®t»]W!‹Fá[f ¤Äõ\æææp'›Y9`�aFH „Î5™,@ñΓ© b¾l4Ôê5’$¡R­E!�-Ñnw4c·†Xg��Üñ­¼g@ñ7p]—f³ùX²Á¾ïãy/^Ì[ÿÓ?ýׯ_gccƒ$Iö<^&5\í÷ûg´Ö±çyQ’$+išv„¾€yæ·°nŠž/(=Ÿ[” D ƆŠuчɰ†½øÙÐkÀÛÀ³˜‡q�ƒVk­â8^ÔZ÷}ß?ÔµÖ^†„a˜Çœm Úf¨[#UlàcŸÏJ©næâßQJu´Ö}¥TœÿUL\¿ÏÀð§#ËÅñÛëBóSŒ¢C”Âw]w¦ÛíVëõúXÉà ØÞÞæõ×_7m„]‡F½ŽŸÅÒu®þggÔ­²ŸE˜Y¾ÆÐ+m¿‘÷0(%MŒEJΞ9k:ü¹ó7ËÇ�ò®…�U8 Ã�$I¸{÷nîú/†”RÌÏÏ?VR @½^çܹsyï­5¯¾ú*YéåžûÚ<¥Ô)!Dó|_JÓt‹Á,þ9Œ^ÀÿÂüî/yäsI>‡( @‰Iv…¥Ç’݉t SŸýp9{U²ï¤•Ü”ã8óŽãÌ!ªB7MS‘¦iž,–=óñe.þˆ³Ù~G)ÕNÓ´­µî)¥¢Ìðkà6pˆÙíö/�Ñd@$<Þþ x#S*¥6ã8–€r]w®ÓéTÆI[òÒét¸öú5¢0¢âûœ>}†Ù¹9„ïe}Èä�'¶W­³QHŒ²àPç lþ€Y®T+œ—$às‚’”(1ûx`o)Õ¢±7û/X7[z°²û IDAT· ü3Ƙ¾\ÐFu/JÓ´“ 8™N@N”Rq6d5r^�1öw0Æ¿3æü£Æ”Œëþ/ŽÁ^ÃÄ–³Îˆº“¦©Œã8ð<ïd’$³ívÛk4»ò-=Ï#MSÖÖÖxã�7ˆÂ� 8}æ4333ưZ÷~Qø?dôж&d ÔkuNŸ>�çN¨4åöÂJ©}Ë/‹^›¥¿±±Aǹ4°�ù[T«ÕÇJ t‡Z­Æ™3gH’)%�N' ²a‡IÈ’ƒV«5ëºî¹¬TSh­w²N‚SðŸ�ÿ ´'¬$ŸK” D‰ ØG#Æ“€½¼Ö˜:Œ'.°‰i.ô&ðÆ#0§µÎ“áÓ4µF˜ŠØÂÄè?Àd|³ûÇÿdÌz»ý¨÷c”ØëøGL>Ãy0j�išÞð}ßOÓ´iÛ�ÖÞæwÞy‡µµ5¦¦¦�RR¯×óÙ¹(Xò¢!-Æú).êab „-#„©f“çŸ{)@+Åí…¢(>”þ‚RŠ0 ‰ã8OÒ”RæÉxÖS0??Ÿ'p>N8 ÙlrášÍ&qãy¯½öš-ñÜsÿ¬�°×étÎ%IRTÇöoÀî|Cþ ØÙë’G>—$à3Ž’”(±è (>Ñ÷sù� ¸#ËÖø¾� ÌbÒÇ€£@ƒAuœEãEØÄ(kÔø�«óß+P¼þI@ü;ÌÌ€$I !RÏóžN’¤ÑívÝq’Á€íxÇw¾û]:Ý.͹sçh6x®7œ �Íü³ÂùÛXc;œ# %h-QZsæÌ9~÷w5Ý^Ÿ›7o•'vÛ8ŽY]]ÍC¶iP!3Ÿ©©©ÇØvÂ_ûÚ×rïÂ�7X]]Ýw¼¶÷ÀÎÎΔçyÏ`~³Å4M× ›IÀö^—<òy (‰Àg%(Qb€Àø¾–H&‡�±uƼ;˜r½ L 5ºc\|9HèA±¿ëœÀb4`ÔKðw˜ŽtGÒ4Ý´”²�¢hµZm×TØö X|ø�·nÜÈ<’3gN3==�#�,rØï¿ËÚ %@þu˜š2íy_yåkX ã{÷îÅAæ¶ß¶³Ûí²ººš—ÚÙ~Çy¡jµ:ÔKà °á€óçÏçåžBnܸÁýû÷sïÃ$H)™ššª´Ûm_k}ÖÞ¡¬:ÀVeØ9Dq°{’(½Ÿ” D‰àá–P-¾Šr£Ùù"p ß¹Ù»,¼KLl_^CÃ-œÏ¾�ÖøOrùï—Ã`Ü6àûÀ·�i€4M;½^ïý ´çy�(Š\)¥'ìys³³,>xÀÏÂ�Z­†çyFûÞ8bØÐe–,ï&˜ß�ÂJéÜ;0T=) Þ¨ñ /à{>hÍ�;wét:&E„aÈÊÊJÞ{Áê3Ø¿ÙÙÙÇN Bàû>O?ý4sssø¾O’$ܺu+Ï?Ø YHEt:�SBˆ Žãû˜¿%‹yà¿ÿC:'¡$Ÿ” D‰bŒbà^·ÑYñ8"P4 –ŒÎþíò(ÈsØíu°ïãÇAJÿöÒ€É€Â¶ÛŹ?ÆÙ¦DµÖ©ïûgûý~SáŒÆÝí-ÖZ³±±Áw¿û]¶¶¶p‡'Žç}¤­°!€¢H€¦†\GÀþtÖy�…´8ŽËé3§ùòW¾L»ÓæíosÿÁƒ\ti?X;—$ J)Z­KKK¹8�õزÁéééC÷°ÛzžÇôô4W®\!MSÇáÝwßeiié@9�Fƒv»ÝžB¸q{I’¬1Pœþ †¬O:% øÌ£$%Jû�€bŒ¼h˜'�QP4üûÁî<€â8Æ…&åìgü‹z{]–ÀŒ’ƒbòý&ðï1! ’$ÙÔZGRÊÀu]Ñëõ¦²™íØÄÀ~¿Ï{ï½GµZe~~ø"§Nž¤^¯Åþí õ¸zx•ÈÙ¹7@ ÁÌô Aà…!®ëÒíõèv»¹Q=ˆ±¶BA½^��� Óï K´ÕZëÜ£aãù‡ T*Ο?�”’J¥‚çy$IÂòòr^®8 RJšÍf¥ÝnW²ÒQ´Ö©Öz»˜fXcüßìþû(IÀg%(Qâ�x OÀhXÀÖÑY´].9æ}tö?ɰ%Åõ{Íþ)œs4·A�|ðøð-»sš¦Ý(Š>”ïûSÝnwW霅ëºÌḬ̀´´Ä÷¿ÿ}Gâ¹.•J­4ß2O™‚ ‰ nŒ¢@fû(•]d¶]Työ¹çóPÁµk¯³²²‚”‡sÙÇqL«Õj#ì8N»÷<­5Ífó±dƒ…T«UÎ�;ÇÌÌL^�` À~!«QÐjµ¬N€ˆãø¾Rj™ÁÝœÆxþ #ý<“*aJð@IJ”x L £É�£=²Ýh&}ñ}/×ÿ8÷ÿ¸sïG&ÿI`œñ‡{˜¾�í—(¥ÚYï×ó¼cív»Ñh4„ëºÃ¦<3œI’°¾¾ÎO~òSÚí¿÷{.óssÔê5¤pL`àáÜ1)3ôá4���ÆÑ¦nÿü¹óæ"…ɶ_X¸ƒç¹{V›Øg« ”R$IÂÆÆF.dgç¶t0MSšÍ&žç=VÁ ˜��套^Ès–——÷ !h6›n«ÕjgÉþ¶”Rk™N@#ô?)IÀç%(Qâ1afH´ß�kk ÇKö‹ýïåšGŠI�ãŒþ8ã?ÿ½†ƒà=LàÈóÖ•R}!„t]×ét:µF£¡Ç{Maòëë׉ㄙ™._¾ÌÉ“' ‚ ÷ˆ¬6ÐÄý‹žk4 ñÿâEI‘_‰ãæ�ÌÓh4ŒË^iVVV÷Þ±ÆßÂ�N§c‡2ã/¥$ C”R¹çCJ™“‹Ã†Çáé§ŸÎK«ÕjN<â8ÞsÿŒø�Nç¨]Çqà ဒ|ŽP€%>$( ? Ç‘ëfOǬ�ý�ž{\Èa’Á^†/Àa 0*‡5àE­u”µ/¾§µV¾ï?ÕétD³Ùk…T+.òçþçÄqŒëº;v,kÍ+‘"‹Jr`÷5ƒÐYCÎ �”µIÂHƒqÓ?÷üó8®KÇܼy“ååIö�]õøV-ÐuÝ<>oÁHýA@¥RÉ›=.\×åøñã¼òÊ+yÇÈŸÿüçlnnî« „Èr*ôŒ0í¨�(Šî)¥ ›Õ1á€?ìzÁpÿ€’|ÆP€%>"/`\¢àhhÀ>HÅï“L6â£`tÝ^/‹"qaÌ÷Œl;ºü  Ši‰LÖ¼h[á ÓFx¾Ýn×ëõú®Ø¸ ÄQÄÊÊ o¼ñR ^~éefçæ¨Õjh‘f]Å�Õ)þ2zäsƆ6 :ó�;wޝ}íkY‹aÅÒÒÀ�Kù2oZkÖ××ór¾bó¢8Ž9vìXžÐwXØdÀãÇ�såʤ”$IÂ�7¸wïÞ¾yYN€×n·kZëS¾ïk@gáë ¨üFlj×aÿ’|P€%>"Œ ÀÁ‰€y·ž‚¢Á/.3f¹x¾I`ÜòA�ÿ(Š3¾q�qãø&ð€Öº—$ɺÖ:¦Ñ‘ßívÝLx×q­«ÿí·ß&Ž"šÍ&/>ƒï{¹ ŽÀ&cÿ }Ó,(Ë(–Ú „q 0;3Ë/^¥×ëÑëõÙÜÜ$Š¢|ÛI.ûüœÙ \A·Ûͽ6¤`» :ŽÃüü|ÞO`¯c�ƒ <õÔS4�œx¬­­åbDűŒo£Ñð»Ýî|†Â÷}EQlZ [ð—˜Ü޽P’€O9JP¢ÄGŒ�ˆŒû\4´£Fu°ï�ûÚkÜ“Œ?û¬ÿ¦oÀ)@h­Ã4MUDzҴS–LBÇÜ^X`í¿ÿwþý¿ÿ#¾úÕ¯2;;‹ïËü̃Ä<5t!EÆä�ëLXÈ!xá…ËT*|ßçÝwoòðá£CeðÛÄÀ8ŽY__Ç‘2'®ëæe‚óó󪋠ëºÌÍÍñ•¯|0¡†k×®H6Xa[7„g’$¹E‘�ñ Ìïö'À_azMì…’|ŠQ€%>&²\p\h`”0fy¯ãÙ÷ýÈÀèw£c=ÈÚzŠ%(£¡ «xÌýÊôé…Â�¢hZJY³½ù�²d;¥ív›­­-~ýë_S«E¿¹¹ÙLÖ×$ýå‰v ™(�¹Øø`_¯B!1Pj­O(¥R¥Ô¦Rʶ ö�ÿü5°°Ï�Jð)EIJ”øqHo€ýnÔØO"0žŒïýÈ{¼ïuì"ÆM-÷ó_w1$à�H·•Ri–øD†U!•JeèXövJ)ñ}ŸwÞy‡0 ©×k8Î<ÏÇq$BË�Á+dþk�%ÌP–ü§H nr2ÐHÂÌÍÎðòË/Ç1Ýn—·Þz‹n·»o8`èFi�NSÚ�q’ä̓¬áö}?¯°ù‡ ïË“O>ÉììlÞåðþýû¹2á~¨×ë.0E‘«µöã8~7+´õ…–ü-¦ÊcÏË.,—$àS‚’”(ñ à1ÃãÈžLzßk»ý0n»QPÌ%.vÝ8Éà0I’u!„¨^¯wTáïÕª·ßïsÿþ}¾ÿý¿ã•¯µøÒ—¾DsªIàûE+³{6é/ç¶IÏÀ E–~¡Ív¾çñì³Ïfù‚[·o³º²úXá€$IØÜÜÌ«ìû©S§òlþjµzh`á8Íf“^x!ïIð‹_ü‚G� ]ÿ$dÕà¤"‘RúQÝg@ÀxqBŠ^¢’| P€%>A<†G ¸Í~†Ü>£Ë“\ûcÇ0î�¼�îÁÞAæì ‚u’Á ÖZ«4MײÓùÝnwJJŒfÈÛ¡$IÂÖÖ7oÞ¤Q¯S«Õ¸té³s³øBf¡€á|6ίóKÉ‚ŒÕÏ7Êiƒé6„ãŽ=Šëºôû}¤ãG1½^o_ñ�¡•åØ �$I¨T*yÀó¼<<ÁX¥Äý ¥$N�:…R ×u Ã!kkkù¹÷B£Ñð;�ާµ> ¥T<Cþ7ðî^—Ìp™`I~Ã( @‰¿‚ ÿpÀú€§:äç}{¹ 3â¸|€"Æ‘+üoYá4ŽcÏó<ºÝîÑz½>ÖÚáôû}Þºqƒv§K£Ù Z«âûAvRóŸ5ùãBÃ#´!‚Ý—è8’¹ÙY^ùÚ+xžO¿ß烅hµZû&ÚYج|×u‰¢ˆÍÍML8Ý&ZÒ233óXÀÂó<Μ9Ãìì,J)ªÕ*?þñ�ét:ûŠ�ÉGBL‡aèÕ$IþOEý‘ÍþøpƒÉdµ$Ÿ"” D‰ß &8¸�ßóð‡Y˜‡î>$`ô!?.°¸l_÷€Ÿ`$ƒÍ�”ê'I²”�C·Ûíéf³ŒfÈo_»ÝæÞ½»üä'?eg§ÅÕ«WiÔëx¾—“D&þSˆÝëÑcéA¡ÆdO‚F+ ªÕ /^@i£¿¿p{!¯õ?¨ÛÞ†´ÖlmmqïÞ=„ôz½|vn«ªÕê¡«ì8\×¥^¯ó…/|!O„üçþgîܹ“{ö8†¨ÕjBkíG„Oi­½4Mïdƒ†À ˜xÉ”$àS�’”(ñ)@ña÷1��}gô�uÐÑ0ù”½a%ƒ¿ž�#JÓtËžCá´ÛmÙl6½I1÷8ŽÙØØàÍ7ß4í�O<ñÓ3¦¯Q ,ŒÚ†òÛ�„ ˆLK ûV´P¹‘?~ü8AÐÚi¡REEôûý<¦? Eíë5èv»¬®®æ]í5Zƒ�%D>V‰  +œ={6¯ ØÜܤÓé†aÞʸ8¶QÔëu_Jé÷ûý“¾ïË0 CŒN€ ¸ �ë{ §$Ÿ” D‰Oö!ðx>¦ë$°WH`\bà[˜„Àí÷Y8 ‘RVÙétf�ÆDA€íímÞ~ûm¢(â›ßü&/^`jj ¥Æ[ä®~mw®ØmÑ(eò'E!p‡ééi^yåkLM5XXX`kk‹ƒÂÊK)‰¢ˆíímnß¾MÇCÁ†�Æ��= ×u9qâD~Œ£G�ò³ŸýŒ�� Œ=ßÕj­u= ÓA¸QÝVJÝa81ð[˜PÎëÙg1ò=Œ'‰P’€O %(QâSŒ}’ðûØa/ã?.F2¸<—}ŽÓ4íÆqü(»¹³³S�ššòGo‡Õ HÓ”­­-nݺE£^'ì÷¹zõ*A%Àu½<©oH'@�¹ÝÅø9ÄP}†õ Xpá”Ryi_¯×;pN \ýišæÕ2 ²×eÃÕjõÐyö^yžÇôô4_øÂÂt'¼~ý:wïÞÝ·é@­Vs€J†G=ÏK¥”NÇ‹#‰�ßÌÞ_/¬õIÀ¸|—’|Œ( @‰Ÿ1|Ú†cH à“BûA0" ÄI’¬JÉàív[6 gôüŤÀååe^¿v ­5G�åøñã4§š!q2 ³á =°BÆÎÊGŽm�¿Õp]/ŸY¯®®†!‹‹‹ôz}’$Úwlb`š¦t:”Rù¬Üuݼ†ßv?¬Õj‡*?´°rÃgΜÁó¼œTôz=Ö×× Ãp_mƒZ­æJ)ý~ÿ´"ÐZ÷“$I ½À� ür¯Ë¦$¿” D‰còŠ6s’«w4'`4)†%ƒÁTlk­ãl›ãÝn·Y¯×'ZV¥«««¼uÃ䥽òõW¸xñ"Õj9ûÏN0’Ö�Øz ßf)œi–Ç¡ÑhðÊ+_cnv–Ê’ì666qœÃé$IB·Û¥ßïç3}küm‰ ”’Z­vàãŽÂqœ\68šÍ&?øÁXYY9�XP¥R!K œB\BøaŽ*þ&ðê‡*IÀo%(Q¢ÄG‚}H@ñ}\ÿ1f�…U <’�'JÓ4ͪȃ¼z½¾«�^Ñm¾¾¶Æ�7¨7L�K—.!*"O4Ç…°³k› ‹ª¸ W+„™™;vÌÌäUŠ‚$Žéõû2ªÖ/„`ss“{÷îå¢@6Ä`ó<Ï{¬Ä@!ApäÈ._¾Œã8„aÈ›o¾ÉíÛ·¤X­V!„ßëõŽ9Ž£‚ I’,¥iÚ*löus‡øç=U’€O%(Q¢ÄG† $À.Ãdo@£eƒ]L}ù “ ˆãxYk�J)ëQÍ8ŽãA Æ…\×¥†½^/— v‡'N0;;›“€Ç�Í)¸té½^)%?ùÉOX\\$M÷«Þ4j…Zk§×ëMyžwIQ ÃpTðËÙûOö8”5þãZMçº% øð( @‰%>r< (æL ¬c„I$K<‹…�Bv:�€Á®g›5¢½^�G�¡µ&Ló�sçÎR«Õv»ÑuQ*ØŽ*SÔÅ+³%…€°•G:œ:y � ÝjóÖ�ܹó½^ÿ@ÕÖÆi­‰ã˜V«•‚Çqð‡+IÀÇ„’”(QâcÅ!›�&Ž®³xx¥pž~ÇKBOáw:�™F£á;c¬ N«ÕâîÝ»¸ŽC£^çÈ‘£TªU¤HËŠ]Å ­pnw„í1 óJÃVL¸@J�çùœ9})%KKKø¾ÏÒÒaX,È€N§ÃÒÒ2@® `¿·B6LpXXOÉÑ£G¹|ù2µZ�n·‹RŠÅÅEÂ0ÌDZW8@Jét:�c€p§ ¬)¥ŠÕ_4w‹¿ÛgH% øP€%J|Ò8¨dð(Õ ¸Ô0’Á`f–:«ˆ…϶ÛmwjjÊ™d¤DÖtç­·Þ21pßçK_úÇ\ß÷Ñ™p¶q®úgâázà súëAü?ßMÛFC&næôi¾ýíosìØküì§?eye…^¯·ÿM+ÈÛN�ý~/'0išä%�¾ïç†ÿÃè!˜››£V«†!õz�ï}ï{¬®®Çñ¾"DžçQ¯×½N§s$‚+q¿†áhìã ˜pÀwöNñïJð¡Q€%J|ì8€dð¸)ðþ©çð/@x¶p®P)µEÑ‚ÖúT«Õ:Ñh4¤c­ì¬YJÉÇyíµ×pÉsÏ=Ïùóçq2·º�Ò¨jPZ™N‚ææmä’¬—@k….Àu=fgfxþùç^}õçyvÿAPœå§©¹m+++I’æ.zëUp]7 : ìÏå8•J…K—.åÕ¿üå/yÿý÷éï£m „¾ï8�NgÚuÝ BˆJE(¥Ú…MíïgIÀ$ïϸ¾% xL” D‰Ÿ>dß‹q¥‚?|ài»2MÓ®RjRÊj»Ýn4 _J¹Ë`cçÛÛÛ¼ûî»xžÑªÕjY,½‚ƒÌgñz ˜¹þ³ ÉW N¡µ-Cý†ü àì™3Ôj5¶¶¶H’„û÷ïï©Ã?|\=$Õ»³Ó"IÂ0ÄqÌõb#ò6ÀF,Èu]Ž?ž—*¥òDʃß÷])¥ÛjµNd²Á½$IV3± s›žÍÞÿw¶Æ“À’|D( @‰%>1|ȾÅò@1òùGO€• ¶3åÕ0 Sà™n·ë5�‰uq¶ßo\ËâÝš—^z‘S'O¢¥ë4@iž©;Èÿ/…°µAPáÈ‘£|ã¿GµZess“n¯KŇR £ØëõX]]Åu]â(&‰cÒÌpôè1šÍ&ÕjõPÇÅÌÌ W¯^EJI¥Rá/þâ/ˆãø@:®ëÒh4œv»=íyÞe­õ½4Mï`4¬Á¿„ùø[†«FQ’€�%(Q¢Ä'ŠJ�óìWÔþ=ŒdðQ»mš¦]€(Šh­!Ä‘Z­¶K-°06â8aqq‘_þò5*•€“'Oâ8NîFEGBžõ?0ö£¹ùEf®!H#?~ü8Ï?™n·Ç;ï¼ÃââCz½î>—Z¸)…ä¿0ŒX__GˆLØuñ|/ H)sñ Ç� '\¸p�$IhµZ\»v-o]¼_2£çy¢V«9ív{&³ÏpØl'Á‹ÀþØË½P’€‰’”øÿÙ{ó&9ŽóÜ÷—Y[¯3ƒ™Á6À�qÀͤ)R«�iÙ>òvO\;ÂþöG�¾‰ÿ°nèXÞNÈ–dêHÜE $A;@C€XfßzïªÊ¼TeuuOÏPHÖÑ3ÝÕµdVwôûä»ÏÁC±l B�eÉ нê@t{þc£'ƦK)P*" )”Ù`?å�2¶m3==�ïõ`ö1ÿƒ `vv–……‚ @A.—Kr\×%ŸÏß50¡\.£µfqq‘W^y…B¡°‚\EÁèÖ¬ð Bˆ|ìhÒù.lþàŸ‰>WCF6€ŒdÈ�á¾Á%ƒ{Å‚ Ö bD¤ø•ôƸO½BØËËË£ƒ«‘€´ëúÒÅ‹‰ÐÞ½{6;E’Á±K RŒìŽq÷ A$%œJŒÊ £ �ˆtâô[·nåèÑ£X–Ň~ÈììlÓßÒvNkÍÌÌ –eáû>¾ïcÛ6Žã$Æû^<&ä099ÉÒÒƒƒƒI£¢´X�I¨4D M¤”"~DÑ ÃpAk� ¥ã X\c8 XÈ�!Ã}…M�€Þ�@¿²À4Î5�ù=ó¾Öº†¡BH!„¬V«N±XtÇéûÛh†55=MÛ÷)•Ë„aÀáÇ#¹]ÛIí§Ñº“à'â¤ÀˆÄÆß´ L^GÌÛ¶(‹<ôÐC¸®K»Ýââŋܼyë®jøµÖT*”R´Z-r¹\Ò1ЬÈK¥RTåp$`qq‘O>ù„óçÏsçÎJ¥RèEÚР˲°,«(¥Ü&¥\RJYA̳’ü3÷H úÎmfžŸd C† ÷î²o@?=ÚÞpÀ‡@8jÞ×Z·|ߟŽß—õz}[¹\¶×3€‹‹‹üô¿ÿ›jµJ!_`ÏÞ=”Ëe„�X"ºœ±<0 âói3òh#èW¸!d¬0¬ UH¹\bß¾}X–Dk¸~ýFÒp30+îz½N«ÕJÜþ–e%‘€»Ñ ¸rå ?ýéOyíµ×¸qã®ë&!3Ç´7 í Hyp‡B¡ }ßPJ=æû¾£”j)¥Ò߃àÿ›(ap5¬Iâq}!½È�!Ã}‰>$º¥‚W ¬‡_y¾œ>¯RjÑ÷}!„�ËËË[J«‘c¬ƒv›+W®ðZ.Çï«�½{÷144”t LË¡ ÐQwÁÔ„Œ(DI‚RˆX8¨c4=Ïeר.Ž=ŠÖšK—.133“„6JŒË]JÉÔÔT²ÍT]#}¼O@£ÑàÊ•+¼ýöÛ¼óÎ;,,,$ÂCiß6øé0€”2ÉGpGxžgÅIš»áûþu¥Ô¢Rʨåüo`n�!öÆŒ�€ 2ÜÇXE28•N¬NúÖ÷Çx›ˆ$m„Ã0¬*¥!„ˆJ¥â•Ëe!¥\5`Û6ÓSS¼Ûh�ÏçÑ>ŒãØÉ ]'Ŧ�NB]Z©Ö©¨@”(«  pèàAJ¥r4q299µú \ÆÎ-//ãû~²J7ñc¼óùüº9ËËËܺu‹·ß~›'NpõêU\×ÅuÝ®ÿ¤7BO^‚yÏqœ$,Q.—©T*À«µba£t8`ø+¢œ€ÙU†Ù�0~áI@F2dÈp_c �þ¡^­ƒ`úuo8àuzÚk­Û¾ï߉_ºÕju \.Ûk­®C¥X\\äßÿýß™¼s‡�r™­Û¶R,–âÊ€èX“q­ø»mL«Ñ:IŒ¼*±\Zi …<ãã»xæ™§q›ùùׂpÓ%‚A`Û6ív›7nA,{¬PJ†!Û·o§T*­IÎ�;ÇÏþs~ýë_333C¡PH®‘Ì/^ݧ�Ì=M¯þóù<®ëvy3„¦‹`IqXJéj­ÛZëšRÊh y~¬Æˆ2ЃŒdÈ�á¾Ç:žRÛ{‰Àz}jÿ/ O_+ Ã9"c±«R© –J¥œ”rU`âê×®]ãÕW_åø“O²wïJ¥Rä 0D¤Ø‰N¹ÿ£ £MGA‘ÚWHP1 ˲ÈçóŒ�?@»íÓnµùèÊGLMMoX,ȸÝM‚^†Iu@)nJdÂZkÊårW7D€¥¥%.]ºÄ›o¾É»ï¾ËÔÔ¾ï'!„ôÊÞ<Ò¯Í}ƒNܵäC)¥(•JV­V+j­Ç<ÏÓívû&° ”2bA%:‰� Ø2�!C†Ï6¨h~Ü×Òèũޙ÷Ã0\VJ5„¶ªÕjN©T’B¬hD¬\.³°¸È«¯¾J.Ÿ#—óxðÁq]7 ˆ¸60¥˜RJU ô ÔäD!…HVxxxǶ@�F“………dE½ŒÀ ^¯355•ôÈçóÉyŒkÞä>Ôëu®_¿Î+¯¼Â»ï¾Ëµkג΀ék÷KT42Å&L`Ú¯—Ô“ªÕꈔ²¨µÖ¾ïk¥”  H§Dp2µ=M3##2døÌ`“$ éòÀt( A§�ðÖÔµ‚à !ìZ­–/•J¹µÆ†!õFƒwÞù�F“|¾ÀÈÈÅb�^îÑ·ÆAºÛ¹‘Ø )Z#c a„ P,²k×.Ž;ŠðË·Ik½hµZܼyß÷“Ž„–e1::J.—#Þzë-Þxã Þ{ï=æçç“q�„h~"ñ$¤áû>‹‹‹ìÙ³‡}ûö±¼¼Ìüüµj�kÌÎÎvöß LÇ>ß÷¹sçNW#!Íf“f³ÉåË—yç�w8}ú4SSS(¥°m»+¡·ÁPš ñÐCñÄOpèÐ!¦§§9{ö,ï¿ÿ>­V«¯f@RJQ,­Z­6 µÞéy^ÁÍ æ”R¦mpžN+á›ëM=õü E2�!C†Ïî�¬e—�ÿ""fc†ËaÖ…®”2ßh4d>Ÿ—k‘ß÷¹~ýcnß¹�´,†±Fp])Ì*W£MY{OtHÅÌél7Õ¦¼ÐLhtdÇqä•W^a~~~ÅŠ|=˜ä?Û¶©T*I÷>ß÷q]—™™®^½Ê¿þë¿277G»ÝNÂi£�VLìMæ³m›ññqþê¯þЧžzŠññqîܹÃ+¯¼Â�;w˜šš¢Z­®)�p@½^ö}J©P)•n›˜&Ÿ¬7ýÔó/ È@† >“¸ Ð/)°×Â,Ò!¥ô¾ïßÐZ·´Ö !rù|~M¥¥ív›S§NðüóÏ1:2J>Ÿ#* $NHå��"&‘’B&åƒ]‰u2ª PJ#¤ X,2>>ÎÓO?�繜<ùÕjuÓbAFœG)ÅÂÂX–Å­[·¸}û6ÓÓQ²¡‰åwÝÌ”Ñ7Àéܹs‡—_~™—_~™ãÇ�³}ûvlÛfëÖ­<ýôÓØ¶ÍÏ~ö3Ο?ÏÜÜÜ Ñ !…B�Z­&•R¸®ëR)•N Ìuü7¢žkN=õü A2�!C†Ï,î1 zž›ÇQ8àÛD«HÂ0\t¬°Ca{ž·ª'@k�Cnܸ@>ŸçK�<Â>€m;$E&ó/N ²# ”¡€ž{Àul{€ „ R©rýúu×RÊí?n³oÔkܹ}‹J¥Â�7X^^îJ'¦þÒÛ R|ôÑGyî¹çxöÙgÙ±c¦s¡P`ïÞ½äóy�FÒóÀ´-^ BQ,B ¶Ûm„AXA¨TN€ |øàÚ:ÓÿB‘€ŒdÈ�á3� �€~²Áiô3àSÀO‰ª<³O\ð‘Âj4%!„ðbff†À÷£¦;eŒ¾�îDŒ6Pä”2MƒRÓÝÇXFb�šÑ‘ܸœîí·ßæý÷ßï܈ vTJ£B…åÀìÌ$—?º’ÔꛤÀÕÐëPJñðÃó7ó79r„±±±+ûR©ÄÞ½{yùå—Ù²e Õj•�?þ˜………uÇ í�!Ä#DဖR*¤sã\à‘€«ëœî C2�!C†Ï<Ö!• î5ä·€W€?Hm c± Û€ª×ë»�œçy+~KÓªwA°´´Ä‡§OcÙ6O=ù$#£#8ŽKœ××9&fF(‰‡ÓQì’Ò5^ƒ¸Ã q�ïÙ³‡v»EÎËqæì70=�ív”˜·–,²Yù§Ï_«ÕX^^æÏþìÏøæ7¿É‘#Gî{!DRiðÄO`Û6?úÑ�8yò$ÕjuÍ\ó¹‹EjµšÐZ� !,)åõ81p9µûŸ?.¯w è|_>·$ #2dø\`“$ ×ýOÏkó¸üøzúRAÌ•zõz}TJY´m[ô ˜¤¸V«Åµk×è¹Ï�³}ûvÇIVÿt$ƒRD 5Du4owÛ ‘lw‡ÑÑQà:.Ë•e”R,//¯IÌùÂ0ª¨×A´�6¤#� ×{.3×v»�eYlß¾�gžy†çž{ŽÑÑÑu=¦¢axx˜™™êõ:—/_¦V«áûþºyq8`¨Ýn;ñ8E~J1P…vþ¸Äê߃ÞïËç’d C† ŸW¬EV³"ý¶_!r!¿˜Ú„a¸Üjµ®h­Ãjµú`©T²ÇYÕ: !X^®påÊÕH/ Þà…^ˆ“åìh°ZÅ«aÙi(U Ež‰2ÓÓÆƒ%“dYC[†xÈÚG³ÙĶmNœ8±®àŽi\¯×ùb3†Þ>½ó3çççùò—¿Ì_ÿõ_óôÓO322²áö®ë2<<Ì7¿ùM†††øçþg®^½Êº:…´Ö­õ¾8ÑfUgÀ. p€³kœêsO2�!C†Ï z¼Ð_.V— ^Í2^ 2Ï™}´Öm¥T5‚I@Ôjµ�¥R)oÛv_/D1ýV«ÉÍ›79}úCÇáÑGeëÖ­±dp<8›÷”m‘)��(Y@€†´]ºã€ÈP.•9p`?Q��ë×o°´´´Â€iàf³I«Õê++ll]¿¾a¢µÆqŽ=Ê‹/¾ÈK/½ÄØØØŠ®€kÁ$îܹ“cÇŽð³ŸýŒwß}—F£±®N ŠÅ¢B¸­Vk»çyø¾ïA0› 8Dù‚/0 È@† >WèC Ûðo´�°èyœ&*+;–ºV;‚Y­u[J™«V«²\.»RʾáÓ_^^æÒ¥Ë4MJ¥Žã°eË–$¡/Œå|“êÀø�èm� ºãîIÞA, …Àu=¶oßBภ¸víËËK]…aÒn·©×ë+²û{½ý<J)<Ïchhˆ—^z‰o|ã>|x·¹?ŠÅ"ûöícûöí4›M*• ,//o¨r¡P@±¥ÕjåbO†L8ÀLðÝÞ3fº©÷’©Ñÿ;ó™'È�!Ãçë4Ú èÅ ¢Õã£ñk¡µöÃ0¬´Ûí ­u»R©Œ—ËeiYÖšw‹KK4._¦T*Ñn·yæ™g¢ì}ËŠ ³î,åÓ³ˆ5ú¿ÔŒ�LPÔyP³ehˆGy„0ŒÄ~Þ}÷Dr�RŠf³¹æ [÷†$R^6ضmÇ�ç…^à‘GYkú‚iNôâ‹/²eË~ò“ŸpæÌnÞ¼¹¡�BÔ¢Y»Àƒqù&ÀTJ'"àï§¶õÞ„ôw&ݪá3M2�!C†Ï%Ö!«…zŸ÷3â¿$* <˜ºA,!lÀ®V«Ãår¹©®s˜!…aH£^ç£Ë—qÏóØ÷Ð>FGF�Bv0+ûŽ @�G ~-Ѿ1,Kâåö¹ÒÝü<Ïc×®]|éK_bpp°£lÈÚ+õµ�H)i·ÛضM«Õ¢R©¬«�Ïç-!D^k½•ÎÍšVJUS»}-~ïä§úÜ‘€ŒdÈ�ás‹5H@úGz#½á€×ˆ~?÷§®U÷}VkíK)�jµê–J%[J™6 L«ÝÉ©)¥hµÛX¶E!Ÿ§X("t·×€V*ötbýB´2J5ãÑ:J`I ¡4Ú‚±�;‘R†Š·Þz‹éé(ÛÞÄð×¹Ÿ] ~Ò¯K¥;vì`÷îÝ4 ( ]ñÿ»%ù|ž]»vñÕ¯~­5KKK\¸p!é~¸Ö¹…¦³á@³ÙÌ !ß÷U\Цãòÿ:Ñgz¢ßiâÿ«‘H”š?;$ #2dø\cO©íý¤ƒ×Âω\Ǥ®Õ ‚@ !>VJµ„»ã6«žDJÉòÒgÏœ¡\*¡•æÑG�úÈTO!ˆlO'' 3ôΤ„0ÄA'r¼ÊtŒ÷)ŠìÙó o½õV¢hJìV³]éØo.€”Çq˜ŸŸçìÙ³´Z-„InC,ÔsO°,‹ÁÁAž}öYøþ÷¿Ï™3gXXXØP8 —Ë¡µ¶€Ý€'„ð‚ ˜ Ãp)µÛ‹Dvñ—kœÊ�ó�In=Ÿ1�€ 2|î±AÉàÞÁõúü7ð20¿ïk­•ïûs€l·ÛùjµZ.•Jù~$À]#tæÌÂ0Äu]vïÞÍð–-HKv‘€Î$t¢Øyo•²v… ¤�´ü6KKKqBÝR׊>màû!½ÝŒÝq\×EÁÜÜçÏŸOÈ�ã8ɾ¹\®ë›…”×uÙ¹s'žç1==M¡Pàƒ>`qq‘v»½®N@>Ÿ—RÊR½^‡Øˆk­•Rª’Úíy"b÷ÚÃ1Æ?ý�ùÌ‘€ŒdÈ�á �M’€^¬¥ðS¢ºò­©kÕÂ0ív[{êõz.ÎJï{³R¿tésss<ÿüó”K%áÄïG­„)`eÄyŒ1'ôi­�RJ«T´šM&®]å¿þëÇÌÌÌ�Ëå’ú}èÄõ׳]BDÝý<Ï#—Ë¡”bnnŽz½žëy^¢òg:Þ+\×eÛ¶müÅ_üÛ·o§ÑhpöìYfff6Tnèy@©Ñh�¶R*Hõ 0xŠÈ>þ|•Ó¨Ôã €Ï È@† ¾0¸ÇæAÐ?' FÔAðO€-æýØ¨Ìø¾/uÔEp[©TrVœ1…B¡@†œ={–bD8xð`¼zV £®‚063F¨“‰B'‰@kEËoS©Tyýõ×8yòfffW}:¦oôûÍë~0«ñ|¾�¬ò¡S 011‘�ŠV«•T ‘Ïçûžs3Bày_þò—ùÛ¿ý[~ðƒðÞ{ïm¸ñQL¨×ë;]×µ¥”nHŸà(QGÈí5Nׯ<ð3A2�!C†/î�¬å»®Ði#<_§†a`Žk·Û¹Z­V,‹¹¾'×uQJ1==Íé3gPZ“Ë娹s'år )¬xÐ:13&ã?ɸG …)Œà·}f¦§¹rõ'O~ÀåË—‰Ýà‰ÛÜ�~b?iûeŒ¿çyqžB'þ®”Â÷}’óY–•< Áˆä�×vׯã}عs'CCCLNN¢µæý÷ßOªÖ;¿çyBQª×ë’T’_†5À”< ü9ðï@#=„žÓ}&I@F2dÈð…Ã]�€´Z`z[‹tÚÍÆ0 M|ÙÖZï²,+gâákáÂ… LOMaÛ6O’?Œã´h¥c…´J‹gdÂ0¤V¯sñâ%^yånݺE³Ùì2Žé€0 S¤€$Ì ã.€ÑÊ?Ÿ¸÷{aìœîÉår]Æßó<6¥¸¤” þø�ÿ˜ÑÑQæææ¸rå �F£Ë3±\×Ek�o4ãD®|©µžˆ; <ü%ðoDD¯ßw6@ úîmrš¿1Xßýîw×cÈ�!C†ß:¾÷½ïÝÝò³éP@ ¸_èÙ1‚@�Ê€¨ñÌÌ W®|į~õk&&®Ñl¶âc:Sè–ö]½‚@%®|ãöÏårrÝ›pÀôôtRÙ`Œ¿É=p]Û¶7Ü(¨L’áØØcccÉö·ß~›ùùyZ­V²ßjp‡r¹\ªV«–ÖÚdõ‡q8€øõðÿÿBDòº†a¦ÍÊDÒû¶@F2dÈð…ÅHÀÝÊß&*ü¢’2Á¢Ö:D­VÛ!¥ôÖZK)Éçó|òÉ'ÔëuòùBHöîÝK¯�6ÆœHe°Z­qòäI^}õUnÞ¼™ÿ^Dµÿæ9] �J©ÄmŸËå6äVï…ÖšÅÅENŸ>�(j­q]—\.Çààà=€^<óÌ3”Ëe‚ àäÉ“\¿~}C„ŶmJ¥’[­VwI)]!„§µ¾–j Pþð€k}N#è®0¸/I@F2dÈð…Æ]�€µJÓ�DedßHí“tBÈZ­fžëº}=&†!sss¼öÚëÔë lÛfxx8jxcdãŠß÷™™™åĉ|ðÁIÌ¿w¥�¿[ã?¾‰*à¾}û(—ËH)YXX¤Ùlôæª0׌Ú×¹}û6¶m'¡)%A088xÏÕfü8p€—_~Ù(róæÍDFx-ضm X•Je‹ÖÚ²,+§µ¾­µ¾C”5„ú‘—ç<Ý•!½¸¯I@F2dÈð…Ç=zÖZ^^%ò¼”º–ÁœÂB¸µZm«B:k,¯-Ë"N�:…RŠ-[¶päÈÛFz^RÕâÏséâE^{õUnݺE£Ù\7Þ+dÛ6ù|žÇ{ŒmÛ¶áû>çÎ�còÎ$A¸²_Àz0ç7Ò½ÆíotLV¿eY÷ì �R2::ÊW¾òÚí6�FƒÙÙÙueƒÍñ¥R©P©Trív{(ö4�%:Ÿ¿CâÉÓé°ZŸâû–d C† èK ›¤Å^ÒÞ€0õ¼Ÿe¹@DžKo ‚`Akh­UµZÝ:000¸–PŽ‘Â�ŸŸãÕW�eYI)œµZ‰ØIÉ IDAT�7Þxƒ7ßxƒ;““‰»}3ÐZ³gÏ{ìQŽ?Îðð0í¶�mYx®Ë'7oâû~W™àzçKWT«U.\¸�´v'!ƒƒƒl¤Bb=ÂãÇ�344„뺜8q‚«W¯nøø\.'�†ìŠIÀ`šîvÁ_ À[뜲ßÍú�“€ŒdÈ�!CŒuúl& —œ&"Oš÷´Ö­¸oÀ$@¥RqJ¥’mÛvߤ“4×jµ¹yó&o¾ù•J…矞\Îcii‰sçÎqêÔ)®ß¸A)•ÀÕ5þ |ßǶmöîÝËO<α£ÇØ=¾›|.�ïû>|iI4šÉÉ)–——Ã�À�V«E³ÙäæÍ›I( ·«ßj%†…™ó–-[8xð _ÿú×ñ<)%ÔëõD ¨‚  Ýn !„E´Êß.„h訵ð"a C~�È#ðê:Ã2ß›û¦“`F2dÈ�!…O‘@wNÀ{D$à±ô¾ïOZJY¨V«ƒårÙ–RŠÕdƒšÍo¾ù33³lݺ•��&'ïð“Ÿü”©©©duÏgCÕZS(8vìÇ�ãáâ„ljˆ�ëz~@³Ù¢Z­nÚH+¥’pÄÜÜA$Þ„|>Ÿ„Lbä½�s|¹\æ÷ÿ÷Éçó(¥˜ŸŸ§Z­®Ùª8‚DÁ0®Ü°ˆÊ=­uX¦Û�?IôÙ¾B7ùëçQºoÚ g C† zp$`­ý4~ITx(½o¸¤µÞW­V·–J¥œeY«žGJÉÀÀKKKüÇüJ)êõ:ssó´Û­8ùn½¡t ”âðáÃ<þØc<õôSìØ¾!$QE!±,›‘ÑŽ=šˆMNNÒn¯¥’ÛBˆxÌU®_ÿ8 g˜ü€\.‡çywUuÐïZ¶msèÐ!â~ üò—¿äâÅ‹+<¦t±Õjuy%bŠMä xRk}¸E·Dðc�ô†X ½í„áw˜�€ 2dèƒuH@š ¬…~øu"—ñC©k5‚ hK) quÀÖb±h[–µêo´ã8Ôëu.\¸@»í£u´Rï �ŸÕI@är9x`œcÇŽñÄ�óÀø8žç*e4ì@€´, ùÎv‡‡D£»ÁæVìJ…4› ߸~ýz×ñ–e122B©T¶í{X–•TM|õ«_Åq´ÖLNN&žŒtˆ"‚.AüU°ˆâý9 éI:$@‘€€Õ›ÁJù;K Ì@† 2¬‚UH€yn°Ve@úúñs¢ßß=éƒÚíö-­u „(ÕjµB¹\¶W3~J)Úí6µZ-q�›º}cÐÖ3œ�Fƒáá-|ík_åÈ‘#Œ�íÂŽÏÓˆ-Ú’He±oß> …Íf3I>ÜœñW(e¤‡£ÞKKKø¾�ïû‰t°mÛ‹Å{@’ØÇóÏ?Ï–-[ð<�Ÿþô§,//'÷.Žý†aÒ¡ç>J­µB<äµÖ5¢p@ú;pŒèûñ siºá>!È�!C†5°�¾f»Q�ƒÕKÂÒøð20–ÚA°\ÐZ?X©TFK¥’#Sµq&Ž^¯×“8u?;!eGàºWç¾ïÓl6ùò—¿ÌñãÇùÒ—Ž022)õ騳 �¡ˆ[ ë¤Í°mGû[¶láèѣضÇôgãpÀÆ�µéß÷“Ä@DZ“•øƒ>ˆçyŸJ+áè¾HÆÇÇùÖ·¾E†xžÇÙ³g“ë¥ÉT¿®ˆñ}”ZëQ!ÄqàšÖú IÇÐ'ò ¤«î;�€ 2dXl´^r`?Ëø¢æAÛÌûZëºïû-!„ Xõz}K±XtˆŒN²Jm4]®êÔh㇕HþöV ¶oÛÆ“Oç©§žbllWâ7qŒÀ°é-¬£-B ,+J|à�iµÚ�Ï¥Kš¹¹�Iïv�Vk”¥æçç“Æ›‘Ïç¦X,nªê Lxdhhˆr¹L¥R¡ÙlrýúuÂ0L@i�º�¶”²¨µ.ÄÊŽQ8 ž:ô÷ˆZE`¦ÚgHiÒhöù­‘€ŒdÈ�!ðA°z“Í£N§ƒàHúß÷oi­ÛRÊ/V±X”J)šÍ&•J¥KÔfeM~¤H+¥L¬IZìg||œ?øÖ·8|ø;Çv’®<옱ñˆÄ-ol‘”×qØ»çA ù¾†Š©©©5nÃJôŽ}nnŽåå帄QbÛ6û÷ïglllÃ}ÖƒI |òÉ'Éàk×®177·¢$ÑŒÑÿo€ÐZïBäâê€Þƒ¿Nô_êÙÞOh*ýžè³Ï§ŽŒdÈ�!Ãq�$ú{*À ˜ý´Öm¥Ôb»ÝžPJ�)¥F´Ö²ÙlŠ´ÑL¯L#CÕsÁ˜øA@†?~ŒãÇŸäÈ‘#lÞ‚mG™öÆÅßI~#1þZD=¢¥9H!AF%‚ž—cdd”GýrÒÜgvv–f³¹)U?3‡ çÄÄD"èc°cÇòùü=‡Ìµæææøøã�¹zõ*µZ-¹–ˆå‹ÓèŸ$7 ¾%Â-Ë: µvÃ0¼Õs¹—‰HÀ'ë kUð›òd C† 6�{ k-]—€ÿþ(š�aÖ•RŸŽRªàû~N)e÷Ƥӯ{WÔBD®|Ïó(•J?~œ'Ÿ<Îα1¤4^zÜÿ©! �ˆÍQˆ[ë¨�´, Å"ûöíC™$ÓÍÍÍá¦VìfZkfffPJ%šRFÞ€ÑÑѤœïn½aÒn·¹xñ"§OŸfjj ×u“Þýλšò¡ÖZJ)=˲ˆÃ5­uE)eª\¢ÏõÿæÖÚo•d C† î !iÉàô¶4æ‰<ß&*7‹N®5ív{^‘×Zïd•ßmc”Òé~ˆ=‡ä«_û�>ú(;vìXa䢯@�n——!þcÎk<éU±ëzìÞ½›|.‡ï·Q*Êî�ν¾¡î%5B–——9uêT’™oÈή]»î©<Ðôxýõ×9uêccc(¥’k¤Ç‘†ñ’¤Ã)q™¡],E»ÝÞ­”²Z­Ö`!uh‰¨�Ð÷‰¼ý7úIIÿFI@F2dÈ�a“èñÀ§—0M”øGD‚AæzKZkIô›=,„(¥Þ‹N’x"{«HÂÎs]FFFØ¿?CCCQW<­ÑˆTÈ@DîþãÞ}îε„ èHÓFA>—ctt”Ç#„HJûÅÕׂ! ¾ï‘N@ºy�©ëßl8@)Åòò2çÎ�ãõ×_çüùó4›M …B¢JØ�TônKßÛ¶ñSYpùòe~õ«_qúôifgg£0Hê~+ˆÄzÁ¶íäþ¦Ž¥RÉ^^^.}îmÀ ‚àv¼‹ü¢�)Vÿt>Àz¦{BF2dÈ�áчÀÊuó¿_¡~ `‰ÂϧÞ_&R�sbYZ/}¼©q/‹IY@­V£V«Ñn·i6›lÛ¾��r9ɲ7«zK$ Íhõ‹!. „@ �B#”F �6º€Ò‘A!_àðáÃä¼KKKܹsßï¨&ÉŠ«,ÞÓ·ÔÔâß¾}›¥¥¥Ä ¥äàÁƒ¸®›ˆ¥ÝöAP©T8qâÿôOÿ´Â¨¯fäÓïõzDÒá‡~âDBJ¥’S­V„û„¶Rj^)ÕŠwñˆò¾¿Ö=�4úvü4¼È�!C†O}ÊÓqÛÕBëI à  x*µ= êKÆç-‡r¹…BaÅÊÔ`ii‰�>úˆ×^}•Ç{ŒñÆãú÷hèQ�Òj¥¡$­9Б6û$k!’fA¶í°mûvž~æ>øà$W®|Dàû¡b³æË�S§µÆqœ¤“àèè(nœëÐn·™žžæµ×^ãý÷ßOHD¿~ 2 côOúKk-X–µ®*¡eYäóyêõzβ¬�žç=éûþÕ &ã]¶IÿšnÃož‹žGæÈ�!C†ûwIú¡×ü> x<~y„ÖÚƤ”–ëºV>Ÿžç ˲V¬hµÖ´Z-¦&'9¥T»–’Ý»w%‚@Z«dÅ߬tVÖQþ@çÜÑù£i‹¸¦0T )år‰={öP­Và îÂW£ÝÞ\utZöÎÍÍqõêÕÄ#=44D.—# CΟ?ÏÉ“'yç�w¸yófWì~µ•{z{ïýs]—ááaªÕ*ív{]-×u…RÊn6›eÇqEÜ# X+“íWD$àK©mËDzó®”Òs§¼‘Æ9µz�kHË"T*j½[´â›Ú~�±&@œT(„ˆ“ò"Ñ KÊÈý¯5BH„0«úTæ¼KZ‹¾ô¥/188È;ïüŠ ¸M„É~µcÆ­oYÓÓÓ,,,$†Ø¬þ¥”Ôëu~üãóƒüÛ¶±,«ë¾¬¦RØ[�&<ðÀ\¼x1Ñ8X¹\Ž ¬ ò¶mïl¥Ô’R* j ý8�ªó0$ú¸ÿù”<È�!C†Oë�€40X+0ýx“ˆèÙÿÐ ‚`¤V«mX«žÝ¬–'''9sæ ®ërðàAvÇ;P‘AO7ÄÑ:ZÕ£-4)Í€ø=¥¢DÀH Gƹƒ�Àó¯ñ˜PÅÁƒ9räû÷ï_±o¡P`Ïž=xžÇàà wîÜáÊ•+Ôj5lÛî›dWfÀB8"Òph}~i`Ê;×ó$º/ÀÆ›5gÈ�!C†»FÏ�s¿8oïêÏ‚�¨ìÏ<üÔ£JÔAp)µ¿ÒZ7|ß¿åûþíf³¹P¯××­·“RâûW¯^ãܹs\ºt‰J¥Bh ©è$Êy^3­52‚Ž·À¶¬øýN!$ ÐJ#Ð ܳ‡'Ÿ|’ÑÑlÛZÓ•ÞsO¡Ÿ8É®+7ÀˆA��´ P³ÙLÚ¯VÚgæ—®‚0�Þíû÷ïçßø`pppÕs‰6ÀO<Áìì,aréÒ%W„3ÒbCñ{J)e ûQI§1úé0@¿P¬LÑØ”' #2dÈð»ÃFI€A?Qˆtåÿ‹(�ÄüÃ0\VJùBˆ|³Ù´„v.—“"Z†¯Ÿ™™a~~Ë’(ây9ŠÅB¢¸‡Œ%�—?¨®¤@C"›•^•G¡ d< ×uä‘G¡PÈS¯7˜››£^¯¯¼añ¹‚  ÕjQ¯Õ %Ùk®³zmcš×ÿã�?Î7¾ñ�UÏÑ ×uÙ¶m_ÿú×ãÿñ9uêóóó]Õ1A1†Z©Î@%0HÔ ×Ô 0X³YPj¾«’�,�!C† ¿EôùAîH‡BÖøÀ,QN@3}¬Öºåûþõv»}£Ñh,·Z­ëÀ¨^¾|™S§NqéÒE—:z& D§T‹u$�£Ä:»Ù;¥qead¬Ã­BD¥r;vìàØ±£ŒŽŽ®PæƒN[ßjµJ£ÑèwÐû‚ y¤C&\066Æßÿýßóâ‹/®w‹úbhhˆ#GŽðw÷w¼ôÒK,//†a×ø�—BE7ÄÔù°–ûµ0@¿°@£ßx3@† 2ü–Ñ €•ž€�vìýñŸþ›¨ÛœIG÷Ã0¬Ð1&»„Òu]w5Ã`\ÕËË>þø:Qòž•¨áõÆúMµ?˜5‰‘7ÃL­IÍMˆûDÿ�÷¡T*1>>ÎÂÂJ)h6›A�ÿf³I«ÕÑtVöÆ­o²ú{î{¢`¦n<�=ö/¼ðO=õÃÃÃýn˺ð<�ááaüq–––˜��åÂ… ÌÎÎ&ûÄž CÐ’[l£?è§ Ð5­5¶§¯»"4�€ 2døà.HÀFñ ‘NÀ·ÒÃ0\TJÕ¥”¹z½î !\Çqúu1:္¹9fffÈçóxžG>Ÿ�zIòJ‰H[�q©kÂP%ç1=¢ýbá ¸¡B ãP‚ã8¸ŽË¡C‡Èçóœ>}ºkõÞl6W„ÒÍz’›§TBdÒD 7¯À” ~ík_ãÏÿüÏ)‹NBì˲àk_û�<òßýîwyóÍ7“qZ–¥ƒ P:t>ã½Dz×XIÝòÀ]ÓgíïȪ•È�!C†ß6@têÚ� êg­&€__빞ïûþ ­µì)•J¶ã8ý ×cüÅ‹“d»]»v144»û;6�\—zZNX �BF@F]»’ãhv¹<ÀîÝãh çÎ�cii‰z½Îj c×ÒD -l�~Þh4xøá‡ùË¿üKŽ=š´÷ý4àº.£££|ûÛß&—Ëñ‹_üß÷»é|~’Èø8 LÓJz�U©÷z½&7 9Ö|ß´Ö:#2dÈð;Ä:$àn½—‰Â/¤¶…A,RJéU«Õ‘r¹ŒeYÎzá€ÙÙY´Ö¸®‹ÖÛ¶ÉårQ]¿QýÓ:Ñ ˆl\œ ˜ Šl¼NY©È[�<�Gá¹.år™‘‘lËJŒÿj•½)ÆÐ� xžÇ®]»xî¹ç_WÓ3°m›b±È¡C‡øøã�yã�7 „RÊ’ã8[µÖ�˜�…D¹ÏOu­õQ‚ç¼b> Ã[ÀÇDy½á*è÷]éJLÆø©Í6C† 2Üú�èüXß 8GDž!å)‚`! ÃZ.—;X­Vw•J%˶í5[Z–ÅÒÒ"¿þõ¯p‡|¾ÀØØÎØh¦o@g{RÛ;�)¥5ùuÜX( Ú­•J…J¥’$'n¤Ê-}¾Þp€Ã<ÀC=ÄÈÈžçmø¦n–eá8Žé€ÖZ¸®k)¥vH)KJ©E"ƒÄD �ú¿M)ÕÒZ·€¶”²­”Z.'�(AcsÞ€Ä�€ 2d¸ÐG# ½bÛ è]~@DŽö^Ï÷ýÛ€®Õjã¥Rɱ,«¯MHf¥gÏž¥V«ñÌ3ϰmÛ6ŠÅb2ät9^¢hŒq9ÐÉM'A•x¹qã:'Ožäö�;‰ñO�Ý‘„Rc‡È(Û¶M«Õbrr’?ü�0 ÿTÃZëTI¥eÎ+b¹`§ÝnH)=b'óÐZ‡éçBˆ¤$ ÃÙ ÆÃ0|T)u†¨ü³×#Лd˜ ‰Ô÷*#2dÈpŸ`�&ý°VæÚ¯‰HÀ‘ôÆ æ-¥,T*•¡r¹œ“RZk% !¸}û6õz�¡¡!”RŒ��á8N’/`Œ~<'ãHM´S! »žGâ>�f“‰‰ .^¼À… h·ý¤s_¿„¿µ ÓŠaVå­V‹[·nqâÄ lÛÆó<ÆÆÆp]÷žÚí6•J…ééiºH…”’|>oK)íV«å¾žbp•Ruà`+ð}"UÈ~a�•MâïUF2dÈ�á>Â$ 77À Ÿåè·íM"ðpjŸ ÃÅf³yÑó¼}ÕjuW¹\«õ 0ð<ß÷9yò$J…qÂÛŽãv%ã%ƒ&!/ò˜n�P¡ŠD�bÍ€j­ÆÇÌ;ï¼ÃÄÄD—û>u�’mk�„,D/Bàº.žçá8a255Å;#eYxžÇÐжm÷Êön•J…ëׯ' Ó9æ‘Ëå°,«¯žÁj�RŽØ¶M†·µÖM¥Ô(ðWÀ?múö}I@F2dÈ�á>Ã:žƒõûá5¢´{S×j‡aXñ}Õju{©TÊÉ5üàÆøV*Ο¿@µZãØ±clÛ¶-i‹›®Ëï<7zû¦“ FZ¥¢n~³³³\¹r•“'OrçÎ|ß_aˆ{e{{‘Þž&!fÕïºnÒ!PÇÒdz³³œ:u ­5žçqèÐ!vîܹâ›�ïû‰ádÿþýÌḬ̀°°@¥RIúضM©T"ÚíöFº!ÚRÊÇqV»Ýžv_^ee;iƒ$ #2dÈp¢ è»+Ø{øÓ.á‘FÀãéóA0 „Bˆ\µZ¥T*åã•j_ ¨u¤ð÷É'Ÿ0;;Ëàà RJ¶mÛ†mYÙéhVìIÃÑÉ �RÐö[,..111Á… ç9wîNÜÊ×\ èëúßH8ÀÔú›•šT„aH£ÑàêÕ«4�dU>88˜<ß z‰ÏÀÀ{÷îe||œ[·nqíÚ5Μ9“ˆ™‡ëºIèÁˆõ>b�†ÐZ礔û,˪·ˆ”!ŸN‹k /�$˜ådÈ�!ÃýŠ �€ÞžñпyP/~ üÑÊÑ\«Á‚Öú²ÖúA)åx±X\Mg �ã8h­ùàƒÃ�|>O±XÄuH ]…a”hJM5€LNNræÌY>úè#¦¦¦/BiC¿Ñd@Ê�NX IDATÈårär9\×]5ÁÏ÷}¦¦¦øÙÏ~†mÛIGÀR©´Öôû" ClÛftt”ÑÑQlÛ&ŸÏsýúu^ýu~ýë_Ójµ( +æ$ħAÐh4ÃPH)=)eɲ¬A­uE)ÕïöÞ:^$s!È�!C†û›$«¡Ÿÿ1QÁÑÔµÃp!‚\³Ùt�¡b±˜_Í �pÀÂÂW¯^Ų,ìßÏÈÈ®ç�&Aª+ޝh4ܼy‹K—.qþüùDö·7æo¤…£ç¢«Ä/=vó¾�eY¸®K.—[±òï… LMMqòäIòùu¢²?¶Äïqyàl\~ö°Â) 6°j8¢$¿›7o²¸¸[ÛfË–-HiJ»WëÍf‹ééÞÿ}.]ºÄíÛ·ñ<Û¶WYÕë."�Lh "`¤‹×Zù÷" C.^¼H¥R¡X,â8¥R )åºçH�Û„\×MˆG»Ý¦Õj%ç2çÛLž�™Wœ8èZ–UŒµ,`QS¡%Vj¤½‚, 0C† >¸Gý›-‘€?Ê©k5‚ @1¡µBìÌçóëZ)­5�F“S§NQ¯×9zô(žçbäŒ@»ÝæÔðî{ï1??OµZÅó¼uãí½^€d2=«g)e²ò6} 6‚(?AÐn·¸sç6?üá©T* 1::J>ŸßÐ9R5ÿ]¤¡R©Ðh4ؾ};µZ­Gø(-£¼6R! ¸±¦�¹Ð.¢’ÀÕš%D #2dÈðÁ]�Ñ󿀑€b¼-ÐZ7|ߟd£Ñp�b>Ÿ/@ÿ«ÙÓÓÓ8ŽC¹\fll,.­³hµ|*•enݼŹóç¹víZr|¯ÐO<ßž©ôÏð7ûšŒ{ã¾—Rn¾œOk‚0¤V«qõêU~õ«_122 /¼Àƒ>¸B.¸×p›¤¾~ÞÏó(—ËŒŽŽbYavr!â–Ä&4`ÿúÁxÂ0´„�ÆA;€«tK›VÂ]^€ŒdÈ�!Ãgwé èM ìµàsD9ßr©kÕÂ0œjµZ>p@J™�%sW%Zk‚ `rr’z½Î³Ï>K¡PÀ²òT*®]›à­·Þbzzº'Þ-’ÒÀÕ`víç 0FtÛ¶mŒŒŒ033ƒïû)«ë3‰Î(NŸ>ÍíÛ·Ù¶mÛ·oO’Óó Ã0ꌗ®†íÛ·³gφ‡‡ Ã�v»�¼§”JzA¤ô5z{X–E–Â#Êç3~°étLç‰$D #2dÈðÃHÀjMa (@SÀO€—�D_)Õæ}ß¿U«ÕB!ĨçykúÔM)[¥RáÃ?dzzš±±1._¾ÌG}ÄââbR/0†¸P(022Âøø8;vìÀ�½SSS,,,$¹ULÃ÷}æççyûí·)—Ë|å+_IŒ¾ïû´Z-|ßÇqœ$Ùp5 óøã�cY'NœàìÙ³,..&zÆsaJ …BÒLhjjªË«{6$‘®ƒEǰoc¥ñO“€,�!ÃÿßÞ¹5Irœçùɬª>wÏyfgö, DX¥ |a™á€ Y>ÿý5ýFøBa-K!†²B’/Lƒ!Kí˜ÝÅÌΩÏ]••鋬¬Î®éž�Y‚ äQÓÓÝÕUÕÕß›ß1øuæ"àu+Ž€?~kX\£ \q,¥d4%@½^¯·–ÔÀ3�Nyúô)/_¾ää䄟ÿüç<{ö¬Òj÷jŸ£jFÿ|•¿ü|»»»<|ø�ÃÃCÚ­–íX¸Ø³,e:�+ëkîÆ Ü÷øÉO~RN'ìt:Ôjµ2›ß­ü]+äU´Ûmîß¿ÏÚÚBòÃs%Ëîö·"`Y9Ÿ;Ö²ãK)9<<ä�G�h4›ö€B°±±Q†ŽŽŽÈ²×ó8¸U÷ãÇ�ɲŒóósÞÿ}îÞ½K’$e­¿«xI’°±±Á|@1ˆO?ý”““¤”dYÆx<æ÷ÿ÷ùè£�èt: ‡C¾øâ ž={F‘œéĆB$Eëf' °‰MŒ˜ÿ꜀à�¯¯«–§Uãð)Öøÿ+o¥µž'Y–5ƒ�èv»Ýd‰ÕsñíÙlFšÎPjž‚°,9Îû›5ùÑZ#€n¯Çîî.÷îÝãþýû4 ÷¹í˜§‘RÐítØÝÝ%ÏsNOOé÷û+¾þ«É²ŒçÏŸóWõWeÂÞÝ»w‰ã¸Èq¸šÄ¸ )%�N‡ýý}Þ}÷]û�„`0Ðëõ¸sço½õÄq̇~HžçüÁüÓéÔ÷6H/ Ð �-ëü‚ùªßmA�À×…ŠV‹€ëÚ/³\ÿ› ð/¼s¥yž+!Ä ‡ÃaÜívuEõâ}´Ö¤©u»O&“++z7ܧ¼€%}«p-}÷÷÷9<|‹·ß~dC @Z¬ø�±_³V¯±¾¶F^¸Õ§Óé•&<¯Â¿¶ápÈp8äàà€½½=Y–¹ƒ;àßó×”<�@ ðõå†sºÃÝ�ÿŽ´Ã\4L±I�ë!pqèë®Ï{&‚"¹n—ƒƒö÷÷‹8{‚ÖÆnyNî Î1Ŧ�}Oÿ›rկɕ.?ã·ñu«j¥�N§lå;éúL§óÞüRJ†Ã!Ÿ~ú)?ýéO™N§dYVç“O>AJÉd2áƒ>àÁƒlmmÇq)t†Ã!ý~ŸÁ`@³Ùdccƒ½½½¥a'L|ÏE§Ó)½ îg-úÄBˆØ“•7s1`Y x�@àëÌ-E@•U9cìáÿ„­9wǾĖÖ 7ÿÚ5×5?Ia £(¦Ùl•ÙþÛÛÛÄq\¬Æs´6‹.{o•>¯°û9ã_&ûºþý®'@E´ÛmöööØÜܤQ¯óòô%ÏŸ¿àôô´ÌÔ—R’¦)ÇÇǼ|ù’étJ£Ñ Š"¢(b6›ñÉ'Ÿ0�N |ûÛßæÑ£Gt»]’$F©œÑhÈh4DÁÚÚ{{{ÅûÉÂ}1Æ”âÂå(DQD½^§ÑhÐh4Ê܉ÂË�0·çËC` |¹¡¸_¸m€ÿënH‹c=)W ïÚì�…(ËëÖ××Ëd7×OÀ]®ê}÷¼1fî(_Ó(•/)GÔL§†Ããñ­5µZ��õuÞ><äÁhÔë=#Ž“R$¸U¾1†ñxL­V[hiì®çÙ³gœžžrttijgχܻw�V«Y–JÑëõØÙÙ¹âúw÷#Ïó…ÍO–¬Õj � o@,¥Œó<÷…Z›kVÿ<�@ ð�à5DÀMBÀÃzºÞë#àKcŒÀ&ö–}Øá’Û’$A)ÅgŸ}Fš¦ììì°Öë�e&¾oøíê>/ËúÜjÙ­üË/V‰t6c<¶MŠ\o€­­-ç÷ð«Ü}Šã˜$Ih6›´ÛíRØJ@Q+ÂþoTõT»à�o /,ËÚ¿ªeð)ð#à?0_yΊÏ}Qï lËZÀNÅ«×ëeR[u>Àùù9iš’+Åææ&íN§ÒCÀVXp—»‘¼BК\©²=ñl6+ùlooóÖ[¹³·G»ÝAA–e †.ÎÏ™ŒÇìíî"„àÅ‹¤iz­ñ/¯Û¸¨Ón²½Ù£ÛmS¯×0ư¾±ÁÖÖ‘\lä„…[ù— Ž… p^¿ лg¾ð�}ƒÅÁWJƒ�o77é¸Ìúcsþ=V¸c_û›(Švâ8î5 â8I’”†¬jPµÖL&ŽONȵFåyé%°ïWGXA0»ê/6¥ì8àn·Ãîîo¼ñ[[[4šM„LÆÃ!——Ìf)õz�ÞÚBJêõ:/^¼ ßï¯ì[P^‘Шµ!×'5ÎÎ/ø?ÿ”v»Ë÷ùðÃi·Û¥×b6›-Ì'¨z|¯GEÔjµ2 ð$K<¿Ã„å^€à�o¯!V­ü««Ë/±}þv’ ØŠ�H‹îuQEõV«K)Wæaþôûý²GÀææ&u/àö³YÿöR�'À5Ý™L&e¶³Ùdgg‡ƒƒH’!`:�Ñô‹úü‘�8ب'1õz�n·ƒRZç Ã+¡Ø‘ÀŠ—YšrÙrrrÊ‹/Oø›¿þŒ�÷¾ýmÞ~ûmö÷÷I’¤(³Ù¬ ‰DQTz`ždèÂI’�$‰kÌàhcC4¡ –_Ðp%£ÜãÛ'àß2)p¡µÎó<fYv8™LšívûF6h8‘çö2\½¾Í¨H¡uŽ[˜+•uÑ�Þëõо÷Ë?€ÉdÂééƒ�m¸“$5¢È†#¬¡­Q¯×yã�7¨×ë P*#Ij ±r÷èêÿÓ4µ†4Ë5£ÑˆápPŽð•IB­V+ÛìÎC vœ°RóR¼(’$‰�¿·Ûmz½.‘”¤éŒ(èüj5Ê{Íp8äøø˜££#:��Ng>â8ÏËöÀ.þï®IJI’$´Ûm4°BTþÀò€òƒ�ðJà‹�*UPµ‚ÿ€Í ø+0ÆÌ”RçžZJÙ‡Q!®5¤NL&“"“_”¯û­‚/..XëõÈ•!¸¸¸Àh]ºÏã8¦ÕlÒlµŠ0@\a¿­°ZÈô7Æ £ˆµµ5„Œ‡ T ¤7r•¸�ÆgŸ}Æúú:»»» �y3$¯°› Øív©×ëeÙ£}KDÆåýMVô x�@ à³B¸ÿ«Uñ�Ïà�°9®: ÏóüR&I’ýápØn·Ûe–þ5×Y®ö�`¨vëså€Fk¶wvØÚÜDQ’ ¥¤ÝnÓj5i6š$µZ‘„FU‘¦3´¶#ŠÝÛŠ ³P’'£ˆé(#S }�û¿zý³ÙŒÏ?ÿœv»M·Ûåàà ŒíûßÉí”4›MÖÖÖ î^»JG­ò@ Vsƒ¹îõÛæ|Ž-ü=l§:Œ1Z)unŒÑBˆ$Žc†Ãa«V«‰z½^6þñ®mÁ:àÞ[ä‰QŒþm6›4Š~úÝn‡f³I-±qwI¤` —¾áÕä¹"Ï•�=`œˆ‘®ÒUž“çúF!‡RŠ~¿ÏÑÑNô¸ Xèwà·vÕõz�N§Ãd2B!¥”ZkYÌ`+´–]Pð�@`97äònnõl‰à�°ž€vqª±R*¤1F×jµ7]RÌÝîK®qa%îèTÝænµ=‰¢ˆ�� vvvˆãˆ$Nˆ‹Ïº&>öœŸ7åaטâønTq–)n¸ð_ÊÉÉ J)Ö××ét:e5€û^yž—ù RʲbÁå.ÄqìVö¾À=� €@ ܆[Š€ÛðøC¬'`Ó½˜çùyqº4Žã;RJ¦½] ÿ;ãX+Üø.«ß‰€<Ï dYÆååeÙU°Ùh e„ôŒº1mtÑW`F–¦óºü"¤0?oŠÊçnÿÛ¬þýëWJ1yúô)ív›���Ò àªÜÊß…5œèt:.aÐUTi`»1^i@ VrCpëÃb[Ôþ!ð»ÀÝâ\#¥”2ÆŒ¢(RBˆXcÜäCÙpϸKL€8MÓ�Fc!‘0Ïs&“I9¨ÙlrzzÊúú:mìª?*DXw¾R •)kàµÆ‰…yž£rÛg`2“¦Yi _×èèèè¨(]¼C·Û¥Õj-x1ªÿ»�FE‚" �E ˜ç[ø¯Á�WðKî#l8à_ïçš)¥ò<Ï?�¢è¹”²+¥l !œ!ÓÆ˜¼è! �1&Š¢µ(ŠÖ„=Uvç›wæó»é ‡Cž<ùØØ°óõ:qa ¥À‹æò8Æ rÛ‹`42�Ê ƒ¿(J)Ž��i4ôz=>|Xö(îK™ïà*æ½ ¬6bÑÝï¨&º}ƒ ·æÕÏÿ¶sà?6°šÃäyžc¦Zë:sã†{ßGk=ò(Šº€˜L&tŠñÁþê܉‚4M¹¸¸¤V«£µ¡×ë‘çõZ�¨p½Ï[ü‚ÑÖ+0�N¹¸¸d:�ƒ†¦eâŸ3ÈÕ$ÅÛ µ¦ßï—¥��NgA¸}Üê¿ÕjÑëõ\¸@ÕÎà'ú@ nÎ æÀÍE@µÕ°~ŽM|xØ· O™Ç·Ý*¶Úôf"¥LŠk,ó2â8^pÍ; ”b:�ryyY à‘mãü�†s»[£n´Í1˜N§ ‡#.//Ëœƒ4ÍÊc;÷¼_¶÷:L&ž?^†\NƒŽ8ŽiµZt»]áíK)eÅ#±Ì`�ñZW�o_±ð�áo?þk¸6±•MæÉ†;\(¶�ß\v^¥µZmÁûFTkÍl6c<ÓhÔí{2BÊ”zÍNtÞ‚þ ÏééÃá°i‘X5Ìþy^Ç0›Í8;;ãñãÇå”Àf³é²ýËqÇÆ¢(¢Ñh8¡ g³YÂ\Ábe@h�×ç+~‡A·iïQÇÌGݺG·I � ozŸ5Bá²õ«ÆÙÅÒ]6}–¥L§S’¤F倄²]ÏÎÎ9;;¥ß0�Nmr ÊÊ•¾û ~»Þªá¿�ÐZ“¦)_~ù%õz��� vwwËjw,— àšÕëu9k\ T‡•�[ñ ˆ€2nÏrà ·åX[å}Ÿ÷YÒ�Ðoä]û¨]¥òÂ�Ÿ’Ö¢H¢sE¦ÇÇ'œžžryyYÖâgYŠ1TVþó\ßÃà'ÞÆ`Œáââ‚$IØÚÚ¢ÙlÒl6ËùV¤ˆRm�%ÖkR5ø«<A�@àöÜR˜%ïW€^²9£¯±†,gÑ 'Ø�€öö³'¯gˆµ_Ò§¹ÊQYÆlf�Fcƒ>ÃáˆñxL–ežç`nÔÝ×wm‡]S"¿cŸï²¿)Ʉ§OŸ²±±áVùeߘwŒ¢ˆ(ФÂ÷À<°ô4A�@൸…ð›-ËÜÿþÊß7ü¾Àíw!„8 "ü©zåÅx«Û6X“Iƒf<¢ßÏ�Fe‰_–e¥¡Íóy‰!Æx_dqåïãD�?«à¦Ìf3NNN8::¢Õj±¿¿_~'H„nœpT”JVç¬lP@ ^›[ˆ€ª!Zæú÷@ÄâÊ?fÑ à‡.´ÖN(”¿jŒý×m¦ü¼´.ÍR¦Ó ç——¨L•±xwŒ,«Äý…ÀoåïVä`ˆëJE‘õ6úN\'\µÁ“'OÊáE®ìÏ_ýÞ�HQ+ÆÃUB�@ øj¹¡€å!�U±_TÝÿ¾ñ×ÀsOAéX%æ,–fYFše(oÕï‚Åx¾‚¢áüˆÅJßï à?/î×Bƒ¢k¯Púý>Ïž=cccƒ»wï²¹¹Y¶ v3â8–µZ­–çyµð²öÀB�@ ø*¸¥¨îç6¿Ô¯ï÷7ßC`€s 7Æ(lÀÊ}~%@–)´žàZfü@÷÷ wµÏ@õ}_8€ÍÞwï[�àγânÓ锳³3>ÿüsêõ:­V«l\Äÿ‘RÊ8Žã(Šª?gE €@ |u‚ÔÕIDAT%Ü@æ�|ʲ=€äÕbÀ ÷¹c!DnŒQBˆ…eõªJç^÷÷ø«u ücÝøEŒß̽yž—Yù~O?ÙÐ}ÞwÛž‡@¡ƒëC.!Ð rÇôr D­V‹§ÓiÕØ»nE!�_·Ì ðç ¸€/¤÷Z54{Ÿ;ÖZ;°p¾,˨׫Ýp-«šùøã„�1v�œÏp¸Õ¼ð+ü™®Àí?%î6¬v811�ùòË/ét:ÒétÊ~I’h—àß‚UÇ  _)nLß+9œ0Þ£/|¯€/ü<‚±âcÚØ¸!Dš¦+€3Èþøà¥ßÇûS5ö.ñïUµþ«*|Ñà‹‡eŸ×ZsvvF½^gkk‹$I¨Õjîü:Žã´ê&K/ˆ �@ ðKbÉÁêR×½æoUo@5,à‡ |>NÓôn½^ïDQÔs/j­™N§4�U×X �ª(ãì¾[¿*Œ1Ý� ¯Ä‘¤ðì—•ËB~© ß§`£Ñˆ““^¼xAÇlll0�BdQ …Õß»× ÷,€@ üÒX"–îÆUà{½ä5ÿXÂó±1æ{J©†1&�¢h¨ !¢ÙlV úi,dâ/¹Ö…ç¾A^­Y0ÚxïÛUý<_À_á¯ò2T÷qÇ-�_�çy1Îø QÑjµ8??ÈÒ4íçyî €sUt ¿dnQ!à ³äÑOüÃÛW(¥Ž�ÿmŒÑQMjµZ$¥ì !šB™¦©HÓT8·yÇ¢¸6pN‰¿ºWJ-Œåµ†yÑ8Ws¬p0D ûU ú²ó¹Ï»cùác ³ÙŒ££#Úí6wîÜ1ÇÇÇh­³ÙlÖ/¦'º{ùòº{@ ~éÜBøï/3Φòš«*PÀ_j­L§ÓQÇÛRÊm)åš”²ÄišF³Ù,BÈ(ŠDd¾[¿Lþó µRjéj\ˆÅQ½~–¿ïAðóªÉƒËðË—í§”âòò’Ç�óüùsf³Y>›Í&J©y‡#xÆê†KÁ�–$Âr!àÿe]óúöœyž@ø#­õR­µŠ¢h"¥<BÔ¥”±1&"!D”eY$„pƒ…¤"BDîQJ a5‚ ¾P°ž½`ì½ïz%§`Yî€/ üÏû¡€jØÂ}îüüœ³³3z½€JÓt¢µVÞ=\&ÊK  ÿ¨,ñÀ«=˲â\À <þø�1f¨”špuŒpù!b)e"„¨I)Bˆ†”²Ylµ<ÏkÞgËs;ƒ^ÙDaäB Nûx÷`Ù}Y*œh¨Vœœœ¥­VKi­3¥ÔÌã</�S‚ ¿J¬ðÀ«›9ó&A~µ€þÛ,ï„§�¨0˜Jk�Ó<ÏGRJçˆ„í­—*�¸ðÄBˆ¸x9Ï�{^#Ž¢(’RÊ¢[_Ù¹¯jèýdCßC°¬�°ë  ”“¿|ùò…Rê…R*Ó6a€¿åjåÂ@ þÉ0ž%|EhÀx�Ψ- 8ðø/À?~Xc±ñ�Ÿ`(Š•ºDÑB¸š (<Eh Æ „òÑ WžŸ�„RË9Q—O…”RxÍ|àƒIÓ”Ùl¦Ó45XÑ2Íó|tyyù¥Rê"·®±+ÿÏYì™P}4bUB ÿTxbÀ=J®ºüÝ` KŠ­æ=Ö�‡À[À}l£ áÓ?6×<^÷ÿuÏ�ѯ[KJÙB4¥”u!D$…‡AR„Š[à÷F0ZkeŒIµÖ£,ËNÒ4=6ÆL±ÿ4�?N€Yñ|æýï6<�@ ø•ÃËXÕ@h™' šàõÇÀS¬(Ø*¶m`èMŠ)‚,¯ó¿{®�1Fk�k­gRʱç9p¹~¨Á½æ®C¹"/@nŒÉ´ÖÓÂø»•¿þ8c>ѽWí¢¨ƒ ¿²T<U#ï'ôùÞ€„Eo@ÂUOÁ²ÄÀàZ ·°¢ Yüß.¶:¿˜(Xå%p! H)¥».è"»_yI~~\_cWøÿøŒÅ•þ²-#x�@ ðk‚_ÿ_õ8aà{ðÝ~þV5þkÇ\ ø[t–lm¬PpŸsÜæÿÜU ,e\Í�ð¿ÿ ðר•¿*¶|ÅV ‡ �@ ð+Ë5 „œñƒåYþþþ¾±¬Ž.]ï̽ × 'ŽW¼ßb¹8è`½Õë½Î;°ì»øßéøÞP×lKCA�@à×…j€{¬ �ª`pûD\]ý¯׉€ea ÷Ú k˜_Ç{pe–ï’ï?^`]ý_b »oì³ÊãÊ<€��_yVä¼*'`Õ&—<®ª ¸Í¶êún²�Äæ8O�ËS+*&À%Öárgà«Æ¿ºùï+ €@ ü:±ªupµSà2׿ïþ¯öøE_Á~S¬÷oßê÷öëùsï±ê¸.r�@ ðëÁ+Æ ûÆÑÍm®‹ .þ¯ÿ›ºý¿Êÿuûú�Õï¸LÐø^€UÆÿJ(àÿI>érÖ8ƒIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/disconnectall1.png0000644000000000000000000000012715174607203020046 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/disconnectall1.png0000644000175000001440000000114615174607203020034 0ustar00rncbcusers‰PNG  IHDRóÿa-IDATxÚÅ“[HÓqÇ?ÿÿ¶ÿÔVNVN›X ©5Ó¨XoÞz)�#Ã.¾!…ùÒCïQ!¥ÑÅ‚̔DÍL#š /+/û»Í­­Íÿ~=”±™½8‡ó=_¾çÿÛ¤Ä@\ KsQñÙÍý¢I¹«¤D\œù± �4ý…�²>îéAê ׿¼îð¨ý]|ùÛ;Z½“ÔÎG@Þ28uIr"Ø7¨ÉV((7aêPyДÏ%¯›“w."Ýð½z §kr˜ôLãr¾dj5 K£�ñ: ‘8Ëcaö,ĸYeÆaKý‰‰½>ÂG?Q$­5Ù<#޳›tnÀ0Ãßãg‡N¢/¬a]! ï_bŸ^4 CÜõ©ìðv÷Å1²nÙSIßµžg-S” ‡(HØ\•bu(½“,ù£(ñ_™Lžª uùè<—ÃùLF‚<:5AÝjµºfZ·�­óXzqçeÂn#a�ìv//fcËMä¤P¸Ó„üD¥ë�ž#ÇhœÙOÛÌÚ}ÕÄZ‹ÛÒˆ€ñ¸•ñW¥ˆ×¥Ä›ó9˜T¼|£Ë‰ÖSŠèv ÚŠUéÄ�3+˜u2Ö¦\üŠUf&9‰¤ÒÌ•íi|-IcΞ‚G-@Ò‘Yô”åQeôkmONð¿ÙF ãŸ~㤯Íwó;Y±IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/start1.png0000644000000000000000000000013215174607203016355 xustar0030 mtime=1777536643.508914341 30 atime=1777536643.508914341 30 ctime=1777536643.508914341 qjackctl-1.0.6/src/images/start1.png0000644000175000001440000000037615174607203016353 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ P f ~IDAT8Ë­’Á € EŸ„�ôî6®¡s0�Þe&<F iJãOz Éûá·…ßt’,ØðÀswÊ}…üç«ß(Œ|³ÛaäE{…‘WŒ\×Èc®×Æœiå€Y¡ŽØ€£7¸X¿…¨»”/QÖšYHÀZ¦k‘ ¼€�'PÏJSÙIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/add1.png0000644000000000000000000000013215174607203015750 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/add1.png0000644000175000001440000000027515174607203015744 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎéwIDAT8Ëc`hÀˆSæ Ã8û,C:vµLx�?‹„êI7€ÀD½0@ö3ÜÙ`Œ& ¼špÉ!¤‘b/°`„86'ãqˆŸê‘¤®é,Ã,†ü@@#›†FªG# ÁTH¶èaB+ 0öU“‚ÔIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/xstarted1.png0000644000000000000000000000013215174607203017056 xustar0030 mtime=1777536643.508914341 30 atime=1777536643.508914341 30 ctime=1777536643.508914341 qjackctl-1.0.6/src/images/xstarted1.png0000644000175000001440000000047615174607203017055 0ustar00rncbcusers‰PNG  IHDRÄ´l;IDATxÚí“!oÃ0…ß*#“RÃÐáã'å�´¿Á*;èòü†H¦Ã¦4ªTÙ“G©kÕ¨ÍÔ¡ÊWK‘B?hOwÁ�0‚[²'9y.ÎûüÎóñŸ#ðï¦Þ £ì×"BÀ0 ÌI ¼(ÈÐ| bÛ¶mÕµµµwïÞ�›ŸŸ§—=rÏÚl6w{{{3p’?˜~X lEñèùóç¿=uê+Ãüü¼022Âôô4’$¡ÓéÈÉÉAìvûÜ… ?ü:11qè¢k�—2­¹víê¹Ã‡뺻»q8œ ·Û=4::ê_XXH † f³ÉX]]­Ñëõx<=©ºººËccc—€gkµ`=ðÉÙ³g‡ff^¦¯^½’®¬¬||TUÀg@ pzÇŽ¿777¥ž=@˜Eåfgg«�©T*CŽyôØl¶û™™™lÞ¼)C­VoZ�±¬ÏÉÉVE"³„Ãá  M-µ*‘H0??�$IKƒ—€ÉþþþÞh4šV©TèõzÃj0€�ÇE¥R)²Jë’$‘N§WLj€"#CÍÂB’d2™\ NË™E�‘¸N§cãÆ�…,JO¹|(�F’¤¥ó‚ü.ßd2í\·N-LOO3111º:ã0ÖÝÝ=¢Ñh¨¬ü G©TV°(%�š™™!�§AX�áYÀ®'Nì ‡Ã<{ÖM$Ck�ƒV«µsv6’޵ˢ8yòd-ð`^ùýþ¹¹¹¹x$´Àžýû÷~üø§oy<=¸Ý/ð—bUŸ4@YYYÙ!�N÷öÎ�ï+ŠŠŠ25�ÙëõŠ©T*zëÖ­'N§óA4} ˜jjjN744˜Ÿ>ínÞ¼im½St + ZÀl±X¾¶Z›«T*•ØÖæÀh,A­VóâÅ ©½ý�)ŸÏŒÇ㉒’’ÜC‡>̳X,o<|ø�ÖÖ;ñÆÆÆŸfgg€AaÔd±X¾¹qã·ª¼¼|ÑçóÑÕÕ…ËåJ˜ÍfÕÖ­¥Bnn.™™™(•Jb±ãããôöþIGGG¸¥¥åçX,vðqA.¿Üb±œ±Z›« EŸÏGgg'½½½Rkk«3 îÛ·o¯Ñh,Òj5¢¨¦¦¦’�@`ÒãñÜnº€q �¼6ß«¨¨ø¾©éúÑÂBý2ÔãñH‡ã®Ïç»ÈâžÍôru"0�AÙÏÉÃ_^ô{5565777878888;;;>>=DA%DB)@@@AAAIH ODDDDEEEFFFQH#GGGNG8HHHIIIMI@JJJKKKNKGLLLXN%POJPOOWR6QQQSSSTTTUUUVVVbY,dX?\\\ha=```mc4dddseLpiBtfMhhhiiiyiJmmmnnnoooqqqrrr{xDuuu�vmyyy{{{‹p‰‡tˆ†~½„‡‡‡À†‰‰‰ŠŠŠ‘‰�ÃˆŽŽ�˜‹€ŽŽŽ�ŽŽ������’‘’’’’”””•••———˜˜˜±¥±¦ššš´¨œœœ£¡„¬œŠŸŸŸ«£p   ¢¢ ¢¢¢¤£™£££È°¤¤¤É±¥¥¥¦¦¦©©©«««®®®±±±´´´¼¼¼½½½ÆÆÆÏÏÄÎÎÎÐÐÐÒÒÒØØØéæyÞÞÞãããæææèèèéééüüîþþùûctRNS@æØf IDATxÚc` Ø�·.$ ÂѵÄ¿;Ûøü*<«³”ð)‘ñOÏ ÖÇ£BƼcRK„%ÌÆ�“Z"ñØ2¢ÂEI—°ŠÔöº0-%Ü*¢óÚ&öe»²ãRÁ$jV>ePN3æ‰ûT‚T¸qàRÁ( QáΉCDÅô‚v @*ÒÚgV†Z°áT!ì\\ÜÕ”ìÅ�S…˜]^O[~M®.¼&AqݽU�68|"¯fÑP4aj™7ö˜™Ë)/ë§7yöÔ Eì¡Á£¢.ÈbTQ*‡]…¤ºU³‹Q‚ª.+vÂÊI­B,Rö 8âž‹?£U$ÀÁ×”gúáKÑ©Ÿ–èÄ„;… ÖΙ¡‰/'Dej3Ð ŒÏ[Ñè?ÎOIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/mporti.png0000644000000000000000000000013115174607203016450 xustar0030 mtime=1777536643.505914363 29 atime=1777536643.50491437 30 ctime=1777536643.505914363 qjackctl-1.0.6/src/images/mporti.png0000644000175000001440000000032415174607203016440 0ustar00rncbcusers‰PNG  IHDR(-S6PLTE222:::???LLLfffhhh}}}ŽŽŽ˜˜˜¥¥¥©©©ÔÔÔÿÿÿQ :±tRNS@æØfLIDATxÚmÎA€ ÀbU´*�ÿVðÔTrÜ™d"òËf0Y2’zPd»Yv–^`Á'~gZK®”ÄJÅÅ‚gUúwñ±Ê$/�Yå$<ÚIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/qtlogo1.png0000644000000000000000000000013215174607203016525 xustar0030 mtime=1777536643.507914349 30 atime=1777536643.507914349 30 ctime=1777536643.507914349 qjackctl-1.0.6/src/images/qtlogo1.png0000644000175000001440000000563415174607203016525 0ustar00rncbcusers‰PNG  IHDR szzôzTXtRaw profile type exifxÚÕ—[’ì(†ß½ŠY „`9\#f³üùdg]¦ûDWUÏyétdâpÚ ô_$_û?ÿ>׿ø¤¢áÊjµ´RŸÜrK�“>>û5>×bÈ÷ïÛ'¾~ãõË?£0ÊsÑòë_y]»¿¼�Lô‹?¢þáy_&}^Øúëz é"Z=´ðùS?¾ç¬zÎ~v×s! åÙÔ³Äõ6 7²$÷c…Ãø*çv�£†fÌa…ÇŒ-¦(áÄ×{+ ¨wš+ìa¡ÏÌSg™6ël³¯´d奫,[uµÕwÜPéÚyë.ÛvÝm÷׎œ|ô”c§žvú;j/TÿtüµøB-ÝHù}öŽWÍ|¢{Šè>£Žˆ¥AÜ�³PcÎÉ‘sÌBK¨BAªc³bèW,@˜wLzâ;vÈ}·‹\…[úr—C÷�K×–?àö Ô–;á¼{Tè9 ‚úøמj'Ùé9ùÇôDc£MN\еžB®Ó*²!N«×<}’àJzzÕ˜5êœæ®Â)ÜýÞx…>ð>Æ#ª¶Òð•—\µÎl„G\£ÎYlˆ¸ÖÐ~V~¶¶‹ÔúW»¿~Cž6ÑÈ»w‰£á †—ÑOß(b/ë-Ÿ+Œ9lå±Kè~Ö>S(έ Úfl¬i�ÑT†)~Ðû2$¬É¨ÒÕv7š�œŽ¼J^8‚N4¢CeÏt­ŒCI§–'kº¢"´ˆª$[å�'uWÏ)ø’ÎÚc¬WáIYV7¸œ�æìÌ(³ «}ö  Ø¥#m6À’ߪ—ld±jèw*¢´úãd�¥W²æÅwÐQíÇheE÷„eƒ`˜Š³LÁ¥4·“´žÌ°++Œ¨Õ.Ü�î¯Iêg®…/¬FwÑÆžg§r”¬êtRQ [¤Y Cg¢ndVu],ÚOhGâÁGI¿¬“‡;·ÀÉ9GNaX:s"5ÉÝÊ›�å›èzYˆ;ÇÝU=Âã¿ÀΈ¬•7ø#ű¾Ç9§ÇH×4=æéXæ;»ž£yäÇdÞ ÛWŸ±/\ÕJc"�NÑÉ Ú‰¤]}C†O ßHOhïÇZŸ½XÛVçsŽ’/!=�´æªÿÄîØvyêÓõƒB¶1qÇ®¹ßG`Ñœø¼èÂ@tÖ2¦ç­·Ñ9¢åÓ:J+„n–ÀûV: ÖC£Ù­½ñh`lÜBµèÐ8ݱ¸"ãÛÍ0®IòŠ×ÉQSßÛIG-MÝæ(‘ÂÏ",ÓÖu¯“êzˆ…�JyãÂzãUzç|Ê>ÚÍ+s^ I¨?|¶§¿éNHêê‹ìÅÛš©?Èš¯’J>�É}•ƒån¢Á«p.Rœu´i¸uDKsè6ýN’;áž;Äe ¤Ôn‘F¯;Vï7»$ŸÆ›�½æTöÔ˽ˆâØ0þ1 LeY(¤Ñáz*˯Æi;uP-–5”Û©£N»&šÞ膊Ù6¾”÷^]^™ûĦT€hQ 5-õQ´YšÎL†>•Vóå \ÞxãMùDC¼~,boM.ìד¿ ¥ !�¡ -#¬ÝP�è[ò¶,]gSý“î¢-h´â$³�­ÂªêЄÊî Éfýžx ÚÐÈÝ�'î]þPpwj™vŸF‹l`º£CÇÔ›„‡xY Ô—�ó²Ü×Èéâef&›(*ã"=ÝH¿Ð` 최Y=ú•îMÜq<õ�DO§¬4l–‡—Øîþ){äfe_tšßkØá}ÅÍÄÄõré]$ç½I+¶F欻fû¤ÿòRHÅ8(ønÛ/}â=�Šq�½×¿ä5hâðÓ);Bcuè*ÝV¤ÎS_'�)R!#¯ÖœDJœùÏóú^EýzüÅDz¿ðš‹ÃàùÇ»ú*¯gGñèƒøaכstĂ7ìé·4ÿÿ܉¯Èíú/¼ÀYÅ!°PDIDATXÃí—MlW…¿yóÜñ$žb“?Ú‚Z~Ê$ "AP¡ Ö¤.‹vC¥l,XT�º ›R¡HHiZ©DQ(µ"ü‚dSaì4Æž™.l !ž€ ‹æìæ�wçÞwÞ½g40ƒÿ;”—ú›çg€Šw”?"_J^ ô ß¡ºÈ$/É ýÍe™ä‹ßGHà,ð™Ó�RĮҭ,6b¸ lÛ&ú,ÊåÑküíÆÂš^6ô7ÛNä"W€–O¾ÅïöåäžÞãÀÝïµâÙµã�Õœ_äpèû×å,§bÎß�ßí#a&ø5t–KO¯ **k¼u¬/_Gµà`Õ^=8–�Ñ„†.u4ñÁ_AN¬Õ—Smèvrâñé,wnì¦m²¹j#+}µ” OP!ßȉ5Þ:f‚“‘3“øÓ#]lªúMÕ¨/þœ¤�äëš½¸„+}€²Õüâ_ À‰Áv:žüœ{ œ ¨t§½(<>BÂNNâ牢ˆ%ӧ裠 **JÆÛ)$RH„"òWÀ#=ÄSÎÒŽ¥â.%²„îXÝWûh­9§Þüþè-CǦœÇ¤PHZ)Çà”edeo2¢ŽÚXv:X*ªc°š‘Ö²ÍÂ�ÐYÞ(’EÎF.ub©øÛ/ œÀïö#rl+WK1\C‰Ðë>´ùp=v3£€ÎïæIüöÒF„"0m“󱿲ëfæ:ܪ6=èíå«ñ�øÜ>öÌÛEÅÃ2®Ån"¬(YƆŠút¡‘S¿ðÖg–xñMå>‚žHŽ_ϯ€&­÷Û8P³]ê4}ØH�ö �…8üaÂÚ¹ÈVÏ©Ããò°±r¡ÄÃü è‰_dðV�/ýMT{ËblÛb–6·ªKÆ6Ãb~‹ÿ�uÛf­wnU#š|ÂÕø�¾†NØ7g7Û?ÚÀ�mœŠv:WD!Q­áv†ÇÒ�ßX±©Ðä·�-²�H ‹¶`;ËŸ3�™N§ôz=‚ ˆBÌÁõÒR©étšx­¢‚p­¦IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/patchbay1.png0000644000000000000000000000013215174607203017013 xustar0030 mtime=1777536643.505914363 30 atime=1777536643.505914363 30 ctime=1777536643.505914363 qjackctl-1.0.6/src/images/patchbay1.png0000644000175000001440000000117115174607203017003 0ustar00rncbcusers‰PNG  IHDRóÿa@IDATxÚÅ“MHqÆŸ™ÖÙ)üØRÜ,„…”=˜£dâ¡:tj56”E‡èH_`ai$$a—"ë¡!ꪑ›¦¶T®Îîd«Û´³;âÎììÌÿߥ“õì{þ½Ïû¼ÀNôʰ?zÄšc5”PJ™íïñ„F;Èf°Û ìÜtâT"¦Û¨ #ë£ÞÛ¾[ÀÿF–…=¹”ÍÖxÔ i�‰ÁèƒÐäîV5FÁ0b—$; ‰(¬’ÿ5üžc��È‚i+9}´¨êfwzùÜPܵâã[—‡ïÃÿ²V#“T"b°ŸMCÄT¡JŸbÂ+—©ÇQPÖÜVXqùLÛ¬^-NgõG=X›ëú þñ9x[ž–6Çn em¦³_ ô�å»ó|ÿÒˆú^ŸÚöÝššt€±™g3%»2uÅ­ˆƒÓ\ŽÃ"NFsʼnkº²X @ÙʲÛ�§²¥î'h`xä;š�L\F�Æ·ÑëáÏÜ ÑÛ=¾HòKÏ.ª¾Õ»­% ÿ*÷¤Ö°âãÛCcÏ ù=W~ 5¦Ô( J›/Ø�W›2 °�l{êîMu,{ Opì³:{g†¤Ö[V}í/ä¥�‡`9V¸žÖ÷~}b±rÜMtº~ÄL-+ A2€8~IÒäùrki°¸æñGÛÁú* ÔÔ™ëÁï…îC ðûœÇͤìÀ#¡˜I©À·ÍVù½åY”¤ºˆ¡€¡E&¨©ÝÝñgÄ_0‘ 9üøwoIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportpno_32x32.png0000644000000000000000000000012715174607203017646 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/aportpno_32x32.png0000644000175000001440000000151415174607203017633 0ustar00rncbcusers‰PNG  IHDR D¤ŠÆÝPLTEUL<        '".!& %, $- &.!!!"""&"###$$$-9&&&8:((()))*****+,,,2, ---)00...///000111333444666:63Jp9995=>;;;W]S}]aBBBDDD2LYFFF^ŽfmIIIa“#WrLLL g“fkgt$^wQQQ ryt¦,fƒt�YYYYZZ‡[[[i\@bbb7t}ƒ—tfMhhh‰™3„‹œyiJ"† nlh=‚Œ˜¾™Á—¥m„…B—š¯Ý"§¬.Ÿ¿'¨­ƒƒƒ(¬²�„u½ñ‹‹‹ŒŒŒH©­ŽŽŽ%½Â’’’–––ƒ¥¥+ÍÓ¬œ‰©œ“   ¥¥¥’´µªªª­­­®®®¯®®¯¯¯�½¾®±±²²²Ä´¨¸¸¹¹¹¹Æ¶©¢ÅÅ»»»ŸÍÎÂÂÂÃÃÃÀÅÅÆÆÆÈËËÙÞÞ¹ôõäääåååçççÙòóèííìììøþþÈ]c6tRNS@æØfIDATxÚc` „É„ã“×jœ^l�G^7bN\”(ny…¾/§0œò:¡3L™qË÷Ujèµá”×ꢄW§~9uA¼ò|1Î ùfìò²Ñå9axäRKfuá–—ÉêmŸà®æ?«¼b|^Õ”z'N;Ÿ I¬ò‰ÕmS+B­ ƒD°ËO›]gmb“�Ì�C~îd[f^ßdO!,òò`yGV6·t{,òbyN®ð"lòóüðË3Ì+èʳóà’g˜—9i">yËy-Æ,øä{æÍãfrÈvÅ!?¯³&6IE3ÍÊGR.ŒMÒgœ7oyµŽ”H}FÜ`^G™™ø<<9h^¾¹4þ<*%LIgw YU`à3 IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/copy1.png0000644000000000000000000000012715174607203016176 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/copy1.png0000644000175000001440000000050515174607203016162 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÚ9ñaJjÅIDAT8Ë­“Ë Â0Dߢœh *pÈéƒHl¤ÐGÎÎ-ÐÍ,‡â8_#Y–¼ÞÑ̬ ?BTÕæŠªz›,ªj)êº6À€ÛZïa­hfºF2"pÎáœC¤!Ï�ˆ4@‚B0à´Ë„KÕÄR–*èpY°tE… œ´mÛ�Fš~—8 DîýÍêC²ªàÝà½Ç{¢� f&3=¯iˆã�‡0³èEÆéê^±…2%X’»8ÆÏQP_²õþ†ãT”ht�bIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/acliento_32x32.png0000644000000000000000000000013215174607203017576 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/acliento_32x32.png0000644000175000001440000000310315174607203017563 0ustar00rncbcusers‰PNG  IHDR D¤ŠÆ÷PLTE03')-36;!@9ILRWK#]L)a  g 34.75)m$6:,q'<:.f,x'==6<=;?@.|*s/~+„*AAbHJL9�;›0—4|=‹<›8VOI�9ƒF ŽD]RHVUMTUSH){O–EY[GhUG[ZR›I^_L¦GtYHq^J}\GˆZCghU«U ‡_I‹dPqpW‘bK¯\¯` ®Z.ŽeL™h‚t&°f'wxd´h“~‘q`”y/€}^žŽƒ¶k3hµlF·q0 †±x¼t¦†·r=¹w%•|oƒƒ}†ƒu•Ž˜Š4Ÿˆ5‰Šu°Ž“…€ž‡~�“qÀ~`“’x°™ ƒ]¨š,˜•u®›ƉB¸�£’‡Áœ�šyœ—•ÅŸ˜œŒ›œ‡À¡ Ë—7Á§Æ‘s©š•Ëœ1Ϩ»¨8¾¬$¨§Œ«¨‡¦¨¥×¯¬­…Ó©8ПxÔ§R¬®ŸÓ¥qÏ¢�Ù¶°±›³±–Ò¤‰Þ»'ֲܿtÔ½Bº¹¤Ü»?ḻ«×²‡à¾5ÞÂ7ÖÇ8س¡¾¿©ßÄAÚµ£åÉáÇMæË+ÆÂ´Û»¡ÁÅ´ÉÈ™æÊHäËXæÏ?ÊÉ­ÈɳèÕ(ÌÍ£ÍÉ»çÌgÌËÂêÑeâÆ·ÓÒ¢ÒÒ©ë×JêÙBÓÏÁêÖ]ÑÔ°ïá*ÓÖ²ÓÒÉé×}ê׉ÙÙ¯ÝÛ«ÚÙ¾ÝÙ¶ñãKïÞoïÞvÚݹÚÙÐîÞ—ÚÜÙóì@é×ÌîÙ´âÞ¼òæfàá·ÜßÏîߟáäÀóæ‡óè~åãÇòåªáäàêæÃëéÍóçÆóãÞùí�éêÚõíªêëÔùð’ôë¼õçÔöð¦óèÛ÷îµ÷î¿ýúsñìæïðÙõíåîòá÷ðÛöòãõôëûöÓø÷îý÷öùûø†rÑotRNS@æØfúIDATxÚc` 8Y¡Kppp‚È;üþóçüøþýûׯŸAà%<~ôȬ(ÿåòåË�ÁÁ;v¬�yó¦Ï;}ú È «?êò««Û Ò#Ý­­ÕÄ•ÄÅ%EDøx\OŸ‘)øõ0ÿéï§W÷,›ÚZëg¬o`` ©¢"+Ésá¨XÁå¶/¿Ÿ~û¹¦@ß@SCQVVœ÷ôQ° ¿/·=ýôåçûkS'–Ƨ…˜zhjõ‹q> 2Áò×Åê«Wß}xð~æ³ñ ~ígÓ4€ˆ pðërÁž=OÜ~ûv÷ÝØ�°}+4T$ÅÅ…ø8Ïœ�¸ábú²e¯/�8ÿlӹʰ ³ë—vI ññ²> VðãbÄÔ©/NœØ¹iõæs‡ÎöÕ7UUdk ðr³íÛ¶âÇ1ß)sîÚ}hãæ5¯™ÖÔT’˜˜¬#Èuf;Ø‘?޹•ÞݽiÅ’YK>^Ù_S’¬ÅÏɺï°(ØǬããϯX±xÖ´5ÚçÖ¤”•ekñps²1ïÛvÃ÷cÖ;gÍÚ|£ï€§yRWJ™�4/7';«ð¾í`7ìRsvž4«ïìüg5ÌÍ;#ùø€°²ˆ�¬ø~LÄØ8mUßFÓ¹iFzf9Ò y6f™}`GZ}Ý%nljºÿ@²¾¦†²žº��Ð6VfaÆí¾××7k6ÖÔPQÔÓâá:€YX†q/Ø –ŸoIkèƒãX äv6ff™›Pž¯ tô ôvsqsqq±···°°0ñغw8U:“<º�îܼyêæ©“'÷îu€¤ÚÉ Nž<}ú¼3æñŒî ,,//,ŒCIüò/ÛµvrCn¨‡�.–Üaõç××çÏïo™×]çÃ�!�‘‘±k×®õk×/_8}zwc\¨ª|æËû@páô…3GOÁÞíý…( D�`À tĘè[€cÀ§¢À¸IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportpni_32x32.png0000644000000000000000000000013215174607203017634 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/aportpni_32x32.png0000644000175000001440000000152115174607203017623 0ustar00rncbcusers‰PNG  IHDR D¤ŠÆÚPLTE©œ“        '".!& %, $- &.!!!"""&"###$$$-9&&&8:((()))*****+,,,2, ---)00...///000111333444666:63Jp9995=>;;;W]S}]aBBBDDD2LYFFF^ŽfmIIIa“#WrLLLUL<g“fkgt$^wQQQ ryt¦s�,fƒYYYYZZ‡[[[i\@bbb7t}ƒ—tfMhhh‰™3„‹œyiJ"† nlh=‚Œ˜¾™Á—¥m„…B—š¯Ý"§¬.Ÿ¿'¨­ƒƒƒ(¬²�„u½ñ‹‹‹ŒŒŒH©­ŽŽŽ%½Â’’’–––ƒ¥¥+ÍÓ¬œ‰    ¥¥¥’´µªªª­­­®®®¯¯¯�½¾®±±²²²Ä´¨¸¸¹¹¹¹Æ¶©¢ÅÅ»»»ŸÍÎÂÂÂÃÃÃÀÅÅÆÆÆÈËËÙÞÞ¹ôõäääåååçççÙòóèííìììøþþùþþ^ÓºYtRNS@æØf%IDATxÚc` æÎÅ//™×¦ŠW��Yi›^C¤L“ Ú-𩋈©î²˜‹Û-sõcæÎÍÈ÷Å¥‚Qo®WÓ„Þª9œ*”¹ŒúgO©JPÀe‰‹ÃD<*æ¦Ús³áS1×2+ ¤bN5.…aÜ`3âıª`w/ 㪘ْÄ�G…MíäÊÌœ*X™­Ê'u—DñâRáÊcR×Z_–.‹CEš�µ•cߌìh5ìÁÁn—oÀáÖê$€#DÙ=rlåý§÷háŠÁà@ïP]|*ø„ýšðª•˜«V¡�'‰¡¢Y׿"D� Ãfõi=:øT8ëú‡kâQ¡Ø,¯?«!Ÿ&ž±S¥ñefÇÈ¢P¼™2TļˆpÞé2X;¨¦íIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphDisconnect.png0000644000000000000000000000012715174607203020256 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphDisconnect.png0000644000175000001440000000221215174607203020237 0ustar00rncbcusers‰PNG  IHDRÄ´l;sBIT|dˆ pHYs & &Q©©3tEXtSoftwarewww.inkscape.org›î<IDAT8�¥•MHgÇãìºVt76kG÷Û@Ñ@i$´¦KõÒk*Ù–^ZD¨"9xh‚¥7„ n)E´Ú]‘BÍaÕ­ëîZ¿Ò­âú‘hcT4®ÎLÎ4Sµ9´/ Ì ÿ÷7ϼÏóü�ÿ¿ýzÕKÈÌšàP^Ë25½ iO�4 a&àŠ�C`Ødc$­x(Dàøøx¢‹Eà†Õjm …BÏÀGÚ‡LþÌÜ0™L-Á`ð`~~^‡ÃòØØ˜ÜÜܼ ¼XLqqÿçåååÖìì웺»»E`ØÖ"�׀ꮮ®/ÊÊÊrŽ��999áèèˆt:}¸˜DØn³ÙÞ±ÛívI’„ÂÂÂk¢(–F£Ñ ` xX�{MMMü~¿cmm�¡¡!5«ÉdRÝÚÚÚˆÅb?hGZ" €û555ËÃÃÃJ"‘P‡‡‡¿ßŸ>|ÀÝêêêÐúúº’H$ÔÖÖV¥¤¤$ ´Ÿï�¡G¬jmÇb±”¢(·Ýnw^QQ‘àt:mf³¹4�>¤þþþOÓé´8::J0\™ššú¦�ß�@ÑÁ:üØŽÇã)UUÿ†»Ýn[ffæíÙÙÙíååesNNŽcffæÏ���¯€ –ƒçÀ™^AFð¿Â}>Ÿàv»­‹ÅÓ××7±°°ðprrò[Y–CÚùŸ]à\á�ãñxJ„[�'Ïëõ .—+WÅ‚‰‰‰ ,Ë?œ7Å¥uX‡Ÿû±Xì©(Š%^¯÷šÛíœN§Õd2•D£ÑU`8⟠ôR° (ÈÊʺ[\\\ …–�B�Çcóù|‚Ëå²™Íæ;†R¼¿4¨|ÐÓÓÓV__ÿîââ¢088ø£¢(.—ëbµ\ ×Á€È^Þjlll©­­umll‹E ƒßÅãñ‡ªªÞ¼¢�pEgv ¨îUTTÔµ··ßÙÛÛFFFÔÞÞÞ_677¿"ñx|]UÕ[^¯7Ïçó ‡Ã&ŠbéÜÜ\ H#·•�VVVΉ„œL&•¥¥%µ­­M­¬¬\>äÜtWû¸®®îÑÐÐ�‰DÔ@  ÔÔÔü¼­ñ0i—=??_ÊÍÍeYfuu•H$ÂôôôÓñññ¯�IàçFôø)@KUUUÑþþ¾ I’È5fÿ Ø�Åb»©Tê•��ÙÝÝ=êíímç…»éM kÏ£�@@Q¥I’$Wggç7À¢®Ó'A>ðçFcÑ6oΛ Íe³µÜ¼ähД®Õ Ü8f2xÑ i-Ë—À°OM§F­pAxå`ü/ë/M�»ê�+VIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/refresh1.png0000644000000000000000000000013215174607203016656 xustar0030 mtime=1777536643.507914349 30 atime=1777536643.507914349 30 ctime=1777536643.507914349 qjackctl-1.0.6/src/images/refresh1.png0000644000175000001440000000112715174607203016647 0ustar00rncbcusers‰PNG  IHDRóÿaIDATxÚ­’]HS†ŸmžÍÖü(ZBö£7Ñ¢‚~è"¼N¨!A¢À¢èJº »©›¢ £›®Š¨IhÙ¢Ò¢ÔdË¥’†ÎÎqÆçqcÇ3·sº8¹μé½ûøxÞ�ïµ°‘ºæ*¬û°ü™Æ"MÕƒ«ë‚ j‰ÄhÂ�ž1g%‡Ú¼ ÞjÎxiæGò o4Ñ×>Ê´ê 4€XÂ;ó'x¹KØÙÊØ(Ò  ÀŒz¶mÉO$иj±fÍÞH Qg+½�a¬&_úH§`a Äi jösàBËZ@ÜÞAà HŸ ‚÷Î�Œ^Àï›G‚áÛíhJ›•žë@aî„Gr"¥È~½ó÷Í£�žs[ÄfPXÖƒ°YÀUÝHB~b&ˆÑ@T=ñð�¬ÙT Rx�¿¢È¥#8¡|Ç©Ü ±ŒM›@úç[‹�ô2¤UW $û±XÁU•{�®k~*ïÁj+`iŽç7ꃨ1�’8rùæºS »g!.Crþõß_ø5~•Ì ¸ë\œŽÐ6´;»ë–wѹ0ͤº�‰û§€> ÛpS ×ÞS^wŒ²íPUŬ°Éb  v&Dëéc’™ÞÃÀ·µ°à9Ý�»þ"Žb+Î ³…ŠdƉ|=Œä ùUŠ»þ,®ª“d4;Šô�øÜsà-°ÌÿÔo’JÑú•fIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportlti_64x64.png0000644000000000000000000000013215174607203017650 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/aportlti_64x64.png0000644000175000001440000000516515174607203017647 0ustar00rncbcusers‰PNG  IHDR@@�·�ì÷PLTE‡“” &% $" *, '($#././ -*"$"3302*)))77 46100079+-+==A@(2375231BBGF?@#==EENL685DE5:< LK:;9USKLPO+FH$JK?@> PP9GG)OQce/PL2NO\Z%UUCHJ-SUgiHIG![Zkl*ZZ2XZLNKcamogjPQOITU0__>ZZvv8^`$igqrTVS;ac5dd/hg(lj;jj^\`\^[(tv[`b€€b^]2us@ooPhi`b_:rq^ceafh7zxEtt?wv……fheTpq#‰‰C|zJyyokmlmk?‚2‡‰Sz{H€O~~*ŽŽ[z|qrpL„ƒfyxSƒƒHŠˆvwt\ƒ„3••Q‰ˆL�Ž e„†z|yx}[ŠŠj…ƒ:›š}|X��ƒ~}R”‘r†…`��O—š�ƒ€hŽ�7¥¤…ƒ‡]•”B¡¡sŽŒŠ…„ƒˆ‹y�Œ†ˆ…`™—V� ˆŠ‡?«ªi™™R¤¥Œ��ŒŽ‹r™›`¢ŸE°¯V©ªoŸŸ|𛑓�[­®s££‘–˜T²±d¬®–˜•M·¶›—˜a³´„¤§i±³›�š|ªª\¹¹f¸¹ ¢Ÿa¾¾YÂÀˆ°±k½¾„´´¦¨¥gÄά©cËÉ‹»»mÉÉuÇÈ”¼¾°²®qÎͯ´¶´¶³oÖÔ•ÆÆxÔÔÑÒ¸º·¿¹¸tÜÙ½¼À Éʽ¿¼€ÜÛžÏϤÍÎyáßÃÅÁ~åã…âá¥ÖÖÇÉÆÅÊÍŠæå®×ØÊÌÉ„ëé¬ÝÝ´ÜÞÐÒÏŠñï“ðï²äãÔÖÓ¸âãŽõóÚÖØ¶ççÙÛØ¹êê”ûùÛàãÞàݘÿýåàÞâäáçéæìîëñóïôöóý÷öùûø÷ýÿýÿüg*†îtRNS@æØf,IDATxÚÕ—aTWÇA¤ km�»€JÍ*íB;ÄÈ@µY”ZÃm³q-ˆ$¢¡6±-±P ˜Š”%E«¢€�H• ŠbTrÖ¸8.e7DCíšø|ŸurN)Òm±;œ„ÓIÜ|xëòß]¦Ý'¦ÊûG0 °×Ëì¬ØËî ˆÇ|íˆýA¿Ó¡¯o¯?ä²1JL£££ã×T'Û€ýXUUQê ®ŽÅlœ$2;éýEÄòËæ»øþд³8­©¶êË/‹öïOº}fËFÅqñ7¿“ çr“Y§]ü>ʈd¼Ešsrr²ÞºÖD�—ë8I9/^o''&nqu¾Ì…�6SÿHÍú8+ƒ„E µ¶Ò£K»�NÔŸ á s¹\–Ÿ À,#fP—oýEÛ¶F`-WèÑÒ>§£qjjê9xˆ)DZëèÑÃÛ]àM0»<<ımóæ­[W 4©èÑ2½Óù�mròÙ3;øÙíÏ?»~¹~�«Ö.™ïßÏHÝÀ€áÈl"tªó[âe#NBª×[,›Í6iŸ´—<º×.p€ú'€R’× ÞMë³Áæ|Îé@µzýÈ‹Íb›<1fèÍ÷v8�€i ‹ÊîM0#òJ[ —­¶(¯AÝÑ­Eûúô–'–ÖáG….ÿ ):R©ëcccÉ"OiÄJ8¾âËäÈOj€èîÓë�[�Æ\—€ÓÇjkkë> |Þ±qG4…âoŸ8ñŸð¥r¤Q}SÛÝýOí9Г\ŸñЪr-õ÷_>MØyµ !œ ŸÍÉ‚¨;P¤Ýj~ÈrÝ%Tüþ›fÏž ì0üþÕÌ6&ú�\^šÍ拤ß*A~穹ý¥Sô«N¯% m™:å]TÝPÍËÞ‘.’U#�²ãºÑx<í•MuÖZAä�»±¯GP-ò½”ÇcgóJe ˆ?Ÿ½g>”øê¶>¬DxS†¦ÄÒ×­FR~6;�'UÈ•ï”_þùP¨‹?̈¨*ª+´èÑ‘ñ„œO²ù"Ù7o êïz»s´Áq­+¨»ûoT«nPJ…|›Ç±cö–-tëx†"à¸c™:ùcíhlPH…Ù;Øé|ZbÚÁ”<÷ÎwIdTU*¶k¤„€(eR^úß8é!1){¶§¸9`œ~£hg›íëÖ"?}¯øJÄK缓´+o�»#Žä/Eâ= ØOBgYøªõªq{Ê‚¨E©Ø;ÿ5ÒP-/~4Ū˜uî�iPNlWqzz—¬Bu©4,˜ºzu�ûSš”�õ¹n‰¬(åù/]¬òdÖ¥d%a…¡ !u¨/*J,¦R¹û<@0\§ E´ZD-_²0`ñÒ�.?�Æõ… ýç)ó™B^ô‹‹=»0Hâbëz2)‹(à \¼^çY`7m‹Òaɤ(ëz¸ßý‚àT Ëó§P(swcªÜ—Ç`ýšŒ„„¼Nì¶¯× Y€a===Ø•9^3’dáêfpsÕ°fz÷%»íœß™Ûÿ—þ ˜e°ÎÑ„NIIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportlni.png0000644000000000000000000000013215174607203016767 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/aportlni.png0000644000175000001440000000025515174607203016761 0ustar00rncbcusers‰PNG  IHDRíÝâRPLTEpH€€€€€ÀÀÀÿÿÿÿÿ6tRNS@æØfFIDATxÚcHb€e(ƒ)) ÊT�Ê&:ºA„E Bj‚j!¦Ä„�Ä€ÄÔd¨jaP3•R`b0{B0G0«9I o09˜IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/remove1.png0000644000000000000000000000013215174607203016515 xustar0030 mtime=1777536643.507914349 30 atime=1777536643.507914349 30 ctime=1777536643.507914349 qjackctl-1.0.6/src/images/remove1.png0000644000175000001440000000030515174607203016503 0ustar00rncbcusers‰PNG  IHDRóÿasRGB®ÎéIDAT8˵SÉ€ \©Ìjhê°ëÀÊâÃAÑ,¯ü`�$ËüPá!¶� ÑÂB„-ìLHš¨0¿azOLD Û9\�îˆéJVxŽ] —ÎNÔ ‹çâ,@dS8Ò]²xâ ¥i³j�µ²Ø»[i§ƒŽ§ xóY>¯R£h û¬#�IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/mporti_64x64.png0000644000000000000000000000013215174607203017324 xustar0030 mtime=1777536643.505914363 30 atime=1777536643.505914363 30 ctime=1777536643.505914363 qjackctl-1.0.6/src/images/mporti_64x64.png0000644000175000001440000000335415174607203017321 0ustar00rncbcusers‰PNG  IHDR@@�·�ìúPLTE       # # #!' "#!*"#$"$%#3%%'%'(&()'/*++$+,*,+.+.",-+-/,01/7752'315130231689496342:8796A<A8)9:8@=@:4CBI> ;=;==6P>J<X;=?ICUB@B?a>CD2ACAJEMD$NB.VEDFCOE5OG,GHFRI(VJjEXH$TH4IKHOIClGOM0cNKMJNNFMOMSR:VQ@[[RTQnWUVTVXUbaY[XgY>[]Zk\B]_\mc#^`]dd:_a^`b_ac`}a&bdaib\scCkgDoh9ti)khJueEfheuo&mhgpikhlnk{r>npmnNvnhoqn…vwvEqsprtq‹zsuruwtwyvxzw‚xly{x’€zy{}z}|†�]‹}f~€}ˆ~r€‚�ƒ€‚„�ƒ…‚‰„ƒ…‡„ˆ‰†È‡‹�Š��ŒŽ��щ�™G“’Š•”zÕ�“•’”–“°¤–˜•˜š—¥œjš›˜¶©›�™ª™Žœž›¦¥^§¡{ž �«ž�²±±žŽ¢¤¡¤¦£®¨‚¯«q¥§¤¦¨¥²°i³®t¸¦œ«­ª¯±®À¯¤²´±µ·´¸º·Éµ¤¹»¸º¼¹ÓÎù¿»½º½¿¼ÈÄ�áÓÀ¾ÁÿÂÄÁë×ÅÈÄÇÉÆÏͱÊÌÉÎÐÌÏÑÎÐÒÏÓÕÒÕ×ÔØ×Î×ÙÕíé|ÞàÝãåáåçäçéæëêáëîêñóðõøÓ÷öíô÷óúùÜùûøûýúþýôüÿûÀœ˜tRNS@æØf IDATxÚí—olEÀov •ºR.´¡šbiáøcÕN,2­ÁK�¬&&è ˆG©aSmŒÿiɘh)Ö€S¾Lª±D†@(i¡^Ê�ÜÑ“ž&…šl{ÄkÎÔØ»6qvï¾væ¾ãû¾¿üÞ›7oÞ:ÿ�ðæ«Y}¯j‘ – ¿ >˜t@NÈÆ¡øÌch8Z¤zå "öÑÙ#s¥ ÎãKwœî½uI>玦¦ÓWoÝ(–&¼ÑÚb~.QU¹¦x¤¥µ©élïIüvcûÃRg¹¬¥µù�ÝwÍÆÔ%Kx)Œ�ú¿ÀÝ�Ë”å/ :Œ›×>7X¥ !'GÓi„üÄÇ Œ‚´´CidU·( wf1؉:ò(F4°0󨕥ª¨‚íL˜=ØÓÁü”¸sÅTÅrâŒ$&yÏðyœ"ªšq Ÿ…b}Ôú‰_™!í`xá‰ÄXÔÿ�(Á>‹2Ý@,ã„Hw(õŠ9 ¸ &l(61Á:Ic©°ƒR®[„1‹`9”«‚íˆ8ÁÎÂrð­ >S,‚åŽÍ8T̞േûu˜=a ¥ì:0¬»óÔÙ—ÑŽûu#ä{J —* ÈÔ�²ÄhÔO¢ w0Ï"€ã6<ÛÓÌ|Ÿ®",df—;qÛ*!‚-¡qj„"á0ëé$X”@Ôë Ê¢áÁp÷‡ïÄ¥b«)K¦œp3Îã¸�O 8='bfBwˆU2!N0h4:L�j¦Qâu9À§täáFˆ‘ßÿøåâÑú Ô‘¹Õ5p#$þk„&““œðÕ³ªÀhPÁJX� §›HÉä_a±Ðp)YkÊ%šæ¦ãÓSáÄC"ÃÅUƒ*6’v€S§ñ”�ÅÑB‚ Ö ºÃ¾§ð¦tÓ„ípþ‡ªJhúo iÂøôß?¼¼öù&œ²FóÔm¾}§aA(vÓ›{·Îß}ÉB‘érëOvݾówpBåÍ+Ï­Þüñ"‘7“߸åGË(û 罸oþ¦o>�#ôl•íê²ó  'v^XüÊ«bË æ‚=œ°aUíÞ/qí�þBE_¡xë·Ÿò� ÑÚC͹ëhΞo}·{4™¼Kë]Àá�!¬ØÖ/•JŽ|í”[¨•†×?˜J¥bÐ!K.žûuòOšÅßÍœg^[ ÿÇ¿,þéç³öÐ{-ºIEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/aportlto_32x32.png0000644000000000000000000000013215174607203017644 xustar0030 mtime=1777536643.503914378 30 atime=1777536643.503914378 30 ctime=1777536643.503914378 qjackctl-1.0.6/src/images/aportlto_32x32.png0000644000175000001440000000206715174607203017641 0ustar00rncbcusers‰PNG  IHDR D¤ŠÆmPLTE   ## !!!&&"""(('' ((%%%)) (*&))$,,//***!..00%33000'5511188666,;;777??==@@0BB===??3>>>3EE@@@>AAAAABBBGGGHHHQQSSz��‹‹‹ršš˜˜@””csœœ���vœœœœ6tžžx��’’’žžB¡¡;¢¢D¡¡S››…z¦¦¢¢OŸ£Z›››¥¥K¦¦E¦¦G~ª§§§J���€«¨©©E€­­€®®�°°¢¢¢‚°°¬«\„³³Š¼¼‹½½¸¸aŒ¾¾�ÀÀ±±±ŽÁÁ�ÂÂ�Ãÿ¿Y¿¿_‘ÄÄ···ÀÀsÃÃf¹¹¹ººº»»»ÁÆ|¾¾¾ÈÈu¿¿¿ÉÉrËËeÂÂÂÍÍlÎÎjÔÔpÕÕpØØrÝ݃ß߈ââƒçç�áááåååòòŒòòŽóó�öö�÷ø‘üü–ýý—jÐÓtRNS@æØfxIDATxÚc` تÚØâ‘7k_µlílœò Õ5+Ö.[5W—ùéÕu+V-›“‹ÃÛ¥Ë:ªkV.î/SÆ®@nÚZ Šª…Í©êØ”çÏ\»¢µ2£$V«¼SÛÎ-3ÍÏNtÅêÍ¢ÉÇNO¬h(ðó”Ç&¯2kÿ¶«“Âcì…±ÉËNÙwòÌ„/knv¬æ‹ö,ð9¸3ÁFG u-ñÞâ"ŽCž³qCðæ”sŒ8äÙjw‡åÏž=‹]^¿xo^ùÌýy›ÀòØè'îoÚ‘ǪB?jÿñ>˜¼)¦½Þ“gÖðAä-:³0äY§Z¿3AdöYóÎu3˜Ñ¸>5ÕYÂÌšal§†*/µçD·»$œ+aêkˆªÀhG©.‚[8O,E^#‡Ÿ™?i«N2_°�ÕÀíët¢5� ô�Asò‘å:þ–®cºŸvµ(YX!¸"Žè ŽÓªG2� ]AP( —!‘Ù°‹Yo=¢IEND®B`‚qjackctl-1.0.6/src/images/PaxHeaders/graphZoomFit.png0000644000000000000000000000012715174607203017554 xustar0029 mtime=1777536643.50491437 29 atime=1777536643.50491437 29 ctime=1777536643.50491437 qjackctl-1.0.6/src/images/graphZoomFit.png0000644000175000001440000000265315174607203017546 0ustar00rncbcusers‰PNG  IHDRÄ´l;sBIT|dˆ pHYs & &Q©©3tEXtSoftwarewww.inkscape.org›î<(IDAT8��•]lSeÇ=íé°lÝܬ~lNdÌ`¡|¦‹²˜Å ^¹„¸�8nt*w‰!ÑÄ`†�&ÌãjÃ˜Ž­fv.ng´ ší¬c[c¥–­tkO{N½ ˜eNM|’7ÏÕû{ÿÏÇû<:þÝô€ °å@ °€8F€1`HiÝ?uèJ`ãš5k^ݵkWÍ–-[ŠV®\a¸}û¶Öß?u¹\���wæ�8�þ'°X%ÂëühÏž†EQtáp˜X,F2™DErsshoo�}úég_OMM�~æ—?Túæùóç>q8yýýýôôüœìëë»;66–L&“ZQQvû†"‡Ã±¼¸¸IT÷îÝ{úÖ­[‡�á¥R� ì8pàÀØÌ̽ô¥KÓ555£ÀI³ÙüƒÛíNº\®”Åbù hZ»v­ûòå˪ÏçM:t(.‡@ñRjËÊÊÊŽOOßѺ»»ÒµµµcÀ¾üüüÏ=Obdd$ÝÕÕ•>uêTª´´ôÐPQQÑÑ×÷‹ÖÝÝ•v8^`«~8 x¶¡¡¡qÓ¦M�º\®ÔÑ£G¿ÍÏÏ×mذÁ&ŠbÁµk×T¿ß¯Äãñ¸¢(  òò­¨ªªZ ÝÍs»ÝÃR�°~ýúâ™™{HÒàlNNNY[[ÛæÑÑQ­®®î8à4`Mssó»•••›wìØñckkëÐûï¿WôÄ�g-[¶ìIa‘bÈ.,,‰Á`Pu:�ϯZµÊ8>>®çAϺ€ï�ßUU5ꛚš^ …BÂÜ܃«ÕZbàï¦% 4M`xxXK$ÌÏÏ/¬€NQdYfrrRK¥RªN§CUUR©Tj¡â4 ÷'&‚ £ÑHii©ØÐÐÐ-IÒ\AAA¨ÞÞ*ãñ¸âõz•}ûö¹ÊÊÊĬ¬,"‘{LMM+V�[}}}ÁmÛ^~¦ºúEóÙ³gïìß¿ÿ‹ÊÊJ[ggç;z½Þ‹Å˜��U�;Öëõz{¢Ñ¨P__ÿB$A–‡çE[œc¸ÓÒÒÒ�ÞO¯[·Nؽ{÷+Š¢è¼^ï¯ápX³X,¢ÉdƒÁ Þçóý‰D¦ª««_ª«{;Ïï÷30 ]†.¨±ÙlíGŽQÆÇÇÒnwwº±±1d4ω¢ØqæÌ™Ä‰'’ÙÙÙ]Àñ�;wú&'ƒZgç�éúúw¢À H·jlv»½±¥åR­(ŠÂÕ«”—?…ÉdbvvFkoïˆú|¾d,SW¯^­ß¾}»Ùn·%œÎïÍÍÍ_E£Ñ“ÀMÝèsv»ýƒÖÖojW¬X)ȲLoo/�G±ÙlâÓO—ë 1™AÓ4E!sãÆ º»ÝwÛÚÚŽÅãñ @Hè€`½Ýnÿ°¥åRmq±E�e™žžü~¿æt:˜žž¾YUUµµ¼ü©ÇrrÌY‚ è"‘?RÁ�$Iîññq'Ð Ü2cóÙ�7~|ñâ…×-ë_PI’´ŽŽŽvY–›x0gWÖLt0Ünf|,Sü¿ýk’4Ðbµ–§§§ñx #include // QRegularExpression exact match pattern wrapper. #if QT_VERSION < QT_VERSION_CHECK(5, 12, 0) #define EXACT_PATTERN(s) ('^' + s + '$') #else #define EXACT_PATTERN(s) QRegularExpression::anchoredPattern(s) #endif //---------------------------------------------------------------------- // class qjackctlAliasItem -- Client/port item alias map. // Constructor. qjackctlAliasItem::qjackctlAliasItem ( const QString& sClientName, const QString& sClientAlias ) { if (sClientAlias.isEmpty()) { m_rxClientName.setPattern(EXACT_PATTERN(escapeRegExpDigits(sClientName))); m_sClientAlias = sClientName; } else { m_rxClientName.setPattern(EXACT_PATTERN(sClientName)); m_sClientAlias = sClientAlias; } } // Default destructor. qjackctlAliasItem::~qjackctlAliasItem (void) { m_ports.clear(); } // Client name method. QString qjackctlAliasItem::clientName (void) const { return m_rxClientName.pattern(); } // Client name matcher. bool qjackctlAliasItem::matchClientName ( const QString& sClientName ) const { return m_rxClientName.match(sClientName).hasMatch(); } // Client aliasing methods. const QString& qjackctlAliasItem::clientAlias (void) const { return m_sClientAlias; } void qjackctlAliasItem::setClientAlias ( const QString& sClientAlias ) { m_sClientAlias = sClientAlias; } // Port aliasing methods. QString qjackctlAliasItem::portAlias ( const QString& sPortName ) const { return m_ports.value(sPortName, sPortName); } void qjackctlAliasItem::setPortAlias ( const QString& sPortName, const QString& sPortAlias ) { if (sPortAlias.isEmpty()) m_ports.remove(sPortName); else m_ports.insert(sPortName, sPortAlias); } // Save client/port aliases definitions. void qjackctlAliasItem::saveSettings ( QSettings& settings, const QString& sClientKey ) { settings.beginGroup(sClientKey); settings.setValue("/Name", m_rxClientName.pattern()); settings.setValue("/Alias", m_sClientAlias); int iPort = 0; QMap::ConstIterator iter = m_ports.constBegin(); const QMap::ConstIterator& iter_end = m_ports.constEnd(); for ( ; iter != iter_end; ++iter) { const QString& sPortName = iter.key(); const QString& sPortAlias = iter.value(); if (!sPortName.isEmpty() && !sPortAlias.isEmpty()) { settings.beginGroup("/Port" + QString::number(++iPort)); settings.setValue("/Name", sPortName); settings.setValue("/Alias", sPortAlias); settings.endGroup(); } } settings.endGroup(); } // Escape and format a string as a regular expresion. QString qjackctlAliasItem::escapeRegExpDigits ( const QString& s, int iThreshold ) { const QString& sEscape = QRegularExpression::escape(s); QString sDigits; QString sResult; int iDigits = 0; for (int i = 0; i < sEscape.length(); i++) { const QChar& ch = sEscape.at(i); if (ch.isDigit()) { if (iDigits < iThreshold) sDigits += ch; else sDigits = "[0-9]+"; iDigits++; } else { if (iDigits > 0) { sResult += sDigits; sDigits.clear(); iDigits = 0; } sResult += ch; } } if (iDigits > 0) sResult += sDigits; return sResult; } // Need for generic sort. bool qjackctlAliasItem::operator< ( const qjackctlAliasItem& other ) { return (m_sClientAlias < other.clientAlias()); } //---------------------------------------------------------------------- // class qjackctlAliasList -- Client/port list alias map. // Constructor. qjackctlAliasList::qjackctlAliasList (void) { } // Default destructor. qjackctlAliasList::~qjackctlAliasList (void) { qDeleteAll(*this); clear(); } // Client finders. qjackctlAliasItem *qjackctlAliasList::findClientName ( const QString& sClientName ) { QListIterator iter(*this); while (iter.hasNext()) { qjackctlAliasItem *pClient = iter.next(); if (pClient->matchClientName(sClientName)) return pClient; } return nullptr; } // Client aliasing methods. void qjackctlAliasList::setClientAlias ( const QString& sClientName, const QString& sClientAlias ) { qjackctlAliasItem *pClient = findClientName(sClientName); if (pClient == nullptr) { pClient = new qjackctlAliasItem(sClientName); append(pClient); } pClient->setClientAlias(sClientAlias); } QString qjackctlAliasList::clientAlias ( const QString& sClientName ) { qjackctlAliasItem *pClient = findClientName(sClientName); if (pClient == nullptr) return sClientName; return pClient->clientAlias(); } // Client/port aliasing methods. void qjackctlAliasList::setPortAlias ( const QString& sClientName, const QString& sPortName, const QString& sPortAlias ) { qjackctlAliasItem *pClient = findClientName(sClientName); if (pClient == nullptr) { pClient = new qjackctlAliasItem(sClientName); append(pClient); } pClient->setPortAlias(sPortName, sPortAlias); } QString qjackctlAliasList::portAlias ( const QString& sClientName, const QString& sPortName ) { qjackctlAliasItem *pClient = findClientName(sClientName); if (pClient == nullptr) return sPortName; return pClient->portAlias(sPortName); } // Load/save aliases definitions. void qjackctlAliasList::loadSettings ( QSettings& settings, const QString& sAliasesKey ) { clear(); settings.beginGroup(sAliasesKey); QStringListIterator client_iter(settings.childGroups()); while (client_iter.hasNext()) { const QString& sClientKey = client_iter.next(); const QString& sClientName = settings.value(sClientKey + "/Name").toString(); const QString& sClientAlias = settings.value(sClientKey + "/Alias").toString(); if (!sClientName.isEmpty() && !sClientAlias.isEmpty()) { qjackctlAliasItem *pClient = new qjackctlAliasItem(sClientName, sClientAlias); append(pClient); settings.beginGroup(sClientKey); QStringListIterator port_iter(settings.childGroups()); while (port_iter.hasNext()) { const QString& sPortKey = port_iter.next(); const QString& sPortName = settings.value(sPortKey + "/Name").toString(); const QString& sPortAlias = settings.value(sPortKey + "/Alias").toString(); if (!sPortName.isEmpty() && !sPortAlias.isEmpty()) pClient->setPortAlias(sPortName, sPortAlias); } settings.endGroup(); } } settings.endGroup(); } void qjackctlAliasList::saveSettings ( QSettings& settings, const QString& sAliasesKey ) { std::sort(begin(), end()); settings.beginGroup(sAliasesKey); int iClient = 0; QListIterator iter(*this); while (iter.hasNext()) { (iter.next())->saveSettings(settings, "Client" + QString::number(++iClient)); } settings.endGroup(); } // end of qjackctlAliases.cpp qjackctl-1.0.6/src/PaxHeaders/qjackctlGraph.cpp0000644000000000000000000000013215174607203016446 xustar0030 mtime=1777536643.510914327 30 atime=1777536643.510914327 30 ctime=1777536643.510914327 qjackctl-1.0.6/src/qjackctlGraph.cpp0000644000175000001440000022624015174607203016444 0ustar00rncbcusers// qjackctlGraph.cpp // /**************************************************************************** Copyright (C) 2003-2026, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlGraph.h" #include "qjackctlGraphCommand.h" #include "qjackctlAliases.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //---------------------------------------------------------------------------- // qjackctlGraphItem -- Base graphics item. // Constructor. qjackctlGraphItem::qjackctlGraphItem ( QGraphicsItem *parent ) : QGraphicsPathItem(parent), m_marked(false), m_hilite(false) { const QPalette pal; m_foreground = pal.buttonText().color(); m_background = pal.button().color(); } // Basic color accessors. void qjackctlGraphItem::setForeground ( const QColor& color ) { m_foreground = color; } const QColor& qjackctlGraphItem::foreground (void) const { return m_foreground; } void qjackctlGraphItem::setBackground ( const QColor& color ) { m_background = color; } const QColor& qjackctlGraphItem::background (void) const { return m_background; } // Marking methods. void qjackctlGraphItem::setMarked ( bool marked ) { m_marked = marked; } bool qjackctlGraphItem::isMarked (void) const { return m_marked; } // Highlighting methods. void qjackctlGraphItem::setHighlight ( bool hilite ) { m_hilite = hilite; QGraphicsPathItem::update(); } bool qjackctlGraphItem::isHighlight (void) const { return m_hilite; } // Raise item z-value (dynamic always-on-top). void qjackctlGraphItem::raise (void) { static qreal s_zvalue = 0.0; switch (type()) { case qjackctlGraphPort::Type: { QGraphicsPathItem::setZValue(s_zvalue += 0.003); qjackctlGraphPort *port = static_cast (this); if (port) { qjackctlGraphNode *node = port->portNode(); if (node) node->setZValue(s_zvalue += 0.002); } break; } case qjackctlGraphConnect::Type: default: QGraphicsPathItem::setZValue(s_zvalue += 0.001); break; } } // Item-type hash (static) uint qjackctlGraphItem::itemType ( const QByteArray& type_name ) { return qHash(type_name); } // Rectangular editor extents (virtual) QRectF qjackctlGraphItem::editorRect (void) const { return QRectF(); } // Path and bounding rectangle override. void qjackctlGraphItem::setPath ( const QPainterPath& path ) { m_rect = path.controlPointRect(); QGraphicsPathItem::setPath(path); } // Bounding rectangle accessor. const QRectF& qjackctlGraphItem::itemRect (void) const { return m_rect; } //---------------------------------------------------------------------------- // qjackctlGraphPort -- Port graphics item. // Constructor. qjackctlGraphPort::qjackctlGraphPort ( qjackctlGraphNode *node, const QString& name, qjackctlGraphItem::Mode mode, uint type ) : qjackctlGraphItem(node), m_node(node), m_name(name), m_mode(mode), m_type(type), m_index(node->ports().count()), m_selectx(0), m_hilitex(0) { QGraphicsPathItem::setZValue(+1.0); const QPalette pal; setForeground(pal.buttonText().color()); setBackground(pal.button().color()); m_text = new QGraphicsTextItem(this); QGraphicsPathItem::setFlag(QGraphicsItem::ItemIsSelectable); QGraphicsPathItem::setFlag(QGraphicsItem::ItemSendsScenePositionChanges); QGraphicsPathItem::setAcceptHoverEvents(true); QGraphicsPathItem::setToolTip(m_name); setPortTitle(m_name); } // Destructor. qjackctlGraphPort::~qjackctlGraphPort (void) { removeConnects(); // No actual need to destroy any children here... // //delete m_text; } // Accessors. qjackctlGraphNode *qjackctlGraphPort::portNode (void) const { return m_node; } void qjackctlGraphPort::setPortName ( const QString& name ) { m_name = name; QGraphicsPathItem::setToolTip(m_name); } const QString& qjackctlGraphPort::portName (void) const { return m_name; } void qjackctlGraphPort::setPortMode ( qjackctlGraphItem::Mode mode ) { m_mode = mode; } qjackctlGraphItem::Mode qjackctlGraphPort::portMode (void) const { return m_mode; } bool qjackctlGraphPort::isInput (void) const { return (m_mode & Input); } bool qjackctlGraphPort::isOutput (void) const { return (m_mode & Output); } void qjackctlGraphPort::setPortType ( uint type ) { m_type = type; } uint qjackctlGraphPort::portType (void) const { return m_type; } void qjackctlGraphPort::setPortTitle ( const QString& title ) { m_title = (title.isEmpty() ? m_name : title); static const int MAX_TITLE_LENGTH = 29; static const QString ellipsis(3, '.'); QString text = m_title.simplified(); if (text.length() >= MAX_TITLE_LENGTH + ellipsis.length()) text = ellipsis + text.right(MAX_TITLE_LENGTH).trimmed(); m_text->setPlainText(text); QPainterPath path; const QRectF& rect = m_text->boundingRect().adjusted(0, +2, 0, -2); path.addRoundedRect(rect, 5, 5); /*QGraphicsPathItem::*/setPath(path); } const QString& qjackctlGraphPort::portTitle (void) const { return m_title; } void qjackctlGraphPort::setPortIndex ( int index ) { m_index = index; } int qjackctlGraphPort::portIndex (void) const { return m_index; } QPointF qjackctlGraphPort::portPos (void) const { QPointF pos = QGraphicsPathItem::scenePos(); const QRectF& rect = itemRect(); if (m_mode == Output) pos.setX(pos.x() + rect.width()); pos.setY(pos.y() + rect.height() / 2); return pos; } // Connection-list methods. void qjackctlGraphPort::appendConnect ( qjackctlGraphConnect *connect ) { m_connects.append(connect); } void qjackctlGraphPort::removeConnect ( qjackctlGraphConnect *connect ) { m_connects.removeAll(connect); } void qjackctlGraphPort::removeConnects (void) { foreach (qjackctlGraphConnect *connect, m_connects) { if (connect->port1() != this) connect->setPort1(nullptr); if (connect->port2() != this) connect->setPort2(nullptr); } // Do not delete connects here as they are owned elsewhere... // // qDeleteAll(m_connects); m_connects.clear(); } qjackctlGraphConnect *qjackctlGraphPort::findConnect ( qjackctlGraphPort *port ) const { foreach (qjackctlGraphConnect *connect, m_connects) { if (connect->port1() == port || connect->port2() == port) return connect; } return nullptr; } // Connect-list accessor. const QList& qjackctlGraphPort::connects (void) const { return m_connects; } void qjackctlGraphPort::paint ( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget */*widget*/ ) { const QPalette& pal = option->palette; const QRectF& port_rect = itemRect(); QLinearGradient port_grad(0, port_rect.top(), 0, port_rect.bottom()); QColor port_color; if (QGraphicsPathItem::isSelected()) { m_text->setDefaultTextColor(pal.highlightedText().color()); painter->setPen(pal.highlightedText().color()); port_color = pal.highlight().color(); } else { const QColor& foreground = qjackctlGraphItem::foreground(); const QColor& background = qjackctlGraphItem::background(); const bool is_dark = (background.value() < 128); m_text->setDefaultTextColor(is_dark ? foreground.lighter() : foreground.darker()); if (qjackctlGraphItem::isHighlight()) { painter->setPen(foreground.lighter()); port_color = background.lighter(); } else { painter->setPen(foreground); port_color = background; } } port_grad.setColorAt(0.0, port_color); port_grad.setColorAt(1.0, port_color.darker(120)); painter->setBrush(port_grad); painter->drawPath(QGraphicsPathItem::path()); } QVariant qjackctlGraphPort::itemChange ( GraphicsItemChange change, const QVariant& value ) { if (change == QGraphicsItem::ItemScenePositionHasChanged) { foreach (qjackctlGraphConnect *connect, m_connects) { connect->updatePath(); } } else if (change == QGraphicsItem::ItemSelectedHasChanged && m_selectx < 1) { const bool is_selected = value.toBool(); setHighlightEx(is_selected); foreach (qjackctlGraphConnect *connect, m_connects) connect->setSelectedEx(this, is_selected); } return value; } // Selection propagation method... void qjackctlGraphPort::setSelectedEx ( bool is_selected ) { if (!is_selected) { foreach (qjackctlGraphConnect *connect, m_connects) { if (connect->isSelected()) { setHighlightEx(true); return; } } } ++m_selectx; setHighlightEx(is_selected); if (QGraphicsPathItem::isSelected() != is_selected) QGraphicsPathItem::setSelected(is_selected); --m_selectx; } // Highlighting propagation method... void qjackctlGraphPort::setHighlightEx ( bool is_highlight ) { if (m_hilitex > 0) return; ++m_hilitex; qjackctlGraphItem::setHighlight(is_highlight); foreach (qjackctlGraphConnect *connect, m_connects) connect->setHighlightEx(this, is_highlight); --m_hilitex; } // Special port-type color business. void qjackctlGraphPort::updatePortTypeColors ( qjackctlGraphCanvas *canvas ) { if (canvas) { const QColor& color = canvas->portTypeColor(m_type); if (color.isValid()) { const bool is_dark = (color.value() < 128); qjackctlGraphItem::setForeground(is_dark ? color.lighter(180) : color.darker()); qjackctlGraphItem::setBackground(color); if (m_mode & Output) { foreach (qjackctlGraphConnect *connect, m_connects) { connect->updatePortTypeColors(); connect->update(); } } } } } // Port sorting type. qjackctlGraphPort::SortType qjackctlGraphPort::g_sort_type = qjackctlGraphPort::PortName; void qjackctlGraphPort::setSortType ( SortType sort_type ) { g_sort_type = sort_type; } qjackctlGraphPort::SortType qjackctlGraphPort::sortType (void) { return g_sort_type; } // Port sorting order. qjackctlGraphPort::SortOrder qjackctlGraphPort::g_sort_order = qjackctlGraphPort::Ascending; void qjackctlGraphPort::setSortOrder( SortOrder sort_order ) { g_sort_order = sort_order; } qjackctlGraphPort::SortOrder qjackctlGraphPort::sortOrder (void) { return g_sort_order; } // Natural decimal sorting comparator (static) bool qjackctlGraphPort::lessThan ( qjackctlGraphPort *port1, qjackctlGraphPort *port2 ) { const int port_type_diff = int(port1->portType()) - int(port2->portType()); if (port_type_diff) return (port_type_diff > 0); if (g_sort_order == Descending) { qjackctlGraphPort *port = port1; port1 = port2; port2 = port; } if (g_sort_type == PortIndex) { const int port_index_diff = port1->portIndex() - port2->portIndex(); if (port_index_diff) return (port_index_diff < 0); } switch (g_sort_type) { case PortTitle: return qjackctlGraphPort::lessThan(port1->portTitle(), port2->portTitle()); case PortName: default: return qjackctlGraphPort::lessThan(port1->portName(), port2->portName()); } } bool qjackctlGraphPort::lessThan ( const QString& s1, const QString& s2 ) { const int n1 = s1.length(); const int n2 = s2.length(); int i1, i2; for (i1 = i2 = 0; i1 < n1 && i2 < n2; ++i1, ++i2) { // Skip (white)spaces... while (s1.at(i1).isSpace()) ++i1; while (s2.at(i2).isSpace()) ++i2; // Normalize (to uppercase) the next characters... QChar c1 = s1.at(i1).toUpper(); QChar c2 = s2.at(i2).toUpper(); if (c1.isDigit() && c2.isDigit()) { // Find the whole length numbers... int j1 = i1++; while (i1 < n1 && s1.at(i1).isDigit()) ++i1; int j2 = i2++; while (i2 < n2 && s2.at(i2).isDigit()) ++i2; // Compare as natural decimal-numbers... j1 = s1.mid(j1, i1 - j1).toInt(); j2 = s2.mid(j2, i2 - j2).toInt(); if (j1 != j2) return (j1 < j2); // Never go out of bounds... if (i1 >= n1 || i2 >= n2) break; // Go on with this next char... c1 = s1.at(i1).toUpper(); c2 = s2.at(i2).toUpper(); } // Compare this char... if (c1 != c2) return (c1 < c2); } // Probable exact match. return false; } // Rectangular editor extents. QRectF qjackctlGraphPort::editorRect (void) const { return QGraphicsPathItem::sceneBoundingRect(); } //---------------------------------------------------------------------------- // qjackctlGraphNode -- Node graphics item. // Constructor. qjackctlGraphNode::qjackctlGraphNode ( const QString& name, qjackctlGraphItem::Mode mode, uint type ) : qjackctlGraphItem(nullptr), m_name(name), m_mode(mode), m_type(type) { QGraphicsPathItem::setZValue(0.0); const QPalette pal; const int base_value = pal.base().color().value(); const bool is_dark = (base_value < 128); const QColor& text_color = pal.text().color(); QColor foreground_color(is_dark ? text_color.darker() : text_color); qjackctlGraphItem::setForeground(foreground_color); const QColor& window_color = pal.window().color(); QColor background_color(is_dark ? window_color.lighter() : window_color); background_color.setAlpha(160); qjackctlGraphItem::setBackground(background_color); m_pixmap = new QGraphicsPixmapItem(this); m_text = new QGraphicsTextItem(this); QGraphicsPathItem::setFlag(QGraphicsItem::ItemIsMovable); QGraphicsPathItem::setFlag(QGraphicsItem::ItemIsSelectable); QGraphicsPathItem::setToolTip(m_name); setNodeTitle(m_name); const bool is_darkest = (base_value < 24); QColor shadow_color = (is_darkest ? Qt::white : Qt::black); shadow_color.setAlpha(180); QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect(); effect->setColor(shadow_color); effect->setBlurRadius(is_darkest ? 8 : 16); effect->setOffset(is_darkest ? 0 : 2); QGraphicsPathItem::setGraphicsEffect(effect); qjackctlGraphItem::raise(); } // Destructor. qjackctlGraphNode::~qjackctlGraphNode (void) { removePorts(); // No actual need to destroy any children here... // //QGraphicsPathItem::setGraphicsEffect(nullptr); // delete m_text; // delete m_pixmap; } // accessors. void qjackctlGraphNode::setNodeName ( const QString& name ) { m_name = name; QGraphicsPathItem::setToolTip(m_name); } const QString& qjackctlGraphNode::nodeName (void) const { return m_name; } void qjackctlGraphNode::setNodeMode ( qjackctlGraphItem::Mode mode ) { m_mode = mode; } qjackctlGraphItem::Mode qjackctlGraphNode::nodeMode (void) const { return m_mode; } void qjackctlGraphNode::setNodeType ( uint type ) { m_type = type; } uint qjackctlGraphNode::nodeType (void) const { return m_type; } void qjackctlGraphNode::setNodeIcon ( const QIcon& icon ) { m_icon = icon; m_pixmap->setPixmap(m_icon.pixmap(24, 24)); } const QIcon& qjackctlGraphNode::nodeIcon (void) const { return m_icon; } void qjackctlGraphNode::setNodeTitle ( const QString& title ) { const QFont& font = m_text->font(); m_text->setFont(QFont(font.family(), font.pointSize(), QFont::Bold)); m_title = (title.isEmpty() ? m_name : title); static const int MAX_TITLE_LENGTH = 29; static const QString ellipsis(3, '.'); QString text = m_title.simplified(); if (text.length() >= MAX_TITLE_LENGTH + ellipsis.length()) text = text.left(MAX_TITLE_LENGTH).trimmed() + ellipsis; m_text->setPlainText(text); } QString qjackctlGraphNode::nodeTitle (void) const { return m_title; // m_text->toPlainText(); } // Port-list methods. qjackctlGraphPort *qjackctlGraphNode::addPort ( const QString& name, qjackctlGraphItem::Mode mode, int type ) { qjackctlGraphPort *port = new qjackctlGraphPort(this, name, mode, type); m_ports.append(port); m_portkeys.insert(qjackctlGraphPort::PortKey(port), port); updatePath(); return port; } qjackctlGraphPort *qjackctlGraphNode::addInputPort ( const QString& name, int type ) { return addPort(name, qjackctlGraphItem::Input, type); } qjackctlGraphPort *qjackctlGraphNode::addOutputPort ( const QString& name, int type ) { return addPort(name, qjackctlGraphItem::Output, type); } void qjackctlGraphNode::removePort ( qjackctlGraphPort *port ) { m_portkeys.remove(qjackctlGraphPort::PortKey(port)); m_ports.removeAll(port); updatePath(); } void qjackctlGraphNode::removePorts (void) { foreach (qjackctlGraphPort *port, m_ports) port->removeConnects(); // Do not delete ports here as they are node's child items... // //qDeleteAll(m_ports); m_ports.clear(); m_portkeys.clear(); } // Port finder (by name, mode and type) qjackctlGraphPort *qjackctlGraphNode::findPort ( const QString& name, qjackctlGraphItem::Mode mode, uint type ) { return static_cast ( m_portkeys.value(qjackctlGraphPort::ItemKey(name, mode, type), nullptr)); } // Port-list accessor. const QList& qjackctlGraphNode::ports (void) const { return m_ports; } // Reset port markings, destroy if unmarked. void qjackctlGraphNode::resetMarkedPorts (void) { QList ports; foreach (qjackctlGraphPort *port, m_ports) { if (port->isMarked()) { port->setMarked(false); } else { ports.append(port); } } foreach (qjackctlGraphPort *port, ports) { port->removeConnects(); removePort(port); delete port; } } // Path/shape updater. void qjackctlGraphNode::updatePath (void) { const QRectF& rect = m_text->boundingRect(); int width = rect.width() / 2 + 24; int wi, wo; wi = wo = width; foreach (qjackctlGraphPort *port, m_ports) { const int w = port->itemRect().width(); if (port->isOutput()) { if (wo < w) wo = w; } else { if (wi < w) wi = w; } } width = 4 * ((wi + wo) / 4); std::sort(m_ports.begin(), m_ports.end(), qjackctlGraphPort::Compare()); int height = rect.height() + 2; int type = 0; int yi, yo; yi = yo = height; foreach (qjackctlGraphPort *port, m_ports) { const QRectF& port_rect = port->itemRect(); const int w = port_rect.width(); const int h = port_rect.height() + 1; if (type - port->portType()) { type = port->portType(); height += 2; yi = yo = height; } if (port->isOutput()) { port->setPos(width + 6 - w, yo); yo += h; if (height < yo) height = yo; } else { port->setPos(-6, yi); yi += h; if (height < yi) height = yi; } } QPainterPath path; path.addRoundedRect(0, 0, width, height + 6, 5, 5); /*QGraphicsPathItem::*/setPath(path); } void qjackctlGraphNode::paint ( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget */*widget*/ ) { const QPalette& pal = option->palette; const QRectF& node_rect = itemRect(); QLinearGradient node_grad(0, node_rect.top(), 0, node_rect.bottom()); QColor node_color; if (QGraphicsPathItem::isSelected()) { const QColor& hilitetext_color = pal.highlightedText().color(); m_text->setDefaultTextColor(hilitetext_color); painter->setPen(hilitetext_color); node_color = pal.highlight().color(); } else { const QColor& foreground = qjackctlGraphItem::foreground(); const QColor& background = qjackctlGraphItem::background(); const bool is_dark = (background.value() < 192); m_text->setDefaultTextColor(is_dark ? foreground.lighter() : foreground.darker()); painter->setPen(foreground); node_color = background; } node_color.setAlpha(180); node_grad.setColorAt(0.6, node_color); node_grad.setColorAt(1.0, node_color.darker(120)); painter->setBrush(node_grad); painter->drawPath(QGraphicsPathItem::path()); m_pixmap->setPos(node_rect.x() + 4, node_rect.y() + 4); const QRectF& text_rect = m_text->boundingRect(); const qreal w2 = (node_rect.width() - text_rect.width()) / 2; m_text->setPos(node_rect.x() + w2 + 4, node_rect.y() + 2); } QVariant qjackctlGraphNode::itemChange ( GraphicsItemChange change, const QVariant& value ) { if (change == QGraphicsItem::ItemSelectedHasChanged) { const bool is_selected = value.toBool(); foreach (qjackctlGraphPort *port, m_ports) port->setSelected(is_selected); } return value; } // Rectangular editor extents. QRectF qjackctlGraphNode::editorRect (void) const { return m_text->sceneBoundingRect(); } //---------------------------------------------------------------------------- // qjackctlGraphConnect -- Connection-line graphics item. // Constructor. qjackctlGraphConnect::qjackctlGraphConnect (void) : qjackctlGraphItem(nullptr), m_port1(nullptr), m_port2(nullptr) { QGraphicsPathItem::setZValue(-1.0); QGraphicsPathItem::setFlag(QGraphicsItem::ItemIsSelectable); qjackctlGraphItem::setBackground(qjackctlGraphItem::foreground()); #if 0//Disable drop-shadow effect... const QPalette pal; const bool is_darkest = (pal.base().color().value() < 24); QColor shadow_color = (is_darkest ? Qt::white : Qt::black); shadow_color.setAlpha(220); QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect(); effect->setColor(shadow_color); effect->setBlurRadius(is_darkest ? 4 : 8); effect->setOffset(is_darkest ? 0 : 1); QGraphicsPathItem::setGraphicsEffect(effect); #endif QGraphicsPathItem::setAcceptHoverEvents(true); qjackctlGraphItem::raise(); } // Destructor. qjackctlGraphConnect::~qjackctlGraphConnect (void) { // No actual need to destroy any children here... // //QGraphicsPathItem::setGraphicsEffect(nullptr); } // Accessors. void qjackctlGraphConnect::setPort1 ( qjackctlGraphPort *port ) { if (m_port1) m_port1->removeConnect(this); m_port1 = port; if (m_port1) m_port1->appendConnect(this); if (m_port1 && m_port1->isSelected()) setSelectedEx(m_port1, true); } qjackctlGraphPort *qjackctlGraphConnect::port1 (void) const { return m_port1; } void qjackctlGraphConnect::setPort2 ( qjackctlGraphPort *port ) { if (m_port2) m_port2->removeConnect(this); m_port2 = port; if (m_port2) m_port2->appendConnect(this); if (m_port2 && m_port2->isSelected()) setSelectedEx(m_port2, true); } qjackctlGraphPort *qjackctlGraphConnect::port2 (void) const { return m_port2; } // Active disconnection. void qjackctlGraphConnect::disconnect (void) { if (m_port1) { m_port1->removeConnect(this); m_port1 = nullptr; } if (m_port2) { m_port2->removeConnect(this); m_port2 = nullptr; } } // Path/shaper updaters. void qjackctlGraphConnect::updatePathTo ( const QPointF& pos ) { const bool is_out0 = m_port1->isOutput(); const QPointF pos0 = m_port1->portPos(); const QPointF d1(1.0, 0.0); const QPointF pos1 = (is_out0 ? pos0 + d1 : pos - d1); const QPointF pos4 = (is_out0 ? pos - d1 : pos0 + d1); const QPointF d2(2.0, 0.0); const QPointF pos1_2(is_out0 ? pos1 + d2 : pos1 - d2); const QPointF pos3_4(is_out0 ? pos4 - d2 : pos4 + d2); qjackctlGraphNode *node1 = m_port1->portNode(); const QRectF& rect1 = node1->itemRect(); const qreal h1 = 0.5 * rect1.height(); const qreal dh = pos0.y() - node1->scenePos().y() - h1; const qreal dx = pos3_4.x() - pos1_2.x(); const qreal x_max = rect1.width() + h1; const qreal x_min = qMin(x_max, qAbs(dx)); const qreal x_offset = (dx > 0.0 ? 0.5 : 1.0) * x_min; qreal y_offset = 0.0; if (g_connect_through_nodes) { // New "normal" connection line curves (inside/through nodes)... const qreal h2 = m_port1->itemRect().height(); const qreal dy = qAbs(pos3_4.y() - pos1_2.y()); y_offset = (dx > -h2 || dy > h2 ? 0.0 : (dh > 0.0 ? +h2 : -h2)); } else { // Old "weird" connection line curves (outside/around nodes)... y_offset = (dx > 0.0 ? 0.0 : (dh > 0.0 ? +x_min : -x_min)); } const QPointF pos2(pos1.x() + x_offset, pos1.y() + y_offset); const QPointF pos3(pos4.x() - x_offset, pos4.y() + y_offset); QPainterPath path; path.moveTo(pos1); path.lineTo(pos1_2); path.cubicTo(pos2, pos3, pos3_4); path.lineTo(pos4); const qreal arrow_angle = path.angleAtPercent(0.5) * M_PI / 180.0; const QPointF arrow_pos0 = path.pointAtPercent(0.5); const qreal arrow_size = 8.0; QVector arrow; arrow.append(arrow_pos0); arrow.append(arrow_pos0 - QPointF( ::sin(arrow_angle + M_PI / 2.25) * arrow_size, ::cos(arrow_angle + M_PI / 2.25) * arrow_size)); arrow.append(arrow_pos0 - QPointF( ::sin(arrow_angle + M_PI - M_PI / 2.25) * arrow_size, ::cos(arrow_angle + M_PI - M_PI / 2.25) * arrow_size)); arrow.append(arrow_pos0); path.addPolygon(QPolygonF(arrow)); /*QGraphicsPathItem::*/setPath(path); } void qjackctlGraphConnect::updatePath (void) { if (m_port2) updatePathTo(m_port2->portPos()); } void qjackctlGraphConnect::paint ( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget */*widget*/ ) { QColor color; if (QGraphicsPathItem::isSelected()) color = option->palette.highlight().color(); else if (qjackctlGraphItem::isHighlight()) color = qjackctlGraphItem::foreground().lighter(); else color = qjackctlGraphItem::foreground(); const QPalette pal; const bool is_darkest = (pal.base().color().value() < 24); QColor shadow_color = (is_darkest ? Qt::white : Qt::black); shadow_color.setAlpha(80); const QPainterPath& path = QGraphicsPathItem::path(); painter->setBrush(Qt::NoBrush); painter->setPen(QPen(shadow_color, 3)); painter->drawPath(path.translated(+1.0, +1.0)); painter->setPen(QPen(color, 2)); painter->drawPath(path); } QVariant qjackctlGraphConnect::itemChange ( GraphicsItemChange change, const QVariant& value ) { if (change == QGraphicsItem::ItemSelectedHasChanged) { const bool is_selected = value.toBool(); qjackctlGraphItem::setHighlight(is_selected); if (m_port1) m_port1->setSelectedEx(is_selected); if (m_port2) m_port2->setSelectedEx(is_selected); } return value; } QPainterPath qjackctlGraphConnect::shape (void) const { #if (QT_VERSION < QT_VERSION_CHECK(6, 1, 0)) && (__cplusplus < 201703L) return QGraphicsPathItem::shape(); #else const QPainterPathStroker stroker = QPainterPathStroker(QPen(QColor(), 2)); return stroker.createStroke(path()); #endif } // Selection propagation method... void qjackctlGraphConnect::setSelectedEx ( qjackctlGraphPort *port, bool is_selected ) { setHighlightEx(port, is_selected); if (QGraphicsPathItem::isSelected() != is_selected) { #if 0//OLD_SELECT_BEHAVIOR QGraphicsPathItem::setSelected(is_selected); if (is_selected) { if (m_port1 && m_port1 != port) m_port1->setSelectedEx(is_selected); if (m_port2 && m_port2 != port) m_port2->setSelectedEx(is_selected); } #else if (!is_selected || (m_port1 && m_port2 && m_port1->isSelected() && m_port2->isSelected())) { QGraphicsPathItem::setSelected(is_selected); } #endif } } // Highlighting propagation method... void qjackctlGraphConnect::setHighlightEx ( qjackctlGraphPort *port, bool is_highlight ) { qjackctlGraphItem::setHighlight(is_highlight); if (m_port1 && m_port1 != port) m_port1->setHighlight(is_highlight); if (m_port2 && m_port2 != port) m_port2->setHighlight(is_highlight); } // Special port-type color business. void qjackctlGraphConnect::updatePortTypeColors (void) { if (m_port1) { const QColor& color = m_port1->background().lighter(); qjackctlGraphItem::setForeground(color); qjackctlGraphItem::setBackground(color); } } // Connector curve draw style (through vs. around nodes) // bool qjackctlGraphConnect::g_connect_through_nodes = false; void qjackctlGraphConnect::setConnectThroughNodes ( bool on ) { g_connect_through_nodes = on; } bool qjackctlGraphConnect::isConnectThroughNodes (void) { return g_connect_through_nodes; } //---------------------------------------------------------------------------- // qjackctlGraphCanvas -- Canvas graphics scene/view. // Local constants. static const char *CanvasGroup = "/GraphCanvas"; static const char *CanvasRectKey = "/CanvasRect"; static const char *CanvasZoomKey = "/CanvasZoom"; static const char *NodePosGroup = "/GraphNodePos"; static const char *ColorsGroup = "/GraphColors"; // Constructor. qjackctlGraphCanvas::qjackctlGraphCanvas ( QWidget *parent ) : QGraphicsView(parent), m_state(DragNone), m_item(nullptr), m_connect(nullptr), m_port2(nullptr), m_rubberband(nullptr), m_zoom(1.0), m_zoomrange(false), m_gesture(false), m_commands(nullptr), m_settings(nullptr), m_selected_nodes(0), m_repel_overlapping_nodes(false), m_rename_item(nullptr), m_rename_editor(nullptr), m_renamed(0), m_search_editor(nullptr), m_aliases(nullptr) { m_scene = new QGraphicsScene(); m_commands = new QUndoStack(); QGraphicsView::setScene(m_scene); QGraphicsView::setRenderHint(QPainter::Antialiasing); QGraphicsView::setRenderHint(QPainter::SmoothPixmapTransform); QGraphicsView::setResizeAnchor(QGraphicsView::NoAnchor); QGraphicsView::setDragMode(QGraphicsView::NoDrag); updatePalette(); m_rename_editor = new QLineEdit(this); m_rename_editor->setFrame(false); m_rename_editor->setEnabled(false); m_rename_editor->hide(); QObject::connect(m_rename_editor, SIGNAL(textChanged(const QString&)), SLOT(renameTextChanged(const QString&))); QObject::connect(m_rename_editor, SIGNAL(editingFinished()), SLOT(renameEditingFinished())); QGraphicsView::grabGesture(Qt::PinchGesture); m_search_editor = new QLineEdit(this); m_search_editor->setClearButtonEnabled(true); m_search_editor->setEnabled(false); m_search_editor->hide(); QObject::connect(m_search_editor, SIGNAL(textChanged(const QString&)), SLOT(searchTextChanged(const QString&))); QObject::connect(m_search_editor, SIGNAL(editingFinished()), SLOT(searchEditingFinished())); } // Destructor. qjackctlGraphCanvas::~qjackctlGraphCanvas (void) { clear(); delete m_search_editor; delete m_rename_editor; delete m_commands; delete m_scene; } // Accessors. QGraphicsScene *qjackctlGraphCanvas::scene (void) const { return m_scene; } QUndoStack *qjackctlGraphCanvas::commands (void) const { return m_commands; } void qjackctlGraphCanvas::setSettings ( QSettings *settings ) { m_settings = settings; } QSettings *qjackctlGraphCanvas::settings (void) const { return m_settings; } // Canvas methods. void qjackctlGraphCanvas::addItem ( qjackctlGraphItem *item ) { m_scene->addItem(item); if (item->type() == qjackctlGraphNode::Type) { qjackctlGraphNode *node = static_cast (item); if (node) { m_nodes.append(node); m_nodekeys.insert(qjackctlGraphNode::NodeKey(node), node); if (restoreNode(node)) emit updated(node); else emit added(node); } } } void qjackctlGraphCanvas::removeItem ( qjackctlGraphItem *item ) { clearSelection(); if (item->type() == qjackctlGraphNode::Type) { qjackctlGraphNode *node = static_cast (item); if (node && saveNode(node)) { emit removed(node); node->removePorts(); m_nodekeys.remove(qjackctlGraphNode::NodeKey(node)); m_nodes.removeAll(node); } } // Do not remove items from the scene // as they shall be removed upon delete... // // m_scene->removeItem(item); } // Current item accessor. qjackctlGraphItem *qjackctlGraphCanvas::currentItem (void) const { qjackctlGraphItem *item = m_item; if (item && item->type() == qjackctlGraphConnect::Type) item = nullptr; if (item == nullptr) { foreach (QGraphicsItem *item2, m_scene->selectedItems()) { if (item2->type() == qjackctlGraphConnect::Type) continue; item = static_cast (item2); if (item2->type() == qjackctlGraphNode::Type) break; } } return item; } // Connection predicates. bool qjackctlGraphCanvas::canConnect (void) const { int nins = 0; int nouts = 0; foreach (QGraphicsItem *item, m_scene->selectedItems()) { if (item->type() == qjackctlGraphNode::Type) { qjackctlGraphNode *node = static_cast (item); if (node) { if (node->nodeMode() & qjackctlGraphItem::Input) ++nins; else // if (node->nodeMode() & qjackctlGraphItem::Output) ++nouts; } } else if (item->type() == qjackctlGraphPort::Type) { qjackctlGraphPort *port = static_cast (item); if (port) { if (port->isInput()) ++nins; else // if (port->isOutput()) ++nouts; } } if (nins > 0 && nouts > 0) return true; } return false; } bool qjackctlGraphCanvas::canDisconnect (void) const { foreach (QGraphicsItem *item, m_scene->selectedItems()) { switch (item->type()) { case qjackctlGraphConnect::Type: return true; case qjackctlGraphNode::Type: { qjackctlGraphNode *node = static_cast (item); foreach (qjackctlGraphPort *port, node->ports()) { if (!port->connects().isEmpty()) return true; } // Fall thru... } default: break; } } return false; } // Edit predicates. bool qjackctlGraphCanvas::canRenameItem (void) const { qjackctlGraphItem *item = currentItem(); return (item && ( item->type() == qjackctlGraphNode::Type || item->type() == qjackctlGraphPort::Type)); } bool qjackctlGraphCanvas::canSearchItem (void) const { return !m_nodes.isEmpty(); } // Zooming methods. void qjackctlGraphCanvas::setZoom ( qreal zoom ) { if (zoom < 0.1) zoom = 0.1; else if (zoom > 1.9) zoom = 1.9; const qreal scale = zoom / m_zoom; QGraphicsView::scale(scale, scale); QFont font = m_rename_editor->font(); font.setPointSizeF(scale * font.pointSizeF()); m_rename_editor->setFont(font); updateRenameEditor(); m_zoom = zoom; emit changed(); } qreal qjackctlGraphCanvas::zoom (void) const { return m_zoom; } void qjackctlGraphCanvas::setZoomRange ( bool zoomrange ) { m_zoomrange = zoomrange; } bool qjackctlGraphCanvas::isZoomRange (void) const { return m_zoomrange; } // Clean-up all un-marked nodes... void qjackctlGraphCanvas::resetNodes ( uint node_type ) { QList nodes; foreach (qjackctlGraphNode *node, m_nodes) { if (node->nodeType() == node_type) { if (node->isMarked()) { node->resetMarkedPorts(); node->setMarked(false); } else { nodes.append(node); } } } foreach (qjackctlGraphNode *node, nodes) removeItem(node); qDeleteAll(nodes); } void qjackctlGraphCanvas::clearNodes ( uint node_type ) { QList nodes; foreach (qjackctlGraphNode *node, m_nodes) { if (node->nodeType() == node_type) nodes.append(node); } foreach (qjackctlGraphNode *node, nodes) { m_nodekeys.remove(qjackctlGraphNode::NodeKey(node)); m_nodes.removeAll(node); } qDeleteAll(nodes); } // Special node finder. qjackctlGraphNode *qjackctlGraphCanvas::findNode ( const QString& name, qjackctlGraphItem::Mode mode, uint type ) const { return static_cast ( m_nodekeys.value(qjackctlGraphNode::ItemKey(name, mode, type), nullptr)); } // Whether it's in the middle of something... bool qjackctlGraphCanvas::isBusy (void) const { return (m_state != DragNone || m_connect != nullptr || m_item != nullptr || m_rename_item != nullptr); } // Port (dis)connections notifiers. void qjackctlGraphCanvas::emitConnected ( qjackctlGraphPort *port1, qjackctlGraphPort *port2 ) { emit connected(port1, port2); } void qjackctlGraphCanvas::emitDisconnected ( qjackctlGraphPort *port1, qjackctlGraphPort *port2 ) { emit disconnected(port1, port2); } // Rename notifier. void qjackctlGraphCanvas::emitRenamed ( qjackctlGraphItem *item, const QString& name ) { emit renamed(item, name); } // Other generic notifier. void qjackctlGraphCanvas::emitChanged (void) { emit changed(); } // Item finder (internal). qjackctlGraphItem *qjackctlGraphCanvas::itemAt ( const QPointF& pos ) const { const QList& items = m_scene->items(QRectF(pos - QPointF(2, 2), QSizeF(5, 5))); foreach (QGraphicsItem *item, items) { if (item->type() >= QGraphicsItem::UserType) return static_cast (item); } return nullptr; } // Port (dis)connection command. void qjackctlGraphCanvas::connectPorts ( qjackctlGraphPort *port1, qjackctlGraphPort *port2, bool is_connect ) { #if 0 // Sure the sect will check to this instead...? const bool is_connected // already connected? = (port1->findConnect(port2) != nullptr); if (( is_connect && is_connected) || (!is_connect && !is_connected)) return; #endif if (port1->isOutput()) { m_commands->push( new qjackctlGraphConnectCommand(this, port1, port2, is_connect)); } else { m_commands->push( new qjackctlGraphConnectCommand(this, port2, port1, is_connect)); } } // Mouse event handlers. void qjackctlGraphCanvas::mousePressEvent ( QMouseEvent *event ) { if (m_gesture) return; m_state = DragNone; m_item = nullptr; m_pos = QGraphicsView::mapToScene(event->pos()); if (event->button() == Qt::LeftButton) { m_item = itemAt(m_pos); m_state = DragStart; } if (m_item == nullptr && (((event->button() == Qt::LeftButton) && (event->modifiers() & Qt::ControlModifier)) || (event->button() == Qt::MiddleButton))) { #if 1//NEW_DRAG_SCROLL_MODE // HACK: When about to drag-scroll, // always fake a left-button press... QGraphicsView::setDragMode(ScrollHandDrag); QMouseEvent event2(event->type(), #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) event->position(), event->globalPosition(), #else event->localPos(), event->globalPos(), #endif Qt::LeftButton, Qt::LeftButton, event->modifiers() | Qt::ControlModifier); QGraphicsView::mousePressEvent(&event2); #else QGraphicsView::setCursor(Qt::ClosedHandCursor) #endif m_state = DragScroll; } } void qjackctlGraphCanvas::mouseMoveEvent ( QMouseEvent *event ) { if (m_gesture) return; int nchanged = 0; QPointF pos = QGraphicsView::mapToScene(event->pos()); switch (m_state) { case DragStart: if ((pos - m_pos).manhattanLength() > 8.0) { m_state = DragMove; if (m_item) { // Start new connection line... if (m_item->type() == qjackctlGraphPort::Type) { qjackctlGraphPort *port = static_cast (m_item); if (port) { QGraphicsView::setCursor(Qt::DragLinkCursor); m_selected_nodes = 0; m_scene->clearSelection(); m_connect = new qjackctlGraphConnect(); m_connect->setPort1(port); m_connect->setSelected(true); m_connect->raise(); m_scene->addItem(m_connect); m_item = nullptr; ++m_selected_nodes; ++nchanged; } } else // Start moving nodes around... if (m_item->type() == qjackctlGraphNode::Type) { QGraphicsView::setCursor(Qt::SizeAllCursor); if (!m_item->isSelected()) { if ((event->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier)) == 0) { m_selected_nodes = 0; m_scene->clearSelection(); } m_item->setSelected(true); ++nchanged; } // Original node position (for move command)... m_pos1 = snapPos(m_pos); } else m_item = nullptr; } // Otherwise start lasso rubber-banding... if (m_rubberband == nullptr && m_item == nullptr && m_connect == nullptr) { QGraphicsView::setCursor(Qt::CrossCursor); m_rubberband = new QRubberBand(QRubberBand::Rectangle, this); } // Set allowed auto-scroll margins/limits... boundingRect(true); } break; case DragMove: // Allow auto-scroll only if within allowed margins/limits... boundingPos(pos); QGraphicsView::ensureVisible(QRectF(pos, QSizeF(2, 2)), 8, 8); // Move new connection line... if (m_connect) m_connect->updatePathTo(pos); // Move rubber-band lasso... if (m_rubberband) { const QRect rect( QGraphicsView::mapFromScene(m_pos), QGraphicsView::mapFromScene(pos)); m_rubberband->setGeometry(rect.normalized()); m_rubberband->show(); if (!m_zoomrange) { if (event->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier)) { foreach (QGraphicsItem *item, m_selected) { item->setSelected(!item->isSelected()); ++nchanged; } m_selected.clear(); } else { m_selected_nodes = 0; m_scene->clearSelection(); ++nchanged; } const QRectF range_rect(m_pos, pos); foreach (QGraphicsItem *item, m_scene->items(range_rect.normalized())) { if (item->type() >= QGraphicsItem::UserType) { if (item->type() != qjackctlGraphNode::Type) ++m_selected_nodes; else if (m_selected_nodes > 0) continue; const bool is_selected = item->isSelected(); if (event->modifiers() & Qt::ControlModifier) { m_selected.append(item); item->setSelected(!is_selected); } else if (!is_selected) { if (event->modifiers() & Qt::ShiftModifier) m_selected.append(item); item->setSelected(true); } ++nchanged; } } } } // Move current selected nodes... if (m_item && m_item->type() == qjackctlGraphNode::Type) { pos = snapPos(pos); const QPointF delta = (pos - m_pos); foreach (QGraphicsItem *item, m_scene->selectedItems()) { if (item->type() == qjackctlGraphNode::Type) { qjackctlGraphNode *node = static_cast (item); if (node) node->setPos(snapPos(node->pos() + delta)); } } m_pos = pos; } else if (m_connect) { // Hovering ports high-lighting... const qreal zval = m_connect->zValue(); m_connect->setZValue(-1.0); if (m_port2) { m_port2->setHighlight(false); m_port2 = nullptr; } QGraphicsItem *item = itemAt(pos); if (item && item->type() == qjackctlGraphPort::Type) { qjackctlGraphPort *port1 = m_connect->port1(); qjackctlGraphPort *port2 = static_cast (item); if (port1 && port2 && !port2->isHighlight() && port1->portType() == port2->portType() && port1->portMode() != port2->portMode()) { m_port2 = port2; m_port2->setHighlight(true); } } m_connect->setZValue(zval); } break; case DragScroll: { #if 1//NEW_DRAG_SCROLL_MODE QGraphicsView::mouseMoveEvent(event); #else QScrollBar *hbar = QGraphicsView::horizontalScrollBar(); QScrollBar *vbar = QGraphicsView::verticalScrollBar(); const QPoint delta = (pos - m_pos).toPoint(); hbar->setValue(hbar->value() - delta.x()); vbar->setValue(vbar->value() - delta.y()); m_pos = pos; #endif break; } default: break; } if (nchanged > 0) emit changed(); } void qjackctlGraphCanvas::mouseReleaseEvent ( QMouseEvent *event ) { if (m_gesture) return; int nchanged = 0; switch (m_state) { case DragStart: // Make individual item (de)selections... if ((event->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier)) == 0) { m_selected_nodes = 0; m_scene->clearSelection(); ++nchanged; } if (m_item) { bool is_selected = true; if (event->modifiers() & Qt::ControlModifier) is_selected = !m_item->isSelected(); m_item->setSelected(is_selected); if (m_item->type() != qjackctlGraphNode::Type && is_selected) ++m_selected_nodes; m_item = nullptr; // Not needed anymore! ++nchanged; } // Fall thru... case DragMove: // Close new connection line... if (m_connect) { m_connect->setZValue(-1.0); const QPointF& pos = QGraphicsView::mapToScene(event->pos()); qjackctlGraphItem *item = itemAt(pos); if (item && item->type() == qjackctlGraphPort::Type) { qjackctlGraphPort *port1 = m_connect->port1(); qjackctlGraphPort *port2 = static_cast (item); if (port1 && port2 // && port1->portNode() != port2->portNode() && port1->portMode() != port2->portMode() && port1->portType() == port2->portType() && port1->findConnect(port2) == nullptr) { port2->setSelected(true); #if 1 // Sure the sect will commit to this instead...? m_connect->setPort2(port2); m_connect->updatePortTypeColors(); m_connect->updatePathTo(port2->portPos()); emit connected(m_connect); m_connect = nullptr; ++m_selected_nodes; #else // m_selected_nodes = 0; // m_scene->clearSelection(); #endif // Submit command; notify eventual observers... m_commands->beginMacro(tr("Connect")); connectPorts(port1, port2, true); m_commands->endMacro(); ++nchanged; } } // Done with the hovering connection... if (m_port2) { m_port2->setHighlight(false); m_port2 = nullptr; } if (m_connect) { m_connect->disconnect(); delete m_connect; m_connect = nullptr; } } // Maybe some node(s) were moved... if (m_item && m_item->type() == qjackctlGraphNode::Type) { const QPointF& pos = QGraphicsView::mapToScene(event->pos()); QList nodes; foreach (QGraphicsItem *item, m_scene->selectedItems()) { if (item->type() == qjackctlGraphNode::Type) { qjackctlGraphNode *node = static_cast (item); if (node) nodes.append(node); } } m_commands->push( new qjackctlGraphMoveCommand(this, nodes, m_pos1, m_pos)); ++nchanged; } // Close rubber-band lasso... if (m_rubberband) { delete m_rubberband; m_rubberband = nullptr; m_selected.clear(); // Zooming in range?... if (m_zoomrange) { const QRectF range_rect(m_pos, QGraphicsView::mapToScene(event->pos())); zoomFitRange(range_rect); nchanged = 0; } } break; case DragScroll: default: break; } #if 1//NEW_DRAG_SCROLL_MODE if (QGraphicsView::dragMode() == ScrollHandDrag) { QGraphicsView::mouseReleaseEvent(event); QGraphicsView::setDragMode(NoDrag); } #endif m_state = DragNone; m_item = nullptr; // Reset cursor... QGraphicsView::setCursor(Qt::ArrowCursor); if (nchanged > 0) emit changed(); } void qjackctlGraphCanvas::mouseDoubleClickEvent ( QMouseEvent *event ) { m_pos = QGraphicsView::mapToScene(event->pos()); m_item = itemAt(m_pos); if (m_item && canRenameItem()) { renameItem(); } else { QGraphicsView::centerOn(m_pos); } } void qjackctlGraphCanvas::wheelEvent ( QWheelEvent *event ) { if (event->modifiers() & Qt::ControlModifier) { const int delta #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) = event->delta(); #else = event->angleDelta().y(); #endif setZoom(zoom() + qreal(delta) / 1200.0); } else QGraphicsView::wheelEvent(event); } // Keyboard event handler. void qjackctlGraphCanvas::keyPressEvent ( QKeyEvent *event ) { if (event->key() == Qt::Key_Escape) { m_scene->clearSelection(); m_search_editor->editingFinished(); clear(); emit changed(); } else if (!m_search_editor->isEnabled() && (event->modifiers() & Qt::ControlModifier) == 0 && !event->text().trimmed().isEmpty()) { startSearchEditor(event->text()); } } // Connect selected items. void qjackctlGraphCanvas::connectItems (void) { QList outs; QList ins; foreach (QGraphicsItem *item, m_scene->selectedItems()) { if (item->type() == qjackctlGraphPort::Type) { qjackctlGraphPort *port = static_cast (item); if (port) { if (port->isOutput()) outs.append(port); else ins.append(port); } } } if (outs.isEmpty() || ins.isEmpty()) return; // m_selected_nodes = 0; // m_scene->clearSelection(); std::sort(outs.begin(), outs.end(), qjackctlGraphPort::ComparePos()); std::sort(ins.begin(), ins.end(), qjackctlGraphPort::ComparePos()); QListIterator iter1(outs); QListIterator iter2(ins); m_commands->beginMacro(tr("Connect")); const int nports = qMax(outs.count(), ins.count()); for (int n = 0; n < nports; ++n) { // Wrap a'round... if (!iter1.hasNext()) iter1.toFront(); if (!iter2.hasNext()) iter2.toFront(); qjackctlGraphPort *port1 = iter1.next(); qjackctlGraphPort *port2 = iter2.next(); // Skip over non-matching port-types... bool wrapped = false; while (port1 && port2 && port1->portType() != port2->portType()) { if (!iter2.hasNext()) { if (wrapped) break; iter2.toFront(); wrapped = true; } port2 = iter2.next(); } // Submit command; notify eventual observers... if (!wrapped && port1 && port2 && port1->portNode() != port2->portNode()) connectPorts(port1, port2, true); } m_commands->endMacro(); } // Disconnect selected items. void qjackctlGraphCanvas::disconnectItems (void) { QList connects; QList nodes; foreach (QGraphicsItem *item, m_scene->selectedItems()) { switch (item->type()) { case qjackctlGraphConnect::Type: { qjackctlGraphConnect *connect = static_cast (item); if (!connects.contains(connect)) connects.append(connect); break; } case qjackctlGraphNode::Type: nodes.append(static_cast (item)); // Fall thru... default: break; } } if (connects.isEmpty()) { foreach (qjackctlGraphNode *node, nodes) { foreach (qjackctlGraphPort *port, node->ports()) { foreach (qjackctlGraphConnect *connect, port->connects()) { if (!connects.contains(connect)) connects.append(connect); } } } } if (connects.isEmpty()) return; // m_selected_nodes = 0; // m_scene->clearSelection(); m_item = nullptr; m_commands->beginMacro(tr("Disconnect")); foreach (qjackctlGraphConnect *connect, connects) { // Submit command; notify eventual observers... qjackctlGraphPort *port1 = connect->port1(); qjackctlGraphPort *port2 = connect->port2(); if (port1 && port2) connectPorts(port1, port2, false); } m_commands->endMacro(); } // Select actions. void qjackctlGraphCanvas::selectAll (void) { foreach (QGraphicsItem *item, m_scene->items()) { if (item->type() == qjackctlGraphNode::Type) item->setSelected(true); else ++m_selected_nodes; } emit changed(); } void qjackctlGraphCanvas::selectNone (void) { m_selected_nodes = 0; m_scene->clearSelection(); emit changed(); } void qjackctlGraphCanvas::selectInvert (void) { foreach (QGraphicsItem *item, m_scene->items()) { if (item->type() == qjackctlGraphNode::Type) item->setSelected(!item->isSelected()); else ++m_selected_nodes; } emit changed(); } // Edit actions. void qjackctlGraphCanvas::renameItem (void) { qjackctlGraphItem *item = currentItem(); if (item && item->type() == qjackctlGraphNode::Type) { qjackctlGraphNode *node = static_cast (item); if (node) { QPalette pal; const QColor& foreground = node->foreground(); QColor background = node->background(); const bool is_dark = (background.value() < 192); pal.setColor(QPalette::Text, is_dark ? foreground.lighter() : foreground.darker()); background.setAlpha(255); pal.setColor(QPalette::Base, background); m_rename_editor->setPalette(pal); QFont font = m_rename_editor->font(); font.setBold(true); m_rename_editor->setFont(font); m_rename_editor->setPlaceholderText(node->nodeName()); m_rename_editor->setText(node->nodeTitle()); } } else if (item && item->type() == qjackctlGraphPort::Type) { qjackctlGraphPort *port = static_cast (item); if (port) { QPalette pal; const QColor& foreground = port->foreground(); const QColor& background = port->background(); const bool is_dark = (background.value() < 128); pal.setColor(QPalette::Text, is_dark ? foreground.lighter() : foreground.darker()); pal.setColor(QPalette::Base, background.lighter()); m_rename_editor->setPalette(pal); QFont font = m_rename_editor->font(); font.setBold(false); m_rename_editor->setFont(font); m_rename_editor->setPlaceholderText(port->portName()); m_rename_editor->setText(port->portTitle()); } } else return; m_selected_nodes = 0; m_scene->clearSelection(); m_rename_editor->show(); m_rename_editor->setEnabled(true); m_rename_editor->selectAll(); m_rename_editor->setFocus(); m_renamed = 0; m_rename_item = item; updateRenameEditor(); } void qjackctlGraphCanvas::searchItem (void) { if (!m_search_editor->isEnabled()) startSearchEditor(); } // Update editors position and size. void qjackctlGraphCanvas::updateRenameEditor (void) { if (m_rename_item && m_rename_editor->isEnabled() && m_rename_editor->isVisible()) { const QRectF& rect = m_rename_item->editorRect().adjusted(+2.0, +2.0, -2.0, -2.0); const QPoint& pos1 = QGraphicsView::mapFromScene(rect.topLeft()); const QPoint& pos2 = QGraphicsView::mapFromScene(rect.bottomRight()); m_rename_editor->setGeometry( pos1.x(), pos1.y(), pos2.x() - pos1.x(), pos2.y() - pos1.y()); } } void qjackctlGraphCanvas::updateSearchEditor (void) { // Position the search editor to the bottom-right of the canvas... const QSize& size = QGraphicsView::viewport()->size(); const QSize& hint = m_search_editor->sizeHint(); const int w = hint.width() * 2; const int h = hint.height(); m_search_editor->setGeometry(size.width() - w, size.height() - h, w, h); } // Discrete zooming actions. void qjackctlGraphCanvas::zoomIn (void) { setZoom(zoom() + 0.1); } void qjackctlGraphCanvas::zoomOut (void) { setZoom(zoom() - 0.1); } void qjackctlGraphCanvas::zoomFit (void) { zoomFitRange(m_scene->itemsBoundingRect()); } void qjackctlGraphCanvas::zoomReset (void) { setZoom(1.0); } // Update all nodes. void qjackctlGraphCanvas::updateNodes (void) { foreach (QGraphicsItem *item, m_scene->items()) { if (item->type() == qjackctlGraphNode::Type) { qjackctlGraphNode *node = static_cast (item); if (node) node->updatePath(); } } } // Update all connectors. void qjackctlGraphCanvas::updateConnects (void) { foreach (QGraphicsItem *item, m_scene->items()) { if (item->type() == qjackctlGraphConnect::Type) { qjackctlGraphConnect *connect = static_cast (item); if (connect) connect->updatePath(); } } } // Zoom in rectangle range. void qjackctlGraphCanvas::zoomFitRange ( const QRectF& range_rect ) { QGraphicsView::fitInView( range_rect, Qt::KeepAspectRatio); const QTransform& transform = QGraphicsView::transform(); if (transform.isScaling()) { qreal zoom = transform.m11(); if (zoom < 0.1) { const qreal scale = 0.1 / zoom; QGraphicsView::scale(scale, scale); zoom = 0.1; } else if (zoom > 2.0) { const qreal scale = 2.0 / zoom; QGraphicsView::scale(scale, scale); zoom = 2.0; } m_zoom = zoom; } emit changed(); } // Graph node position methods. bool qjackctlGraphCanvas::restoreNode ( qjackctlGraphNode *node ) { if (m_settings == nullptr || node == nullptr) return false; m_settings->beginGroup(NodePosGroup); QPointF node_pos = m_settings->value('/' + nodeKey(node)).toPointF(); m_settings->endGroup(); if (node_pos.isNull()) return false; boundingPos(node_pos); node->setPos(node_pos); return true; } bool qjackctlGraphCanvas::saveNode ( qjackctlGraphNode *node ) const { if (m_settings == nullptr || node == nullptr) return false; m_settings->beginGroup(NodePosGroup); m_settings->setValue('/' + nodeKey(node), node->pos()); m_settings->endGroup(); return true; } bool qjackctlGraphCanvas::restoreState (void) { if (m_settings == nullptr) return false; m_settings->beginGroup(ColorsGroup); const QRegularExpression rx("^0x"); QStringListIterator key(m_settings->childKeys()); while (key.hasNext()) { const QString& sKey = key.next(); const QColor& color = QString(m_settings->value(sKey).toString()); if (color.isValid()) { QString sx(sKey); bool ok = false; const uint port_type = sx.remove(rx).toUInt(&ok, 16); if (ok) m_port_colors.insert(port_type, color); } } m_settings->endGroup(); m_settings->beginGroup(CanvasGroup); const QRectF& rect = m_settings->value(CanvasRectKey).toRectF(); const qreal zoom = m_settings->value(CanvasZoomKey, 1.0).toReal(); m_settings->endGroup(); if (rect.isValid()) m_rect1 = rect; // QGraphicsView::setSceneRect(m_rect1); setZoom(zoom); return true; } bool qjackctlGraphCanvas::saveState (void) const { if (m_settings == nullptr) return false; m_settings->beginGroup(NodePosGroup); const QList items(m_scene->items()); foreach (QGraphicsItem *item, items) { if (item->type() == qjackctlGraphNode::Type) { qjackctlGraphNode *node = static_cast (item); if (node) m_settings->setValue('/' + nodeKey(node), node->pos()); } } m_settings->endGroup(); m_settings->beginGroup(CanvasGroup); m_settings->setValue(CanvasZoomKey, zoom()); m_settings->setValue(CanvasRectKey, m_rect1); m_settings->endGroup(); m_settings->beginGroup(ColorsGroup); QStringListIterator key(m_settings->childKeys()); while (key.hasNext()) m_settings->remove(key.next()); QHash::ConstIterator iter = m_port_colors.constBegin(); const QHash::ConstIterator& iter_end = m_port_colors.constEnd(); for ( ; iter != iter_end; ++iter) { const uint port_type = iter.key(); const QColor& color = iter.value(); m_settings->setValue("0x" + QString::number(port_type, 16), color.name()); } m_settings->endGroup(); return true; } // Graph node key mangler. QString qjackctlGraphCanvas::nodeKey ( qjackctlGraphNode *node ) const { QString node_key = node->nodeName(); switch (node->nodeMode()) { case qjackctlGraphItem::Input: node_key += ":Input"; break; case qjackctlGraphItem::Output: node_key += ":Output"; break; default: break; } return node_key; } // Graph port colors management. void qjackctlGraphCanvas::setPortTypeColor ( uint port_type, const QColor& port_color ) { m_port_colors.insert(port_type, port_color); } const QColor& qjackctlGraphCanvas::portTypeColor ( uint port_type ) { return m_port_colors[port_type]; } void qjackctlGraphCanvas::updatePortTypeColors ( uint port_type ) { foreach (QGraphicsItem *item, m_scene->items()) { if (item->type() == qjackctlGraphPort::Type) { qjackctlGraphPort *port = static_cast (item); if (port && (0 >= port_type || port->portType() == port_type)) { port->updatePortTypeColors(this); port->update(); } } } } void qjackctlGraphCanvas::clearPortTypeColors (void) { m_port_colors.clear(); } // Clear all selection. void qjackctlGraphCanvas::clearSelection (void) { m_item = nullptr; m_selected_nodes = 0; m_scene->clearSelection(); m_rename_item = nullptr; m_rename_editor->setEnabled(false); m_rename_editor->hide(); m_renamed = 0; } // Clear all state. void qjackctlGraphCanvas::clear (void) { m_selected_nodes = 0; if (m_rubberband) { delete m_rubberband; m_rubberband = nullptr; m_selected.clear(); } if (m_port2) { m_port2->setHighlight(false); m_port2 = nullptr; } if (m_connect) { m_connect->disconnect(); delete m_connect; m_connect = nullptr; } if (m_state == DragScroll) QGraphicsView::setDragMode(QGraphicsView::NoDrag); m_state = DragNone; m_item = nullptr; m_rename_item = nullptr; m_rename_editor->setEnabled(false); m_rename_editor->hide(); m_renamed = 0; // Reset cursor... QGraphicsView::setCursor(Qt::ArrowCursor); } // Rename item slots. void qjackctlGraphCanvas::renameTextChanged ( const QString& /* text */) { if (m_rename_item && m_rename_editor->isEnabled() && m_rename_editor->isVisible()) ++m_renamed; } void qjackctlGraphCanvas::renameEditingFinished (void) { if (m_rename_item && m_rename_editor->isEnabled() && m_rename_editor->isVisible()) { // If changed then notify... if (m_renamed > 0) { m_commands->push( new qjackctlGraphRenameCommand(this, m_rename_item, m_rename_editor->text())); } // Reset all renaming stuff... m_rename_item = nullptr; m_rename_editor->setEnabled(false); m_rename_editor->hide(); m_renamed = 0; } } // Client/port aliases accessors. void qjackctlGraphCanvas::setAliases ( qjackctlAliases *aliases ) { m_aliases = aliases; } qjackctlAliases *qjackctlGraphCanvas::aliases (void) const { return m_aliases; } //---------------------------------------------------------------------------- // qjackctlGraphSect -- Generic graph driver // Constructor. qjackctlGraphSect::qjackctlGraphSect ( qjackctlGraphCanvas *canvas ) : m_canvas(canvas) { } // Accessors. qjackctlGraphCanvas *qjackctlGraphSect::canvas (void) const { return m_canvas; } // Generic sect/graph methods. void qjackctlGraphSect::addItem ( qjackctlGraphItem *item, bool is_new ) { if (is_new) m_canvas->addItem(item); if (item->type() == qjackctlGraphConnect::Type) { qjackctlGraphConnect *connect = static_cast (item); if (connect) m_connects.append(connect); } } void qjackctlGraphSect::removeItem ( qjackctlGraphItem *item ) { if (item->type() == qjackctlGraphConnect::Type) { qjackctlGraphConnect *connect = static_cast (item); if (connect) { connect->disconnect(); m_connects.removeAll(connect); } } m_canvas->removeItem(item); } // Clean-up all un-marked items... void qjackctlGraphSect::resetItems ( uint node_type ) { const QList connects(m_connects); foreach (qjackctlGraphConnect *connect, connects) { if (connect->isMarked()) { connect->setMarked(false); } else { removeItem(connect); delete connect; } } m_canvas->resetNodes(node_type); } void qjackctlGraphSect::clearItems ( uint node_type ) { qjackctlGraphSect::resetItems(node_type); // qDeleteAll(m_connects); m_connects.clear(); m_canvas->clearNodes(node_type); } // Special node finder. qjackctlGraphNode *qjackctlGraphSect::findNode ( const QString& name, qjackctlGraphItem::Mode mode, int type ) const { return m_canvas->findNode(name, mode, type); } // Client/port renaming method. void qjackctlGraphSect::renameItem ( qjackctlGraphItem *item, const QString& name ) { int nchanged = 0; qjackctlGraphNode *node = nullptr; if (item->type() == qjackctlGraphNode::Type) { node = static_cast (item); if (node) { node->setNodeTitle(name); const QString& node_title = node->nodeTitle(); foreach (qjackctlAliasList *node_aliases, item_aliases(item)) { node_aliases->setClientAlias(node->nodeName(), node_title); ++nchanged; } } } else if (item->type() == qjackctlGraphPort::Type) { qjackctlGraphPort *port = static_cast (item); if (port) node = port->portNode(); if (port && node) { port->setPortTitle(name); foreach (qjackctlAliasList *port_aliases, item_aliases(item)) { port_aliases->setPortAlias( node->nodeName(), port->portName(), name); ++nchanged; } } } if (node) node->updatePath(); if (nchanged > 0) { qjackctlAliases *aliases = nullptr; if (m_canvas) aliases = m_canvas->aliases(); if (aliases) aliases->dirty = true; } } // Search item slots. void qjackctlGraphCanvas::searchTextChanged ( const QString& text ) { clearSelection(); if (text.isEmpty()) return; const QRegularExpression& rx = QRegularExpression(text, QRegularExpression::CaseInsensitiveOption); if (!rx.isValid()) return; for (qjackctlGraphNode *node : m_nodes) { if (rx.match(node->nodeTitle()).hasMatch()) { node->setSelected(true); QGraphicsView::ensureVisible(node); } } } void qjackctlGraphCanvas::searchEditingFinished (void) { m_search_editor->setEnabled(false); m_search_editor->hide(); m_search_editor->clearFocus(); QGraphicsView::setFocus(); } // Start search editor... void qjackctlGraphCanvas::startSearchEditor ( const QString& text ) { m_search_editor->setEnabled(true); m_search_editor->setText(text); m_search_editor->raise(); m_search_editor->show(); m_search_editor->setFocus(); } void qjackctlGraphCanvas::resizeEvent( QResizeEvent *event ) { QGraphicsView::resizeEvent(event); updateSearchEditor(); } // Repel overlapping nodes... void qjackctlGraphCanvas::setRepelOverlappingNodes ( bool on ) { m_repel_overlapping_nodes = on; } bool qjackctlGraphCanvas::isRepelOverlappingNodes (void) const { return m_repel_overlapping_nodes; } void qjackctlGraphCanvas::repelOverlappingNodes ( qjackctlGraphNode *node, qjackctlGraphMoveCommand *move_command, const QPointF& delta ) { const qreal MIN_NODE_GAP = 8.0f; node->setMarked(true); QRectF rect1 = node->sceneBoundingRect(); rect1.adjust( -2.0 * MIN_NODE_GAP, -MIN_NODE_GAP, +2.0 * MIN_NODE_GAP, +MIN_NODE_GAP); foreach (qjackctlGraphNode *node2, m_nodes) { if (node2->isMarked()) continue; const QPointF& pos1 = node2->pos(); QPointF pos2 = pos1; const QRectF& rect2 = node2->sceneBoundingRect(); const QRectF& recti = rect2.intersected(rect1); if (!recti.isNull()) { const QPointF delta2 = (delta.isNull() ? rect2.center() - rect1.center() : delta); if (recti.width() < (1.5 * recti.height())) { qreal dx = recti.width(); if ((delta2.x() < 0.0 && recti.width() >= rect1.width()) || (delta2.x() > 0.0 && recti.width() >= rect2.width())) { dx += qAbs(rect2.right() - rect1.right()); } else if ((delta2.x() > 0.0 && recti.width() >= rect1.width()) || (delta2.x() < 0.0 && recti.width() >= rect2.width())) { dx += qAbs(rect2.left() - rect1.left()); } if (delta2.x() < 0.0) pos2.setX(pos1.x() - dx); else pos2.setX(pos1.x() + dx); } else { qreal dy = recti.height(); if ((delta2.y() < 0.0 && recti.height() >= rect1.height()) || (delta2.y() > 0.0 && recti.height() >= rect2.height())) { dy += qAbs(rect2.bottom() - rect1.bottom()); } else if ((delta2.y() > 0.0 && recti.height() >= rect1.height()) || (delta2.y() < 0.0 && recti.height() >= rect2.height())) { dy += qAbs(rect2.top() - rect1.top()); } if (delta2.y() < 0.0) pos2.setY(pos1.y() - dy); else pos2.setY(pos1.y() + dy); } // Repel this node... node2->setPos(pos2); // Add this node for undo/redo... if (move_command) move_command->addItem(node2, pos1, pos2); // Repel this node neighbors, if any... repelOverlappingNodes(node2, move_command, delta2); } } node->setMarked(false); } void qjackctlGraphCanvas::repelOverlappingNodesAll ( qjackctlGraphMoveCommand *move_command ) { foreach (qjackctlGraphNode *node, m_nodes) repelOverlappingNodes(node, move_command); } // Gesture event handlers. // bool qjackctlGraphCanvas::event ( QEvent *event ) { if (event->type() == QEvent::Gesture) return gestureEvent(static_cast (event)); else return QGraphicsView::event(event); } bool qjackctlGraphCanvas::gestureEvent ( QGestureEvent *event ) { if (QGesture *pinch = event->gesture(Qt::PinchGesture)) pinchGesture(static_cast (pinch)); return true; } void qjackctlGraphCanvas::pinchGesture ( QPinchGesture *pinch ) { switch (pinch->state()) { case Qt::GestureStarted: { const qreal scale_factor = zoom(); pinch->setScaleFactor(scale_factor); pinch->setLastScaleFactor(scale_factor); pinch->setTotalScaleFactor(scale_factor); m_gesture = true; break; } case Qt::GestureFinished: m_gesture = false; // Fall thru... case Qt::GestureUpdated: if (pinch->changeFlags() & QPinchGesture::ScaleFactorChanged) setZoom(pinch->totalScaleFactor()); // Fall thru... default: break; } } // Bounding margins/limits... // const QRectF& qjackctlGraphCanvas::boundingRect ( bool reset ) { if (!m_rect1.isValid() || reset) { const QRect& rect = QGraphicsView::rect(); const qreal mx = 0.33 * rect.width(); const qreal my = 0.33 * rect.height(); m_rect1 = m_scene->itemsBoundingRect() .marginsAdded(QMarginsF(mx, my, mx, my)); } return m_rect1; } void qjackctlGraphCanvas::boundingPos ( QPointF& pos ) { const QRectF& rect = boundingRect(); if (!rect.contains(pos)) { pos.setX(qBound(rect.left(), pos.x(), rect.right())); pos.setY(qBound(rect.top(), pos.y(), rect.bottom())); } } // Snap into position helpers. // QPointF qjackctlGraphCanvas::snapPos ( const QPointF& pos ) const { return QPointF( 4.0 * ::round(0.25 * pos.x()), 4.0 * ::round(0.25 * pos.y())); } //---------------------------------------------------------------------------- // qjackctlGraphThumb::View -- Thumb graphics scene/view. class qjackctlGraphThumb::View : public QGraphicsView { public: // Constructor. View(qjackctlGraphThumb *thumb) : QGraphicsView((thumb->canvas())->viewport()), m_thumb(thumb), m_drag_state(DragNone) { QGraphicsView::setInteractive(false); QGraphicsView::setRenderHints(QPainter::Antialiasing); QGraphicsView::setRenderHint(QPainter::SmoothPixmapTransform); QGraphicsView::setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); QGraphicsView::setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); QGraphicsView::setAutoFillBackground(true); updatePalette(); QGraphicsView::setScene((thumb->canvas())->scene()); } void updatePalette() { qjackctlGraphCanvas *canvas = m_thumb->canvas(); QPalette pal = canvas->palette(); const QPalette::ColorRole role = canvas->backgroundRole(); const QColor& color = pal.color(role); pal.setColor(role, color.darker(120)); QGraphicsView::setPalette(pal); QGraphicsView::setBackgroundRole(role); } protected: // Compute the view(port) rectangle. QRect viewRect() const { qjackctlGraphCanvas *canvas = m_thumb->canvas(); const QRect& vrect = canvas->viewport()->rect(); const QRectF srect( canvas->mapToScene(vrect.topLeft()), canvas->mapToScene(vrect.bottomRight())); return QGraphicsView::viewport()->rect().intersected(QRect( QGraphicsView::mapFromScene(srect.topLeft()), QGraphicsView::mapFromScene(srect.bottomRight()))) .adjusted(0, 0, -1, -1); } // View paint method. void paintEvent(QPaintEvent *event) { QGraphicsView::paintEvent(event); QPainter painter(QGraphicsView::viewport()); // const QPalette& pal = QGraphicsView::palette(); // painter.setPen(pal.midlight().color()); const QRect& vrect = QGraphicsView::viewport()->rect(); const QRect& vrect2 = viewRect(); const QColor shade(0, 0, 0, 64); QRect rect; // top shade... rect.setTopLeft(vrect.topLeft()); rect.setBottomRight(QPoint(vrect.right(), vrect2.top() - 1)); if (rect.isValid()) painter.fillRect(rect, shade); // left shade... rect.setTopLeft(QPoint(vrect.left(), vrect2.top())); rect.setBottomRight(vrect2.bottomLeft()); if (rect.isValid()) painter.fillRect(rect, shade); // right shade... rect.setTopLeft(vrect2.topRight()); rect.setBottomRight(QPoint(vrect.right(), vrect2.bottom())); if (rect.isValid()) painter.fillRect(rect, shade); // bottom shade... rect.setTopLeft(QPoint(vrect.left(), vrect2.bottom() + 1)); rect.setBottomRight(vrect.bottomRight()); if (rect.isValid()) painter.fillRect(rect, shade); } // Handle mouse events. // void mousePressEvent(QMouseEvent *event) { QGraphicsView::mousePressEvent(event); if (event->button() == Qt::LeftButton) { m_drag_pos = event->pos(); m_drag_state = DragStart; QApplication::setOverrideCursor(QCursor(Qt::PointingHandCursor)); } } void mouseMoveEvent(QMouseEvent *event) { QGraphicsView::mouseMoveEvent(event); if (m_drag_state == DragStart && (event->pos() - m_drag_pos).manhattanLength() > QApplication::startDragDistance()) { m_drag_state = DragMove; QApplication::changeOverrideCursor(QCursor(Qt::DragMoveCursor)); } if (m_drag_state == DragMove) { const QRect& rect = QGraphicsView::rect(); if (!rect.contains(event->pos())) { const int mx = rect.width() + 4; const int my = rect.height() + 4; const Position position = m_thumb->position(); if (event->pos().x() < rect.left() - mx) { if (position == TopRight) m_thumb->requestPosition(TopLeft); else if (position == BottomRight) m_thumb->requestPosition(BottomLeft); } else if (event->pos().x() > rect.right() + mx) { if (position == TopLeft) m_thumb->requestPosition(TopRight); else if (position == BottomLeft) m_thumb->requestPosition(BottomRight); } else if (event->pos().y() < rect.top() - my) { if (position == BottomLeft) m_thumb->requestPosition(TopLeft); else if (position == BottomRight) m_thumb->requestPosition(TopRight); } else if (event->pos().y() > rect.bottom() + my) { if (position == TopLeft) m_thumb->requestPosition(BottomLeft); else if (position == TopRight) m_thumb->requestPosition(BottomRight); } } else if (event->modifiers() & Qt::ControlModifier) { m_thumb->canvas()->centerOn( QGraphicsView::mapToScene(event->pos())); } } } void mouseReleaseEvent(QMouseEvent *event) { QGraphicsView::mouseReleaseEvent(event); if (m_drag_state != DragNone) { if ((m_drag_state == DragStart) || (event->modifiers() & Qt::ControlModifier)) { m_thumb->canvas()->centerOn( QGraphicsView::mapToScene(event->pos())); } m_drag_state = DragNone; QApplication::restoreOverrideCursor(); } } void wheelEvent(QWheelEvent *) {} // Ignore wheel events. void contextMenuEvent(QContextMenuEvent *event) { m_thumb->requestContextMenu(event->globalPos()); } private: // Instance members. qjackctlGraphThumb *m_thumb; enum { DragNone = 0, DragStart, DragMove } m_drag_state; QPoint m_drag_pos; }; //---------------------------------------------------------------------------- // qjackctlGraphThumb -- Thumb graphics scene/view. // Constructor. qjackctlGraphThumb::qjackctlGraphThumb ( qjackctlGraphCanvas *canvas, Position position ) : QFrame(canvas), m_canvas(canvas), m_position(position), m_view(nullptr) { m_view = new View(this); QVBoxLayout *layout = new QVBoxLayout(); layout->setSpacing(0); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(m_view); QFrame::setLayout(layout); QFrame::setFrameStyle(QFrame::Panel); QFrame::setForegroundRole(QPalette::Window); QObject::connect(m_canvas->horizontalScrollBar(), SIGNAL(valueChanged(int)), SLOT(updateView())); QObject::connect(m_canvas->verticalScrollBar(), SIGNAL(valueChanged(int)), SLOT(updateView())); } // Destructor. qjackctlGraphThumb::~qjackctlGraphThumb (void) { } // Accessors. qjackctlGraphCanvas *qjackctlGraphThumb::canvas (void) const { return m_canvas; } void qjackctlGraphThumb::setPosition ( Position position ) { m_position = position; updatePosition(); } qjackctlGraphThumb::Position qjackctlGraphThumb::position (void) const { return m_position; } // Request re-positioning. void qjackctlGraphThumb::requestPosition ( Position position ) { emit positionRequested(int(position)); } // Emit context-menu request. void qjackctlGraphThumb::requestContextMenu ( const QPoint& pos ) { emit contextMenuRequested(pos); } // Update view. void qjackctlGraphThumb::updatePosition (void) { const QRect& rect = m_canvas->viewport()->rect(); const int w = rect.width() / 4; const int h = rect.height() / 4; QFrame:setFixedSize(w + 1, h + 1); // 1px slack. switch (m_position) { case TopLeft: QFrame::move(0, 0); break; case TopRight: QFrame::move(rect.width() - w, 0); break; case BottomLeft: QFrame::move(0, rect.height() - h); break; case BottomRight: QFrame::move(rect.width() - w, rect.height() - h); break; case None: default: break; } QFrame::show(); } // Update view. void qjackctlGraphThumb::updateView (void) { updatePosition(); const qreal m = 24.0; m_view->fitInView( m_canvas->scene()->itemsBoundingRect() .marginsAdded(QMarginsF(m, m, m, m)), Qt::KeepAspectRatio); } // Update the thumb-view palette. void qjackctlGraphThumb::updatePalette (void) { m_view->updatePalette(); } // Search placeholder text accessors. void qjackctlGraphCanvas::setSearchPlaceholderText ( const QString& text ) { m_search_editor->setPlaceholderText(text); } QString qjackctlGraphCanvas::searchPlaceholderText (void) const { return m_search_editor->placeholderText(); } // Update the canvas palette. void qjackctlGraphCanvas::updatePalette (void) { QPalette pal;// = QGraphicsView::palette(); const QPalette::ColorRole role = QPalette::Window; const QColor& color = pal.color(role); pal.setColor(role, color.darker(120)); QGraphicsView::setPalette(pal); QGraphicsView::setBackgroundRole(role); } // end of qjackctlGraph.cpp qjackctl-1.0.6/src/PaxHeaders/translations0000644000000000000000000000013215174607203015630 xustar0030 mtime=1777536643.525914219 30 atime=1777536643.517914276 30 ctime=1777536643.525914219 qjackctl-1.0.6/src/translations/0000755000175000001440000000000015174607203015675 5ustar00rncbcusersqjackctl-1.0.6/src/translations/PaxHeaders/qjackctl_uk.ts0000644000000000000000000000013215174607203020550 xustar0030 mtime=1777536643.525914219 30 atime=1777536643.525914219 30 ctime=1777536643.525914219 qjackctl-1.0.6/src/translations/qjackctl_uk.ts0000644000175000001440000070206415174607203020551 0ustar00rncbcusers PortAudioProber Probing... Зондуємо… Please wait, PortAudio is probing audio hardware. Будь лаÑ�ка, зачекайте, PortAudio виконує зондуваннÑ� звукового обладнаннÑ�. Warning ПопередженнÑ� Audio hardware probing timed out. Перевищено чаÑ� очікуваннÑ� на завершеннÑ� зондуваннÑ� звукового обладнаннÑ�. QObject Move ПереÑ�унути Rename Перейменувати %1 (%2 frames) %1 (%2 кадрів) (default) (default) Usage: %1 [options] [command-and-args] КориÑ�туваннÑ�: %1 [параметри] [команда-Ñ–-аргументи] Options: Параметри: Start JACK audio server immediately. ЗапуÑ�тити звуковий Ñ�ервер JACK негайно. Set default settings preset name. Ð’Ñ�тановити назву набору типових параметрів. Set active patchbay definition file. Ð’Ñ�тановити активний файл визначеннÑ� комутації. Set default JACK audio server name. Ð’Ñ�тановити типову назву звукового Ñ�ервера JACK. Show help about command line options. Показати довідку щодо параметрів командного Ñ€Ñ�дка. Show version information. Показати відомоÑ�ті щодо верÑ�Ñ–Ñ—. Displays help on command-line options. Launch command with arguments. ЗапуÑ�тити команду з аргументами. [command-and-args] [команда-з-аргументами] Option -p requires an argument (preset). Разом із параметром -p Ñ�лід вказати аргумент (набір параметрів). Option -a requires an argument (path). Разом із параметром -a Ñ�лід вказати аргумент (шлÑ�Ñ…). Option -n requires an argument (name). Разом із параметром -n Ñ�лід вказати аргумент (назву). qjackctlAboutForm About Про програму &Close &Закрити About Qt Про Qt Debugging option enabled. Увімкнено параметр діагноÑ�тики. System tray disabled. Вимкнено Ñ�иÑ�темний лоток. Transport status control disabled. Вимкнено керуваннÑ� Ñ�таном передаваннÑ�. Realtime status disabled. Вимкнено динамічне повідомленнÑ� щодо Ñ�тану. XRUN delay status disabled. Стан затримки XRUN вимкнено. Maximum delay status disabled. Стан макÑ�имальної затримки вимкнено. JACK Port aliases support disabled. Підтримку альтернативних назв портів KACK вимкнено. JACK MIDI support disabled. Підтримку MIDI у JACK вимкнено. JACK Session support disabled. Підтримку Ñ�еанÑ�ів JACK вимкнено. ALSA/MIDI sequencer support disabled. Підтримку Ñ�интезатора ALSA/MIDI вимкнено. D-Bus interface support disabled. Підтримку інтерфейÑ�у D-Bus вимкнено. Version ВерÑ�Ñ–Ñ� Using: Qt %1 ВикориÑ�товуємо Qt %1 JACK %1 JACK %1 Website Сайт This program is free software; you can redistribute it and/or modify it ЦÑ� програма Ñ” вільним програмним забезпеченнÑ�м, ви можете поширювати Ñ—Ñ— Ñ– вноÑ�ити до неї зміни under the terms of the GNU General Public License version 2 or later. за умов дотриманнÑ� GNU General Public License верÑ�Ñ–Ñ— 2 або новіших верÑ�ій. qjackctlClientListView Readable Clients / Output Ports Придатні до читаннÑ� порти клієнтів/виведеннÑ� Writable Clients / Input Ports Придатні до запиÑ�у клієнти та вхідні порти &Connect &З'єднати Alt+C Connect Alt+C &Disconnect Роз'Ñ”&днати Alt+D Disconnect Alt+D Disconnect &All Роз'Ñ”&днати вÑ�е Alt+A Disconnect All Alt+A Re&name Пере&йменувати Alt+N Rename Alt+N &Refresh &Оновити Alt+R Refresh Alt+R qjackctlConnect Warning ПопередженнÑ� This will suspend sound processing from all client applications. Are you sure? У результаті буде призупинено обробку звуку в уÑ�Ñ–Ñ… клієнтÑ�ьких програмах. Ви хочете Ñ�аме цього? qjackctlConnectionsForm Connections З'єднаннÑ� Audio Звук Connect currently selected ports З'єднати поточні позначені порти &Connect &З'єднати Disconnect currently selected ports Роз'єднати поточні позначені порти &Disconnect &Роз'єднати Disconnect all currently connected ports Роз'єднати уÑ�Ñ– поточні з'єднані порти Disconnect &All Роз'Ñ”&днати вÑ�е Expand all client ports Розгорнути уÑ�Ñ– порти клієнтів E&xpand All Роз&горнути вÑ�Ñ– Refresh current connections view ОÑ�віжити вміÑ�Ñ‚ панелі поточних з'єднань &Refresh &Оновити MIDI MIDI ALSA ALSA qjackctlConnectorView &Connect &З'єднати Alt+C Connect Alt+C &Disconnect &Роз'єднати Alt+D Disconnect Alt+D Disconnect &All Роз'Ñ”&днати вÑ�е Alt+A Disconnect All Alt+A &Refresh &Оновити Alt+R Refresh Alt+R qjackctlGraphCanvas Connect З'єднати Disconnect Від’єднати qjackctlGraphForm Graph Граф &Graph &Граф &Edit З&міни &View П&ереглÑ�д &Zoom Змінити &маÑ�штаб Co&lors &Кольори S&ort К&ритерій упорÑ�дкуваннÑ� &Help &Довідка &Connect &З'єднати Connect З'єднати Connect selected ports З'єднати позначені порти &Disconnect &Роз'єднати Disconnect Від’єднати Disconnect selected ports Роз'єднати позначені порти Ctrl+C Ctrl+C T&humbview Ctrl+D Ctrl+D Cl&ose З&акрити Close Закрити Close this application window Закрити це вікно програми Select &All Позна&чити вÑ�е Select All Позначити вÑ�е Ctrl+A Ctrl+A Select &None З&нÑ�ти позначеннÑ� Select None ЗнÑ�ти позначеннÑ� Ctrl+Shift+A Ctrl+Shift+A Select &Invert &Інвертувати позначеннÑ� Select Invert Інвертувати позначеннÑ� Ctrl+I Ctrl+I &Rename... &Перейменувати… Rename item Перейменувати запиÑ� Rename Item Перейменувати запиÑ� F2 F2 &Find... Find Find nodes Ctrl+F &Menubar Панель &меню Menubar Панель меню Show/hide the main program window menubar Показати або приховати панель меню головного вікна програми Ctrl+M Ctrl+M &Toolbar Па&нель інÑ�трументів Toolbar Панель інÑ�трументів Show/hide main program window file toolbar Показати або приховати панель інÑ�трументів головного вікна програми &Statusbar С&мужка Ñ�тану Statusbar Смужка Ñ�тану Show/hide the main program window statusbar Показати або приховати Ñ�мужку Ñ�тану головного вікна програми &Top Left Top left Show the thumbnail overview on the top-left Top &Right Top right Show the thumbnail overview on the top-right Bottom &Left Bottom Left Bottom left Show the thumbnail overview on the bottom-left &Bottom Right Bottom right Show the thumbnail overview on the bottom-right &None None Ð�емає Hide thumbview Hide the thumbnail overview Text Beside &Icons ТекÑ�Ñ‚ поруч з пі&ктограмами Text beside icons ТекÑ�Ñ‚ поруч зі значками Show/hide text beside icons Показати або приховати текÑ�Ñ‚ поруч із піктограмами &Center &Центрувати Center Центрувати Center view ЦентруваннÑ� переглÑ�ду &Refresh &Оновити Refresh Оновити Refresh view Оновити переглÑ�д F5 F5 Zoom &In З&більшити Zoom In Збільшити Ctrl++ Ctrl++ Zoom &Out З&меншити Zoom Out Зменшити Ctrl+- Ctrl+- Zoom &Fit Підібрати за роз&мірами Zoom Fit Підібрати за розмірами Ctrl+0 Ctrl+0 Zoom &Reset Відновити по&чатковий маÑ�штаб Zoom Reset Відновити початковий маÑ�штаб Ctrl+1 Ctrl+1 &Zoom Range &МаÑ�штабувати за діапазоном Zoom Range МаÑ�штабувати за діапазоном JACK &Audio... Зв&ук Jack… JACK Audio color Колір звуку JACK JACK &MIDI... JACK &MIDI… JACK MIDI JACK MIDI JACK MIDI color Колір MIDI JACK ALSA M&IDI... ALSA M&IDI... ALSA MIDI ALSA MIDI ALSA MIDI color Колір ALSA MIDI JACK &CV... JACK &CV… JACK CV color Колір JACK CV JACK &OSC... JACK &OSC… JACK OSC JACK OSC JACK OSC color Колір JACK OSC &Reset &Скинути Reset colors Відновити типові кольори Port &Name Ð�азва &порту Port name Ð�азва порту Sort by port name УпорÑ�дкувати за назвою порту Port &Title &Ð�азва порту Port title Ð�азва порту Sort by port title УпорÑ�дкувати за назвою порту Port &Index &ІндекÑ� порту Port index ІндекÑ� порту Sort by port index УпорÑ�дкувати за індекÑ�ом порту &Ascending За з&роÑ�таннÑ�м Ascending За зроÑ�таннÑ�м Ascending sort order УпорÑ�дкувати за зроÑ�таннÑ�м &Descending &За Ñ�паданнÑ�м Descending За Ñ�паданнÑ�м Descending sort order УпорÑ�дкувати за Ñ�паданнÑ�м Repel O&verlapping Nodes Від&кинути вузли з перекриттÑ�м Repel nodes Відкинути вузли Repel overlapping nodes Відкинути вузли з перекриттÑ�м Connect Thro&ugh Nodes З'єднати &через вузли Connect Through Nodes З'єднати через вузли Connect through nodes З'єднати через вузли Whether to draw connectors through or around nodes Визначає, Ñ�лід малювати з'єднаннÑ� через вузли чи навколо вузлів &About... П&ро програму… About... Про програму… About Про програму Show information about this application program Показати відомоÑ�ті щодо цієї програми About &Qt... П&ро Qt… About Qt... Про Qt… About Qt Про Qt Show information about the Qt toolkit Показати відомоÑ�ті щодо набору інÑ�трументів Qt &Undo &Вернути Undo last edit action СкаÑ�увати оÑ�танню дію з редагуваннÑ� &Redo &Повторити Redo last edit action Повторити оÑ�танню Ñ�каÑ�овану дію з редагуваннÑ� Zoom МаÑ�штаб Ready Готово Colors - %1 Кольори – %1 qjackctlMainForm Start the JACK server ЗапуÑ�тити Ñ�ервер JACK &Start З&апуÑ�тити Stop the JACK server Зупинити роботу Ñ�ервера JACK S&top &Зупинити JACK server state Стан Ñ�ервера JACK JACK server mode Режим Ñ�ервера JACK DSP Load Ð�авантаженнÑ� на ЦОС Sample rate ЧаÑ�тота диÑ�кретизації XRUN Count (notifications) Лічильник XRUN (Ñ�повіщеннÑ�) Time display Показ чаÑ�у Transport state Стан передаваннÑ� Transport BPM ЧаÑ�тота передаваннÑ� Transport time ЧаÑ� передаваннÑ� Quit processing and exit Припинити обробку Ñ– вийти &Quit Ви&йти Show/hide the session management window Показати або приховати вікно керуваннÑ� Ñ�еанÑ�ом S&ession С&еанÑ� Show/hide the messages log/status window Показати або приховати вікно повідомлень журналу або Ñ�тану &Messages П&овідомленнÑ� Show settings and options dialog Показати вікно параметрів та налаштувань Set&up... Ð�&алаштувати… Show/hide the graph window Показати або приховати вікно графу &Graph &Граф Show/hide the connections window Показати або приховати вікно з'єднань &Connect &З'єднати Show/hide the patchbay editor window Показати або приховати вікно редактора комутації &Patchbay &КомутаціÑ� Rewind transport ПеремотуваннÑ� передаваннÑ� &Rewind Перемотати &назад Backward transport Перемотати передаваннÑ� назад &Backward &Ð�азад Start transport rolling Розпочати перемотуваннÑ� передаваннÑ� &Play Від&творити Stop transport rolling Зупинити перемотуваннÑ� передаваннÑ� Pa&use Па&уза Forward transport Прокрутити вперед &Forward Ð’&перед Show information about this application Показати відомоÑ�ті щодо цієї програми Ab&out... П&ро програму… Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Ð�е вдалоÑ�Ñ� відкрити Ñ�интезатор ALSA Ñ�к клієнт. Ви не зможете Ñ�кориÑ�татиÑ�Ñ� комутацією ALSA MIDI. Information ІнформаціÑ� The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Програма продовжить роботу у Ñ�иÑ�темному лотку. Щоб завершити роботу програми, будь лаÑ�ка, виберіть пункт «Вийти» у контекÑ�тному меню піктограми Ñ�иÑ�темного лотка. Don't show this message again Ð�е показувати надалі Warning ПопередженнÑ� JACK is currently running. Do you want to terminate the JACK audio server? Зараз запущено JACK. Хочете перервати роботу звукового Ñ�ервера JACK? %1 is about to terminate. Are you sure? Зараз роботу %1 буде перервано. Ви впевнені, що хочете Ñ�аме цього? Don't ask this again Більше не питати The preset aliases have been changed: "%1" Do you want to save the changes? Ð�льтернативні назви наборів параметрів було змінено: «%1» Хочете зберегти внеÑ�ені зміни? Server settings will be only effective after restarting the JACK audio server. Параметри Ñ�ервера набудуть чинноÑ�ті лише піÑ�лÑ� перезапуÑ�ку звукового Ñ�ервера JACK. Do you want to restart the JACK audio server? Хочете перезапуÑ�тити звуковий Ñ�ервер JACK? Some client audio applications are still active and connected. Do you want to stop the JACK audio server? ДеÑ�кі клієнтÑ�ькі звукові програми лишаютьÑ�Ñ� активними Ñ– з'єднаними. Хочете зупинити роботу звукового Ñ�ервера JACK? successfully уÑ�пішно with exit status=%1 зі Ñ�таном виходу=%1 Could not start JACK. Maybe JACK audio server is already started. Ð�е вдалоÑ�Ñ� запуÑ�тити JACK. Можливо, звуковий Ñ�ервер JACK вже запущено. Could not load preset "%1". Retrying with default. Ð�е вдалоÑ�Ñ� завантажити набір параметрів «%1». Робимо повторну Ñ�пробу із типовим набором. Could not load default preset. Sorry. Ð�е вдалоÑ�Ñ� завантажити типовий набір параметрів. Вибачте. Startup script... Скрипт запуÑ�ку… Startup script terminated Роботу Ñ�крипту запуÑ�ку перервано D-BUS: JACK server is starting... D-BUS: запуÑ�каємо Ñ�ервер JACK… D-BUS: JACK server could not be started. Sorry D-BUS: не вдалоÑ�Ñ� запуÑ�тити Ñ�ервер JACK. Вибачте JACK is starting... ЗапуÑ�каємо JACK… Shutdown script... Скрипт вимиканнÑ�… Shutdown script terminated Роботу Ñ�крипту вимиканнÑ� перервано JACK is stopping... ПрипинÑ�ємо роботу JACK… D-BUS: JACK server is stopping... D-BUS: припинÑ�ємо роботу Ñ�ервера JACK… D-BUS: JACK server could not be stopped. Sorry D-BUS: не вдалоÑ�Ñ� припинити роботу Ñ�ервера JACK. Вибачте JACK was started with PID=%1. JACK було запущено із PID=%1. D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: Ñ�ервер JACK запущено (%1 або jackdbus). JACK is being forced... ПримуÑ�ово керуємо JACK… JACK was stopped JACK зупинено D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: роботу Ñ�ервера JACK зупинено (%1 або jackdbus). Post-shutdown script... Виконуємо Ñ�крипт піÑ�лÑ� завершеннÑ� роботи… Post-shutdown script terminated Роботу Ñ�крипту, запущеного піÑ�лÑ� припиненнÑ� роботи, перервано Error Помилка Transport BBT (bar.beat.ticks) ПередаваннÑ� BBT (bar.beat.ticks) Transport time code ЧаÑ�ова позначка передаваннÑ� Elapsed time since last reset ЧаÑ� з моменту оÑ�таннього Ñ�киданнÑ� Elapsed time since last XRUN ЧаÑ� з моменту оÑ�таннього XRUN D-BUS: Service is available (%1 aka jackdbus). D-BUS: Ñ�лужба доÑ�тупна (%1 або jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: Ñ�лужба не доÑ�тупна (%1 або jackdbus). Patchbay reset. Комутацію Ñ�кинуто. Could not load active patchbay definition. "%1" Disabled. Ð�е вдалоÑ�Ñ� завантажити активне визначеннÑ� комутації. «%1» Вимкнено. Patchbay activated. Комутацію активовано. Patchbay deactivated. Комутацію деактивовано. Statistics reset. СтатиÑ�тику Ñ�кинуто. msec мÑ� JACK connection graph change. Зміна графу з'єднань JACK. XRUN callback (%1). Зворотний виклик XRUN (%1). Buffer size change (%1). Зміна розміру буфера (%1). Shutdown notification. СповіщеннÑ� щодо вимиканнÑ�. Freewheel started... Запущено вільний хід… Freewheel exited. Вихід з режиму вільного ходу. Could not start JACK. Sorry. Ð�е вдалоÑ�Ñ� запуÑ�тити JACK. Вибачте. JACK has crashed. JACK завершив роботу у аварійному режимі. JACK timed out. Перевищено чаÑ� очікуваннÑ� на запуÑ�к JACK. JACK write error. Помилка запиÑ�у JACK. JACK read error. Помилка читаннÑ� JACK. Unknown JACK error (%d). Ð�евідома помилка JACK (%d). JACK property change. Зміна влаÑ�тивоÑ�ті JACK. ALSA connection graph change. Зміна графу з'єднань ALSA. JACK active patchbay scan СкануваннÑ� активної комутації JACK ALSA active patchbay scan СкануваннÑ� активної комутації ALSA JACK connection change. Зміна з'єднаннÑ� JACK. ALSA connection change. Зміна з'єднаннÑ� ALSA. checked позначено connected з'єднано disconnected роз'єднано failed помилка A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Зараз активною Ñ” комутаціÑ�, Ñ�ка, ймовірно, повторно вÑ�тановить це з'єднаннÑ�: %1 -> %2 Хочете вилучити це комутаційне з'єднаннÑ�? Overall operation failed. Помилка загальної операції. Invalid or unsupported option. Ð�екоректний або непідтримуваний параметр. Client name not unique. Ð�азва клієнта не Ñ” унікальною. Server is started. Сервер запущено. Unable to connect to server. Ð�еможливо з'єднатиÑ�Ñ� з Ñ�ервером. Server communication error. Помилка обміну даними із Ñ�ервером. Client does not exist. Клієнта не Ñ–Ñ�нує. Unable to load internal client. Ð�е вдалоÑ�Ñ� завантажити внутрішній клієнт. Unable to initialize client. Ð�е вдалоÑ�Ñ� ініціалізувати клієнт. Unable to access shared memory. Ð�е вдалоÑ�Ñ� отримати доÑ�туп до Ñ�пільної пам'Ñ�ті. Client protocol version mismatch. Ð�евідповідніÑ�ть верÑ�Ñ–Ñ— протоколу клієнта. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Ð�е вдалоÑ�Ñ� вÑ�тановити з'єднаннÑ� із Ñ�ервером JACK Ñ�к клієнтом. - %1 Будь лаÑ�ка, ознайомтеÑ�Ñ� із даними вікна повідомлень, щоб дізнатиÑ�Ñ� більше. Server configuration saved to "%1". Ð�алаштуваннÑ� Ñ�ервера збережено до «%1». Client activated. Ð�ктивовано клієнт. Post-startup script... Виконуємо Ñ�крипт піÑ�лÑ� запуÑ�ку… Post-startup script terminated ВиконаннÑ� Ñ�крипту піÑ�лÑ� запуÑ�ку перервано Command line argument... Ð�ргумент командного Ñ€Ñ�дка… Command line argument started Запущено аргумент командного Ñ€Ñ�дка Client deactivated. Клієнт деактивовано. Transport rewind. ПеремотуваннÑ� передаваннÑ� назад до кінцÑ�. Transport backward. ПеремотуваннÑ� передаваннÑ� назад. Starting ЗапуÑ�к Transport start. ЗапуÑ�к передаваннÑ�. Stopping ЗупиненнÑ� Transport stop. ЗупиненнÑ� передаваннÑ�. Transport forward. ПеремотуваннÑ� вперед до кінцÑ�. Stopped Зупинено %1 (%2%) %1 (%2%) %1 (%2%, %3 xruns) %1 (%2%, %3 xrun-ів) %1 % %1 % %1 Hz %1 Гц %1 frames %1 кадрів Yes Так No Ð�Ñ– FW Ð’Ð¥ RT РЧ Rolling ПрокручуваннÑ� Looping Цикл %1 msec %1 мÑ� XRUN callback (%1 skipped). Зворотний виклик XRUN (%1 пропущено). Started Запущено Active Ð�ктивний Activating Ð�ктиваціÑ� Inactive Ð�еактивний Mi&nimize Мін&імізувати Rest&ore Від&новити &Hide При&ховати S&how По&казати &Stop З&упинити &Reset &Скинути &Presets &Ð�абори параметрів &Load... Заванта&жити… &Save... З&берегти… Save and &Quit... Зберегти та ви&йти… Save &Template... Зберегти &шаблон… &Versioning &КеруваннÑ� верÑ�Ñ–Ñ�ми Re&fresh О&новити St&atus С&тан &Connections З'&єднаннÑ� Patch&bay &КомутаціÑ� &Transport П&ередаваннÑ� Some settings will be only effective the next time you start this program. ДеÑ�кі з параметрів набудуть чинноÑ�ті лише піÑ�лÑ� наÑ�тупного запуÑ�ку програми. D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS: GetParameterConstraint('%1'): %2. (%3) D-BUS: GetParameterConstraint('%1'): %2. (%3) qjackctlMessagesStatusForm Messages / Status ПовідомленнÑ�/Стан &Messages &ПовідомленнÑ� Messages log Журнал повідомлень Messages output log Журнал вихідних повідомлень &Status С&тан Status information ВідомоÑ�ті щодо Ñ�тану Statistics since last server startup СтатиÑ�тика з моменту оÑ�таннього запуÑ�ку Ñ�ервера Description ОпиÑ� Value ЗначеннÑ� Reset XRUN statistic values Скинути значеннÑ� Ñ�татиÑ�тики XRUN Re&set С&кинути Refresh XRUN statistic values ОÑ�віжити значеннÑ� Ñ�татиÑ�тики XRUN &Refresh &Оновити Server name Ð�азва Ñ�ервера Server state Стан Ñ�ервера DSP Load ЗавантаженнÑ� ЦОС Sample Rate ЧаÑ�тота диÑ�кретизації Buffer Size Розмір буфера Realtime Mode Режим реального чаÑ�у Transport state Стан передаваннÑ� Transport Timecode ЧаÑ�овий код передаваннÑ� Transport BBT BBT передаваннÑ� Transport BPM Ритм передаваннÑ� XRUN count since last server startup КількіÑ�ть XRUN з моменту оÑ�таннього запуÑ�ку Ñ�ервера XRUN last time detected ОÑ�танній зафікÑ�ований XRUN XRUN last ОÑ�танній XRUN XRUN maximum МакÑ�имальна кількіÑ�ть XRUN XRUN minimum Мінімальна кількіÑ�ть XRUN XRUN average СереднÑ� кількіÑ�ть XRUN XRUN total Загальна кількіÑ�ть XRUN Maximum scheduling delay МакÑ�имальна затримка плануваннÑ� Time of last reset ЧаÑ� оÑ�таннього Ñ�киданнÑ� Logging stopped --- %1 --- ЗапиÑ�уваннÑ� до журналу зупинено --- %1 --- Logging started --- %1 --- Розпочато запиÑ�уваннÑ� до журналу --- %1 --- qjackctlPaletteForm Color Themes Теми кольорів Name Ð�азва Current color palette name Ð�азва поточної палітри кольорів Save current color palette name Зберегти назву поточної палітри кольорів Save Зберегти Delete current color palette name Вилучити назву поточної палітри кольорів Delete Вилучити Palette Палітра Current color palette Поточна палітра кольорів Generate: Створити: Base color to generate palette Базовий колір длÑ� Ñ�твореннÑ� палітри Reset all current palette colors Скинути уÑ�Ñ– кольори поточної палітри Reset Скинути Import a custom color theme (palette) from file Імпортувати нетипову тему кольорів (палітру) з файла Import... Імпортувати… Export a custom color theme (palette) to file ЕкÑ�портувати нетипову тему кольорів (палітру) до файла Export... ЕкÑ�портувати… Show Details Показати подробиці Import File - %1 Імпорт файла – %1 Palette files (*.%1) файли палітр (*.%1) Save Palette - %1 All files (*.*) уÑ�Ñ– файли (*.*) Warning - %1 ПопередженнÑ� – %1 Could not import from file: %1 Sorry. Ð�е вдалоÑ�Ñ� імпортувати дані з файла: %1 Вибачте. Export File - %1 ЕкÑ�порт файла – %1 Some settings have been changed. Do you want to discard the changes? ЗначеннÑ� деÑ�ких параметрів було змінено. Хочете відкинути внеÑ�ені зміни? Some settings have been changed: "%1". Do you want to save the changes? ДеÑ�кі з параметрів було змінено: «%1». Хочете зберегти внеÑ�ені зміни? qjackctlPaletteForm::PaletteModel Color Role Роль кольору Active Ð�ктивний Inactive Ð�еактивний Disabled Вимкнений qjackctlPatchbay Warning ПопередженнÑ� This will disconnect all sockets. Are you sure? У результаті буде роз'єднано уÑ�Ñ– Ñ�окети. Ви Ñ�правді цього хочете? qjackctlPatchbayForm Patchbay КомутаціÑ� Move currently selected output socket down one position ПереÑ�унути позначений вихідний Ñ�окет вниз на одну позицію Down Ð�ижче Create a new output socket Створити вихідний Ñ�окет Add... Додати… Edit currently selected input socket properties Змінити влаÑ�тивоÑ�ті поточного позначеного вхідного Ñ�окета Edit... Змінити… Move currently selected output socket up one position ПереÑ�унути поточний позначений вихідний Ñ�окет вгору на одну позицію Up Вище Remove currently selected output socket Вилучити поточний позначений вихідний Ñ�окет Remove Вилучити Duplicate (copy) currently selected output socket Дублювати (копіювати) поточний позначений вихідний Ñ�окет Copy... Копіювати… Remove currently selected input socket Вилучити поточний позначених вхідний Ñ�окет Duplicate (copy) currently selected input socket Дублювати (копіювати) поточний позначений вхідний Ñ�окет Create a new input socket Створити вхідний Ñ�окет Edit currently selected output socket properties Змінити влаÑ�тивоÑ�ті поточного позначеного вихідного Ñ�окета Connect currently selected sockets З'єднати поточні позначені Ñ�окети &Connect &З'єднати Disconnect currently selected sockets Роз'єднати поточні позначені Ñ�окети &Disconnect Роз'&єднати Disconnect all currently connected sockets Роз'єднати уÑ�Ñ– з'єднані Ñ�окети Disconnect &All Роз'єд&нати вÑ�е Expand all items Розгорнути уÑ�Ñ– пункти E&xpand All Роз&горнути вÑ�е Refresh current patchbay view ОÑ�віжити поточний вміÑ�Ñ‚ панелі комутації &Refresh &Оновити Create a new patchbay profile Створити профіль комутації &New С&творити Load patchbay profile Завантажити профіль комутації &Load... З&авантажити… Save current patchbay profile Зберегти поточний профіль комутації &Save... З&берегти… Current (recent) patchbay profile(s) Поточні (нещодавні) профілі комутації Toggle activation of current patchbay profile Перемкнути активацію поточного профілю комутації Acti&vate Ð�&ктивувати Warning ПопередженнÑ� The patchbay definition has been changed: "%1" Do you want to save the changes? ВизначеннÑ� комутації було змінено: «%1» Хочете зберегти внеÑ�ені зміни? %1 [modified] %1 [змінено] Untitled%1 Без назви%1 Error Помилка Could not load patchbay definition file: "%1" Ð�е вдалоÑ�Ñ� завантажити файл визначеннÑ� комутації: «%1» Could not save patchbay definition file: "%1" Ð�е вдалоÑ�Ñ� зберегти файл визначеннÑ� комутації: «%1» New Patchbay definition Ð�ове визначеннÑ� комутації Create patchbay definition as a snapshot of all actual client connections? Створити визначеннÑ� комутації Ñ�к знімок уÑ�Ñ–Ñ… дійÑ�них клієнтÑ�ьких з'єднань? Load Patchbay Definition ЗавантаженнÑ� визначеннÑ� комутації Patchbay Definition files файли визначень комутації Save Patchbay Definition ЗбереженнÑ� визначеннÑ� комутації active активний qjackctlPatchbayView Add... Додати… Edit... Змінити… Copy... Копіювати… Remove Вилучити Exclusive Виключний Forward Вперед (None) (Ð�емає) Move Up ПереÑ�унути вище Move Down ПереÑ�унути нижче &Connect З'&єднати Alt+C Connect Alt+C &Disconnect Роз'Ñ”&днати Alt+D Disconnect Роз'єднати Disconnect &All Роз'єд&нати вÑ�е Alt+A Disconnect All Alt+A &Refresh &Оновити Alt+R Refresh Alt+R qjackctlSessionForm Session СеанÑ� Load session Завантажити Ñ�еанÑ� &Load... З&авантажити… Recent session Ð�ещодавній Ñ�еанÑ� &Recent Ð�е&щодавні Save session Зберегти Ñ�еанÑ� &Save З&берегти &Versioning &КеруваннÑ� верÑ�Ñ–Ñ�ми Update session Оновити Ñ�еанÑ� Re&fresh О&новити Session clients / connections Клієнти та з'єднаннÑ� Ñ�еанÑ�у Client / Ports Клієнт/Порти UUID UUID Command Команда Infra-clients / commands Клієнти та команди інфраÑ�труктури Infra-client Інфраклієнт Infra-command Інфракоманда Add infra-client Додати інфраклієнт &Add &Додати Edit infra-client Змінити інфраклієнт &Edit З&мінити Remove infra-client Вилучити інфраклієнт Re&move Ви&лучити &Save... З&берегти… Save and &Quit... Зберегти та ви&йти… Save &Template... Зберегти &шаблон… Load Session Завантажити Ñ�еанÑ� Session directory Каталог Ñ�еанÑ�ів Save Session Зберегти Ñ�еанÑ� and Quit Ñ– вийти Template Шаблон &Clear Сп&орожнити Warning ПопередженнÑ� A session could not be found in this folder: "%1" Ð�е вдалоÑ�Ñ� знайти Ñ�еанÑ� у цій теці: "%1" %1: loading session... %1: завантажуємо Ñ�еанÑ�... %1: load session %2. %1:завантажити Ñ�еанÑ� %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? У цій теці вже Ñ–Ñ�нує Ñ�еанÑ�: «%1» Ви Ñ�правді хочете перезапиÑ�ати наÑ�вний Ñ�еанÑ�? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? ЦÑ� тека вже Ñ–Ñ�нує Ñ– міÑ�тить дані: «%1» Ви Ñ�правді хочете перезапиÑ�ати вміÑ�Ñ‚ наÑ�вної теки? %1: saving session... %1: зберігаємо Ñ�еанÑ�… %1: save session %2. %1: зберегти Ñ�еанÑ� %2. New Client Ð�овий клієнт qjackctlSessionInfraClientItemEditor Infra-command Інфракоманда qjackctlSessionSaveForm Session СеанÑ� &Name: &Ð�азва: Session name &Directory: Session directory Каталог Ñ�еанÑ�ів Browse for session directory ... ... Save session versioning Зберегти верÑ�Ñ–ÑŽ Ñ�еанÑ�у &Versioning &КеруваннÑ� верÑ�Ñ–Ñ�ми Warning ПопередженнÑ� Session directory does not exist: "%1" Do you want to create it? Session Directory qjackctlSetupForm Setup Ð�алаштуваннÑ� Settings Параметри Preset &Name: &Ð�азва набору параметрів: Settings preset name Ð�азва набору параметрів (default) (типовий) Clear settings of current preset name Вилучити параметри набору із поточною назвою Clea&r О&чиÑ�тити Save settings as current preset name Зберегти параметри із поточною назвою набору &Save З&берегти Delete current settings preset Вилучити поточний набір параметрів &Delete Ви&лучити Parameters Параметри Driv&er: Дра&йвер: The audio backend driver interface to use ІнтерфейÑ� драйвера модулÑ� звукової Ñ�иÑ�теми, Ñ�ким Ñ�лід Ñ�кориÑ�татиÑ�Ñ� dummy dummy sun sun oss oss alsa alsa portaudio portaudio coreaudio coreaudio firewire firewire net net netone netone &Interface: &ІнтерфейÑ�: The PCM device name to use Ð�азва приÑ�трою PCM, Ñ�кою Ñ�лід Ñ�кориÑ�татиÑ�Ñ� hw:0 hw:0 plughw:0 plughw:0 /dev/audio /dev/audio /dev/dsp /dev/dsp MIDI Driv&er: Д&райвер MIDI: The ALSA MIDI backend driver to use Драйвер модулÑ� MIDI ALSA, Ñ�ким Ñ�лід Ñ�кориÑ�татиÑ�Ñ� none немає raw raw seq Ñ�интезатор Use realtime scheduling ВикориÑ�товувати плануваннÑ� у режимі реального чаÑ�у &Realtime &Реальний чаÑ� Sample &Rate: &ЧаÑ�тота диÑ�кретизації: Sample rate in frames per second ЧаÑ�тота диÑ�кретизації у кадрах за Ñ�екунду 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 &Frames/Period: &Кадрів/Період: Frames per period between process() calls КількіÑ�ть кадрів за період між викликами process() 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Periods/&Buffer: Періодів/&Буфер: Number of periods in the hardware buffer КількіÑ�ть періодів в апаратному буфері Whether to use server synchronous mode Чи Ñ�лід викориÑ�товувати Ñ�инхронний режим Ñ�ервера &Use server synchronous mode Син&хронний режим Ñ�ервера Whether to give verbose output on messages Чи Ñ�лід виводити докладні повідомленнÑ� &Verbose messages &Режим докладних повідомлень Latency: ЛатентніÑ�ть: Output latency in milliseconds, calculated based on the period, rate and buffer settings Виводити латентніÑ�ть у міліÑ�екундах, обчиÑ�лену на оÑ�нові періоду, чаÑ�тоти та параметрів буфера 0 msecs 0 мÑ� Advanced Додатково Please do not touch these settings unless you know what you are doing. Будь лаÑ�ка, не змінюйте значеннÑ� цих параметрів, Ñ�кщо ви не певні. Server &Prefix: П&рефікÑ� Ñ�ервера: Server path (command line prefix) ШлÑ�Ñ… до Ñ�ервера (префікÑ� командного Ñ€Ñ�дка) jackd jackd jackdmp jackdmp jackstart jackstart &Name: &Ð�азва: The JACK Audio Connection Kit sound server name Ð�азва звукового Ñ�ервера набору інÑ�трументів звукових з'єднань JACK Do not attempt to lock memory, even if in realtime mode Ð�е намагатиÑ�Ñ� блокувати пам'Ñ�ть, навіть Ñ�кщо робота відбуваєтьÑ�Ñ� у режимі реального чаÑ�у No Memory Loc&k Ð�е &блокувати пам'Ñ�ть Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Розблокувати пам'Ñ�ть типових бібліотек наборів інÑ�трументів (GTK+, QT, FLTK, Wine) &Unlock Memory &Розблокувати пам'Ñ�ть Enable hardware metering on cards that support it Увімкнути апаратне вимірюваннÑ� на картках, длÑ� Ñ�ких передбачено його підтримку H/&W Meter &Ð�паратни вимірювач Provide output monitor ports Ð�адати порти Ñ�поÑ�тереженнÑ� за виведеннÑ�м &Monitor Сп&оÑ�терігати Ignore xruns reported by the backend driver Ігнорувати xrun-и, про Ñ�кі повідомлÑ�Ñ” драйвер модулÑ� обробки So&ft Mode П&рограмний режим Force 16bit mode instead of failing over 32bit (default) ПримуÑ�ово вÑ�тановити 16-бітовий режим заміÑ�ть типового 32-бітового Force &16bit ПримуÑ�овий &16-бітовий Ignore hardware period/buffer size Ігнорувати апаратні розмір період/буфер &Ignore H/W &Ігнорувати апаратні Priorit&y: Пріори&тетніÑ�ть: Scheduler priority when running realtime ПріоритетніÑ�ть планувальника при роботі у режимі реального чаÑ�у &Word Length: Дов&жина Ñ�лова: Word length Довжина Ñ�лова &Wait (usec): &ОчікуваннÑ� (у мкÑ�): Number of microseconds to wait between engine processes (dummy) ТриваліÑ�ть очікуваннÑ� у мікроÑ�екундаж між процеÑ�ами рушіÑ� (фіктивними) 21333 21333 &Channels: &Канали: Maximum number of audio channels to allocate МакÑ�имальна кількіÑ�ть звукових каналів длÑ� резервуваннÑ� Port Ma&ximum: &МакÑ�имальна к-ть портів: Maximum number of ports the JACK server can manage МакÑ�имальна кількіÑ�ть портів, Ñ�кими може керувати Ñ�ервер JACK &Timeout (msec): &ЧаÑ� очікуваннÑ� (у мкÑ�): Set client timeout limit in milliseconds Ð’Ñ�тановити граничний чаÑ� очікуваннÑ� клієнта у міліÑ�екундах 200 200 500 500 1000 1000 2000 2000 5000 5000 Cloc&k source: Д&жерело годинника: Clock source Джерело даних годинника &Audio: &Звук: Provide either audio capture, playback or both Ð�аданнÑ� даних длÑ� захопленнÑ� звуку, длÑ� відтвореннÑ� звуку або обох типів Duplex Двобічний Capture Only Лише захопленнÑ� Playback Only Лише відтвореннÑ� Dit&her: Під&мішуваннÑ� шуму: Set dither mode Ð’Ñ�тановити режим підмішуваннÑ� шуму None Ð�емає Rectangular ПрÑ�мокутне Shaped За формою Triangular Трикутна &Output Device: Ð’&ихідний приÑ�трій: Alternate output device for playback Змінити приÑ�трій виведеннÑ� длÑ� відтвореннÑ� &Input Device: Ð’&хідний приÑ�трій: Alternate input device for capture Змінити вхідний приÑ�трій длÑ� захопленнÑ� даних &Channels I/O: Ка&нали Ð’Ð’: Maximum input audio hardware channels to allocate МакÑ�имальна кількіÑ�ть вхідних апаратних звукових каналів длÑ� резервуваннÑ� Maximum output audio hardware channels to allocate МакÑ�имальна кількіÑ�ть вихідних апаратних звукових каналів длÑ� резервуваннÑ� &Latency I/O: &ЛатентніÑ�ть Ð’Ð’: External input latency (frames) ЛатентніÑ�ть зовнішнього входу (у кадрах) External output latency (frames) ЛатентніÑ�ть зовнішнього виходу (у кадрах) S&elf connect mode: Режим Ñ�а&моз'єднаннÑ�: Whether to restrict client self-connections Чи Ñ�лід обмежувати Ñ�амоз'єднаннÑ� клієнтів Server Suffi&x: Су&фікÑ� Ñ�ервера: Extra driver options (command line suffix) Додаткові параметри драйвера (Ñ�уфікÑ� командного Ñ€Ñ�дка) Start De&lay: Затримка за&пуÑ�ку: Time in seconds that client is delayed after server startup ЧаÑ� у Ñ�екундах затримки запуÑ�ку клієнта піÑ�лÑ� запуÑ�ку Ñ�ервера secs Ñ�екунд Options Ð�алаштуваннÑ� Scripting Скрипти Whether to execute a custom shell script before starting up the JACK audio server. Чи Ñ�лід виконувати нетиповий Ñ�крипт оболонки перед запуÑ�ком звукового Ñ�ервера JACK. Execute script on Start&up: Виконати Ñ�крипт при зап&уÑ�ку: Whether to execute a custom shell script after starting up the JACK audio server. Чи Ñ�лід виконувати нетиповий Ñ�крипт оболонки піÑ�лÑ� запуÑ�ку звукового Ñ�ервера JACK. Execute script after &Startup: Виконати Ñ�крипт піÑ�лÑ� з&апуÑ�ку: Whether to execute a custom shell script before shuting down the JACK audio server. Чи Ñ�лід виконувати нетиповий Ñ�крипт оболонки до завершеннÑ� роботи звукового Ñ�ервера JACK. Execute script on Shut&down: Виконати Ñ�&крипт при вимиканні: Command line to be executed before starting up the JACK audio server РÑ�док команди, Ñ�ку буде виконано перед запуÑ�ком звукового Ñ�ервера JACK Scripting argument meta-symbols МетаÑ�имволи аргументу Ñ�крипту > > Browse for script to be executed before starting up the JACK audio server Вибрати Ñ�крипт, Ñ�кий буде виконано перед запуÑ�ком звукового Ñ�ервера JACK ... ... Command line to be executed after starting up the JACK audio server РÑ�док команди, Ñ�ку буде виконано піÑ�лÑ� запуÑ�ку звукового Ñ�ервера JACK Browse for script to be executed after starting up the JACK audio server Вибрати Ñ�крипт, Ñ�кий буде виконано піÑ�лÑ� запуÑ�ку звукового Ñ�ервера JACK Browse for script to be executed before shutting down the JACK audio server Вибрати Ñ�крипт, Ñ�кий буде виконано до вимиканнÑ� звукового Ñ�ервера JACK Command line to be executed before shutting down the JACK audio server РÑ�док команди, Ñ�ку буде виконано перед вимиканнÑ�м звукового Ñ�ервера JACK Whether to execute a custom shell script after shuting down the JACK audio server. Чи Ñ�лід виконувати нетиповий Ñ�крипт оболонки піÑ�лÑ� завершеннÑ� роботи звукового Ñ�ервера JACK. Execute script after Shu&tdown: Виконати Ñ�крипт піÑ�л&Ñ� вимиканнÑ�: Browse for script to be executed after shutting down the JACK audio server Вибрати Ñ�крипт, Ñ�кий буде виконано піÑ�лÑ� вимиканнÑ� звукового Ñ�ервера JACK Command line to be executed after shutting down the JACK audio server РÑ�док команди, Ñ�ку буде виконано піÑ�лÑ� вимиканнÑ� звукового Ñ�ервера JACK Statistics СтатиÑ�тика Whether to capture standard output (stdout/stderr) into messages window Чи Ñ�лід захоплювати дані зі Ñ�тандартного виведеннÑ� (stdout/stderr) до вікна повідомлень &Capture standard output За&хоплювати Ñ�тандартне виведеннÑ� &XRUN detection regex: &Формальний вираз длÑ� виÑ�вленнÑ� XRUN: Regular expression used to detect XRUNs on server output messages Формальний вираз, Ñ�кий буде викориÑ�тано длÑ� виÑ�вленнÑ� XRUN-ів Ñ�еред виведених Ñ�ервером повідомлень xrun of at least ([0-9|\.]+) msecs xrun of at least ([0-9|\.]+) msecs Connections З'єднаннÑ� Whether to activate a patchbay definition for connection persistence profile. Чи Ñ�лід активувати визначеннÑ� комутації длÑ� поÑ�тійного профілю з'єднаннÑ�. Activate &Patchbay persistence: &Ð�ктивувати Ñ�талу комутацію: Patchbay definition file to be activated as connection persistence profile Файл визначеннÑ� комутації, Ñ�кий Ñ�лід задіÑ�ти Ñ�к поÑ�тійний профіль з'єднаннÑ� Browse for a patchbay definition file to be activated Вибрати файл визначеннÑ� комутації, Ñ�кий має бути активовано Whether to reset all connections when a patchbay definition is activated. Чи Ñ�лід Ñ�кидати уÑ�Ñ– з'єднаннÑ� при активації визначеннÑ� комутації. &Reset all connections on patchbay activation С&кидати уÑ�Ñ– з'єднаннÑ� при активації комутації Whether to issue a warning on active patchbay port disconnections. Чи Ñ�лід попереджати при від'єднанні активних портів комутації. &Warn on active patchbay disconnections &Попереджати при активних з'єднаннÑ�Ñ… комутації Logging ЖурналюваннÑ� Whether to activate a messages logging to file. Чи Ñ�лід активувати журналюваннÑ� повідомлень до файла. &Messages log file: Фа&йл журналу повідомлень: Messages log file Файл журналу повідомлень Browse for the messages log file location Вибрати розташуваннÑ� файла журналу повідомлень Display ДиÑ�плей Time Display Показ чаÑ�у Transport &Time Code &ЧаÑ�ова позначка передаваннÑ� Transport &BBT (bar:beat.ticks) BBT п&ередаваннÑ� (bar:beat.ticks) Elapsed time since last &Reset ЧаÑ� з моменту оÑ�танн&ього Ñ�киданнÑ� Elapsed time since last &XRUN ЧаÑ� з моменту оÑ�танньо&го XRUN Sample front panel normal display font Зразок звичайного шрифту диÑ�плеÑ� передньої панелі Sample big time display font Зразок шрифту показу великих Ñ�имволів чаÑ�у Big Time display: Великий диÑ�плей чаÑ�у: Select font for front panel normal display Виберіть шрифт длÑ� звичайного диÑ�плеÑ� передньої панелі &Font... &Шрифт… Select font for big time display Вибрати шрифт длÑ� показу великих Ñ�имволів чаÑ�у Normal display: Звичайний диÑ�плей: Whether to enable blinking (flashing) of the server mode (RT) indicator Чи Ñ�лід вмикати блиманнÑ� індикатор режиму Ñ�ервера (РЧ) Blin&k server mode indicator &Блимати індикатором режиму Ñ�ервера Custom Ð�етипове &Color palette theme: Тема палітри &кольорів: Custom color palette theme Ð�етипова тема палітри кольорів Wonton Soup Wonton Soup KXStudio KXStudio Manage custom color palette themes Керувати нетиповими темами палітри кольорів &Widget style theme: Тема Ñ�тил&ÑŽ віджетів: Custom widget style theme Ð�етипова тема Ñ�тилю віджетів Messages Window Вікно повідомлень Sample messages text font display Зразок показу шрифту текÑ�ту повідомлень Select font for the messages text display Вибрати шрифт длÑ� показу текÑ�ту повідомлень Whether to keep a maximum number of lines in the messages window Чи Ñ�лід обмежувати макÑ�имальну кількіÑ�ть Ñ€Ñ�дків у вікні повідомлень &Messages limit: Об&меженнÑ� кількоÑ�ті повідомлень: The maximum number of message lines to keep in view МакÑ�имальна кількіÑ�ть Ñ€Ñ�дків повідомлень, Ñ�кі Ñ�лід зберігати на панелі переглÑ�ду 100 100 250 250 2500 2500 Connections Window Вікно з'єднань Sample connections view font Зразок шрифту панелі з'єднань Select font for the connections view Вибрати шрифт длÑ� панелі з'єднаь &Icon size: &Розмір піктограм: The icon size for each item of the connections view Розмір піктограм длÑ� пунктів панелі переглÑ�ду з'єднань 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 Whether to enable client/port name aliases on the connections window Чи Ñ�лід вмикати альтернативні назви клієнтів/портів у вікні з'єднань E&nable client/port aliases &Увімкнути альтернативи клієнтів/портів &JACK client/port aliases: Ð�&льтернативи клієнта/порту JACK: JACK client/port aliases display mode Режим показу альтернатив клієнта/порту JACK Default Типова First Перша Second Друга Whether to enable in-place client/port name editing (rename) Чи Ñ�лід дозволÑ�ти редагуваннÑ� назви (перейменуваннÑ�) клієнта/порту Ena&ble client/port aliases editing (rename) Дозволити &редагуваннÑ� (перейменуваннÑ�) альтернатив клієнта/порту JACK client/port pretty-name (metadata) display mode Режим показу форматованих назв (метаданих) клієнта/порту JACK Enable JA&CK client/port pretty-names (metadata) Уві&мкнути форматовані назви (метадані) клієнта/порту JACK Misc Різне Other Інше Whether to start JACK audio server immediately on application startup Чи Ñ�лід запуÑ�кати звуковий Ñ�ервер JACK одразу піÑ�лÑ� запуÑ�ку програми &Start JACK audio server on application startup За&пуÑ�кати звуковий Ñ�ервер JACK піÑ�лÑ� запуÑ�ку програми Whether to ask for confirmation on application exit Чи Ñ�лід проÑ�ити підтвердженнÑ� виходу з програми &Confirm application close П&ідтверджувати вихід з програми Whether to ask for confirmation on JACK audio server shutdown and/or restart Чи Ñ�лід проÑ�ити підтвердженнÑ� при вимиканні Ñ–/або перезапуÑ�ку звукового Ñ�ервера JACK Confirm server sh&utdown and/or restart Підтверд&жувати вимиканнÑ� Ñ–/або перезапуÑ�к Ñ�ервера Whether to keep all child windows on top of the main window Чи Ñ�лід тримати уÑ�Ñ– дочірні вікна над головним вікном &Keep child windows always on top Завжди у&тримувати дочірні вікна нагорі Whether to enable the system tray icon Чи Ñ�лід вмикати піктограму Ñ�иÑ�темного лотка &Enable system tray icon Ввімкнути пі&ктограму у Ñ�иÑ�темному лотку Whether to show system tray message on main window close Чи Ñ�лід показувати повідомленнÑ� у Ñ�иÑ�темному лотку у відповідь на закриттÑ� головного вікна Sho&w system tray message on close Повід&омленнÑ� у Ñ�иÑ�темному лотку при закритті Whether to start minimized to system tray Чи Ñ�лід запуÑ�кати програму згорнутою до Ñ�иÑ�темного лотка Start minimi&zed to system tray ЗапуÑ�кати з&горнутою до Ñ�иÑ�темного лотка Whether to save the JACK server command-line configuration into a local file (auto-start) Чи Ñ�лід зберігати налаштуваннÑ� командного Ñ€Ñ�дка Ñ�ервера JACK до локального файла (автозапуÑ�к) S&ave JACK audio server configuration to: З&берігати налаштуваннÑ� звукового Ñ�ервера JACK до: The server configuration local file name (auto-start) Ð�азва локального файла налаштувань Ñ�ервера (автозапуÑ�к) .jackdrc .jackdrc Whether to enable ALSA Sequencer (MIDI) support on startup Чи Ñ�лід вмикати підтримку Ñ�интезатора ALSA (MIDI) під чаÑ� запуÑ�ку E&nable ALSA Sequencer support &Увімкнути підтримку Ñ�интезатора ALSA Whether to enable D-Bus interface Чи Ñ�лід вмикати інтерфейÑ� D-Bus &Enable D-Bus interface Увімк&нути інтерфейÑ� D-Bus Whether to enable JACK D-Bus interface Чи Ñ�лід увімкнути інтерфейÑ� D-Bus JACK &Enable JACK D-Bus interface Увімк&унти інтерфейÑ� D-Bus JACK Whether to stop JACK audio server on application exit Чи Ñ�лід вимикати звуковий Ñ�ервер JACK під чаÑ� виходу з програми S&top JACK audio server on application exit Вими&кати звуковий Ñ�ервер JACK при виході з програми Whether to restrict to one single application instance (X11) Чи Ñ�лід обмежувати кількіÑ�ть екземплÑ�рів програми одним (X11) Single application &instance Один екземпл&Ñ�Ñ€ програми Buttons Кнопки Whether to hide the left button group on the main window Чи Ñ�лід ховати ліву групу кнопок у головному вікні Hide main window &Left buttons Ховати &ліві кнопки у головному вікні Whether to hide the right button group on the main window Чи Ñ�лід ховати праву групу кнопок у головному вікні Hide main window &Right buttons Ховати &праві кнопки у головному вікні Whether to hide the transport button group on the main window Чи Ñ�лід ховати групу кнопок передаваннÑ� у головному вікні Hide main window &Transport buttons Ховати кнопки п&ередаваннÑ� у головному вікні Whether to hide the text labels on the main window buttons Чи Ñ�лід ховати текÑ�тові мітки на кнопках головного вікна Hide main window &button text labels Ховати текÑ�тові мітки на &кнопках головного вікна Whether to replace Connections with Graph button on the main window Чи Ñ�лід замінити кнопку «З'єднаннÑ�» у головному вікні на кнопку «Граф» Replace Connections with &Graph button Замінити кнопку «З'єднаннÑ�» на кнопку «&Граф» Defaults Типові параметри &Base font size: &ОÑ�новний розмір шрифту: Base application font size (pt.) Базовий розмір шрифту програми (у пунктах) 6 6 7 7 8 8 9 9 10 10 11 11 12 12 System СиÑ�тема Cycle Цикл HPET HPET Don't restrict self connect requests (default) Ð�е обмежувати запити щодо Ñ�амоз'єднаннÑ� (типовий варіант) Fail self connect requests to external ports only ВідмовлÑ�ти у вÑ�Ñ–Ñ… запитах щодо Ñ�амоз'єднаннÑ� лише длÑ� зовнішніх портів Ignore self connect requests to external ports only Ігнорувати запити щодо Ñ�амоз'єднаннÑ� лише длÑ� зовнішніх портів Fail all self connect requests ВідмовлÑ�ти в уÑ�Ñ–Ñ… запитах щодо Ñ�амоз'єднаннÑ� Ignore all self connect requests Ігнорувати уÑ�Ñ– запити щодо Ñ�амоз'єднаннÑ� Warning ПопередженнÑ� Some settings have been changed: "%1" Do you want to save the changes? До деÑ�ких параметрів було внеÑ�ено зміни: «%1» Хочете зберегти внеÑ�ені зміни? Delete preset: "%1" Are you sure? ВилученнÑ� набору параметрів: «%1» Ви Ñ�правді цього хочете? msec мÑ� n/a н/д &Preset Name Ð�азва н&абору параметрів &Server Name Ð�азва Ñ�&ервера &Server Path &ШлÑ�Ñ… до Ñ�ервера &Driver Д&райвер &Interface &ІнтерфейÑ� Sample &Rate &ЧаÑ�тота диÑ�кретизації &Frames/Period &Кадри/Період Periods/&Buffer Періоди/&Буфер Startup Script Скрипт запуÑ�ку Post-Startup Script Скрипт піÑ�лÑ� запуÑ�ку Shutdown Script Скрипт при вимиканні Post-Shutdown Script Скрипт піÑ�лÑ� вимиканнÑ� Active Patchbay Definition Ð�ктивне визначеннÑ� комутації Patchbay Definition files файли визначень комутацій Messages Log Журнал повідомлень Log files файли журналу Information ІнформаціÑ� Some settings may be only effective next time you start this application. ДеÑ�кі параметри набудуть чинноÑ�ті лише піÑ�лÑ� перезапуÑ�ку програми. Some settings have been changed. Do you want to apply the changes? До деÑ�ких параметрів було внеÑ�ено зміни. Хочете заÑ�тоÑ�увати ці зміни? qjackctlSocketForm Socket Сокет &Socket С&окет &Name (alias): &Ð�азва (пÑ�евдонім): Socket name (an alias for client name) Ð�азва Ñ�окета (альтернатива назві клієнта) Client name (regular expression) Ð�азва клієнта (формальний вираз) Add plug to socket plug list Додати втулку до Ñ�пиÑ�ку втулок Ñ�окета Add P&lug Додати вт&улку &Plug: Ð’&тулка: Port name (regular expression) Ð�азва порту (формальний вираз) Socket plug list СпиÑ�ок втулок Ñ�окета Socket Plugs / Ports Втулки/Порти Ñ�окета Edit currently selected plug Редагувати поточну позначену втулку &Edit З&мінити Remove currently selected plug from socket plug list Вилучити поточну позначену втулку зі Ñ�пиÑ�ку втулок Ñ�окета &Remove Ви&лучити &Client: &Клієнт: Move down currently selected plug in socket plug list ПереÑ�унути поточну позначену втулку нижче у Ñ�пиÑ�ку втулок Ñ�окета &Down &Вниз Move up current selected plug in socket plug list ПереÑ�унути поточну позначену втулку вище у Ñ�пиÑ�ку втулок Ñ�окета &Up &Вище Enforce only one exclusive cable connection ПримуÑ�ово викориÑ�товувати лише одне виключне з'єднаннÑ� кабелю E&xclusive Ð’&иключний &Forward: Пе&реÑ�прÑ�муваннÑ�: Forward (clone) all connections from this socket ПереÑ�прÑ�мувати (клонувати) уÑ�Ñ– з'єднаннÑ� з цього Ñ�окета Type Тип Audio socket type (JACK) Тип звукового Ñ�окета (JACK) &Audio Зв&уковий MIDI socket type (JACK) Тип Ñ�окета MIDI (JACK) &MIDI &MIDI MIDI socket type (ALSA) Тип Ñ�окета MIDI (ALSA) AL&SA AL&SA Plugs / Ports Втулки/Порти Error Помилка A socket named "%1" already exists. Сокет із назвою «%1» вже Ñ–Ñ�нує. Warning ПопередженнÑ� Some settings have been changed. Do you want to apply the changes? ДеÑ�кі з параметрів було змінено. Хочете заÑ�тоÑ�увати внеÑ�ені зміни? Add Plug Додати втулку Edit Змінити Remove Вилучити Move Up ПереÑ�унути вище Move Down ПереÑ�унути нижче (None) (Ð�емає) qjackctlSocketList Output Вихід Input Вхід Socket Сокет <New> - %1 <Ð�овий> – %1 Warning ПопередженнÑ� %1 about to be removed: "%2" Are you sure? Зараз буде вилучено %1: «%2» Ви певні? %1 <Copy> - %2 %1 <КопіÑ�> – %2 qjackctlSocketListView Output Sockets / Plugs Вихідні Ñ�окети/втулки Input Sockets / Plugs Вхідні Ñ�окети/втулки qjackctl-1.0.6/src/translations/PaxHeaders/qjackctl_fr.ts0000644000000000000000000000013015174607203020536 xustar0029 mtime=1777536643.52291424 30 atime=1777536643.521914248 29 ctime=1777536643.52291424 qjackctl-1.0.6/src/translations/qjackctl_fr.ts0000644000175000001440000064675115174607203020553 0ustar00rncbcusers PortAudioProber Probing... Détection… Please wait, PortAudio is probing audio hardware. Merci de patienter, PortAudio détecte le matériel audio. Warning Attention Audio hardware probing timed out. La détection du matériel audio a échoué. QObject (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Option -p requires an argument (preset). L'option -p nécessite un argument (préréglage). Usage: %1 [options] [command-and-args] Utilisation : %1 [options] [commandes-et-args] Options: Options : Start JACK audio server immediately. Démarrez le serveur audio JACK immédiatement. Set default settings preset name. Définir le nom de la présélection des paramètres par défaut. Set active patchbay definition file. Paramètre le fichier de définition de patchbay actif. Set default JACK audio server name. Paramètre le fichier de définition de baie de brassage active. Show help about command line options. Affiche l'aide à propos des options en ligne de commande. Show version information. Afficher les informations de version. Displays help on command-line options. Launch command with arguments. Lancer la commande avec des arguments. [command-and-args] [commande-et-arguments] Option -a requires an argument (path). L'option -a nécessite un argument (chemin). Option -n requires an argument (name). L'option -n nécessite un argument (nom). %1 (%2 frames) %1 (%2 échantillons) Move Déplacer Rename Renommer qjackctlAboutForm About À propos About Qt À propos de Qt &Close &Fermer Version Version Debugging option enabled. Option de débogage activée. System tray disabled. Zone de notification système désactivée. Transport status control disabled. Contrôle du statut du déplacement désactivé. Realtime status disabled. Statut temps réel désactivé. XRUN delay status disabled. Statut du délai de désynchronisation (XRUN) désactivé. Maximum delay status disabled. Statut du délai maximal désactivé. JACK Session support disabled. Prise en charge de session JACK désactivée. ALSA/MIDI sequencer support disabled. Prise en charge du séquenceur ALSA/MIDI désactivée. Using: Qt %1 Utilisant : Qt %1 JACK %1 JACK %1 Website Site ouèbe This program is free software; you can redistribute it and/or modify it Ce programme est libre; vous pouvez le redistribuer et/ou le modifier under the terms of the GNU General Public License version 2 or later. selon les termes de la Licence Publique Générale GNU version 2 ou ultérieure. JACK MIDI support disabled. Prise en charge de JACK MIDI désactivée. JACK Port aliases support disabled. Prise en charge des alias de port JACK désactivée. D-Bus interface support disabled. Prise en charge de l'interface D-Bus désactivée. qjackctlClientListView &Connect &Connecter Alt+C Connect Alt+C &Disconnect &Déconnecter Alt+D Disconnect Alt+D Disconnect &All &Tout déconnecter Alt+A Disconnect All Alt+T Re&name Re&nommer Alt+N Rename Alt+N &Refresh &Rafraîchir Alt+R Refresh Alt+R Readable Clients / Output Ports Clients en lecture / Ports de sortie Writable Clients / Input Ports Clients en écriture / Ports d'entrée qjackctlConnect Warning Attention This will suspend sound processing from all client applications. Are you sure? Cela va suspendre le traitement du son de toutes les applications clientes. Êtes-vous certain ? qjackctlConnectionsForm Audio Audio &Connect &Connecter Connect currently selected ports Connecter les ports actuellement sélectionnés &Disconnect &Déconnecter Disconnect currently selected ports Déconnecter les ports actuellement sélectionnés Disconnect &All &Tout déconnecter Disconnect all currently connected ports Déconnecter tous les ports actuellement connectés Connections Connexions Expand all client ports Afficher tous les ports clients E&xpand All &Afficher tout &Refresh &Rafraîchir Refresh current connections view Rafraîchir la vue actuelle des connexions MIDI MIDI ALSA ALSA qjackctlConnectorView &Connect &Connecter Alt+C Connect Alt+C &Disconnect &Déconnecter Alt+D Disconnect Alt+D Disconnect &All &Tout déconnecter Alt+A Disconnect All Alt+T &Refresh &Rafraîchir Alt+R Refresh Alt+R qjackctlGraphCanvas Connect Connecter Disconnect Déconnecter qjackctlGraphForm Graph Graphe &Graph &Graphe &Edit É&dition &View &Affichage &Zoom &Zoom Co&lors Cou&leurs S&ort &Trier &Help &Aide &Connect &Connecter Connect Connecter Connect selected ports Connecter les ports sélectionnés &Disconnect &Déconnecter Disconnect Déconnecter Disconnect selected ports Déconnecter les ports sélectionnés Ctrl+C T&humbview &Vue d'ensemble Ctrl+D Cl&ose &Fermer Close Fermer Close this application window Fermer cette fenêtre d'application Select &All &Tout sélectionner Select All Tout sélectionner Ctrl+A Ctrl+A Select &None Ne &rien sélectionner Select None Ne rien sélectionner Ctrl+Shift+A Ctrl+Shift+A Select &Invert Sélection &inversée Select Invert Sélection inversée Ctrl+I Ctrl+I &Rename... &Renommer… Rename item Renommer l'élément Rename Item Renommer l'élément F2 F2 &Find... &Chercher... Find Chercher Find nodes Chercher les nÅ“uds Ctrl+F &Menubar Barre de &menu Menubar Barre de menu Show/hide the main program window menubar Afficher/cacher la barre de menu de la fenêtre principale du programme Ctrl+M Ctrl+M &Toolbar Barre d'ou&tils Toolbar Barre d'outils Show/hide main program window file toolbar Afficher/cacher la barre d''outils du fichier de la fenêtre principale du programme &Statusbar Barre de &status Statusbar Barre de status Show/hide the main program window statusbar Afficher/cacher la barre de status de la fenêtre principale du programme &Top Left Hau&t gauche Top left Haut gauche Show the thumbnail overview on the top-left Afficher l'aperçu des vignettes en haut à gauche Top &Right Haut d&roit Top right Haut droit Show the thumbnail overview on the top-right Afficher l'aperçu des vignettes en haut à droite Bottom &Left Bas gauc&he Bottom Left Bas gauche Bottom left Bas gauche Show the thumbnail overview on the bottom-left Afficher l'aperçu des vignettes en bas à gauche &Bottom Right &Bas droite Bottom right Bas droite Show the thumbnail overview on the bottom-right Afficher l'aperçu des vignettes en bas à droite &None Aucu&n None Aucun Hide thumbview Cacher l'affichage des vignettes Hide the thumbnail overview Masquer l'aperçu des vignettes Text Beside &Icons Texte derrière les &icônes Text beside icons Texte derrière les icônes Show/hide text beside icons Afficher/cacher le texte derrière les icônes &Center &Centre Center Centre Center view Affichage centré &Refresh &Rafraîchir Refresh Rafraîchir Refresh view Rafraîchir l'affichage F5 F5 Zoom &In Zoom a&vant Zoom In Zoom avant Ctrl++ Ctrl++ Zoom &Out Zoom a&rrière Zoom Out Zoom arrière Ctrl+- Ctrl+- Zoom &Fit Zoom &ajusté Zoom Fit Zoom ajusté Ctrl+0 Ctrl+0 Zoom &Reset &Réinitialiser le zoom Zoom Reset Réinitialiser le zoom Ctrl+1 Ctrl+1 &Zoom Range Gamme de &zoom Zoom Range Gamme de zoom JACK &Audio... JACK &audio… JACK Audio color Couleur JACK audio JACK &MIDI... JACK &MIDI… JACK MIDI JACK MIDI JACK MIDI color Couleur JACK MIDI ALSA M&IDI... ALSA M&IDI... ALSA MIDI ALSA MIDI ALSA MIDI color Couleur ALSA MIDI JACK &CV... JACK &CV... JACK CV color Couleur JACK CV JACK &OSC... JACK &OSC... JACK OSC JACK OSC JACK OSC color Couleur JACK OSC &Reset &Réinitialiser Reset colors Réinitialiser les couleurs Port &Name &Nom de port Port name Nom de port Sort by port name Trier par nom de port Port &Title &Titre de port Port title Titre de port Sort by port title Trier par titre de port Port &Index &Index de port Port index Index de port Sort by port index Trier par index de port &Ascending &Ascendant Ascending Ascendant Ascending sort order Ordre de tri ascendant &Descending &Descendant Descending Descendant Descending sort order Ordre de tri descendant Repel O&verlapping Nodes Repousser les nÅ“uds qui se che&vauchent Repel nodes Repousser les nÅ“uds Repel overlapping nodes Repousser les nÅ“uds qui se chevauchent Connect Thro&ugh Nodes Connexion par les nÅ“&uds Connect Through Nodes Connexion par les nÅ“uds Connect through nodes Connexion par les nÅ“uds Whether to draw connectors through or around nodes Si les connecteurs doivent être dessinés à travers ou autour des nÅ“uds &About... À &propos… About... À propos… About À propos Show information about this application program Afficher les informations à propos de ce programme applicatif About &Qt... À propos de &Qt… About Qt... À propos de Qt… About Qt À propos de Qt Show information about the Qt toolkit Afficher les informations à propos de la boîte à outils Qt &Undo &Défaire &Redo &Refaire Undo last edit action Défaire la dernière action d'édition Redo last edit action Refaire la dernière action d'édition Zoom Zoom Ready Prêt Colors - %1 Couleurs - %1 qjackctlMainForm &Quit &Quitter Quit processing and exit Quitter le traitement et sortir &Start &Démarrer Start the JACK server Démarrer le serveur JACK S&top &Arrêter Stop the JACK server Arrêter le serveur JACK St&atus S&tatut Ab&out... À pr&opos… Show information about this application Montrer des informations à propos de cette application Show settings and options dialog Montrer la fenêtre d'options et de paramètres &Messages &Messages &Patchbay &Baie de brassage Show/hide the patchbay editor window Montrer/cacher la fenêtre de l'éditeur de baie de brassage &Connect &Connecter Set&up... R&églages… JACK server state État du serveur JACK JACK server mode Mode du serveur JACK Sample rate Fréquence d'échantillonnage Time display Horloge Transport state État du déplacement Transport BPM BPM du déplacement Transport time Horaire du déplacement Show/hide the session management window Montrer/cacher la fenêtre de gestion de session Show/hide the messages log/status window Montrer/cacher la fenêtre de journal/statut Show/hide the graph window Afficher/cacher la fenêtre de graphe Show/hide the connections window Afficher/cacher la fenêtre des connexions &Backward A&rrière Backward transport Déplacer en arrière &Forward A&vant Forward transport Déplacer en avant &Rewind Remb&obiner Rewind transport Rembobiner Pa&use Pa&use Stop transport rolling Arrêter le déplacement &Play &Lecture Start transport rolling Démarrer le déplacement Warning Attention successfully avec succès with exit status=%1 avec statut de sortie=%1 Could not load preset "%1". Retrying with default. Impossible de charger le préréglage « %1 ». Nouvel essai avec celui par défaut. Could not load default preset. Sorry. Impossible de charger le préréglage par défaut. Désolé. Startup script... Script de démarrage… Startup script terminated Script de démarrage terminé JACK is starting... JACK démarre… Could not start JACK. Sorry. Impossible de démarrer JACK. Désolé. JACK is stopping... JACK s'arrête… Shutdown script... Script d'extinction… Don't ask this again Ne pas redemander Shutdown script terminated Script d'extinction terminé Post-shutdown script... Script post-extinction… Post-shutdown script terminated Script post-extinction terminé JACK was stopped JACK a été arrêté The preset aliases have been changed: "%1" Do you want to save the changes? Les alias de préréglage ont été changés : "%1" Voulez-vous sauvegarder les changements ? Error Erreur Transport time code Code temporel (Timecode) du déplacement Elapsed time since last reset Temps écoulé depuis la dernière réinitialisation Elapsed time since last XRUN Temps écoulé depuis la dernière désynchronisation (XRUN) Patchbay activated. Baie de brassage activée. Patchbay deactivated. Baie de brassage désactivée. Statistics reset. Réinitialisation des statistiques. msec ms XRUN callback (%1). Récupération désynchronisation (XRUN) (%1). Buffer size change (%1). Changement de la taille du tampon (%1). Shutdown notification. Notification d'extinction. Freewheel started... Roue libre démarrée… Freewheel exited. Roue libre quittée. checked vérifié connected connecté disconnected déconnecté failed échoué Server configuration saved to "%1". Configuration du serveur sauvegardée dans "%1". Client activated. Client activé. Post-startup script... Script post-démarrage… Post-startup script terminated Script post-démarrage terminé Command line argument... Argument de ligne de commande… Command line argument started Argument de ligne de commande démarré Client deactivated. Client désactivé. Transport rewind. Déplacement en rembobinage. Transport backward. Déplacement en marche arrière. Starting Démarre Transport start. Déplacement démarré. Stopping S'arrête Transport stop. Déplacement arrêté. Transport forward. Déplacement en marche avant. Stopped Arrêté Yes Oui No Non FW RL RT TR Rolling Défile Looping Boucle XRUN callback (%1 skipped). Récupération de désynchronisation (XRUN) (%1 sauté). Started Démarré Active Actif Activating Activation Inactive Inactif &Hide Cac&her D-BUS: GetParameterConstraint('%1'): %2. (%3) D-BUS : GetParameterConstraint('%1') : %2. (%3) Mi&nimize Mi&nimiser S&how M&ontrer Rest&ore R&estaurer &Stop &Arrêter &Reset Ré&initialiser &Presets &Préréglages &Versioning Gestion de ré&visions Re&fresh Ra&fraîchir &Connections &Connexions Patch&bay &Baie de brassage &Graph &Graphe &Transport Déplacemen&t Server settings will be only effective after restarting the JACK audio server. Les paramètres du serveur ne seront effectifs qu'après avoir redémarré le serveur audio JACK. Information Information Some settings will be only effective the next time you start this program. Certains paramètres ne seront effectifs qu'au prochain démarrage de ce programme. DSP Load Charge DSP XRUN Count (notifications) Décompte des désynchronisations (notifications XRUN) JACK connection graph change. Changement du graphe des connexions JACK. ALSA connection graph change. Changement du graphe des connexions ALSA. JACK connection change. Changement des connexions JACK. ALSA connection change. Changement des connexions ALSA. JACK is currently running. Do you want to terminate the JACK audio server? JACK fonctionne actuellement. Voulez-vous arrêter le serveur audio JACK ? D-BUS: Service is available (%1 aka jackdbus). DBUS : le service est disponible (%1 soit jackdbus). D-BUS: Service not available (%1 aka jackdbus). DBUS : le service n'est pas disponible (%1 soit jackdbus). The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Le programme continuera de s'exécuter dans la zone de notification système. Pour terminer le programme, merci de choisir « Quitter » dans le menu contextuel de l'icône de la zone de notification système. Don't show this message again Ne pas montrer ce message à nouveau Could not start JACK. Maybe JACK audio server is already started. Impossible de démarrer JACK. Peut-être que le serveur audio JACK est déjà démarré. D-BUS: JACK server is starting... DBUS : le serveur JACK démarre… D-BUS: JACK server could not be started. Sorry DBUS : impossible de démarrer le serveur JACK. Désolé Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Certaines applications audio clientes sont encore actives et connectées. Voulez-vous arrêter le serveur audio JACK ? %1 is about to terminate. Are you sure? %1 est sur le point de se terminer. Êtes-vous certain ? D-BUS: JACK server is stopping... DBUS : le serveur JACK s'arrête… D-BUS: JACK server could not be stopped. Sorry DBUS : impossible d'arrêter le serveur JACK. Désolé JACK was started with PID=%1. JACK a été démarré avec le PID=%1. D-BUS: JACK server was started (%1 aka jackdbus). DBUS : le serveur JACK a été démarré (%1 soit jackdbus). JACK is being forced... JACK est forcé… D-BUS: JACK server was stopped (%1 aka jackdbus). DBUS : le serveur JACK a été arrêté (%1 soit jackdbus). Transport BBT (bar.beat.ticks) Transport MTB (mesure temps battement) Patchbay reset. Réinitialisation de la baie de brassage. Could not load active patchbay definition. "%1" Disabled. Impossible de charger la définition de baie de brassage active. "%1" Désactivé. JACK has crashed. JACK a planté. JACK timed out. JACK n'a pas répondu à temps. JACK write error. Erreur d'écriture JACK. JACK read error. Erreur de lecture JACK. Unknown JACK error (%d). Erreur JACK inconnue (%d). JACK property change. Changement d'une propriété de JACK. Overall operation failed. L'opération a échoué. Invalid or unsupported option. Option invalide ou non prise en charge. Client name not unique. Nom de client non unique. Server is started. Le serveur est démarré. Unable to connect to server. Incapable de se connecter au serveur. Server communication error. Erreur de communication serveur. Client does not exist. Le client n'existe pas. Unable to load internal client. Incapable de charger le client interne. Unable to initialize client. Incapable d'initialiser le client. Unable to access shared memory. Incapable d'accéder à la mémoire partagée. Client protocol version mismatch. Mauvaise version du protocole client. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Impossible de connecter le serveur JACK comme client. - %1 Veuillez consulter la fenêtre des messages pour plus d'informations. %1 (%2%) %1 (%2%) %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 échantillons %1 msec %1 ms S&ession S&ession &Load... &Charger… &Save... &Sauvegarder… Save and &Quit... Sauvegarder et &Quitter… Save &Template... Sauvegarder &modèle… Do you want to restart the JACK audio server? Voulez-vous redémarrer le serveur audio JACK ? D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS : SetParameterValue('%1', '%2') : %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS : ResetParameterValue('%1') : %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS : GetParameterValue('%1') : %2. (%3) Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Impossible d'ouvrir le sequenceur ALSA comme client. La baie de brassage ALSA MIDI ne sera pas disponible. JACK active patchbay scan Balayage de la baie de brassage JACK active ALSA active patchbay scan Balayage de la baie de brassage ALSA active A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Une définition de baie de brassage est actuellement active, il est probable que cela refasse cette connexion : %1 -> %2 Voulez-vous enlever la connexion de la baie de brassage ? qjackctlMessagesStatusForm Messages / Status Messages / status &Messages &Messages Messages log Journal des messages Messages output log Journal des messages de sortie &Status &Statut Status information Information de statut Statistics since last server startup Statistiques depuis le dernier démarrage du serveur Description Description Value Valeur Reset XRUN statistic values Réinitialiser les valeurs statistiques des désynchronisations (XRUN) Re&set Réinitiali&ser Refresh XRUN statistic values Rafraîchir les valeurs statistiques des désynchronisations (XRUN) &Refresh &Rafraîchir Server name Nom du serveur Server state État du serveur DSP Load Charge DSP Sample Rate Fréquence d'échantillonnage Buffer Size Taille du tampon Realtime Mode Mode temps réel Transport state État du déplacement Transport Timecode Code temporel (Timecode) du déplacement Transport BBT MTB du déplacement Transport BPM BPM du déplacement XRUN count since last server startup Décompte des désynchronisations (XRUN) depuis le dernier démarrage du serveur XRUN last time detected Horaire de la dernière désynchronisation (XRUN) détectée XRUN last Dernière désynchronisation (XRUN) XRUN maximum Nombre maximal de désynchronisation (XRUN) XRUN minimum Nombre minimal de désynchronisation (XRUN) XRUN average Moyenne de désynchronisation (XRUN) XRUN total Nombre total de désynchronisation (XRUN) Maximum scheduling delay Délai d'ordonnancement maximal Time of last reset Temps depuis la dernière réinitialisation Logging stopped --- %1 --- Journalisation arrêtée --- %1 --- Logging started --- %1 --- Journalisation démarrée --- %1 --- qjackctlPaletteForm Color Themes Thèmes de couleur Name Nom Current color palette name Nom de la palette de couleur actuelle Save current color palette name Sauvegarder le nom de la palette de couleur actuelle Save Sauvegarder Delete current color palette name Effacer le nom de la palette de couleur actuelle Delete Effacer Palette Palette Current color palette Palette de couleur actuelle Generate: Générer : Base color to generate palette Couleur de base pour générer la palette Reset all current palette colors Réinitialiser toutes les couleurs de la palette actuelle Reset Réinitialiser Import a custom color theme (palette) from file Importer un thème (palette) de couleur personnalisé depuis un fichier Import... Importer... Export a custom color theme (palette) to file Exporter un thème (palette) de couleur personnalisé vers un fichier Export... Exporter... Show Details Afficher les détails Import File - %1 Importer le fichier - %1 Palette files (*.%1) Fichiers de palette (*.%1) Save Palette - %1 Sauvegarder la palette - %1 All files (*.*) Tous les fichiers (*.*) Warning - %1 Attention - %1 Could not import from file: %1 Sorry. Impossible d'importer depuis le fichier : %1 Navré. Export File - %1 Exporter le fichier - %1 Some settings have been changed. Do you want to discard the changes? Certains paramètres ont été modifié. Souhaitez-vous abandonner les modifications ? Some settings have been changed: "%1". Do you want to save the changes? Certains paramètres ont été modifié. "%1". Souhaitez-vous sauvegarder les modifications ? qjackctlPaletteForm::PaletteModel Color Role Role de couleur Active Actif Inactive Inactif Disabled Désactivé qjackctlPatchbay Warning Attention This will disconnect all sockets. Are you sure? Cela va déconnecter toutes les prises. Êtes-vous certain ? qjackctlPatchbayForm &New &Nouveau Create a new patchbay profile Créer un nouveau profil de baie de brassage &Load... &Charger… Load patchbay profile Charger un profil de baie de brassage &Save... &Sauvegarder… Save current patchbay profile Sauvegarder le profil actuel de la baie de brassage Patchbay Baie de brassage Expand all items Afficher tous les éléments E&xpand All &Afficher tout Current (recent) patchbay profile(s) Profil(s) actuel(s) (récent(s)) de la baie de brassage Acti&vate Acti&ver Toggle activation of current patchbay profile Basculer l'activation du profil actuel de baie de brassage &Connect &Connecter Connect currently selected sockets Connecter les prises actuellement sélectionnées &Disconnect &Déconnecter Disconnect currently selected sockets Déconnecter les prises actuellement sélectionnées Disconnect &All &Tout déconnecter Disconnect all currently connected sockets Déconnecter les prises actuellement connectées &Refresh &Rafraîchir Refresh current patchbay view Rafraîchir la vue actuelle de la baie de brassage Down Vers le bas Move currently selected output socket down one position Déplacer d'une position vers le bas la prise de sortie actuellement sélectionnée Add... Ajouter… Create a new output socket Créer une nouvelle prise de sortie Edit... Éditer… Edit currently selected input socket properties Éditer les propriétés de la prise d'entrée actuellement sélectionnée Up Vers le haut Move currently selected output socket up one position Déplacer d'une position vers le haut la prise de sortie actuellement sélectionnée Remove Enlever Remove currently selected output socket Enlever la prise de sortie actuellement sélectionnée Copy... Copier… Duplicate (copy) currently selected output socket Dupliquer (copier) la prise de sortie actuellement sélectionnée Remove currently selected input socket Enlever la prise d'entrée actuellement sélectionnée Duplicate (copy) currently selected input socket Dupliquer (copier) la prise d'entrée actuellement sélectionnée Create a new input socket Créer une nouvelle prise d'entrée Edit currently selected output socket properties Éditer les propriétés de la prise de sortie actuellement sélectionnée Warning Attention Error Erreur New Patchbay definition Nouvelle définition de baie de brassage Patchbay Definition files Fichiers de définition de baie de brassage Load Patchbay Definition Charger une définition de baie de brassage Save Patchbay Definition Sauvegarder la définition de baie de brassage active actif The patchbay definition has been changed: "%1" Do you want to save the changes? La définition de baie de brassage a été changée : « %1 » Voulez-vous sauvegarder les changements ? %1 [modified] %1 [modifié] Untitled%1 SansTitre%1 Could not load patchbay definition file: "%1" Impossible de charger le fichier de définition de baie de brassage : « %1 » Could not save patchbay definition file: "%1" Impossible de sauvegarder le fichier de définition de baie de brassage : « %1 » Create patchbay definition as a snapshot of all actual client connections? Prendre un cliché de toutes les connexions clientes actuelles pour créer une définition de baie de brassage ? qjackctlPatchbayView Add... Ajouter… Edit... Éditer… Copy... Copier… Remove Enlever Exclusive Exclusif (None) (Aucun) Forward Renvoi Move Up Vers le haut Move Down Vers le bas &Connect &Connecter Alt+C Connect Alt+C &Disconnect &Déconnecter Alt+D Disconnect Alt+D Disconnect &All &Tout déconnecter Alt+A Disconnect All Alt+T &Refresh &Rafraîchir Alt+R Refresh Alt+R qjackctlSessionForm Session Session Load session Charger session &Load... &Charger… Recent session Session récente &Recent &Récente Save session Sauvegarder session &Versioning Gestion de ré&visions Re&fresh Ra&fraîchir Session clients / connections Clients / connexions de la session Infra-clients / commands Commandes / clients-infra Infra-client Client-infra Infra-command Commande-infra Add infra-client Ajouter un client-infra &Add &Ajouter Edit infra-client Modifier un client-infra &Edit Modifi&er Remove infra-client Supprimer un client-infra Re&move Suppri&mer &Save... &Sauvegarder… Update session Mettre à jour la session Client / Ports Clients / Ports UUID UUID Command Commande &Save &Sauvegarder Load Session Charger session Session directory Répertoire de session Save Session Sauvegarder session and Quit et quitter Template Modèle &Clear &Effacer Warning Attention A session could not be found in this folder: "%1" Impossible de trouver une session dans ce dossier : « %1 » %1: loading session... %1 : chargement de la session… %1: load session %2. %1 : charger session %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Il existe déjà une session dans ce dossier : « %1 » Êtes-vous certain de vouloir remlplacer la session existante ? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Ce dossier existe déjà et n'est pas vide : « %1 » Êtes-vous certain de vouloir remplacer le dossier existant ? %1: saving session... %1 : sauvegarde de la session… %1: save session %2. %1 : sauvegarder session %2. New Client Nouveau client Save and &Quit... Sauvegarder et &Quitter… Save &Template... Sauvegarder &modèle… qjackctlSessionInfraClientItemEditor Infra-command Commande-infra qjackctlSessionSaveForm Session Session &Name: &Nom : Session name &Directory: Session directory Répertoire de session Browse for session directory ... … Save session versioning Sauvegarder la session avec gestion de révisions &Versioning Gestion de ré&visions Warning Attention Session directory does not exist: "%1" Do you want to create it? Session Directory qjackctlSetupForm Settings Paramètres Preset &Name: &Nom du préréglage : (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Settings preset name Nom du préréglage des paramètres &Save &Sauvegarder Save settings as current preset name Sauvegarder les paramètres sous le nom du préréglage actuel &Delete E&ffacer Delete current settings preset Effacer le préréglage des paramètres actuel jackd DO NOT TRANSLATE jackdmp DO NOT TRANSLATE jackstart DO NOT TRANSLATE Driv&er: Pilot&e : dummy DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 sun DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 oss DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 alsa DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 portaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 coreaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 firewire DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Parameters Paramètres Number of periods in the hardware buffer Nombre de périodes dans le tampon matériel Priorit&y: Pri&orité : &Frames/Period: &Échantillons/Période : 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Échantillons par période entre appels de process() Port Ma&ximum: Nombre de port ma&ximal : 21333 21333 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Sample rate in frames per second Fréquence d'échantillonage en échantillons par seconde Scheduler priority when running realtime Priorité de l'ordonnanceur quand fonctionne en temps réel &Word Length: &Résolution (bit) : Periods/&Buffer: Périodes/&Tampon : Word length Résolution Maximum number of ports the JACK server can manage Nombre maximal de ports que peut gérer le serveur JACK &Wait (usec): &Attente (en µs) : Sample &Rate: &Fréquence d'échantillonnage (Hz) : &Timeout (msec): &Décompte (en ms) : 200 200 500 500 1000 1000 2000 2000 5000 5000 Set client timeout limit in milliseconds Régler le limite du décompte client en millisecondes &Realtime Temps &réel Use realtime scheduling Utiliser ordonnancement temps réel No Memory Loc&k P&as de verrouillage mémoire Do not attempt to lock memory, even if in realtime mode Ne pas essayer de verrouiller la mémoire même en mode temps-réel &Unlock Memory &Déverrouiller la mémoire Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Déverrouiller la mémoire des bibliothèques d'interface communes (GTK+, QT, FLTK, Wine) So&ft Mode Mode &logiciel Ignore xruns reported by the backend driver Ignorer les désynchronisations (XRUN) rapportées par le pilote principal &Monitor &Écoute de contrôle Provide output monitor ports Fournir des ports de sortie d'écoute de contrôle Force &16bit Forcer &16bit Force 16bit mode instead of failing over 32bit (default) Forcer mode 16bit au lieu d'échouer sur 32bit (par défaut) H/&W Meter Mes&ure matérielle Enable hardware metering on cards that support it Activer la mesure matérielle sur les cartes qui la prennent en charge &Ignore H/W &Ignorer matériel Ignore hardware period/buffer size Ignore la taille des période/tampon matériels &Output Device: Périphérique de s&ortie : &Interface: &Interface : Maximum input audio hardware channels to allocate Nombre maximal de canaux d'entrée audio matériels à allouer &Audio: &Audio : Dit&her: Bruit de dispertion (dit&her) : External output latency (frames) Latence de sortie externe (en échantillons) &Input Device: Pér&iphérique d'entrée : Duplex Duplex Capture Only Capture seulement Playback Only Reproduction seulement Provide either audio capture, playback or both Fournir la capture audio, la reproduction audio ou les deux hw:0 hw:0 The PCM device name to use Nom du périphérique PCM à utiliser > > &Name: &Nom : The JACK Audio Connection Kit sound server name Le nom du serveur de son du Kit de Connexion Audio JACK /dev/dsp /dev/dsp Alternate input device for capture Périphérique d'entrée alternatif pour la capture Maximum output audio hardware channels to allocate Nombre maximal de canaux de sortie audio matériels à allouer Alternate output device for playback Périphérique de sortie alternatif pour la reproduction External input latency (frames) Latence d'entrée externe (en échantillons) None Aucun Rectangular Rectangulaire Shaped Sinusoïdal Triangular Triangulaire Set dither mode Régler le mode du bruit de dispersion (dither) Whether to give verbose output on messages Donner une sortie bavarde sur les messages Time in seconds that client is delayed after server startup Temps en secondes dont le client est retardé après le démarrage du serveur Latency: Latence : Output latency in milliseconds, calculated based on the period, rate and buffer settings Latence de sortie en millisecondes calculée à partir des réglages de la période, de la fréquence d'échantillonnage et du tampon Options Options Scripting Scripts Execute script on Start&up: Exéc&uter un script au démarrage : Whether to execute a custom shell script before starting up the JACK audio server. Exécuter un script de commande personnalisé avant de démarrer le serveur audio JACK. Execute script after &Startup: Exécuter un &script après le démarrage : Whether to execute a custom shell script after starting up the JACK audio server. Exécuter un script de commande personnalisé après avoir démarré le serveur audio JACK. Execute script on Shut&down: Exécuter un script à l'extinctio&n : Whether to execute a custom shell script before shuting down the JACK audio server. Exécuter un script de commande personnalisé avant d'éteindre le serveur audio JACK. Command line to be executed before starting up the JACK audio server Ligne de commande à exécuter avant de démarrer le serveur audio JACK Scripting argument meta-symbols Méta-symboles des arguments de script ... … Browse for script to be executed before starting up the JACK audio server Pointer sur le script à exécuter avant de démarrer le serveur audio JACK Command line to be executed after starting up the JACK audio server Ligne de commande à exécuter après avoir démarré le serveur audio JACK Browse for script to be executed after starting up the JACK audio server Pointer sur le script à exécuter après avoir démarré le serveur audio JACK Browse for script to be executed before shutting down the JACK audio server Pointer sur le script à exécuter avant d'éteindre le serveur audio JACK Command line to be executed before shutting down the JACK audio server Ligne de commande à exécuter avant d'éteindre le serveur audio JACK Execute script after Shu&tdown: Exécuter un script après l'ex&tinction : Whether to execute a custom shell script after shuting down the JACK audio server. Exécuter un script de commande personnalisé après avoir éteint le serveur audio JACK. Browse for script to be executed after shutting down the JACK audio server Pointer sur le script à exécuter après avoir éteint le serveur audio JACK Command line to be executed after shutting down the JACK audio server Ligne de commande à exécuter après avoir éteint le serveur audio JACK Statistics Statistiques &Capture standard output &Capturer la sortie standard Whether to capture standard output (stdout/stderr) into messages window Capturer la sortie standard (stdout/stderr) dans la fenêtre de messages &XRUN detection regex: Regex de détection des désynchronisations (&XRUN) : xrun of at least ([0-9|\.]+) msecs désynchronisation (XRUN) d'au moins ([0-9|\.]+) ms Regular expression used to detect XRUNs on server output messages Expression régulière utilisée pour détecter les désynchronisations (XRUN) dans les messages de sortie du serveur Connections Connexions 10 10 Patchbay definition file to be activated as connection persistence profile Fichier de définition de baie de brassage à activer comme profil de persistance de connexion Browse for a patchbay definition file to be activated Pointer sur un fichier de définition de baie de brassage à activer Activate &Patchbay persistence: Activer la &persistance de baie de brassage : Whether to activate a patchbay definition for connection persistence profile. Activer une définition de baie de brassage pour le profil de persistance de connexion. Display Affichage Time Display Horloge Server Suffi&x: Suffi&xe Serveur : Transport &Time Code Code &temporel (Timecode) du déplacement Transport &BBT (bar:beat.ticks) MT&B (mesure:temps.battement) du déplacement Elapsed time since last &Reset Temps écoulé depuis la dernière &réinitialisation Elapsed time since last &XRUN Temps écoulé depuis la dernière désynchronisation (&XRUN) Sample front panel normal display font Aperçu de l'affichage normal Sample big time display font Aperçu de la grande horloge Big Time display: Grande horloge : &Font... &Police… Select font for front panel normal display Sélectionner la police pour l'affichage normal Select font for big time display Sélectionner la police pour la grande horloge Normal display: Affichage normal : Messages Window Fenêtre de messages Sample messages text font display Aperçu de la police du texte des messages Select font for the messages text display Sélectionner la police pour le texte des messages &Messages limit: Limite des &messages : Whether to keep a maximum number of lines in the messages window Garder un nombre maximal de lignes dans la fenêtre de messages 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Nombre maximal de ligne de messages à garder visibles Connections Window Fenêtre de connexions Sample connections view font Aperçu de la police de la vue des connexions Select font for the connections view Sélectionner la police pour la vue des connexions &Icon size: Taille des &icônes : 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 The icon size for each item of the connections view Taille de l'icône pour chaque élément de la vue des connexions Ena&ble client/port aliases editing (rename) Activer l'é&dition (renommage) des aliases de client/port Whether to enable in-place client/port name editing (rename) Activer l'édition (renommage) en place des aliases de client/port E&nable client/port aliases Activer les aliases de client/p&ort Whether to enable client/port name aliases on the connections window Activer les aliases de client/port dans la fenêtre de connexions Misc Divers Other Autres &Start JACK audio server on application startup &Démarrer le serveur audio JACK au démarrage de l'application Whether to start JACK audio server immediately on application startup Démarrer le serveur audio JACK immédiatement au démarrage de l'application &Confirm application close &Confirmer la fermeture de l'application Whether to ask for confirmation on application exit Demander une confirmation lors de la sortie de l'application &Keep child windows always on top &Garder les fenêtres filles au premier plan Whether to keep all child windows on top of the main window Garder les fenêtres filles au dessus de la fenêtre principale &Enable system tray icon Activ&er l'icône de notification système Whether to enable the system tray icon Activer l'icône de notification système S&ave JACK audio server configuration to: &Sauvegarder la configuration du serveur audio JACK dans : Whether to save the JACK server command-line configuration into a local file (auto-start) Sauvegarder la configuration en ligne de commande du serveur JACK dans un fichier local (démarrage automatique) .jackdrc .jackdrc The server configuration local file name (auto-start) Nom du fichier local de configuration du serveur (démarrage automatique) Buttons Boutons Hide main window &Left buttons Cacher les boutons de &gauche de la fenêtre principale Whether to hide the left button group on the main window Cacher le groupe de bouton de gauche sur la fenêtre principale Hide main window &Right buttons Cacher les boutons de &droite de la fenêtre principale Whether to hide the right button group on the main window Cacher le groupe de bouton de droite sur la fenêtre principale Hide main window &Transport buttons Cacher les boutons de &déplacement de la fenêtre principale Whether to hide the transport button group on the main window Cacher le groupe de bouton de déplacement sur la fenêtre principale Hide main window &button text labels Cacher le texte des &boutons de la fenêtre principale Whether to hide the text labels on the main window buttons Cacher le texte des boutons sur la fenêtre principale Warning Attention msec ms n/a n/a &Preset Name &Nom du préréglage &Server Name Nom du &serveur &Server Path &Chemin du serveur &Driver Pilot&e &Interface &Interface Sample &Rate &Fréquence d'échantillonnage &Frames/Period &Échantillons/Période Periods/&Buffer Périodes/&Tampon Startup Script Script de démarrage Post-Startup Script Script post-démarrage Shutdown Script Script d'extinction Post-Shutdown Script Script post-extinction Patchbay Definition files Fichiers de définition de baie de brassage Active Patchbay Definition Définition de baie de brassage à activer The audio backend driver interface to use Le pilote d'interface audio à utiliser &Verbose messages Messages ba&vards MIDI Driv&er: Pilot&e MIDI : none aucun raw DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 seq DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 The ALSA MIDI backend driver to use Le pilote ALSA MIDI à utiliser plughw:0 plughw:0 Some settings have been changed: "%1" Do you want to save the changes? Des paramètres ont été modifiés : « %1 » Voulez-vous sauvegarder les changements ? Delete preset: "%1" Are you sure? Effacer le préréglage : « %1 » Êtes-vous certain ? Information Informations Some settings may be only effective next time you start this application. Certains paramètres peuvent n'être effectifs qu'après le prochain démarrage de cette application. Some settings have been changed. Do you want to apply the changes? Des paramètres ont été modifiés. Voulez-vous appliquer les changements ? Messages Log Journal des messages System Système Cycle Cycle HPET HPET Don't restrict self connect requests (default) Ne pas restreindre les demandes de connexion automatique (défaut) Fail self connect requests to external ports only Empêche les demandes d'auto-connexion aux ports externes uniquement Ignore self connect requests to external ports only Ignorer les demandes d'auto-connexion aux ports externes uniquement Fail all self connect requests Empêche toutes les demandes d'auto-connexion Ignore all self connect requests Ignorer toutes les demandes d'auto-connexion Log files Fichiers du journal netone DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 /dev/audio /dev/audio &Channels: &Canaux : Server path (command line prefix) Chemin serveur (préfixe de ligne de commande) Maximum number of audio channels to allocate Nombre maximal de canaux audio à allouer &Channels I/O: &Canaux E/S : &Latency I/O: &Latence E/S : Logging Journalisation Messages log file Fichier de journal des messages Browse for the messages log file location Pointer sur l'emplacement du fichier de journal des messages Whether to activate a messages logging to file. Activer la journalisation des messages dans un fichier. Server &Prefix: &Préfixe Serveur : Extra driver options (command line suffix) Options supplémentaires du pilote (Suffixe de ligne de commande) Start De&lay: &Retard du démarrage : secs s 0 msecs 0 ms Please do not touch these settings unless you know what you are doing. Veuillez ne pas toucher ces réglages si vous ne savez pas ce que vous faites. &Messages log file: Fichier de journal des &messages : Whether to enable blinking (flashing) of the server mode (RT) indicator Activer le clignotement de l'indicateur de mode serveur (TR) Blin&k server mode indicator &Clignotement de l'indicateur de mode serveur &JACK client/port aliases: Alias de client/port &JACK : JACK client/port aliases display mode Mode d'affichage des alias de client/port JACK Default Par défaut First Premier Second Deuxième Whether to start minimized to system tray Démarrer minimisé dans la zone de notification système JACK client/port pretty-name (metadata) display mode Activer le mode d'affichage « joli-nom » (métadonnées) de client/port JACK Advanced Avancé Whether to reset all connections when a patchbay definition is activated. Réinitialiser ou non toutes les connexions quand une définition de baie de brassage est activée. &Reset all connections on patchbay activation &Réinitialiser toutes les connections à l'activation d'une baie de brassage Whether to issue a warning on active patchbay port disconnections. Afficher ou non une alerte lors des déconnexions de port faisant partie d'une baie de brassage active. &Warn on active patchbay disconnections A&lerter lors des déconnexions sur la baie de brassage active Enable JA&CK client/port pretty-names (metadata) Activer les « jolis-noms » (métadonnées) de client/port JA&CK Whether to ask for confirmation on JACK audio server shutdown and/or restart S'il faut demander la confirmation de l'arrêt et/ou du redémarrage du serveur audio de JACK Confirm server sh&utdown and/or restart Confirmer l'arrêt et/ou redémarrage d&u serveur Whether to show system tray message on main window close Afficher on non les messages de la zone de notification système lors de la fermeture de la fenêtre principale Sho&w system tray message on close A&fficher les messages de la zone de notification lors de la fermeture de la fenêtre Start minimi&zed to system tray Démarrer minimisé dans la &zone de notifications Whether to restrict to one single application instance (X11) Restreindre à une seule instance de l'application (X11) Single application &instance &Instance d'application unique Whether to enable ALSA Sequencer (MIDI) support on startup Activer la prise en charge du séquenceur ALSA (MIDI) au démarrage Setup Configuration Whether to restrict client self-connections S'il faut limiter les auto-connexions des clients Whether to use server synchronous mode Si l'on utilise le mode synchrone de serveur Clear settings of current preset name Effacer les paramètres du nom du préréglage actuel Clea&r Efface&r &Use server synchronous mode &Utiliser le mode synchrone de serveur Cloc&k source: Source d'&horloge : Clock source Source d'horloge S&elf connect mode: Mode d'auto-conn&exion Custom Personnalisé &Color palette theme: Thème de palette de &couleur : Custom color palette theme Theme de palette de couleur personnalisé Wonton Soup DO NOT TRANSLATE KXStudio DO NOT TRANSLATE Manage custom color palette themes Gérer les thèmes de palette de couleur personnalisés &Widget style theme: Thème de style de &widget : Custom widget style theme Thème de style de widget personnalisé : E&nable ALSA Sequencer support Activer la prise e&n charge du séquenceur ALSA Whether to enable JACK D-Bus interface Activation ou non de l'interface JACK D-Bus &Enable JACK D-Bus interface Activ&er l'interface JACK D-Bus Whether to stop JACK audio server on application exit Arrêter le serveur audio JACK lors de la sortie de l'application S&top JACK audio server on application exit Arrêter le &serveur audio JACK lors de la sortie de l'application Whether to replace Connections with Graph button on the main window Si on remplace les connexions avec un bouton de graphe dans la fenêtre principale Replace Connections with &Graph button Remplacer les connexions par un bouton de graphe Defaults Par défaut &Base font size: Taille de police de &base : Base application font size (pt.) Taille de base de police de l'application (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to enable D-Bus interface Activer l'interface D-Bus &Enable D-Bus interface Activ&er l'interface D-Bus Number of microseconds to wait between engine processes (dummy) Nombre de microsecondes à attendre entre les traitements du moteur (factice) qjackctlSocketForm &Socket &Prise &Name (alias): &Nom (alias) : Socket name (an alias for client name) Nom de la prise (un alias pour le nom du client) Client name (regular expression) Nom du client (expression régulière) Add P&lug Ajouter une &fiche Add plug to socket plug list Ajouter la fiche à la liste des prises &Plug: &Fiche : Port name (regular expression) Nom du port (expression régulière) Socket Plugs / Ports Prises / Ports Socket plug list Liste des prises &Edit &Éditer &Remove Enleve&r Remove currently selected plug from socket plug list Enlever la fiche actuellement sélectionnée de la liste des prises Socket Socket &Client: &Client : &Down Vers le &bas &Up Vers le &haut E&xclusive E&xclusif Enforce only one exclusive cable connection S'assurer de l'utilisation d'une seule connexion cablée exclusive &Forward: Renvo&i : Forward (clone) all connections from this socket Renvoyer (cloner) toutes les connexions depuis cette prise Type Type &Audio &Audio Audio socket type (JACK) Type de prise audio (JACK) &MIDI &MIDI MIDI socket type (ALSA) Type de prise MIDI (ALSA) Plugs / Ports Fiches / Ports Add Plug Ajouter une Fiche Remove Enlever Edit Éditer Error Erreur A socket named "%1" already exists. Une prise nommée « %1 » existe déjà. Move Up Vers le haut Move Down Vers le bas (None) (Aucun) Edit currently selected plug Éditer la fiche actuellement sélectionnée Move down currently selected plug in socket plug list Déplacer vers le bas la fiche actuellement sélectionnée dans la liste des prises Move up current selected plug in socket plug list Déplacer vers le haut la fiche actuellement sélectionnée dans la liste des prises Warning Attention Some settings have been changed. Do you want to apply the changes? Des paramètres ont été modifiés. Voulez-vous appliquer les changements ? MIDI socket type (JACK) Type de prise MIDI (JACK) AL&SA AL&SA qjackctlSocketList Output Sortie Input Entrée Socket Prise Warning Attention <New> - %1 <Nouvelle> - %1 %1 about to be removed: "%2" Are you sure? %1 est sur le point d'être enlevée : « %2 » Êtes-vous certain ? %1 <Copy> - %2 %1 <Copie> - %2 qjackctlSocketListView Output Sockets / Plugs Prises/fiches de sortie Input Sockets / Plugs Prises/fiches d'entrée qjackctl-1.0.6/src/translations/PaxHeaders/qjackctl_ko.ts0000644000000000000000000000013215174607203020542 xustar0030 mtime=1777536643.523914233 30 atime=1777536643.523914233 30 ctime=1777536643.523914233 qjackctl-1.0.6/src/translations/qjackctl_ko.ts0000644000175000001440000064315115174607203020544 0ustar00rncbcusers PortAudioProber Probing... 검색 중... Please wait, PortAudio is probing audio hardware. 잠시 기다려 주십시오. PortAudioê°€ 오디오 하드웨어를 검색하는 중입니다. Warning 경고 Audio hardware probing timed out. 오디오 하드웨어 검색하는 시간ì�´ 초과ë�˜ì—ˆìŠµë‹ˆë‹¤. QObject (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Usage: %1 [options] [command-and-args] 사용법: %1 [옵션] [명령-ë°�-ì�¸ìˆ˜] Options: 옵션: Start JACK audio server immediately. Set default settings preset name. Set active patchbay definition file. Set default JACK audio server name. Show help about command line options. Show version information. Displays help on command-line options. Launch command with arguments. [command-and-args] Option -p requires an argument (preset). 옵션 -pì—�는 ì�¸ìˆ˜(사전설정)ê°€ 필요합니다. Option -a requires an argument (path). 옵션 -aì—�는 ì�¸ìˆ˜(경로)ê°€ 필요합니다. Option -n requires an argument (name). 옵션 -nì—�는 ì�¸ìˆ˜(ì�´ë¦„)ê°€ 필요합니다. %1 (%2 frames) %1 (%2 프레임) Move ì�´ë�™ Rename ì�´ë¦„변경 qjackctlAboutForm About ì •ë³´ &Close 닫기(&C) About Qt Qt ì •ë³´ Version 버전 Debugging option enabled. 디버깅 옵션ì�´ 활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. System tray disabled. 시스템 트레ì�´ê°€ 비활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. Transport status control disabled. 트랜스í�¬íЏ ìƒ�태 컨트롤ì�´ 비활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. Realtime status disabled. 실시간 ìƒ�태가 비활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. XRUN delay status disabled. XRUN 지연 ìƒ�태가 비활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. Maximum delay status disabled. 최대 지연 ìƒ�태가 비활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. JACK Port aliases support disabled. JACK í�¬íЏ 별칭 ì§€ì›�ì�´ 비활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. JACK MIDI support disabled. JACK MIDI ì§€ì›�ì�´ 비활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. JACK Session support disabled. JACK 세션 ì§€ì›�ì�´ 비활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. ALSA/MIDI sequencer support disabled. ALSA/MIDI 시퀀서 ì§€ì›�ì�´ 비활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. D-Bus interface support disabled. D-Bus ì�¸í„°íŽ˜ì�´ìФ ì§€ì›�ì�´ 비활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. Using: Qt %1 사용중: Qt %1 JACK %1 JACK %1 Website 웹사ì�´íЏ This program is free software; you can redistribute it and/or modify it ì�´ 프로그램ì�€ ìž�유 소프트웨어ì�´ë¯€ë¡œ GNU General Public License under the terms of the GNU General Public License version 2 or later. 버전 2 ì�´ìƒ�ì�˜ ì¡°ê±´ì—� ë”°ë�¼ 재분배 ë°�/ë˜�는 수정할 수 있습니다.<br><br>한국어 번역: ì�´ì •í�¬ &lt;daemul72@gmail.com&gt;. qjackctlClientListView Readable Clients / Output Ports ì�½ê¸° 가능한 í�´ë�¼ì�´ì–¸íЏ / 출력 í�¬íЏ Writable Clients / Input Ports 쓰기 가능한 í�´ë�¼ì�´ì–¸íЏ / ìž…ë ¥ í�¬íЏ &Connect ì—°ê²°(&C) Alt+C Connect Alt+C &Disconnect ì—°ê²° í•´ì œ(&D) Alt+D Disconnect Alt+D Disconnect &All 모ë‘� ì—°ê²° í•´ì œ(&A) Alt+A Disconnect All Alt+A Re&name ì�´ë¦„변경(&N) Alt+N Rename Alt+N &Refresh 새로 고침(&R) Alt+R Refresh Alt+R qjackctlConnect Warning 경고 This will suspend sound processing from all client applications. Are you sure? ì�´ë ‡ê²Œ 하면 모든 í�´ë�¼ì�´ì–¸íЏ ì�‘용프로그램ì—�서 사운드 프로세싱ì�´ ì�¼ì‹œ 중단ë�©ë‹ˆë‹¤. 확실하신가요? qjackctlConnectionsForm Connections ì—°ê²° Audio 오디오 Connect currently selected ports 현재 ì„ íƒ�ë�œ í�¬íЏ 연결하기 &Connect 연결하기(&C) Disconnect currently selected ports 현재 ì„ íƒ�ë�œ í�¬íЏ ì—°ê²°í•´ì œ &Disconnect ì—°ê²°í•´ì œ(&D) Disconnect all currently connected ports 현재 ì—°ê²°ë�œ 모든 í�¬íЏ ì—°ê²°í•´ì œ Disconnect &All 모ë‘� ì—°ê²°í•´ì œ(&A) Expand all client ports 모든 í�´ë�¼ì�´ì–¸íЏ í�¬íЏ 확장 E&xpand All 모ë‘� 확장(&X) Refresh current connections view 현재 ì—°ê²° 보기 새로 고침 &Refresh 새로 고침(&R) MIDI MIDI ALSA ALSA qjackctlConnectorView &Connect 연결하기(&C) Alt+C Connect Alt+C &Disconnect ì—°ê²°í•´ì œ(&D) Alt+D Disconnect Alt+D Disconnect &All 모ë‘� ì—°ê²°í•´ì œ(&A) Alt+A Disconnect All Alt+A &Refresh 새로 고침(&R) Alt+R Refresh Alt+R qjackctlGraphCanvas Connect 연결하기 Disconnect ì—°ê²°í•´ì œ qjackctlGraphForm Graph 그래프 &Graph 그래프(&G) &Edit 편집(&E) &View 보기(&V) &Zoom 확대/축소(&Z) Co&lors 색ìƒ�(&L) S&ort ì •ë ¬(&O) &Help ë�„움ë§�(&H) &Connect 연결하기(&C) Connect 연결하기 Connect selected ports ì„ íƒ�한 í�¬íЏ 연결하기 &Disconnect ì—°ê²°í•´ì œ(&D) Disconnect ì—°ê²°í•´ì œ Disconnect selected ports ì„ íƒ�한 í�¬íЏ ì—°ê²°í•´ì œ Ctrl+C T&humbview Ctrl+D Cl&ose 닫기(&O) Close 닫기 Close this application window ì�´ ì�‘용프로그램 ì°½ 닫기 Select &All 모ë‘� ì„ íƒ�(&A) Select All 모ë‘� ì„ íƒ� Ctrl+A Ctrl+A Select &None ì—†ì�Œ ì„ íƒ�(&N) Select None ì—†ì�Œ ì„ íƒ� Ctrl+Shift+A Ctrl+Shift+A Select &Invert 반전 ì„ íƒ�(&I) Select Invert 반전 ì„ íƒ� Ctrl+I Ctrl+I &Rename... ì�´ë¦„변경(&R)... Rename item 항목 ì�´ë¦„변경 Rename Item 항목 ì�´ë¦„변경 F2 F2 &Find... Find Find nodes Ctrl+F &Menubar 메뉴모ì�Œ(&M) Menubar 메뉴모ì�Œ Show/hide the main program window menubar 기본 프로그램 ì°½ 메뉴모ì�Œ 표시/숨김 Ctrl+M Ctrl+M &Toolbar ë�„구모ì�Œ(&T) Toolbar ë�„구모ì�Œ Show/hide main program window file toolbar 기본 프로그램 ì°½ 파ì�¼ ë�„구모ì�Œ 표시/숨김 &Statusbar ìƒ�태 표시줄(&S) Statusbar ìƒ�태 표시줄 Show/hide the main program window statusbar 기본 프로그램 ì°½ ìƒ�태 표시줄 표시/숨김 &Top Left Top left Show the thumbnail overview on the top-left Top &Right Top right Show the thumbnail overview on the top-right Bottom &Left Bottom Left Bottom left Show the thumbnail overview on the bottom-left &Bottom Right Bottom right Show the thumbnail overview on the bottom-right &None None ì—†ì�Œ Hide thumbview Hide the thumbnail overview Text Beside &Icons ì•„ì�´ì½˜ 옆ì—� í…�스트(&I) Text beside icons ì•„ì�´ì½˜ 옆ì—� í…�스트 Show/hide text beside icons ì•„ì�´ì½˜ 옆ì—� í…�스트 표시/숨김 &Center 중앙(&C) Center 중앙 Center view 중앙 보기 &Refresh 새로 고침(&R) Refresh 새로 고침 Refresh view 보기 새로 고침 F5 F5 Zoom &In 확대(&I) Zoom In 확대 Ctrl++ Ctrl++ Zoom &Out 축소(&O) Zoom Out 축소 Ctrl+- Ctrl+- Zoom &Fit ì°½ì—� 맞춤(&F) Zoom Fit ì°½ì—� 맞춤 Ctrl+0 Ctrl+0 Zoom &Reset 확대/축소 재설정(&R) Zoom Reset 확대/축소 재설정 Ctrl+1 Ctrl+1 &Zoom Range 확대/축소 범위(&Z) Zoom Range 확대/축소 범위 JACK &Audio... JACK Audio(&A)... JACK Audio color JACK 오디오 색ìƒ� JACK &MIDI... JACK MIDI(&M)... JACK MIDI JACK MIDI JACK MIDI color JACK MIDI 색ìƒ� ALSA M&IDI... ALSA MIDI ALSA MIDI ALSA MIDI color ALSA MIDI 색ìƒ� JACK &CV... JACK CV(&C)... JACK CV color JACK CV 색ìƒ� JACK &OSC... JACK OSC(&O)... JACK OSC JACK OSC JACK OSC color JACK OSC 색ìƒ� &Reset 재설정(&R) Reset colors 색ìƒ� 재설정 Port &Name í�¬íЏ ì�´ë¦„(&N) Port name í�¬íЏ ì�´ë¦„ Sort by port name í�¬íЏ ì�´ë¦„으로 ì •ë ¬ Port &Title í�¬íЏ 제목(&T) Port title í�¬íЏ 제목 Sort by port title í�¬íЏ 제목으로 ì •ë ¬ Port &Index í�¬íЏ ì�¸ë�±ìФ(&I) Port index í�¬íЏ ì�¸ë�±ìФ Sort by port index í�¬íЏ ì�¸ë�±ìŠ¤ë¡œ ì •ë ¬ &Ascending 오름차순(&A) Ascending 오름차순 Ascending sort order 오름차순 ì •ë ¬ &Descending 내림차순(&D) Descending 내림차순 Descending sort order 내림차순 ì •ë ¬ Repel O&verlapping Nodes Repel nodes Repel overlapping nodes Connect Thro&ugh Nodes Connect Through Nodes Connect through nodes Whether to draw connectors through or around nodes &About... QjackCtl ì •ë³´(&A)... About... QjackCtl ì •ë³´... About QjackCtl ì •ë³´ Show information about this application program ì�´ ì�‘용프로그램ì—� 대한 ì •ë³´ 표시 About &Qt... Qt ì •ë³´(&Q)... About Qt... Qt ì •ë³´... About Qt Qt ì •ë³´ Show information about the Qt toolkit Qt 툴킷ì—� 대한 ì •ë³´ 표시 &Undo 실행 취소(&U) &Redo 다시 실행(&R) Undo last edit action 마지막 편집 작업 실행 취소 Redo last edit action 마지막 편집 작업 다시 실행 Zoom 확대/축소 Ready 준비 완료 Colors - %1 색ìƒ� - %1 qjackctlMainForm Start the JACK server JACK 서버 시작 &Start 시작(&S) Stop the JACK server JACK 서버 중지 S&top 중지(&T) JACK server state JACK 서버 ìƒ�태 JACK server mode JACK 서버 모드 DSP Load DSP 불러오기 Sample rate 샘플 ë ˆì�´íЏ XRUN Count (notifications) XRUN 카운트 (알림) Time display 시간 화면표시 Transport state 트랜스í�¬íЏ ìƒ�태 Transport BPM 트랜스í�¬íЏ BPM Transport time 트랜스í�¬íЏ 시간 Quit processing and exit 프로세싱 종료 후 ë��내기 &Quit 종료(&Q) Show/hide the session management window 세션 관리 ì°½ 표시/숨김 S&ession 세션(&E) Show/hide the messages log/status window 메시지 로그/ìƒ�태 ì°½ 표시/숨김 &Messages 메시지(&M) Show settings and options dialog 설정 ë°� 옵션 대화ìƒ�ìž� 표시 Set&up... 설정(&U)... Show/hide the graph window 그래프 ì°½ 표시/숨김 Show/hide the connections window ì—°ê²° ì°½ 표시/숨김 &Connect 연결하기(&C) Show/hide the patchbay editor window 패치베ì�´ 편집기 ì°½ 표시/숨김 &Patchbay 패치베ì�´(&P) Rewind transport 트랜스í�¬íЏ ë�˜ê°�기 &Rewind ë�˜ê°�기(&R) Backward transport ì—­ë°©í–¥ 트랜스í�¬íЏ &Backward ì—­ë°©í–¥(&B) Start transport rolling 트랜스í�¬íЏ 롤ë§� 시작 &Play 재ìƒ�하기(&P) Stop transport rolling 트랜스í�¬íЏ 롤ë§� 중지 Pa&use ì�¼ì‹œ 중지(&U) Forward transport ì •ë°©í–¥ 트랜스í�¬íЏ &Forward ì •ë°©í–¥(&F) Show information about this application ì�´ ì�‘용프로그램ì—� 대한 ì •ë³´ 표시 Ab&out... ì •ë³´(&O)... Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. ALSA 시퀀서를 í�´ë�¼ì�´ì–¸íŠ¸ë¡œ ì—´ 수 없습니다. ALSA MIDI 패치베ì�´ëŠ” 사용할 수 없습니다. D-BUS: Service is available (%1 aka jackdbus). D-BUS: 서비스를 사용할 수 있습니다(%1 ë˜�는 jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: 서비스를 사용할 수 없습니다(%1 ë˜�는 jackdbus). Information ì •ë³´ The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. 프로그램ì�€ 시스템 트레ì�´ì—�서 계ì†� 실행ë�©ë‹ˆë‹¤. 프로그램ì�„ ë��마치려면 시스템 트레ì�´ ì•„ì�´ì½˜ì�˜ 컨í…�스트 메뉴ì—�서 "종료"를 ì„ íƒ�하십시오. Don't show this message again ì�´ 메시지를 다시 표시하지 않ì�Œ Warning 경고 JACK is currently running. Do you want to terminate the JACK audio server? JACKì�´ 현재 실행 중입니다. JACK 오디오 서버를 종료하시겠습니까? %1 is about to terminate. Are you sure? %1ì�´(ê°€) 종료ë�˜ë ¤ê³  합니다. 확실하신가요? successfully 성공ì �으로 with exit status=%1 종료 ìƒ�태=%1 Could not start JACK. Maybe JACK audio server is already started. JACKì�„ 시작할 수 없습니다. JACK 오디오 서버가 ì�´ë¯¸ 시작ë�˜ì—ˆì�„ 수 있습니다. Could not load preset "%1". Retrying with default. "%1" 사전설정ì�„ 불러올 수 없습니다. 기본값으로 다시 시ë�„합니다. Could not load default preset. Sorry. 기본 사전설정ì�„ 불러올 수 없습니다. 죄송합니다. Startup script... 스타트업 스í�¬ë¦½íЏ... Startup script terminated 스타트업 스í�¬ë¦½íЏ 종료ë�¨ D-BUS: JACK server is starting... D-BUS: JACK 서버 시작하는 중... D-BUS: JACK server could not be started. Sorry D-BUS: JACK 서버를 시작할 수 없습니다. 죄송합니다 JACK is starting... JACKì�´ 시작하는 중입니다... Some client audio applications are still active and connected. Do you want to stop the JACK audio server? ì�¼ë¶€ í�´ë�¼ì�´ì–¸íЏ 오디오 ì�‘ìš© 프로그램ì�€ 여전히 활성 ìƒ�태ì�´ë©° ì—°ê²°ë�˜ì–´ 있습니다. JACK 오디오 서버를 중지하시겠습니까? Shutdown script... ì�¼ì‹œì¢…료 스í�¬ë¦½íЏ... Shutdown script terminated ì�¼ì‹œì¢…료 스í�¬ë¦½íЏ 종료ë�¨ JACK is stopping... JACKì�´ 중지하는 중입니다... D-BUS: JACK server is stopping... D-BUS: JACK 서버가 중지하는 중입니다... D-BUS: JACK server could not be stopped. Sorry D-BUS: JACK 서버를 중지할 수 없습니다. 죄송합니다 JACK was started with PID=%1. JACKì�´ PID=%1로 시작ë�˜ì—ˆìŠµë‹ˆë‹¤. D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: JACK 서버가 시작ë�˜ì—ˆìŠµë‹ˆë‹¤(%1 ë˜�는 jackdbus). JACK is being forced... JACKì�´ ê°•ì œ 종료ë�©ë‹ˆë‹¤... JACK was stopped JACKì�´ 중지ë�¨ D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: JACK 서버가 중지ë�˜ì—ˆìŠµë‹ˆë‹¤(%1 ë˜�는 jackdbus). Post-shutdown script... ì�¼ì‹œì¢…료 후 스í�¬ë¦½íЏ... Post-shutdown script terminated ì�¼ì‹œì¢…료 후 스í�¬ë¦½íŠ¸ê°€ 종료ë�¨ Error 오류 Don't ask this again 다시 묻지 않ì�Œ The preset aliases have been changed: "%1" Do you want to save the changes? 사전 설정 별칭ì�´ 변경ë�˜ì—ˆìŠµë‹ˆë‹¤. "%1" 변경 사항ì�„ 저장하시겠습니까? Transport BBT (bar.beat.ticks) 트랜스í�¬íЏ BBT (마디.ë°•ìž�.틱) Transport time code 트랜스í�¬íЏ 시간 코드 Elapsed time since last reset 마지막 재설정 ì�´í›„ 경과ë�œ 시간 Elapsed time since last XRUN 마지막 XRUN ì�´í›„ 경과 시간 Patchbay reset. 패치베ì�´ 재설정. Could not load active patchbay definition. "%1" Disabled. 활성 패치베ì�´ ì •ì�˜ë¥¼ 불러올 수 없습니다. "%1" 비활성화ë�¨. Patchbay activated. 패치베ì�´ê°€ 활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. Patchbay deactivated. 패치베ì�´ê°€ 비활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. Statistics reset. 통계 재설정. msec ms JACK connection graph change. JACK ì—°ê²° 그래프 변경. XRUN callback (%1). XRUN 콜백 (%1). Buffer size change (%1). 버í�¼ í�¬ê¸° 변경 (%1). Shutdown notification. ì�¼ì‹œì¢…료 알림. Freewheel started... 프리휠 시작ë�¨... Freewheel exited. 프리휠ì�´ 종료ë�˜ì—ˆìŠµë‹ˆë‹¤. Could not start JACK. Sorry. JACKì�„ 시작할 수 없습니다. 죄송합니다. JACK has crashed. JACKì�´ ì¶©ë�Œí–ˆìŠµë‹ˆë‹¤. JACK timed out. JACK 시간ì�´ 초과ë�˜ì—ˆìŠµë‹ˆë‹¤. JACK write error. JACK 쓰기 오류입니다. JACK read error. JACK ì�½ê¸° 오류입니다. Unknown JACK error (%d). 알 수 없는 JACK 오류 (%d). JACK property change. JACK ì†�성ì�´ 변경ë�˜ì—ˆìŠµë‹ˆë‹¤. ALSA connection graph change. ALSA ì—°ê²° 그래프가 변경ë�˜ì—ˆìŠµë‹ˆë‹¤. JACK active patchbay scan JACK 활성 패치베ì�´ 스캔 ALSA active patchbay scan ALSA 활성 패치베ì�´ 스캔 JACK connection change. JACK ì—°ê²°ì�´ 변경ë�˜ì—ˆìŠµë‹ˆë‹¤. ALSA connection change. ALSA ì—°ê²°ì�´ 변경ë�˜ì—ˆìŠµë‹ˆë‹¤. checked 확ì�¸í•¨ connected ì—°ê²°ë�¨ disconnected ì—°ê²°í•´ì œë�¨ failed 실패함 A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? 패치베ì�´ ì •ì�˜ê°€ 현재 활성화ë�˜ì–´ 있습니다. ì�´ ì—°ê²°ì�„ 다시 실행할 가능성ì�´ 있ì�Œ: %1 -> %2 패치베ì�´ ì—°ê²°ì�„ 제거하시겠습니까? Overall operation failed. ì „ì²´ 작업ì�´ 실패했습니다. Invalid or unsupported option. 유효하지 않거나 ì§€ì›�ë�˜ì§€ 않는 옵션입니다. Client name not unique. í�´ë�¼ì�´ì–¸íЏ ì�´ë¦„ì�´ 고유하지 않습니다. Server is started. 서버가 시작ë�˜ì—ˆìŠµë‹ˆë‹¤. Unable to connect to server. 서버ì—� ì—°ê²°í•  수 없습니다. Server communication error. 서버 통신 오류입니다. Client does not exist. í�´ë�¼ì�´ì–¸íŠ¸ê°€ 존재하지 않습니다. Unable to load internal client. ë‚´ë¶€ í�´ë�¼ì�´ì–¸íŠ¸ë¥¼ 불러올 수 없습니다. Unable to initialize client. í�´ë�¼ì�´ì–¸íŠ¸ë¥¼ 초기화할 수 없습니다. Unable to access shared memory. 공유 메모리ì—� 액세스할 수 없습니다. Client protocol version mismatch. í�´ë�¼ì�´ì–¸íЏ 프로토콜 버전ì�´ ì�¼ì¹˜í•˜ì§€ 않습니다. Could not connect to JACK server as client. - %1 Please check the messages window for more info. JACK 서버ì—� í�´ë�¼ì�´ì–¸íŠ¸ë¡œ ì—°ê²°í•  수 없습니다. - %1 ìž�세한 ë‚´ìš©ì�€ 메시지 ì°½ì�„ 확ì�¸í•˜ì„¸ìš”. Server configuration saved to "%1". 서버 구성ì�´ "%1"ì—� 저장ë�˜ì—ˆìŠµë‹ˆë‹¤. Client activated. í�´ë�¼ì�´ì–¸íŠ¸ê°€ 활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. Post-startup script... 스타트업 후 스í�¬ë¦½íЏ... Post-startup script terminated 스타트업 후 스í�¬ë¦½íЏ 종료ë�¨ Command line argument... 명령줄 ì�¸ìˆ˜... Command line argument started 명령줄 ì�¸ìˆ˜ 시작ë�¨ Client deactivated. í�´ë�¼ì�´ì–¸íŠ¸ê°€ 비활성화ë�˜ì—ˆìŠµë‹ˆë‹¤. Transport rewind. 트랜스í�¬íЏ ë�˜ê°�기. Transport backward. 트랜스í�¬íЏ ì—­ë°©í–¥. Starting 시작하는 중 Transport start. 트랜스í�¬íЏ 시작. Stopping 중지하는 중 Transport stop. 트랜스í�¬íЏ ì •ì§€. Transport forward. 트랜스í�¬íЏ ì •ë°©í–¥. Stopped 중지ë�¨ %1 (%2%) %1 (%2%) %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 프레임 Yes 예 No 아니오 FW FW RT RT Rolling 롤ë§� Looping 루핑 %1 msec %1 ms XRUN callback (%1 skipped). XRUN 콜백 (%1 건너뜀). Started 시작ë�¨ Active 활성 Activating 활성 ìƒ�태 Inactive 비활성 &Hide 숨김(&H) D-BUS: GetParameterConstraint('%1'): %2. (%3) D-BUS: GetParameterConstraint('%1'): %2. (%3) Mi&nimize 최소화(&N) S&how 표시(&H) Rest&ore ë³µì›�(&O) &Stop 중지(&S) &Reset 재설정(&R) &Presets 사전설정(&P) &Load... 불러오기(&L)... &Save... 저장(&S)... Save and &Quit... 저장 후 종료(&Q)... Save &Template... 탬플릿 저장(&T)... &Versioning 버전 관리(&V) Re&fresh 새로 고침(&F) St&atus ìƒ�태(&A) &Connections ì—°ê²°(&C) Patch&bay 패치베ì�´(&B) &Graph 그래프(&G) &Transport 트랜스í�¬íЏ(&T) Server settings will be only effective after restarting the JACK audio server. 서버 설정ì�€ JACK 오디오 서버를 다시 시작한 후ì—�ë§Œ ì �ìš©ë�©ë‹ˆë‹¤. Do you want to restart the JACK audio server? JACK 오디오 서버를 다시 시작하시겠습니까? Some settings will be only effective the next time you start this program. ì�¼ë¶€ 설정ì�€ 다ì�Œì—� ì�´ 프로그램ì�„ 시작할 때만 유효합니다. D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) qjackctlMessagesStatusForm Messages / Status 메시지 / ìƒ�태 &Messages 메시지(&M) Messages log 메시지 로그 Messages output log 메시지 출력 로그 &Status ìƒ�태(&S) Status information ìƒ�태 ì •ë³´ Statistics since last server startup 마지막 서버 시작 ì�´í›„ 통계 Description 설명 Value ê°’ Reset XRUN statistic values XRUN 통계 ê°’ 재설정 Re&set 재설정(&S) Refresh XRUN statistic values XRUN 통계 ê°’ 새로 고침 &Refresh 새로 고침(&R) Server name 서버 ì�´ë¦„ Server state 서버 ìƒ�태 DSP Load DSP 불러오기 Sample Rate 샘플 ë ˆì�´íЏ Buffer Size 버í�¼ í�¬ê¸° Realtime Mode 실시간 모드 Transport state 트랜스í�¬íЏ ìƒ�태 Transport Timecode 트랜스í�¬íЏ 타임코드 Transport BBT 트랜스í�¬íЏ BBT Transport BPM 트랜스í�¬íЏ BPM XRUN count since last server startup 마지막 서버 시작 ì�´í›„ XRUN 수 XRUN last time detected XRUNì�´ 마지막으로 ê°�ì§€ë�¨ XRUN last 마지막 XRUN XRUN maximum XRUN 최댓값 XRUN minimum XRUN 최솟값 XRUN average XRUN í�‰ê·  XRUN total XRUN 합계 Maximum scheduling delay 최대 스케줄ë§� 지연 Time of last reset 마지막 재설정 시간 Logging stopped --- %1 --- 로깅 중지ë�¨ --- %1 --- Logging started --- %1 --- 로깅 시작ë�¨ --- %1 --- qjackctlPaletteForm Color Themes 색ìƒ� 테마 Name ì�´ë¦„ Current color palette name 현재 색ìƒ� 팔레트 ì�´ë¦„ Save current color palette name 현재 색ìƒ� 팔레트 ì�´ë¦„ 저장 Save 저장 Delete current color palette name 현재 색ìƒ� 팔레트 ì�´ë¦„ ì‚­ì œ Delete ì‚­ì œ Palette 팔레트 Current color palette 현재 색ìƒ� 팔레트 Generate: ìƒ�성: Base color to generate palette 팔레트 ìƒ�성ì�„ 위한 기본 색ìƒ� Reset all current palette colors 모든 현재 팔레트 색ìƒ� 재설정 Reset 재설정 Import a custom color theme (palette) from file 파ì�¼ì—�서 사용ìž� 지정 색ìƒ� 테마(팔레트) 가져오기 Import... 가져오기... Export a custom color theme (palette) to file 사용ìž� 지정 색ìƒ� 테마(팔레트)를 파ì�¼ë¡œ 내보내기 Export... 내보내기... Show Details 세부 ì •ë³´ 표시 Import File - %1 파ì�¼ 가져오기 - %1 Palette files (*.%1) 팔레트 파ì�¼ (*.%1) Save Palette - %1 All files (*.*) 모든 파ì�¼ (*.*) Warning - %1 경고 - %1 Could not import from file: %1 Sorry. 파ì�¼ì—�서 가져올 수 ì—†ì�Œ: %1 죄송합니다. Export File - %1 파ì�¼ 내보내기 - %1 Some settings have been changed. Do you want to discard the changes? ì�¼ë¶€ 설정ì�´ 변경ë�˜ì—ˆìŠµë‹ˆë‹¤. 변경 ë‚´ìš©ì�„ 취소하시겠습니까? Some settings have been changed: "%1". Do you want to save the changes? ì�¼ë¶€ 설정ì�´ 변경ë�˜ì—ˆìŠµë‹ˆë‹¤. "%1". 변경 ë‚´ìš©ì�„ 저장하시겠습니까? qjackctlPaletteForm::PaletteModel Color Role 색ìƒ� ì—­í•  Active 활성 Inactive 비활성 Disabled 비활성화ë�¨ qjackctlPatchbay Warning 경고 This will disconnect all sockets. Are you sure? 모든 소켓ì�˜ ì—°ê²°ì�´ ë�Šì–´ì§‘니다. 확실하신가요? qjackctlPatchbayForm Patchbay 패치베ì�´ Move currently selected output socket down one position 현재 ì„ íƒ�ë�œ 출력 소켓ì�„ 한 위치 아래로 ì�´ë�™ Down 아래로 Create a new output socket 새 출력 소켓 만들기 Add... 추가... Edit currently selected input socket properties 현재 ì„ íƒ�ë�œ ìž…ë ¥ 소켓 ì†�성 편집 Edit... 편집... Move currently selected output socket up one position 현재 ì„ íƒ�ë�œ 출력 소켓ì�„ 한 위치 위로 ì�´ë�™ Up 위로 Remove currently selected output socket 현재 ì„ íƒ�ë�œ 출력 소켓 제거 Remove 제거 Duplicate (copy) currently selected output socket 현재 ì„ íƒ�ë�œ 출력 소켓 복제 (복사) Copy... 복사... Remove currently selected input socket 현재 ì„ íƒ�ë�œ ìž…ë ¥ 소켓 제거 Duplicate (copy) currently selected input socket 현재 ì„ íƒ�ë�œ ìž…ë ¥ 소켓 복제 (복사) Create a new input socket 새 ìž…ë ¥ 소켓 만들기 Edit currently selected output socket properties 현재 ì„ íƒ�한 출력 소켓 ì†�성 편집 Connect currently selected sockets 현재 ì„ íƒ�ë�œ 소켓 ì—°ê²° &Connect 연결하기(&C) Disconnect currently selected sockets 현재 ì„ íƒ�ë�œ 소켓 ì—°ê²°í•´ì œ &Disconnect ì—°ê²°í•´ì œ(&D) Disconnect all currently connected sockets 현재 ì—°ê²°ë�œ 모든 소켓 ì—°ê²°í•´ì œ Disconnect &All 모ë‘� ì—°ê²°í•´ì œ(&A) Expand all items 모든 항목 확장 E&xpand All 모ë‘� 확장(&X) Refresh current patchbay view 현재 패치베ì�´ 보기 새로 고침 &Refresh 새로 고침(&R) Create a new patchbay profile 새 패치베ì�´ 프로필 ìƒ�성 &New 새로 만들기(&N) Load patchbay profile 패치베ì�´ 프로필 불러오기 &Load... 불러오기(&L)... Save current patchbay profile 현재 패치베ì�´ 프로필 저장 &Save... 저장(&S)... Current (recent) patchbay profile(s) 현재(최근) 패치베ì�´ 프로필 Toggle activation of current patchbay profile 현재 패치베ì�´ 프로필 활성화 전환 Acti&vate 활성화(&V) Warning 경고 The patchbay definition has been changed: "%1" Do you want to save the changes? 패치베ì�´ ì •ì�˜ê°€ 변경ë�˜ì—ˆì�Œ: "%1" 변경 사항ì�„ 저장하시겠습니까? %1 [modified] %1 [수정ë�¨] Untitled%1 제목없ì�Œ-%1 Error 오류 Could not load patchbay definition file: "%1" 패치베ì�´ ì •ì�˜ 파ì�¼ì�„ 불러올 수 ì—†ì�Œ: "%1" Could not save patchbay definition file: "%1" 패치베ì�´ ì •ì�˜ 파ì�¼ì�„ 저장할 수 ì—†ì�Œ: "%1" New Patchbay definition 새 패치베ì�´ ì •ì�˜ Create patchbay definition as a snapshot of all actual client connections? 모든 실제 í�´ë�¼ì�´ì–¸íЏ ì—°ê²°ì�˜ 스냅샷으로 패치베ì�´ ì •ì�˜ë¥¼ 만드시겠습니까? Load Patchbay Definition 패치베ì�´ ì •ì�˜ 불러오기 Patchbay Definition files 패치베ì�´ ì •ì�˜ 파ì�¼ Save Patchbay Definition 패치베ì�´ ì •ì�˜ 저장 active 활성 qjackctlPatchbayView Add... 추가... Edit... 편집... Copy... 복사... Remove 제거 Exclusive ì „ìš© Forward 앞으로 (None) (ì—†ì�Œ) Move Up 위로 ì�´ë�™ Move Down 아래로 ì�´ë�™ &Connect 연결하기(&C) Alt+C Connect ì—°ê²° Alt+C &Disconnect ì—°ê²°í•´ì œ(&D) Alt+D Disconnect ì—°ê²° í•´ì œ Alt+D Disconnect &All 모ë‘� ì—°ê²°í•´ì œ(&A) Alt+A Disconnect All 모ë‘� ì—°ê²° í•´ì œ Alt+A &Refresh 새로 고침(&R) Alt+R Refresh 새로 고침 Alt+R qjackctlSessionForm Session 세션 Load session 세션 불러오기 &Load... 불러오기(&L)... Recent session 최근 세션 &Recent 최근 세션(&R) Save session 세션 저장 &Save 저장(&S) &Versioning 버전 관리(&V) Update session 세션 ì—…ë�°ì�´íЏ Re&fresh 새로 고침(&F) Session clients / connections 세션 í�´ë�¼ì�´ì–¸íЏ / ì—°ê²° Client / Ports í�´ë�¼ì�´ì–¸íЏ / í�¬íЏ UUID UUID Command 명령 Infra-clients / commands ì�¸í”„ë�¼ í�´ë�¼ì�´ì–¸íЏ / 명령 Infra-client ì�¸í”„ë�¼ í�´ë�¼ì�´ì–¸íЏ Infra-command ì�¸í”„ë�¼ 명령 Add infra-client ì�¸í”„ë�¼ í�´ë�¼ì�´ì–¸íЏ 추가 &Add 추가(&A) Edit infra-client ì�¸í”„ë�¼ í�´ë�¼ì�´ì–¸íЏ 편집 &Edit 편집(&E) Remove infra-client ì�¸í”„ë�¼ í�´ë�¼ì�´ì–¸íЏ 제거 Re&move 제거(&M) &Save... 저장(&S)... Save and &Quit... 저장 후 종료(&Q)... Save &Template... 템플릿 저장(&T)... Load Session 세션 불러오기 Session directory 세션 디렉토리 Save Session 세션 저장 and Quit ë°� 종료 Template 템플릿 &Clear 비우기(&C) Warning 경고 A session could not be found in this folder: "%1" 다ì�Œ í�´ë�”ì—�서 세션ì�„ ì°¾ì�„ 수 ì—†ì�Œ: "%1" %1: loading session... %1: 세션ì�„ 불러오는 중... %1: load session %2. %1: %2 세션ì�„ 불러옵니다. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? 다ì�Œ í�´ë�”ì—� 세션ì�´ ì�´ë¯¸ 있ì�Œ: "%1" 기존 세션ì�„ ë�®ì–´ì“°ì‹œê² ìŠµë‹ˆê¹Œ? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? ì�´ í�´ë�”는 ì�´ë¯¸ 있으며 비어 있지 않ì�Œ: "%1" 기존 í�´ë�”를 ë�®ì–´ì“°ì‹œê² ìŠµë‹ˆê¹Œ? %1: saving session... %1: 세션 저장 중... %1: save session %2. %1: %2 세션ì�„ 저장합니다. New Client 새 í�´ë�¼ì�´ì–¸íЏ qjackctlSessionInfraClientItemEditor Infra-command ì�¸í”„ë�¼ 명령 qjackctlSessionSaveForm Session 세션 &Name: ì�´ë¦„(&N): Session name &Directory: Session directory 세션 디렉토리 Browse for session directory ... ... Save session versioning 세션 버전 관리 저장 &Versioning 버전 관리(&V) Warning 경고 Session directory does not exist: "%1" Do you want to create it? Session Directory qjackctlSetupForm Settings 설정 Preset &Name: 사전설정 ì�´ë¦„(&N): Settings preset name 사전설정 ì�´ë¦„ 설정 (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Save settings as current preset name 현재 사전설정 ì�´ë¦„으로 설정 저장 &Save 저장(&S) Delete current settings preset 현재 설정 사전설정 ì‚­ì œ &Delete ì‚­ì œ(&D) jackd DO NOT TRANSLATE jackdmp DO NOT TRANSLATE jackstart DO NOT TRANSLATE &Name: ì�´ë¦„(&N): The JACK Audio Connection Kit sound server name JACK 오디오 ì—°ê²° 키트 사운드 서버 ì�´ë¦„ Driv&er: 드ë�¼ì�´ë²„(&E): The audio backend driver interface to use 사용할 오디오 백엔드 드ë�¼ì�´ë²„ ì�¸í„°íŽ˜ì�´ìФ dummy DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 sun DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 oss DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 alsa DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 portaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 coreaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 firewire DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 net DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 netone DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Parameters 매개변수 MIDI Driv&er: MIDI 드ë�¼ì�´ë²„(&E): The ALSA MIDI backend driver to use 사용할 ALSA MIDI 백엔드 드ë�¼ì�´ë²„ none ì—†ì�Œ raw DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 seq DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Time in seconds that client is delayed after server startup 서버 시작 후 í�´ë�¼ì�´ì–¸íŠ¸ê°€ 지연ë�˜ëŠ” 시간(ì´ˆ) Latency: 지연시간: Output latency in milliseconds, calculated based on the period, rate and buffer settings 기간, ì†�ë�„ ë°� 버í�¼ 설정ì�„ 기반으로 계산ë�œ 출력 지연시간 (밀리초) Use realtime scheduling 실시간 스케줄ë§� 사용 &Realtime 실시간(&R) Do not attempt to lock memory, even if in realtime mode 실시간 모드ì�¸ 경우ì—�ë�„ 메모리 잠금ì�„ 시ë�„하지 마십시오 No Memory Loc&k 메모리 잠금 ì—†ì�Œ(&K) Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) 공통 툴킷 ë�¼ì�´ë¸ŒëŸ¬ë¦¬ì�˜ 메모리 잠금 í•´ì œ (GTK+, QT, FLTK, Wine) &Unlock Memory 메모리 잠금 í•´ì œ(&U) Ignore xruns reported by the backend driver 백엔드 드ë�¼ì�´ë²„ì—�서 보고한 xrun 무시 So&ft Mode 안전 모드(&F) Provide output monitor ports 출력 모니터 í�¬íЏ 제공 &Monitor 모니터(&M) Force 16bit mode instead of failing over 32bit (default) 32비트를 초과하는 대신 16비트 모드 ê°•ì œ ì �ìš© (기본값) Force &16bit 16비트 ê°•ì œ ì �ìš©(&1) Enable hardware metering on cards that support it ì§€ì›�하는 카드ì—�서 하드웨어 미터ë§� 실행 H/&W Meter H/W 미터(&W) Ignore hardware period/buffer size 하드웨어 기간/버í�¼ í�¬ê¸° 무시 &Ignore H/W H/W 무시(&I) Whether to give verbose output on messages 메시지ì—� 대한 ìž�세한 출력ì�„ 제공할지 여부 &Verbose messages ìƒ�세 메시지(&V) &Output Device: 출력 장치(&O): &Interface: ì�¸í„°íŽ˜ì�´ìФ(&I): Maximum input audio hardware channels to allocate 할당할 최대 ìž…ë ¥ 오디오 하드웨어 채ë„� &Audio: 오디오(&A): Dit&her: ë””ë�”(&H): External output latency (frames) 외부 출력 지연시간 (프레임) &Input Device: ìž…ë ¥ 장치(&I): Provide either audio capture, playback or both 오디오 캡처, 재ìƒ� ë˜�는 둘 다 제공 Duplex 입출력 Capture Only ìž…ë ¥ ë§Œ Playback Only 출력 ë§Œ The PCM device name to use 사용할 PCM 장치 ì�´ë¦„ hw:0 hw:0 plughw:0 plughw:0 /dev/audio /dev/audio /dev/dsp /dev/dsp > > Alternate input device for capture 캡처를 위한 대체 ìž…ë ¥ 장치 Maximum output audio hardware channels to allocate 할당할 최대 출력 오디오 하드웨어 채ë„� Alternate output device for playback 재ìƒ�ì�„ 위한 대체 출력 장치 External input latency (frames) 외부 ìž…ë ¥ 지연시간 (프레임) Set dither mode ë””ë�” 모드 지정 None ì—†ì�Œ Rectangular 사ê°�형 Shaped 모양 Triangular 삼ê°�형 Number of periods in the hardware buffer 하드웨어 버í�¼ì�˜ 기간 수 Priorit&y: ì†�성(&Y): &Frames/Period: 프레임/기간(&F): Frames per period between process() calls process() 호출 사ì�´ì�˜ 기간당 프레임 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Port Ma&ximum: 최대 í�¬íЏ(&X): &Channels: 채ë„� 수(&C): Number of microseconds to wait between engine processes (dummy) 엔진 프로세스 사ì�´ì—�서 대기하는 마ì�´í�¬ë¡œì´ˆ 수 (ë�”미) 21333 21333 Sample rate in frames per second 초당 프레임ì�˜ 샘플 ë ˆì�´íЏ 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Scheduler priority when running realtime 실시간 실행 시 스케줄러 ìš°ì„  순위 &Word Length: 단어 길ì�´(&W): Periods/&Buffer: 기간/버í�¼(&B): Word length 단어 길ì�´ Maximum number of ports the JACK server can manage JACK 서버가 관리할 수 있는 최대 í�¬íЏ 수 &Wait (usec): 대기시간 (μs)(&W): Sample &Rate: 샘플 ë ˆì�´íЏ(&R): Maximum number of audio channels to allocate 할당할 최대 오디오 채ë„� 수 &Timeout (msec): 시간초과 (ms)(&T): Set client timeout limit in milliseconds í�´ë�¼ì�´ì–¸íЏ 시간 제한 지정 (ms) Setup 설정 Whether to restrict client self-connections í�´ë�¼ì�´ì–¸íЏ ìž�ì²´ ì—°ê²° 제한 여부 Whether to use server synchronous mode 서버 ë�™ê¸° 모드 사용 여부 &Use server synchronous mode 서버 ë�™ê¸° 모드 사용(&U) Please do not touch these settings unless you know what you are doing. 무엇ì�„ 하고 있는지 모르는 경우 ì�´ 설정ì�„ 만지지 마십시오. 200 200 500 500 1000 1000 2000 2000 5000 5000 Cloc&k source: í�´ëŸ­ 소스(&K): Clock source í�´ëŸ­ 소스 S&elf connect mode: ìž�ì²´ 연결하기 모드(&E): Options 옵션 Scripting 스í�¬ë¦½íŒ… Whether to execute a custom shell script before starting up the JACK audio server. JACK 오디오 서버를 시작하기 ì „ì—� 사용ìž� ì •ì�˜ ì…¸ 스í�¬ë¦½íŠ¸ë¥¼ 실행할지 여부입니다. Execute script on Start&up: 스타트업 시 스í�¬ë¦½íЏ 실행(&U): Whether to execute a custom shell script after starting up the JACK audio server. JACK 오디오 서버를 시작한 후 사용ìž� ì •ì�˜ ì…¸ 스í�¬ë¦½íŠ¸ë¥¼ 실행할지 여부입니다. Execute script after &Startup: 스타트업 후 스í�¬ë¦½íЏ 실행:(&S): Whether to execute a custom shell script before shuting down the JACK audio server. JACK 오디오 서버를 종료하기 ì „ì—� 사용ìž� ì •ì�˜ ì…¸ 스í�¬ë¦½íŠ¸ë¥¼ 실행할지 여부입니다. Execute script on Shut&down: ì�¼ì‹œì¢…료 시 스í�¬ë¦½íЏ 실행: Command line to be executed before starting up the JACK audio server JACK 오디오 서버를 시작하기 ì „ì—� 실행할 명령줄 Scripting argument meta-symbols 스í�¬ë¦½íŒ… ì�¸ìˆ˜ 메타 기호 Browse for script to be executed before starting up the JACK audio server JACK 오디오 서버를 시작하기 ì „ì—� 실행할 스í�¬ë¦½íЏ 찾아보기 ... ... Command line to be executed after starting up the JACK audio server JACK 오디오 서버를 시작한 후 실행할 명령줄 Browse for script to be executed after starting up the JACK audio server JACK 오디오 서버를 시작한 후 실행할 스í�¬ë¦½íЏ 찾아보기 Browse for script to be executed before shutting down the JACK audio server JACK 오디오 서버를 종료하기 ì „ì—� 실행할 스í�¬ë¦½íЏ 찾아보기 Command line to be executed before shutting down the JACK audio server JACK 오디오 서버를 종료하기 ì „ì—� 실행할 명령줄 Whether to execute a custom shell script after shuting down the JACK audio server. JACK 오디오 서버를 종료한 후 사용ìž� 지정 ì…¸ 스í�¬ë¦½íŠ¸ë¥¼ 실행할지 여부입니다. Execute script after Shu&tdown: ì�¼ì‹œì¢…료 후 스í�¬ë¦½íЏ 실행(&T): Browse for script to be executed after shutting down the JACK audio server JACK 오디오 서버를 종료한 후 실행할 스í�¬ë¦½íЏ 찾아보기 Command line to be executed after shutting down the JACK audio server JACK 오디오 서버를 종료한 후 실행할 명령줄 Statistics 통계 Whether to capture standard output (stdout/stderr) into messages window 표준 출력(stdout/stderr)ì�„ 메시지 ì°½ì—� 캡처할지 여부 &Capture standard output 표준 출력 캡처(&C) &XRUN detection regex: XRUN ê°�ì§€ ì •ê·œì‹�(&X): Regular expression used to detect XRUNs on server output messages 서버 출력 메시지ì—�서 XRUNì�„ ê°�지하는 ë�° 사용ë�˜ëŠ” ì •ê·œì‹� xrun of at least ([0-9|\.]+) msecs Connections ì—°ê²° Whether to reset all connections when a patchbay definition is activated. 패치베ì�´ ì •ì�˜ê°€ 활성화ë�  때 모든 ì—°ê²°ì�„ 재설정할지 여부. &Reset all connections on patchbay activation 패치베ì�´ 활성화 시 모든 ì—°ê²° 재설정(&R) Whether to issue a warning on active patchbay port disconnections. 활성 패치베ì�´ í�¬íЏ ì—°ê²°ë�Šê¹€ì—� 대한 경고 ë°œìƒ� 여부. &Warn on active patchbay disconnections 활성 패치베ì�´ ì—°ê²°í•´ì œ 시 경고(&W) Custom 사용ìž� 지정 &Color palette theme: 색ìƒ� 팔레트 테마(&C): Custom color palette theme 사용ìž� 지정 색ìƒ� 팔레트 테마 Wonton Soup DO NOT TRANSLATE KXStudio DO NOT TRANSLATE Manage custom color palette themes 사용ìž� 지정 색ìƒ� 팔레트 테마 관리 &Widget style theme: 위젯 스타ì�¼ 테마(&W): Custom widget style theme 사용ìž� 지정 위젯 스타ì�¼ 테마 Whether to enable JACK D-Bus interface JACK D-Bus ì�¸í„°íŽ˜ì�´ìФ 활성화 여부 &Enable JACK D-Bus interface JACK D-Bus ì�¸í„°íŽ˜ì�´ìФ 활성화(&E) Whether to replace Connections with Graph button on the main window 기본 ì°½ì—�서 ì—°ê²°ì�„ 그래프 버튼으로 대체할지 여부 Replace Connections with &Graph button ì—°ê²°ì�„ 그래프 버튼으로 바꾸기(&G) 10 10 Patchbay definition file to be activated as connection persistence profile ì—°ê²° ì§€ì†�성 프로필로 활성화할 패치베ì�´ ì •ì�˜ 파ì�¼ Browse for a patchbay definition file to be activated 활성화할 패치베ì�´ ì •ì�˜ 파ì�¼ 찾아보기 Whether to activate a patchbay definition for connection persistence profile. ì—°ê²° ì§€ì†�성 프로필ì—� 대한 패치베ì�´ ì •ì�˜ë¥¼ 활성화할지 여부. Activate &Patchbay persistence: 패치베ì�´ ì§€ì†�성 활성화(&P): Logging 로깅 Messages log file 메시지 로그 파ì�¼ Browse for the messages log file location 메시지 로그 파ì�¼ 위치 찾아보기 Whether to activate a messages logging to file. 파ì�¼ì—� 로깅하는 메시지를 활성화할지 여부입니다. Server &Prefix: 서버 ì ‘ë‘�사(&P): Server path (command line prefix) 서버 경로 (명령줄 ì ‘ë‘�사) &Channels I/O: I/O 채ë„�(&C): &Latency I/O: I/O 지연시간(&L): Server Suffi&x: 서버 접미사(&X): Extra driver options (command line suffix) 추가 드ë�¼ì�´ë²„ 옵션 (명령줄 접미사) Start De&lay: 시작 지연(&L): secs ì´ˆ 0 msecs 0 ms Clear settings of current preset name 현재 사전설정 ì�´ë¦„ì�˜ 설정 비우기 Clea&r 비우기(&R) &Messages log file: 메시지 로그 파ì�¼(&M): Display 화면표시 Time Display 시간 화면표시 Transport &Time Code 트랜스í�¬íЏ 타임 코드(&T) Transport &BBT (bar:beat.ticks) 트랜스í�¬íЏ BBT(마디:ë°•ìž�.틱)(&B) Elapsed time since last &Reset 마지막 재설정 ì�´í›„ 경과 시간(&R) Elapsed time since last &XRUN 마지막 XRUN ì�´í›„ 경과 시간(&X) Sample front panel normal display font 샘플 ì „ë©´ 패ë„� ì�¼ë°˜ 화면표시 글꼴 Sample big time display font 샘플 í�° 시간 화면표시 글꼴 Big Time display: í�° 시간 화면표시: Select font for front panel normal display ì „ë©´ 패ë„� ì�¼ë°˜ 화면표시ì�˜ 글꼴 ì„ íƒ� &Font... 글꼴(&F)... Select font for big time display í�° 시간 화면표시ì—� 사용할 글꼴 Normal display: ì�¼ë°˜ 화면표시: Whether to enable blinking (flashing) of the server mode (RT) indicator 서버 모드(RT) 지시ìž�ì�˜ 깜박임(깜박임) 사용 여부 Blin&k server mode indicator 서버 모드 지시ìž� 깜박임(&K) Messages Window 메시지 ì°½ Sample messages text font display 샘플 메시지 í…�스트 글꼴 화면표시 Select font for the messages text display 메시지 í…�스트 화면표시ì�˜ 글꼴 ì„ íƒ� Whether to keep a maximum number of lines in the messages window 메시지 ì°½ì�˜ 최대 줄 수 유지 여부 &Messages limit: 메시지 제한(&M): The maximum number of message lines to keep in view 표시할 최대 메시지 줄 수 100 100 250 250 2500 2500 Connections Window ì—°ê²° ì°½ Sample connections view font 샘플 ì—°ê²° 보기 글꼴 Select font for the connections view ì—°ê²° 보기ì�˜ 글꼴 ì„ íƒ� &Icon size: ì•„ì�´ì½˜ í�¬ê¸°(&I): The icon size for each item of the connections view ì—°ê²° 보기ì�˜ ê°� 항목ì—� 대한 ì•„ì�´ì½˜ í�¬ê¸° 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 Whether to enable client/port name aliases on the connections window ì—°ê²° ì°½ì—�서 í�´ë�¼ì�´ì–¸íЏ/í�¬íЏ ì�´ë¦„ 별칭ì�„ 활성화할지 여부 E&nable client/port aliases í�´ë�¼ì�´ì–¸íЏ/í�¬íЏ 별칭 활성화(&N) Whether to enable in-place client/port name editing (rename) ì�¸í”Œë ˆì�´ìФ í�´ë�¼ì�´ì–¸íЏ/í�¬íЏ ì�´ë¦„ 편집 활성화 여부(ì�´ë¦„ 변경) Ena&ble client/port aliases editing (rename) í�´ë�¼ì�´ì–¸íЏ/í�¬íЏ 별칭 편집 활성화 (ì�´ë¦„ 변경)(&B) &JACK client/port aliases: JACK í�´ë�¼ì�´ì–¸íЏ/í�¬íЏ 별칭(&J): Advanced 고급 JACK client/port aliases display mode JACK í�´ë�¼ì�´ì–¸íЏ/í�¬íЏ 별칭 화면표시 모드 Default 기본값 First 첫 번째 Second ë‘� 번째 JACK client/port pretty-name (metadata) display mode JACK í�´ë�¼ì�´ì–¸íЏ/í�¬íЏ 예ì�œ ì�´ë¦„(메타ë�°ì�´í„°) 화면표시 모드 Enable JA&CK client/port pretty-names (metadata) JA&CK í�´ë�¼ì�´ì–¸íЏ/í�¬íЏ 예ì�œ ì�´ë¦„(메타ë�°ì�´í„°) 활성화(&C) Misc 기타 Other 다른 Whether to start JACK audio server immediately on application startup ì�‘용프로그램 시작 시 JACK 오디오 서버를 즉시 시작할지 여부 &Start JACK audio server on application startup ì�‘용프로그램 시작 시 JACK 오디오 서버 시작(&S) Whether to ask for confirmation on application exit ì�‘용프로그램 종료 시 확ì�¸ 요청 여부 &Confirm application close ì�‘용프로그램 닫기 확ì�¸(&C) Whether to keep all child windows on top of the main window 모든 하위 ì°½ì�„ 기본 ì°½ 맨 위ì—� 둘지 여부 &Keep child windows always on top 하위 ì°½ì�„ í•­ìƒ� 맨 위로 유지(&K) Whether to enable the system tray icon 시스템 트레ì�´ ì•„ì�´ì½˜ 활성화 여부 &Enable system tray icon 시스템 트레ì�´ ì•„ì�´ì½˜ 활성화(&E) Whether to show system tray message on main window close 기본 ì°½ì�„ ë‹«ì�„ 때 시스템 트레ì�´ 메시지를 표시할지 여부 Sho&w system tray message on close ë‹«ì�„ 때 시스템 트레ì�´ 메시지 표시(&W) Whether to start minimized to system tray 시스템 트레ì�´ë¡œ 최소화할지 여부 Start minimi&zed to system tray 시스템 트레ì�´ì—� 최소화ë�œ 시작(&Z) Whether to restrict to one single application instance (X11) 단ì�¼ ì�‘용프로그램 ì�¸ìŠ¤í„´ìŠ¤ë¡œ 제한할지 여부 (X11) Single application &instance 단ì�¼ ì�‘용프로그램 ì�¸ìŠ¤í„´ìŠ¤(&I) Whether to save the JACK server command-line configuration into a local file (auto-start) JACK 서버 명령줄 구성ì�„ 로컬 파ì�¼ì—� 저장할지 여부 (ìž�ë�™ 시작) Whether to ask for confirmation on JACK audio server shutdown and/or restart JACK 오디오 서버 ì�¼ì‹œì¢…료 ë°�/ë˜�는 다시 시작 시 확ì�¸ì�„ 요청할지 여부 Confirm server sh&utdown and/or restart 서버 ì�¼ì‹œì¢…료 확ì�¸ ë°�/ë˜�는 다시 시작(&U) S&ave JACK audio server configuration to: JACK 오디오 서버 구성 저장(&A): The server configuration local file name (auto-start) 서버 구성 로컬 파ì�¼ ì�´ë¦„ (ìž�ë�™ 시작) .jackdrc .jackdrc Whether to enable ALSA Sequencer (MIDI) support on startup 시작 시 ALSA 시퀀서(MIDI) ì§€ì›� 활성화 여부 E&nable ALSA Sequencer support ALSA 시퀀서 ì§€ì›� 활성화(&N) Whether to enable D-Bus interface D-Bus ì�¸í„°íŽ˜ì�´ìФ 활성화 여부 &Enable D-Bus interface D-Bus ì�¸í„°íŽ˜ì�´ìФ 활성화(&E) Whether to stop JACK audio server on application exit ì�‘용프로그램 종료 시 JACK 오디오 서버를 중지할지 여부 S&top JACK audio server on application exit ì�‘용프로그램 종료 시 JACK 오디오 서버 중지(&S) Buttons 버튼 Whether to hide the left button group on the main window 기본 ì°½ì—�서 왼쪽 버튼 그룹ì�„ 숨길지 여부 Hide main window &Left buttons 기본 ì°½ 왼쪽 버튼 숨김(&L) Whether to hide the right button group on the main window 기본 ì°½ì—�서 오른쪽 버튼 그룹ì�„ 숨길지 여부 Hide main window &Right buttons 기본 ì°½ 오른쪽 버튼 숨김(&R) Whether to hide the transport button group on the main window 기본 ì°½ì—�서 트랜스í�¬íЏ 버튼 그룹ì�„ 숨길지 여부 Hide main window &Transport buttons 기본 ì°½ 트랜스í�¬íЏ 버튼 숨김(&T) Whether to hide the text labels on the main window buttons 기본 ì°½ 버튼ì�˜ í…�스트 ë ˆì�´ë¸”ì�„ 숨길지 여부 Hide main window &button text labels 기본 ì°½ 버튼 í…�스트 ë ˆì�´ë¸” 숨김(&B) Defaults 기본값 &Base font size: 기본 글꼴 í�¬ê¸°(&B): Base application font size (pt.) 기본 ì�‘ìš© 프로그램 글꼴 í�¬ê¸° (pt) 6 6 7 7 8 8 9 9 11 11 12 12 System 시스템 Cycle 사ì�´í�´ HPET HPET Don't restrict self connect requests (default) ìž�ì²´ ì—°ê²° 요청ì�„ 제한하지 않ì�Œ (기본값) Fail self connect requests to external ports only 외부 í�¬íЏì—�ë§Œ ìž�ì²´ ì—°ê²° 요청 실패 Ignore self connect requests to external ports only 외부 í�¬íЏì—� 대한 ìž�ì²´ ì—°ê²° 요청만 무시 Fail all self connect requests 모든 ìž�ì²´ ì—°ê²° 요청 실패 Ignore all self connect requests 모든 ìž�ì²´ ì—°ê²° 요청 무시 Warning 경고 Some settings have been changed: "%1" Do you want to save the changes? ì�¼ë¶€ 설정ì�´ 변경ë�˜ì—ˆì�Œ: "%1" 변경 사항ì�„ 저장하시겠습니까? Delete preset: "%1" Are you sure? 사전설정 ì‚­ì œ: "%1" 확실하신가요? msec ms n/a 해당 ì—†ì�Œ &Preset Name 사전설정 ì�´ë¦„(&P) &Server Name 서버 ì�´ë¦„(&S) &Server Path 서버 경로(&S) &Driver 드ë�¼ì�´ë²„(&D) &Interface ì�¸í„°íŽ˜ì�´ìФ(&I) Sample &Rate 샘플 ë ˆì�´íЏ(&R) &Frames/Period 프레임/기간(&F) Periods/&Buffer 기간/버í�¼(&B) Startup Script 스타트업 스í�¬ë¦½íЏ Post-Startup Script 스타트업 후 스í�¬ë¦½íЏ Shutdown Script ì�¼ì‹œì¢…료 스í�¬ë¦½íЏ Post-Shutdown Script ì�¼ì‹œì¢…료 후 스í�¬ë¦½íЏ Active Patchbay Definition 활성 패치베ì�´ ì •ì�˜ Patchbay Definition files 패치베ì�´ ì •ì�˜ 파ì�¼ Messages Log 메시지 로그 Log files 로그 파ì�¼ Information ì •ë³´ Some settings may be only effective next time you start this application. ì�¼ë¶€ 설정ì�€ 다ì�Œì—� ì�´ ì�‘용프로그램ì�„ 시작할 때만 유효할 수 있습니다. Some settings have been changed. Do you want to apply the changes? ì�¼ë¶€ 설정ì�´ 변경ë�˜ì—ˆìŠµë‹ˆë‹¤. 변경 사항ì�„ ì �용하시겠습니까? qjackctlSocketForm Socket 소켓 &Socket 소켓(&S) &Name (alias): ì�´ë¦„ (별칭)(&N): Socket name (an alias for client name) 소켓 ì�´ë¦„(í�´ë�¼ì�´ì–¸íЏ ì�´ë¦„ì�˜ 별칭) Client name (regular expression) í�´ë�¼ì�´ì–¸íЏ ì�´ë¦„ (ì •ê·œì‹�) Add plug to socket plug list 소켓 플러그 목ë¡�ì—� 플러그 추가 Add P&lug 플러그 추가(&L) &Plug: 플러그(&P): Port name (regular expression) í�¬íЏ ì�´ë¦„ (ì •ê·œì‹�) Socket plug list 소켓 플러그 목ë¡� Socket Plugs / Ports 소켓 플러그 / í�¬íЏ Edit currently selected plug 현재 ì„ íƒ�ë�œ 플러그 편집 &Edit 편집(&E) Remove currently selected plug from socket plug list 소켓 플러그 목ë¡�ì—�서 현재 ì„ íƒ�ë�œ 플러그 제거 &Remove 제거(&R) &Client: í�´ë�¼ì�´ì–¸íЏ(&C): Move down currently selected plug in socket plug list 소켓 플러그 목ë¡�ì—�서 현재 ì„ íƒ�ë�œ 플러그 아래로 ì�´ë�™ &Down 아래로(&D) Move up current selected plug in socket plug list 소켓 플러그 목ë¡�ì—�서 현재 ì„ íƒ�ë�œ 플러그 위로 ì�´ë�™ &Up 위로(&U) Enforce only one exclusive cable connection 하나ì�˜ ì „ìš© ì¼€ì�´ë¸” ì—°ê²°ë§Œ ì �ìš© E&xclusive ë�…ì �ì �(&X) &Forward: Forward (clone) all connections from this socket ì�´ 소켓ì�˜ 모든 ì—°ê²° 전달하기 (복제) Type 유형 Audio socket type (JACK) 오디오 소켓 유형 (JACK) &Audio 오디오(&A) MIDI socket type (JACK) MIDI 소켓 유형 (JACK) &MIDI MIDI(&M) MIDI socket type (ALSA) MIDI 소켓 유형 (ALSA) AL&SA ALSA(&S) Plugs / Ports 플러그 / í�¬íЏ Error 오류 A socket named "%1" already exists. "%1" ì�´ë¦„ì�„ 가진 소켓ì�´ ì�´ë¯¸ 있습니다. Warning 경고 Some settings have been changed. Do you want to apply the changes? ì�¼ë¶€ 설정ì�´ 변경ë�˜ì—ˆìŠµë‹ˆë‹¤. 변경 사항ì�„ ì �용하시겠습니까? Add Plug 플러그 추가 Edit 편집 Remove 제거 Move Up 위로 ì�´ë�™ Move Down 아래로 ì�´ë�™ (None) (ì—†ì�Œ) qjackctlSocketList Output 출력 Input ìž…ë ¥ Socket 소켓 <New> - %1 <ì‹ ê·œ> - %1 Warning 경고 %1 about to be removed: "%2" Are you sure? %1 제거 예정: "%2" 확실하신가요? %1 <Copy> - %2 %1 <복사> - %2 qjackctlSocketListView Output Sockets / Plugs 출력 소켓 / 플러그 Input Sockets / Plugs ìž…ë ¥ 소켓 / 플러그 qjackctl-1.0.6/src/translations/PaxHeaders/qjackctl_ru.ts0000644000000000000000000000013215174607203020557 xustar0030 mtime=1777536643.524914226 30 atime=1777536643.524914226 30 ctime=1777536643.524914226 qjackctl-1.0.6/src/translations/qjackctl_ru.ts0000644000175000001440000070052715174607203020562 0ustar00rncbcusers PortAudioProber Probing... ОпроÑ�… Please wait, PortAudio is probing audio hardware. Подождите немного, PortAudio опрашивает звуковой интерфейÑ�. Warning Предупреждение Audio hardware probing timed out. ВремÑ� опроÑ�а звукового интерфейÑ�а иÑ�текло. QObject Option -p requires an argument (preset). Ключ -p требует аргумента (профиль параметров). (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Usage: %1 [options] [command-and-args] ИÑ�пользование: %1 [ключи] [команды-и-аргументы] Options: Ключи: Start JACK audio server immediately. ЗапуÑ�тить звуковой Ñ�ервер JACK немедленно. Set default settings preset name. Указать имÑ� профилÑ� параметров по умолчанию. Set active patchbay definition file. УÑ�тановить файл активного опиÑ�аниÑ� коммутатора. Set default JACK audio server name. Указать имÑ� звукового Ñ�ервера JACK по умолчанию. Show help about command line options. Показать Ñ�правку о ключах командной Ñ�троки. Show version information. Показать Ñ�ведениÑ� о верÑ�ии. Displays help on command-line options. Launch command with arguments. ЗапуÑ�тить команду Ñ� аргументами. [command-and-args] [команда-и-аргументы] Option -a requires an argument (path). Ключу -a необходим аргумент (раÑ�положение). Option -n requires an argument (name). Ключу -n необходим аргумент (название). %1 (%2 frames) %1 (%2 выб.) Move ПеремеÑ�тить Rename Переименовать qjackctlAboutForm About О программе About Qt О Qt &Close &Закрыть Version ВерÑ�иÑ� Transport status control disabled. Управление Ñ�оÑ�тоÑ�нием передачи отключено. Realtime status disabled. СтатуÑ� режима реального времени отключён. JACK Session support disabled. Поддержка JACK Session отключена. Using: Qt %1 ИÑ�пользует: Qt %1 JACK %1 JACK %1 Website ДомашнÑ�Ñ� Ñ�траница This program is free software; you can redistribute it and/or modify it Это программа Ñ�влÑ�етÑ�Ñ� Ñ�вободной; вы можете раÑ�проÑ�транÑ�ть и/или изменÑ�ть её без ограничений under the terms of the GNU General Public License version 2 or later. на уÑ�ловиÑ�Ñ… лицензии GNU General Public License верÑ�ии 2 или более новой. Debugging option enabled. Параметр отладки включён. System tray disabled. ОблаÑ�ть уведомлениÑ� отключена. XRUN delay status disabled. СтатуÑ� задержки XRUN отключён. Maximum delay status disabled. СтатуÑ� макÑ�имальной задержки отключён. JACK MIDI support disabled. Поддержка JACK MIDI отключена. ALSA/MIDI sequencer support disabled. Поддержка Ñ�еквенÑ�ера ALSA/MIDI отключена. JACK Port aliases support disabled. Поддержка алиаÑ�ов портов JACK отключена. D-Bus interface support disabled. Поддержка интерфейÑ�а D-Bus отключена. qjackctlClientListView Readable Clients / Output Ports Порты выхода Writable Clients / Input Ports Порты входа &Connect &Соединить Alt+C Connect Alt+Ñ� &Disconnect &ОтÑ�оединить Alt+D Disconnect Alt+Ñ€ Disconnect &All ОтÑ�оединить &вÑ�е Alt+A Disconnect All Alt+в Re&name Пере&именовать Alt+N Rename Alt+и &Refresh &Обновить Alt+R Refresh Alt+о qjackctlConnect Warning Предупреждение This will suspend sound processing from all client applications. Are you sure? Обработка звука от клиентÑ�ких приложений будет прекращена. Ð’Ñ‹ уверены? qjackctlConnectionsForm &Connect &Соединить Connect currently selected ports Соединить выбранные Ñ�ейчаÑ� порты &Disconnect &ОтÑ�оединить Disconnect currently selected ports ОтÑ�оединить выбранные Ñ�ейчаÑ� порты Disconnect &All ОтÑ�оединить &вÑ�е Disconnect all currently connected ports ОтÑ�оединить вÑ�е Ñ�оединённые Ñ�ейчаÑ� порты Connections СоединениÑ� Expand all client ports РаÑ�крыть вÑ�е порты клиентов E&xpand All &РаÑ�крыть вÑ�е &Refresh &Обновить Refresh current connections view Обновить отображение текущих Ñ�оединений Audio Звук MIDI MIDI ALSA ALSA qjackctlConnectorView &Connect &Соединить Alt+C Connect Alt+Ñ� &Disconnect &ОтÑ�оединить Alt+D Disconnect Alt+Ñ€ Disconnect &All ОтÑ�оединить &вÑ�е Alt+A Disconnect All Alt+в &Refresh &Обновить Alt+R Refresh Alt+о qjackctlGraphCanvas Connect Соединить Disconnect ОтÑ�оединить qjackctlGraphForm Graph Граф &Graph &Граф &Edit &Правка &View &Вид &Zoom &МаÑ�штаб Co&lors &Цвета S&ort &Сортировка &Help &Справка &Connect &Соединить Connect Соединить Connect selected ports Соединить выбранные порты &Disconnect &ОтÑ�оединить Disconnect ОтÑ�оединить Disconnect selected ports ОтÑ�оединить выбранные порты Ctrl+C Ctrl+C T&humbview М&иниатюра Ctrl+D Ctrl+D Cl&ose &Закрыть Close Закрыть Close this application window Закрыть Ñ�то окно приложениÑ� Select &All Выбрать &вÑ�е Select All Выбрать вÑ�е Ctrl+A Ctrl+A Select &None СнÑ�ть в&ыделение Select None СнÑ�ть выделение Ctrl+Shift+A Ctrl+Shift+A Select &Invert &Инвертировать выделение Select Invert Инвертировать выделение Ctrl+I Ctrl+I &Rename... Пере&именовать... Rename item Переименовать объект Rename Item Переименовать объект F2 F2 &Find... &Ð�айти… Find Ð�айти Find nodes Ð�айти узлы Ctrl+F Ctrl+F &Menubar Панель &меню Menubar Панель меню Show/hide the main program window menubar Показать/Ñ�крыть панель меню программы Ctrl+M Ctrl+M &Toolbar Панель &инÑ�трументов Toolbar Панель инÑ�трументов Show/hide main program window file toolbar Показать/Ñ�крыть панель инÑ�трументов программы &Statusbar &СтатуÑ�наÑ� Ñ�трока Statusbar СтатуÑ�наÑ� Ñ�трока Show/hide the main program window statusbar Показать/Ñ�крыть Ñ�татуÑ�ную Ñ�троку программы &Top Left &Вверху Ñ�лева Top left Вверху Ñ�лева Show the thumbnail overview on the top-left Показывать обзор миниатюр вверху Ñ�лева Top &Right Вверху &Ñ�права Top right Вверху Ñ�права Show the thumbnail overview on the top-right Показывать обзор миниатюр вверху Ñ�права Bottom &Left &Внизу Ñ�лева Bottom Left Внизу Ñ�лева Bottom left Внизу Ñ�лева Show the thumbnail overview on the bottom-left Показывать обзор миниатюр внизу Ñ�лева &Bottom Right &Внизу Ñ�права Bottom right Внизу Ñ�права Show the thumbnail overview on the bottom-right Показывать обзор миниатюр внизу Ñ�права &None &Ð�ет None Ð�ет Hide thumbview Ð�е показывать миниатюру Hide the thumbnail overview Ð�е показывать обзор миниатюр Text Beside &Icons ТекÑ�Ñ‚ &Ñ€Ñ�дом Ñ�о значками Text beside icons ТекÑ�Ñ‚ Ñ€Ñ�дом Ñ�о значками Show/hide text beside icons Показывать или Ñ�крывать текÑ�Ñ‚ Ñ€Ñ�дом Ñ�о значками &Center &Центрировать Center Центрировать Center view Центрировать вид &Refresh О&бновить Refresh Обновить Refresh view Обновить вид F5 F5 Zoom &In &Приблизить Zoom In Приблизить Ctrl++ Ctrl++ Zoom &Out От&далить Zoom Out Отдалить Ctrl+- Ctrl+- Zoom &Fit УмеÑ�тить вÑ�&Ñ‘ в окне Zoom Fit УмеÑ�тить вÑ�Ñ‘ в окне Ctrl+0 Ctrl+0 Zoom &Reset СброÑ�ить &маÑ�штаб Zoom Reset СброÑ�ить маÑ�штаб Ctrl+1 Ctrl+1 &Zoom Range Приблизить в&ыделенное Zoom Range Приблизить выделенное JACK &Audio... JACK &Audio... JACK Audio color Цвет JACK Audio JACK &MIDI... JACK &MIDI... JACK MIDI JACK MIDI JACK MIDI color Цвет JACK MIDI ALSA M&IDI... ALSA M&IDI... ALSA MIDI ALSA MIDI ALSA MIDI color Цвет ALSA MIDI JACK &CV... JACK &CV... JACK CV color Цвет JACK CV JACK &OSC... JACK &OSC... JACK OSC JACK OSC JACK OSC color Цвет JACK OSC &Reset С&броÑ�ить Reset colors СброÑ�ить цвета Port &Name По &названию порта Port name Ð�азвание порта Sort by port name Сортировать по названию порта Port &Title По &заголовку порта Port title По заголовку порта Sort by port title Сортировать по заголовку порта Port &Index По &индекÑ�у порта Port index По индекÑ�у порта Sort by port index Сортировать по индекÑ�у порта &Ascending По &нараÑ�танию Ascending По нараÑ�танию Ascending sort order ПорÑ�док Ñ�ортировки по нараÑ�танию &Descending По &убыванию Descending По убыванию Descending sort order ПорÑ�док Ñ�ортировки по убыванию Repel O&verlapping Nodes ОтброÑ�ить п&ерекрывающиеÑ�Ñ� узлы Repel nodes ОтброÑ�ить узлы Repel overlapping nodes ОтброÑ�ить перекрывающиеÑ�Ñ� узлы Connect Thro&ugh Nodes Соединение чер&ез узлы Connect Through Nodes Соединение через узлы Connect through nodes Соединение через узлы Whether to draw connectors through or around nodes ОпределÑ�ет, проводить ли Ñ�оединительные Ñ�лементы через узлы или вокруг них &About... &О программе... About... О программе... About О программе Show information about this application program Показать информацию об Ñ�той программе About &Qt... О &Qt... About Qt... О Qt... About Qt О Qt Show information about the Qt toolkit Показать информацию о наборе инÑ�трументов Qt &Undo &Отмена &Redo &Возврат Undo last edit action Отменить поÑ�леднее дейÑ�твие Redo last edit action Вернуть поÑ�леднее дейÑ�твие Zoom МаÑ�штаб Ready Готово Colors - %1 Цвета — %1 qjackctlMainForm &Start &ЗапуÑ�тить Start the JACK server ЗапуÑ�тить Ñ�ервер JACK S&top С&топ Stop the JACK server ОÑ�тановить Ñ�ервер JACK &Quit Ð’&ыход Quit processing and exit ОÑ�тановить Ñ�ервер и выйти из программы JACK is starting... ВыполнÑ�етÑ�Ñ� запуÑ�к JACK... JACK is stopping... ВыполнÑ�етÑ�Ñ� оÑ�тановка JACK... msec мÑ� Error Ошибка JACK server state СоÑ�тоÑ�ние Ñ�ервера JACK Sample rate ЧаÑ�тота Ñ�Ñ�мплированиÑ� Time display ВремÑ� Transport state СоÑ�тоÑ�ние передачи Transport BPM BPM передачи Transport time ВремÑ� передачи &Play &ВоÑ�произвеÑ�ти Start transport rolling ЗапуÑ�тить прокрутку передачи Pa&use Пау&за Stop transport rolling ОÑ�тановить прокрутку передачи St&atus С&татуÑ� Ab&out... О про&грамме... Show information about this application Показать информацию о приложении Show settings and options dialog Показать диалог наÑ�тройки программы &Messages С&ообщениÑ� Patch&bay &Коммутатор Show/hide the patchbay editor window Показать/Ñ�крыть окно коммутатора &Connections Сое&динениÑ� successfully уÑ�пешно Activating Ð�ктивируетÑ�Ñ� Starting ЗапуÑ�к The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Программа продолжит работать в облаÑ�ти уведомлениÑ�. ДлÑ� завершениÑ� выберите в контекÑ�тном меню облаÑ�ти уведомлениÑ� пункт «Выход». Startup script... Сценарий запуÑ�ка... Startup script terminated Выполнение Ñ�ценариÑ� запуÑ�ка прекращено Started Запущен Stopping ОÑ�тановка JACK was stopped Cервер JACK оÑ�тановлен Shutdown script... Сценарий выключениÑ�... Shutdown script terminated Выполнение Ñ�ценариÑ� выключениÑ� прекращено Inactive Ð�е активен Active Ð�ктивен Stopped ОÑ�тановлен Could not load active patchbay definition. "%1" Disabled. Ð�е удалоÑ�ÑŒ загрузить опиÑ�ание активного коммутатора. «%1» Отключено. Statistics reset. ПерезапуÑ�к Ñ�татиÑ�тики Shutdown notification. Уведомление об оÑ�тановке checked проверено connected Ñ�оединено failed не удалоÑ�ÑŒ Client activated. Клиент активирован Post-startup script... Сценарий поÑ�ле запуÑ�ка... Post-startup script terminated Выполнение Ñ�ценариÑ� поÑ�ле запуÑ�ка прекращено Client deactivated. Клиент деактивирован Transport start. Передача запущена Transport stop. Передача оÑ�тановлена Yes Да No Ð�ет Rolling Прокрутка Looping Цикл Transport time code Тайм-код передачи Elapsed time since last reset Времени Ñ� поÑ�ледней перезагрузки Elapsed time since last XRUN Времени Ñ� поÑ�леднего XRUN disconnected отÑ�оединено Command line argument... Ð�ргумент командной Ñ�троки... Command line argument started Ð�ргумент командной Ñ�троки запущен Information ИнформациÑ� Do you want to restart the JACK audio server? ПерезапуÑ�тить звуковой Ñ�ервер JACK? Some settings will be only effective the next time you start this program. Ð�екоторые изменениÑ� вÑ�тупÑ�Ñ‚ в Ñ�илу только при Ñ�ледующем запуÑ�ке программы. JACK server mode Режим Ñ�ервера JACK Server settings will be only effective after restarting the JACK audio server. Параметры работы Ñ�ервера JACK вÑ�тупÑ�Ñ‚ в Ñ�илу только при Ñ�ледующем запуÑ�ке Ñ�ервера. RT RT &Hide С&крыть S&how &Показать &Stop &Стоп Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Ð�е удалоÑ�ÑŒ открыть Ñ�еквенÑ�ер ALSA как клиентÑ�кое приложение. Коммутатор ALSA MIDI будет недоÑ�тупен. D-BUS: Service is available (%1 aka jackdbus). D-BUS: Ñ�лужба доÑ�тупна (%1, извеÑ�тный как jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: Ñ�лужба недоÑ�тупна (%1, извеÑ�тный как jackdbus). Warning Предупреждение JACK is currently running. Do you want to terminate the JACK audio server? Сервер JACK работает. Ð’Ñ‹ хотите оÑ�тановить его? Don't ask this again Больше не Ñ�прашивать with exit status=%1 Ñ�о Ñ�татуÑ�ом выхода %1 Could not start JACK. Maybe JACK audio server is already started. Ð�е удалоÑ�ÑŒ запуÑ�тить JACK. Возможно, звуковой Ñ�ервер уже запущен. Could not load preset "%1". Retrying with default. Ð�е удалоÑ�ÑŒ загрузить профиль «%1». Попытка загрузить иÑ�пользуемый по умолчанию профиль. Could not load default preset. Sorry. Ð�е удалоÑ�ÑŒ запуÑ�тить профиль по умолчанию. D-BUS: JACK server is starting... D-BUS: запуÑ�каетÑ�Ñ� Ñ�ервер JACK... D-BUS: JACK server could not be started. Sorry D-BUS: не удалоÑ�ÑŒ запуÑ�тить Ñ�ервер JACK. Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Ð�екоторые клиентÑ�кие звуковые приложениÑ� вÑ�Ñ‘ ещё активны и подÑ�оединены. ОÑ�тановить звуковой Ñ�ервер JACK? D-BUS: JACK server is stopping... D-BUS: Ñ�ервер JACK оÑ�танавливаетÑ�Ñ�... D-BUS: JACK server could not be stopped. Sorry D-BUS: не удалоÑ�ÑŒ оÑ�тановить Ñ�ервер JACK. Post-shutdown script... ВыполнÑ�етÑ�Ñ� Ñ�ценарий поÑ�ле выключениÑ�… Post-shutdown script terminated Выполнение Ñ�ценариÑ� поÑ�ле выключениÑ� прекращено JACK was started with PID=%1. JACK был запущен Ñ� PID=%1. Don't show this message again Больше не показывать Ñ�то Ñ�ообщение The preset aliases have been changed: "%1" Do you want to save the changes? Ð�лиаÑ�Ñ‹ профилей изменилиÑ�ÑŒ: «%1» Сохранить изменениÑ�? D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: Ñ�ервер JACK был запущен (%1, извеÑ�тный как jackdbus). JACK is being forced... Принудительное выполнение JACK… D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: Ñ�ервер JACK был оÑ�тановлен (%1, извеÑ�тный как jackdbus). Transport BBT (bar.beat.ticks) BBT передачи (такт.долÑ�.тики) Patchbay reset. Коммутатор Ñ�брошен. Patchbay activated. Коммутатор активирован. Patchbay deactivated. Коммутатор деактивирован. JACK connection graph change. Смена графа Ñ�оединений JACK. XRUN callback (%1). Обратный вызов XRUN (%1). Buffer size change (%1). Смена размера буфера (%1). Freewheel started... Запущен Ñ�вободный ход… Freewheel exited. Выход из режима Ñ�вободного хода. Could not start JACK. Sorry. Ð�е удалоÑ�ÑŒ запуÑ�тить JACK. JACK has crashed. Произошёл Ñ�бой в работе JACK. JACK timed out. Превышено времÑ� ожиданиÑ� запуÑ�ка JACK. JACK write error. Ошибка запиÑ�и JACK. JACK read error. Ошибка чтениÑ� JACK. Unknown JACK error (%d). Ð�еизвеÑ�тнаÑ� ошибка JACK (%d). JACK property change. Изменение Ñ�войÑ�тва JACK. ALSA connection graph change. Смена графа Ñ�оединений ALSA. JACK active patchbay scan Сканирование активного коммутатора JACK. ALSA active patchbay scan Сканирование активного коммутатора ALSA. JACK connection change. Смена Ñ�оединений JACK. ALSA connection change. Смена Ñ�оединений ALSA. A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Ð’ наÑ�тоÑ�щее времÑ� активно определение коммутатора, что может привеÑ�ти к повторному Ñ�оединению: %1 -> %2 Удалить Ñ�оединение коммутатора? %1 (%2%, %3 xruns) %1 (%2%, %3 xrun) FW Свободный ход &Versioning &ВерÑ�ии Re&fresh О&бновить D-BUS: GetParameterConstraint('%1'): %2. (%3) D-BUS: GetParameterConstraint('%1'): %2. (%3) &Graph &Граф D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) Overall operation failed. Выполнение операции в целом неудачно. %1 is about to terminate. Are you sure? %1 Ñ�ейчаÑ� прекратит работу. Ð’Ñ‹ уверены? Invalid or unsupported option. Ð�екорректный или неподдерживаемый параметр Client name not unique. ИмÑ� клиента не уникально. Server is started. Сервер запущен. Unable to connect to server. Ð�е удалоÑ�ÑŒ Ñ�оединитьÑ�Ñ� Ñ� Ñ�ервером. Server communication error. Ошибка коммуникации Ñ� Ñ�ервером. Client does not exist. Клиент не Ñ�ущеÑ�твует. Unable to load internal client. Ð�е удалоÑ�ÑŒ загрузить внутренний клиент. Unable to initialize client. Ð�е удалоÑ�ÑŒ инициализировать клиент. Unable to access shared memory. Ð�е удалоÑ�ÑŒ получить доÑ�туп к разделÑ�емой памÑ�ти. Client protocol version mismatch. Ð�еÑ�овпадение верÑ�ии клиентÑ�кого протокола. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Ð�е удалоÑ�ÑŒ Ñ�оединитьÑ�Ñ� Ñ� Ñ�ервером JACK. — %1 ПроÑ�мотрите вывод в окне Ñ�ообщений. Server configuration saved to "%1". КонфигурациÑ� Ñ�ервера Ñ�охранена в «%1». Transport rewind. Перемотка к началу Transport backward. Перемотка назад Transport forward. Перемотка вперёд %1 (%2%) %1 (%2%) %1 % %1% %1 Hz %1Гц %1 frames %1 выб. %1 msec %1 мÑ� XRUN callback (%1 skipped). Обратный вызов XRUN (%1 пропущен). Mi&nimize &Свернуть Rest&ore &ВоÑ�Ñ�тановить &Reset С&броÑ�ить &Presets &Профили S&ession С&еанÑ�Ñ‹ &Load... &Загрузить... &Save... &Сохранить… Save and &Quit... Сохранить и вы&йти… Save &Template... Сохранить &шаблон… &Transport &Передача &Rewind К &началу Set&up... &Параметры &Patchbay &Коммутатор &Connect &СоединениÑ� DSP Load Загрузка DSP XRUN Count (notifications) ЧиÑ�ло XRUN (уведомлений) Show/hide the session management window Показать/Ñ�крыть окно управлениÑ� Ñ�еанÑ�ами Show/hide the messages log/status window Показать Ñ�крыть окно журнала Ñ�ообщений/Ñ�оÑ�тоÑ�ниÑ� Show/hide the graph window Показать/Ñ�крыть окно графа Show/hide the connections window Показать/Ñ�крыть окно Ñ�оединений Backward transport Перемотать назад &Backward Ð�&азад Forward transport Перемотать вперёд &Forward &Вперёд Rewind transport Перемотать к началу qjackctlMessagesStatusForm Messages / Status СообщениÑ�/Ñ�татуÑ� &Messages С&ообщениÑ� Messages log Журнал Ñ�ообщений Messages output log Журнал выведенных Ñ�ообщений &Status С&татуÑ� Status information ИнформациÑ� о Ñ�татуÑ�е Statistics since last server startup СтатиÑ�тика Ñ� поÑ�леднего запуÑ�ка Ñ�ервера Description ОпиÑ�ание Value Значение Reset XRUN statistic values Обнулить Ñ�татиÑ�тику по раÑ�Ñ�инхронизации Re&set С&броÑ�ить Refresh XRUN statistic values Обновить Ñ�татиÑ�тику по раÑ�Ñ�инхронизации &Refresh &Обновить Server name ИмÑ� Ñ�ервера Server state СтатуÑ� Ñ�ервера DSP Load Загрузка DSP Sample Rate ЧаÑ�тота Ñ�Ñ�мплированиÑ� Buffer Size Размер буфера Realtime Mode Режим реального времени Transport state СоÑ�тоÑ�ние передачи Transport Timecode Тайм-код передачи Transport BBT BBT передачи Transport BPM BPM передачи XRUN count since last server startup РаÑ�Ñ�инхронизаций Ñ� поÑ�леднего запуÑ�ка Ñ�ервера XRUN last time detected ПоÑ�леднÑ�Ñ� обнаруженнаÑ� раÑ�Ñ�инхронизациÑ� XRUN last ПоÑ�леднÑ�Ñ� раÑ�Ñ�инхронизациÑ� XRUN maximum МакÑ�имальнаÑ� раÑ�Ñ�инхронизациÑ� XRUN minimum МинимальнаÑ� раÑ�Ñ�инхронизациÑ� XRUN average СреднÑ�Ñ� длительноÑ�ть раÑ�Ñ�инхронизаций XRUN total Ð’Ñ�его раÑ�Ñ�инхронизаций Maximum scheduling delay МакÑ�имальнаÑ� задержка раÑ�пиÑ�аниÑ� Time of last reset ВремÑ� поÑ�леднего Ñ�броÑ�а Logging stopped --- %1 --- Журналирование оÑ�тановлено --- %1 --- Logging started --- %1 --- Журналирование запущено --- %1 --- qjackctlPaletteForm Color Themes Цветовые темы Name Ð�азвание Current color palette name Ð�азвание текущей цветовой палитры Save current color palette name Сохранить название текущей цветовой палитры Save Сохранить Delete current color palette name Удалить название текущей цветовой палитры Delete Удалить Palette Палитра Current color palette ТекущаÑ� цветоваÑ� палитра Generate: Создать: Base color to generate palette Базовый цвет длÑ� генерированиÑ� палитры Reset all current palette colors СброÑ�ить вÑ�е иÑ�пользуемые цвета Reset СброÑ�ить Import a custom color theme (palette) from file Импорт пользовательÑ�кой цветовой темы (палитры) из файла Import... Импорт... Export a custom color theme (palette) to file ЭкÑ�порт пользовательÑ�кой цветовой темы (палитры) из файла Export... ЭкÑ�порт... Show Details ПодробноÑ�ти Import File - %1 Импорт файла — %1 Palette files (*.%1) Файлы палитр (*.%1) Save Palette - %1 Сохранить палитру — %1 All files (*.*) Ð’Ñ�е файлы (*.*) Warning - %1 Предупреждение — %1 Could not import from file: %1 Sorry. Ð�е удалоÑ�ÑŒ импортировать из файла: %1 Export File - %1 ЭкÑ�порт файла — %1 Some settings have been changed. Do you want to discard the changes? Ð�екоторые параметры изменилиÑ�ÑŒ. Отменить изменениÑ�? Some settings have been changed: "%1". Do you want to save the changes? Ð�екоторые параметры изменилиÑ�ÑŒ: «%1» Сохранить изменениÑ�? qjackctlPaletteForm::PaletteModel Color Role Роль цвета Active Ð�ктивен Inactive Ð�е активен Disabled Выключен qjackctlPatchbay Warning Предупреждение This will disconnect all sockets. Are you sure? Ð’Ñ�е Ñ�океты будут раÑ�Ñ�оединены. Продолжить? qjackctlPatchbayForm &New &Создать Create a new patchbay profile Создать новый профиль коммутатора &Load... &Загрузить... Load patchbay profile Загрузить профиль коммутатора &Save... &Сохранить... Save current patchbay profile Сохранить текущий профиль коммутатора Acti&vate &Ð�ктивировать &Connect &Соединить Connect currently selected sockets Соединить выбранные Ñ�ейчаÑ� Ñ�океты &Disconnect &РаÑ�Ñ�оединить Disconnect currently selected sockets РаÑ�Ñ�оединить выбранные Ñ�ейчаÑ� Ñ�океты Disconnect &All РаÑ�Ñ�оединить &вÑ�е Disconnect all currently connected sockets РаÑ�Ñ�оединить вÑ�е Ñ�оединённые Ñ�ейчаÑ� Ñ�океты &Refresh &Обновить Refresh current patchbay view Обновить текущий вид коммутатора Down Вниз Move currently selected output socket down one position ПеремеÑ�тить выбранный Ñ�ейчаÑ� Ñ�окет вниз на одну позицию Add... Добавить... Create a new output socket Создать новый Ñ�окет выхода Edit... Изменить... Edit currently selected input socket properties Изменить Ñ�войÑ�тва выбранного Ñ�ейчаÑ� Ñ�окета входа Up Вверх Move currently selected output socket up one position ПеремеÑ�тить выбранный Ñ�ейчаÑ� Ñ�окет вверх на одну позицию Remove Удалить Remove currently selected output socket Удалить выбранный Ñ�ейчаÑ� Ñ�окет выхода Patchbay Коммутатор Remove currently selected input socket Удалить выбранный Ñ�ейчаÑ� Ñ�окет входа Create a new input socket Создать новый Ñ�окет входа Edit currently selected output socket properties Изменить Ñ�войÑ�тва выбранного Ñ�ейчаÑ� Ñ�окета выхода Warning Предупреждение active активно New Patchbay definition Ð�овое опиÑ�ание коммутатора Patchbay Definition files Файлы опиÑ�аниÑ� коммутатора Load Patchbay Definition Загрузить опиÑ�ание коммутатора Save Patchbay Definition Сохранить опиÑ�ание коммутатора The patchbay definition has been changed: "%1" Do you want to save the changes? ОпиÑ�ание коммутатора изменилоÑ�ÑŒ: «%1» Сохранить изменениÑ�? %1 [modified] %1 [изменено] Untitled%1 Без имени %1 Error Ошибка Could not load patchbay definition file: "%1" Ð�е удалоÑ�ÑŒ загрузить файл опиÑ�аниÑ� коммутатора: «%1» Could not save patchbay definition file: "%1" Ð�е удалоÑ�ÑŒ Ñ�охранить файл опиÑ�аниÑ� коммутатора: «%1» Create patchbay definition as a snapshot of all actual client connections? Создать опиÑ�ание коммутатора как Ñ�нимок активных Ñ�оединений клиентов? Duplicate (copy) currently selected output socket Дублировать (копировать) выбранное в данный момент выходное гнездо Copy... Скопировать... Duplicate (copy) currently selected input socket Дублировать (копировать) выбранное в данный момент входное гнездо Expand all items Развернуть вÑ�е Ñ�лементы E&xpand All &Развернуть вÑ�е Current (recent) patchbay profile(s) Текущий (недавний) профиль коммутатора Toggle activation of current patchbay profile Включить или отключить текущий профиль коммутатора qjackctlPatchbayView Add... Добавить... Edit... Изменить... Remove Удалить Move Up Выше Move Down Ð�иже &Connect &Соединить Alt+C Connect Alt+C &Disconnect &ОтÑ�оединить Alt+D Disconnect Alt+D Disconnect &All ОтÑ�оединить &вÑ�е Alt+A Disconnect All Alt+A &Refresh &Обновить Alt+R Refresh Alt+R Exclusive ИÑ�ключительный Copy... Скопировать... Forward Вперёд (None) (Ð�ет) qjackctlSessionForm Session СеанÑ� Load session Загрузить Ñ�еанÑ� &Load... &Загрузить… Recent session Ð�едавние Ñ�еанÑ�Ñ‹ &Recent &Ð�едавние Save session Сохранить Ñ�еанÑ� &Versioning &ВерÑ�ии Re&fresh О&бновить Session clients / connections Клиенты и Ñ�оединениÑ� Ñ�еанÑ�а Infra-clients / commands Инфра-клиенты и команды Infra-client Инфра-клиент Infra-command Инфра-команда Add infra-client Добавить инфра-клиент &Add &Добавить Edit infra-client Изменить инфра-клиент &Edit &Изменить Remove infra-client Удалить инфра-клиент Re&move &Удалить &Save... &Сохранить… Update session Обновить Ñ�еанÑ� Client / Ports Клиенты/порты UUID UUID Command Команда &Save &Сохранить Load Session Загрузить Ñ�еанÑ� Session directory Каталог Ñ�еанÑ�ов Save Session Сохранить Ñ�еанÑ� and Quit и выйти Template Шаблон &Clear О&чиÑ�тить Warning Предупреждение A session could not be found in this folder: "%1" Ð�е удалоÑ�ÑŒ найти Ñ�еанÑ� в каталоге «%1» %1: loading session... %1: загружаетÑ�Ñ� Ñ�еанÑ�... %1: load session %2. %1: загрузить Ñ�еанÑ� %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Ð’ Ñ�той папке уже еÑ�ть Ñ�еанÑ�: «%1» Ð’Ñ‹ уверены, что хотите перезапиÑ�ать его? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Эта папка уже Ñ�ущеÑ�твует и не пуÑ�та: «%1» Ð’Ñ‹ уверены, что хотите перезапиÑ�ать Ñ�ущеÑ�твующую папку? %1: saving session... %1: Ñ�охранÑ�етÑ�Ñ� Ñ�еанÑ�... %1: save session %2. %1: Ñ�охранить Ñ�еанÑ� %2. New Client Ð�овый клиент Save and &Quit... Сохранить и вы&йти… Save &Template... Сохранить &шаблон… qjackctlSessionInfraClientItemEditor Infra-command Инфра-команда qjackctlSessionSaveForm Session СеанÑ� &Name: &ИмÑ�: Session name ИмÑ� Ñ�еанÑ�а &Directory: &Каталог: Session directory Каталог Ñ�еанÑ�ов Browse for session directory ПоиÑ�к каталога Ñ�еанÑ�ов ... ... Save session versioning СохранÑ�ть верÑ�ии Ñ�еанÑ�ов &Versioning &ВерÑ�ии Warning Предупреждение Session directory does not exist: "%1" Do you want to create it? Каталог Ñ�еанÑ�ов не Ñ�ущеÑ�твует: «%1» Создать его? Session Directory Каталог Ñ�еанÑ�ов qjackctlSetupForm Settings Параметры jackd DO NOT TRANSLATE jackdmp DO NOT TRANSLATE jackstart DO NOT TRANSLATE dummy DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 sun DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 oss DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 alsa DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 portaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 coreaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 firewire DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Parameters Параметры 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 Sample rate in frames per second ЧаÑ�тота диÑ�кретизации выборок в Ñ�екунду 6 6 7 7 8 8 9 9 10 10 Scheduler priority when running realtime Приоритет планировщика в режиме реального времени 21333 21333 16 16 32 32 Priorit&y: П&риоритет: &Wait (usec): О&жидание (мÑ�): &Frames/Period: &Выборок в буфере: 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Выборок в период между вызовами process() Sample &Rate: &ЧаÑ�тота диÑ�кр.: H/&W Meter Ð�ппаратный &Ñ�чётчик None Ð�ет Rectangular ПрÑ�моугольное Shaped По очертаниÑ�м Triangular Треугольное Duplex ДуплекÑ� Provide either audio capture, playback or both Разрешить захват звука, его воÑ�произведение или вÑ�Ñ‘ Ñ�разу hw:0 hw:0 &Timeout (msec): &Тайм-аут (мÑ�): Dit&her: Подмешивание &шума: 200 200 500 500 1000 1000 2000 2000 5000 5000 Set client timeout limit in milliseconds УÑ�тановить тайм-аут длÑ� клиента в миллиÑ�екундах &Interface: &ИнтерфейÑ�: So&ft Mode &Программный режим &Monitor &Контроль Provide output monitor ports ЗадейÑ�твовать порты контролÑ� выхода &Realtime Режим &реал. времени Use realtime scheduling ИÑ�пользовать планирование в реал. времени (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Whether to give verbose output on messages Подробно ли выводить Ñ�ообщениÑ� Latency: Задержка: Output latency in milliseconds, calculated based on the period, rate and buffer settings Задержка выхода в мÑ�, раÑ�читанных на оÑ�нове наÑ�троек периода, чаÑ�тоты и буфера Options Параметры Scripting Сценарии Execute script on Start&up: ВыполнÑ�ть Ñ�ценарий при &запуÑ�ке: Whether to execute a custom shell script before starting up the JACK audio server. ВыполнÑ�ть ли Ñ�обÑ�твенный Ñ�ценарий перед запуÑ�ком Ñ�ервера JACK. Execute script after &Startup: ВыполнÑ�ть Ñ�ценарий поÑ�ле з&апуÑ�ка: Whether to execute a custom shell script after starting up the JACK audio server. ВыполнÑ�ть ли Ñ�обÑ�твенный Ñ�ценарий поÑ�ле запуÑ�ка Ñ�ервера JACK. Whether to execute a custom shell script after shuting down the JACK audio server. ВыполнÑ�ть ли Ñ�обÑ�твенный Ñ�ценарий поÑ�ле оÑ�тановки Ñ�ервера JACK. Command line to be executed before starting up the JACK audio server Команда, выполнÑ�емаÑ� перед запуÑ�ком Ñ�ервера JACK ... ... Browse for script to be executed before starting up the JACK audio server Указать Ñ�ценарий, выполнÑ�емый перед запуÑ�ком Ñ�ервера JACK Command line to be executed after starting up the JACK audio server Команда, выполнÑ�емаÑ� поÑ�ле запуÑ�ка Ñ�ервера JACK Browse for script to be executed after starting up the JACK audio server Указать Ñ�ценарий, выполнÑ�емый поÑ�ле запуÑ�ка Ñ�ервера JACK Browse for script to be executed after shutting down the JACK audio server Указать Ñ�ценарий, выполнÑ�емый поÑ�ле оÑ�тановки Ñ�ервера JACK Command line to be executed after shutting down the JACK audio server Команда, выполнÑ�емаÑ� поÑ�ле оÑ�тановки Ñ�ервера JACK Statistics СтатиÑ�тика &XRUN detection regex: &РегулÑ�рное выражение длÑ� определениÑ� XRUN: xrun of at least ([0-9|\.]+) msecs xrun не менее ([0-9|\.]+) мÑ� Regular expression used to detect XRUNs on server output messages РегулÑ�рное выражение длÑ� определениÑ� раÑ�Ñ�инхронизаций Ñ�реди Ñ�ообщений от Ñ�ервера Connections СоединениÑ� Patchbay definition file to be activated as connection persistence profile Файл опиÑ�аниÑ� коммутатора, активируемый как профиль поÑ�тоÑ�нного Ñ�оединениÑ� Browse for a patchbay definition file to be activated Указать активируемый файл опиÑ�аниÑ� коммутатора Activate &Patchbay persistence: Ð�ктивировать &поÑ�тоÑ�нный коммутатор: Whether to activate a patchbay definition for connection persistence profile. Ð�ктивировать ли опиÑ�ание коммутатора длÑ� профилÑ� поÑ�тоÑ�нного Ñ�оединениÑ�. Display ИнтерфейÑ� Transport &BBT (bar:beat.ticks) &BBT передачи (такт:долÑ�.тики) Elapsed time since last &Reset ВремÑ�, прошедшее Ñ� поÑ�леднего &Ñ�броÑ�а Elapsed time since last &XRUN ВремÑ�, пошедшее Ñ� поÑ�ледней &раÑ�Ñ�инхронизации Messages Window Окно Ñ�ообщений Sample messages text font display Каким будет шрифт длÑ� вывода Ñ�ообщений Ñ�ервера &Font... &Шрифт... Select font for the messages text display Выберите шрифт длÑ� отображениÑ� Ñ�ообщений Ñ�ервера msec мÑ� n/a н/д Patchbay Definition files Файлы опиÑ�аниÑ� коммутатора Driv&er: &Драйвер: Preset &Name: ИмÑ� &профилÑ�: Settings preset name ИмÑ� профилÑ� параметров &Save &Сохранить Save settings as current preset name Сохранить параметры в текущий профиль &Delete &Удалить Delete current settings preset Удалить текущий профиль &Audio: &Звук: Force &16bit Принудительно &16 бит Force 16bit mode instead of failing over 32bit (default) Принудительно иÑ�пользовать 16-битный режим вмеÑ�то 32-битного (по умолчанию) Periods/&Buffer: Периодов на &буфер: Time in seconds that client is delayed after server startup Сколько Ñ�екунд клиент ждёт поÑ�ле запуÑ�ка Ñ�ервера > > Scripting argument meta-symbols МетаÑ�имволы аргументов в Ñ�ценариÑ�Ñ… &Capture standard output &Захватывать Ñ�тандартный вывод Whether to capture standard output (stdout/stderr) into messages window Захватывать ли Ñ�тандартный вывод (stdout/stderr) Other Другое &Confirm application close За&прашивать подтверждение на выход Whether to ask for confirmation on application exit Спрашивать ли подтверждение на выход из программы &Preset Name ИмÑ� &профилÑ� &Server Path За&пуÑ�к Ñ�ервера &Driver &Драйвер &Interface &ИнтерфейÑ� Sample &Rate &ЧаÑ�тота диÑ�кр. &Frames/Period &Выборок/период Periods/&Buffer Периодов/&буфер Port Ma&ximum: &МакÑ�. портов: Maximum number of ports the JACK server can manage МакÑ�имальное кол-во портов, обрабатываемых Ñ�ервером JACK &Input Device: УÑ�тройÑ�тво &входа: &Output Device: УÑ�тройÑ�тво в&ыхода: /dev/dsp /dev/dsp No Memory Loc&k Б&ез блокировки памÑ�ти Do not attempt to lock memory, even if in realtime mode Ð�е пытайтеÑ�ÑŒ заблокировать памÑ�ть, даже в режиме реального времени &Ignore H/W &Игнорировать апп. буфер и период &Word Length: Ра&зрÑ�дноÑ�ть Ñ�лова: Time Display Отображение времени Transport &Time Code &Тайм-код передачи Sample front panel normal display font Пример текÑ�та в малом Ñ�чётчике Sample big time display font Пример текÑ�та в большом Ñ�чётчике Normal display: Малый Ñ�чётчик: Big Time display: Большой Ñ�чётчик: &Messages limit: Предел кол-ва &Ñ�ообщений: Whether to keep a maximum number of lines in the messages window Ограничивать ли количеÑ�тво Ñ�трок в окне Ñ�ообщений 100 100 250 250 2500 2500 The maximum number of message lines to keep in view МакÑ�имальное количеÑ�тво Ñ�трок Ñ�ообщений, доÑ�тупное при проÑ�мотре &Start JACK audio server on application startup &ЗапуÑ�кать звуковой Ñ�ервер JACK при Ñ�тарте программы Whether to start JACK audio server immediately on application startup ЗапуÑ�кать ли Ñ�ервер JACK при Ñ�тарте QJackCtl &Keep child windows always on top О&кна программы вÑ�егда наверху Whether to keep all child windows on top of the main window ОпределÑ�ет, держать ли вÑ�е дочерние окна поверх главного окна &Enable system tray icon &Включить облаÑ�ть уведомлениÑ� Whether to enable the system tray icon Включать ли облаÑ�ть уведомлениÑ� (Ñ�иÑ�темный лоток, system tray) S&ave JACK audio server configuration to: Со&хранÑ�ть конфигурацию JACK в файл: Whether to save the JACK server command-line configuration into a local file (auto-start) ОпределÑ�ет, Ñ�охранÑ�ть ли конфигурацию командной Ñ�троки Ñ�ервера JACK в локальный файл (автозапуÑ�к) .jackdrc .jackdrc The server configuration local file name (auto-start) ИмÑ� локального файла конфигурации Ñ�ервера (автозапуÑ�к) System СиÑ�тема Cycle Цикл HPET HPET Don't restrict self connect requests (default) Ð�е ограничивать запроÑ�Ñ‹ на Ñ�амоÑ�оединение (по умолчанию) Fail self connect requests to external ports only ОтклонÑ�ть запроÑ�Ñ‹ на Ñ�амоÑ�оединение только Ñ� внешними портами Ignore self connect requests to external ports only Игнорировать запроÑ�Ñ‹ на Ñ�амоÑ�оединение только Ñ� внешними портами Fail all self connect requests ОтклонÑ�ть вÑ�е запроÑ�Ñ‹ на Ñ�амоÑ�оединение Ignore all self connect requests Игнорировать вÑ�е запроÑ�Ñ‹ на Ñ�амоÑ�оединение Warning Предупреждение Some settings have been changed: "%1" Do you want to save the changes? Ð�екоторые параметры изменилиÑ�ÑŒ: «%1» Сохранить изменениÑ�? Delete preset: "%1" Are you sure? Удалить профиль: «%1» Ð’Ñ‹ уверены? &Server Name &ИмÑ� Ñ�ервера Startup Script Сценарий, выполнÑ�емый при запуÑ�ке Post-Startup Script Сценарий, выполнÑ�емый поÑ�ле запуÑ�ка Shutdown Script Сценарий, выполнÑ�емый при выключении Post-Shutdown Script Сценарий, выполнÑ�емый поÑ�ле выключениÑ� Active Patchbay Definition Ð�ктивное опиÑ�ание коммутатора Messages Log Журнал Ñ�ообщений Log files Файлы журналов Information ИнформациÑ� Some settings may be only effective next time you start this application. Ð�екоторые параметры вÑ�тупÑ�Ñ‚ в Ñ�илу только при Ñ�ледующем запуÑ�ке приложениÑ�. Some settings have been changed. Do you want to apply the changes? Ð�екоторые параметры были изменены. Применить Ñ�ти изменениÑ�? &Name: &Ð�азвание: The JACK Audio Connection Kit sound server name ИмÑ� звукового Ñ�ервера JACK The audio backend driver interface to use ИÑ�пользуемый звуковой драйвер MIDI Driv&er: &Драйвер MIDI: The ALSA MIDI backend driver to use ИÑ�пользуемый драйвер ALSA MIDI none нет raw DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 seq DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Please do not touch these settings unless you know what you are doing. МенÑ�йте Ñ�ти параметры только еÑ�ли точно знаете, что делаете. Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Разблокировать памÑ�ть оÑ�новных библиотек интерфейÑ�ов (GTK+, QT, FLTK, Wine) &Unlock Memory &Разблокировать памÑ�ть Ignore xruns reported by the backend driver Игнорировать xrun, о которых Ñ�ообщает драйвер Enable hardware metering on cards that support it Включить аппаратное измерение длÑ� поддерживающих Ñ�ту функцию карт Ignore hardware period/buffer size Игнорировать аппаратный размер периода/буфера &Verbose messages &Подробный вывод Maximum input audio hardware channels to allocate МакÑ�имальное чиÑ�ло резервируемых каналов входа External output latency (frames) Задержка внешнего выхода (в выборках) Capture Only Только захват Playback Only Только воÑ�произведение The PCM device name to use ИмÑ� иÑ�пользуемого уÑ�тройÑ�тва PCM plughw:0 plughw:0 /dev/audio /dev/audio Alternate input device for capture Выберите уÑ�тройÑ�тво входа длÑ� захвата Maximum output audio hardware channels to allocate МакÑ�имальное резервируемое чиÑ�ло звуковых каналов уÑ�тройÑ�тва Alternate output device for playback Ð�льтернативное уÑ�тройÑ�тво воÑ�произведениÑ� External input latency (frames) Задержка внешнего входа (в выборках) Set dither mode Выберите Ñ�поÑ�об подмешиваниÑ� шума Server path (command line prefix) Путь к Ñ�ерверу (префикÑ� командной Ñ�троки) Number of periods in the hardware buffer КоличеÑ�тво периодов в аппаратном буфере &Channels: &Каналов: 192000 192000 Word length Длина Ñ�лова в байтах Maximum number of audio channels to allocate МакÑ�имальное чиÑ�ло резервируемых звуковых каналов &Channels I/O: Ввод/вывод &каналов: &Latency I/O: &Задержка ввода/вывода: Server Suffi&x: Су&ффикÑ� Ñ�ервера: Whether to execute a custom shell script before shuting down the JACK audio server. ОпределÑ�ет, выполнÑ�ть ли пользовательÑ�кий Ñ�ценарий оболочки перед выключением аудиоÑ�ервера JACK Execute script on Shut&down: Ð’&ыполнÑ�ть Ñ�ценарий при выходе: Browse for script to be executed before shutting down the JACK audio server Выбор Ñ�ценариÑ�, который будет выполнÑ�тьÑ�Ñ� перед выключением аудиоÑ�ервера JACK Command line to be executed before shutting down the JACK audio server КоманднаÑ� Ñ�трока, котораÑ� будет выполнÑ�тьÑ�Ñ� перед выключением аудиоÑ�ервера JACK Execute script after Shu&tdown: ВыполнÑ�ть Ñ�ценарий поÑ�ле &выключениÑ�: Whether to reset all connections when a patchbay definition is activated. ОпределÑ�ет, Ñ�браÑ�ывать ли вÑ�е Ñ�оединениÑ� при активации опиÑ�аниÑ� коммутатора &Reset all connections on patchbay activation С&браÑ�ывать вÑ�е Ñ�оединениÑ� при активации коммутатора Whether to issue a warning on active patchbay port disconnections. ОпределÑ�ет, показывать ли предупреждение о раÑ�Ñ�оединениии портов активного коммутатора &Warn on active patchbay disconnections Предупре&ждать о раÑ�Ñ�оединении в активном коммутаторе Logging Журналирование Messages log file Файл журнала Ñ�ообщений Browse for the messages log file location Указать раÑ�положение файла журнала Whether to activate a messages logging to file. ОпределÑ�ет, Ñ�охранÑ�ть ли протокол в файл журнала Setup Ð�аÑ�тройка Whether to use server synchronous mode ИÑ�пользовать ли Ñ�инхронный режим Ñ�ервера &Use server synchronous mode ИÑ�пользовать Ñ�ин&хронный режим Ñ�ервера Advanced Дополнительные &Messages log file: Файл &журнала: Select font for front panel normal display Выбрать шрифт длÑ� малого Ñ�чётчика Select font for big time display Выбрать шрифт длÑ� большого Ñ�чётчика Whether to enable blinking (flashing) of the server mode (RT) indicator ОпределÑ�ет, включать ли мерцание (мигание) индикатора режима Ñ�ервера (RT) Blin&k server mode indicator &Мерцать индикатором режима Ñ�ервера Connections Window Окно Ñ�оединений Sample connections view font Шрифт длÑ� диалога управлениÑ� Ñ�оединениÑ�ми Select font for the connections view Выберите шрифт длÑ� проÑ�мотра Ñ�оединений &Icon size: &Размер значков: The icon size for each item of the connections view Размер значка каждого Ñ�лемента в окне Ñ�оединений 16 x 16 16 × 16 32 x 32 32 × 32 64 x 64 64 × 64 Whether to enable in-place client/port name editing (rename) ОпределÑ�ет, разрешить ли редактирование (переименование) алиаÑ�ов клиентов/портов Ena&ble client/port aliases editing (rename) Ра&зрешить редактирование (переименование) алиаÑ�ов клиентов/портов Whether to enable client/port name aliases on the connections window ОпределÑ�ет, включать ли алиаÑ�Ñ‹ имён клиентов/портов в окне Ñ�оединений E&nable client/port aliases &Разрешить алиаÑ�Ñ‹ клиентов/портов Server &Prefix: Пре&фикÑ� Ñ�ервера: Extra driver options (command line suffix) Дополнительные ключи драйвера (Ñ�уффикÑ� в командной Ñ�троке) Start De&lay: Задер&жка запуÑ�ка: secs Ñ� 0 msecs 0 мÑ� Misc Разное Whether to stop JACK audio server on application exit ОÑ�танавливать ли звуковой Ñ�ервер JACK при выходе из приложениÑ� S&top JACK audio server on application exit ОÑ�та&навливать JACK при выходе из приложениÑ� Whether to start minimized to system tray ЗапуÑ�кать ли приложение в облаÑ�ти уведомлениÑ�, Ñ�крываÑ� оÑ�новное окно Clear settings of current preset name ОчиÑ�тить параметры текущего профилÑ� Clea&r О&чиÑ�тить Cloc&k source: ИÑ�точник данных чаÑ�о&в: Clock source ИÑ�точник данных чаÑ�ов S&elf connect mode: Режим &Ñ�амоÑ�оединениÑ�: Whether to restrict client self-connections ОпределÑ�ет, ограничивать ли Ñ�амоÑ�оединение клиентов Custom ПользовательÑ�кие &Color palette theme: Тема &цветовой палитры: Custom color palette theme ПользовательÑ�каÑ� тема цветовой палитры Wonton Soup DO NOT TRANSLATE KXStudio DO NOT TRANSLATE Manage custom color palette themes УправлÑ�ть пользовательÑ�кими темами цветовой палитры &Widget style theme: Тема Ñ�тилÑ� вид&жетов: Custom widget style theme ПользовательÑ�каÑ� тема Ñ�тилÑ� виджетов JACK client/port pretty-name (metadata) display mode Режим отображениÑ� читабельного имени (метаданных) клиента/порта JACK Enable JA&CK client/port pretty-names (metadata) Включить читабельные имена клиента/порта JA&CK (метаданные) Whether to ask for confirmation on JACK audio server shutdown and/or restart ОпределÑ�ет, нужно ли запрашивать подтверждение при выключении и/или перезапуÑ�ке звукового Ñ�ервера JACK Confirm server sh&utdown and/or restart Запрашивать по&дтверждение оÑ�тановки и перезагрузки Whether to show system tray message on main window close Показывать ли Ñ�ообщениÑ� программы в облаÑ�ти уведомлениÑ�, когда оÑ�новное окно Ñ�крыто Sho&w system tray message on close Показывать Ñ�ооб&щениÑ� в облаÑ�ти уведомлениÑ� Start minimi&zed to system tray ЗапуÑ�катьÑ�Ñ� Ñ�вёрнутым в Ñ�иÑ�темный &лоток Whether to enable ALSA Sequencer (MIDI) support on startup Включать ли при запуÑ�ке поддержку MIDI-Ñ�еквенÑ�ера ALSA E&nable ALSA Sequencer support &Включить поддержку Ñ�еквенÑ�ера ALSA Whether to enable JACK D-Bus interface Включать ли интерфейÑ� JACK по шине D-Bus &Enable JACK D-Bus interface Вкл&ючить интерфейÑ� JACK к шине D-Bus Buttons Кнопки Whether to hide the left button group on the main window Скрывать ли группу кнопок в левой чаÑ�ти оÑ�новного окна Hide main window &Left buttons Скрывать &левые кнопки оÑ�новного окна Whether to hide the right button group on the main window Скрывать ли группу кнопок в правой чаÑ�ти оÑ�новного окна Hide main window &Right buttons Скрывать прав&ые кнопки оÑ�новного окна Whether to hide the transport button group on the main window Скрывать ли группу кнопок управлениÑ� передачей в оÑ�новном окне Hide main window &Transport buttons Скрывать кнопки &передачи Whether to hide the text labels on the main window buttons Скрывать ли надпиÑ�и на кнопках в оÑ�новном окне Hide main window &button text labels Скрывать по&дпиÑ�и кнопок оÑ�новного окна &JACK client/port aliases: &Ð�лиаÑ�Ñ‹ клиентов/портов JACK: JACK client/port aliases display mode Режим отображениÑ� алиаÑ�ов клиентов/портов JACK Default По умолчанию First Первый Second Второй Whether to replace Connections with Graph button on the main window Заменить ли кнопку «СоединениÑ�» на кнопку «Граф» в главном окне Replace Connections with &Graph button Заменить кнопку «СоединениÑ�» на кнопку «&Граф» Defaults ИÑ�пользуемые по умолчанию параметры &Base font size: &Кегль шрифта в интерфейÑ�е: Base application font size (pt.) Кегль шрифта приложениÑ� (пт.) 11 11 12 12 net DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to enable D-Bus interface Влючать ли интерфейÑ� D-Bus &Enable D-Bus interface Вклю&чить интерфейÑ� D-Bus Number of microseconds to wait between engine processes (dummy) ВремÑ� ожиданиÑ� в микроÑ�екундах между Ñ�тапами обработки (фиктивное) netone DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to restrict to one single application instance (X11) ОпределÑ�ет, ограничивать ли до одной копии программы (X11) Single application &instance Зап&уÑ�кать только одну копию программы qjackctlSocketForm &Socket &Сокет &Client: &Клиент: Socket name (an alias for client name) ИмÑ� Ñ�окета (пÑ�евдоним имени клиента) &Name (alias): &ИмÑ� (пÑ�евдоним): Socket Plugs / Ports Сокетовые штепÑ�ели/порты Socket plug list СпиÑ�ок штепÑ�елей Ñ�окета &Down Ð’&низ &Up Ð’&верх Add plug to socket plug list Добавить штепÑ�ель в Ñ�пиÑ�ок штепÑ�елей Ñ�окета Socket Сокет &Plug: &ШтепÑ�ель: &Edit И&зменить &Remove &Удалить Remove currently selected plug from socket plug list Удалить выбранный штепÑ�ель из Ñ�пиÑ�ка штепÑ�елей Ñ�окета Plugs / Ports ШтепÑ�ели/порты Error Ошибка A socket named "%1" already exists. Сокет Ñ� именем «%1» уже Ñ�ущеÑ�твует. Add Plug Добавить штепÑ�ель Remove Удалить Edit Изменить Move Up ПеремеÑ�тить выше Move Down ПеремеÑ�тить ниже Client name (regular expression) ИмÑ� клиента (регулÑ�рное выражение) Add P&lug Добавить &штепÑ�ель Port name (regular expression) ИмÑ� порта (регулÑ�рное выражение) Type Тип &Audio &Звук Audio socket type (JACK) Тип звукового Ñ�окета (JACK) &MIDI &MIDI MIDI socket type (ALSA) Тип MIDI-Ñ�окета (ALSA) E&xclusive И&Ñ�ключительный Enforce only one exclusive cable connection Принудительно только одно кабельное Ñ�оединение Warning Предупреждение Some settings have been changed. Do you want to apply the changes? Ð�екоторые параметры были изменены. Применить Ñ�ти изменениÑ�? (None) (Ð�ет) Edit currently selected plug Изменить выбранный штепÑ�ель Move down currently selected plug in socket plug list ПеремеÑ�тить выбранный штепÑ�ель вниз в Ñ�пиÑ�ке штепÑ�елей Ñ�окета Move up current selected plug in socket plug list ПеремеÑ�тить выбранный штепÑ�ель вверх в Ñ�пиÑ�ке штепÑ�елей Ñ�окета &Forward: &Передача: Forward (clone) all connections from this socket Передача (клонирование) вÑ�ех Ñ�оединениÑ� от Ñ�того Ñ�окета MIDI socket type (JACK) Тип MIDI-Ñ�окета (JACK) AL&SA AL&SA qjackctlSocketList Output Выход Input Вход Socket Сокет Warning Предупреждение <New> - %1 <Ð�овый> — %1 %1 about to be removed: "%2" Are you sure? %1 будет удалён: «%2» Ð’Ñ‹ уверены? %1 <Copy> - %2 %1 <КопиÑ�> — %2 qjackctlSocketListView Output Sockets / Plugs Выходные Ñ�океты/штепÑ�ели Input Sockets / Plugs Входные Ñ�океты/штепÑ�ели qjackctl-1.0.6/src/translations/PaxHeaders/qjackctl_pt_BR.ts0000644000000000000000000000013215174607203021137 xustar0030 mtime=1777536643.524914226 30 atime=1777536643.523914233 30 ctime=1777536643.524914226 qjackctl-1.0.6/src/translations/qjackctl_pt_BR.ts0000644000175000001440000064022415174607203021137 0ustar00rncbcusers PortAudioProber Probing... Pesquisando... Please wait, PortAudio is probing audio hardware. Por favor espere, o PortAudio está testando o hardware de áudio. Warning Aviso Audio hardware probing timed out. O teste de hardware de áudio atingiu o tempo limite. QObject (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Start JACK audio server immediately. Inicie o servidor de áudio JACK imediatamente Set default settings preset name. Defina o nome da predefinição das configurações padrão. Set active patchbay definition file. Definir arquivo de definição do patchbay ativo. Set default JACK audio server name. Defina o nome do servidor de áudio JACK padrão. Show help about command line options. Mostre ajuda sobre opções de linha de comando. Show version information. Mostrar informações da versão. Displays help on command-line options. Launch command with arguments. Execute o comando com argumentos. [command-and-args] [comando-e-args] Option -p requires an argument (preset). Opção -p requer um argumento (preset). Usage: %1 [options] [command-and-args] Uso: %1 [options] [command-and-args] Options: Opções: Option -a requires an argument (path). A opção -a requer um argumento (caminho). Option -n requires an argument (name). Opção -n requer um argumento (nome). %1 (%2 frames) %1 (%2 quadros) Move Mover Rename Renomear qjackctlAboutForm About Sobre About Qt Sobre QT &Close &Fechar Version Versão Debugging option enabled. Depuração habilitada. System tray disabled. Bandeja do sistema desativada. Transport status control disabled. Controle de status de transporte desativado. Realtime status disabled. Status de tempo real desativado. XRUN delay status disabled. Atraso de XRUN desativado. Maximum delay status disabled. Status de atraso máximo desativado. ALSA/MIDI sequencer support disabled. Suporte ao sequenciador ALSA/MIDI desativado. Using: Qt %1 Usando: Qt %1 JACK %1 JACK %1 Website Website This program is free software; you can redistribute it and/or modify it Este programa é software livre; você pode redistribuí-lo e / ou modificá-lo under the terms of the GNU General Public License version 2 or later. sob os termos da GNU General Public License versão 2 ou posterior. JACK MIDI support disabled. Suporte JACK MIDI desativado. JACK Port aliases support disabled. Suporte a aliases das portas JACK desativadao. D-Bus interface support disabled. Suporte à interface D-Bus desativado. JACK Session support disabled. Suporte para sessão JACK desativado. qjackctlClientListView &Connect &Conectar Alt+C Connect Alt+C &Disconnect &Desconectar Alt+D Disconnect Alt+D Disconnect &All Desconectar &Tudo Alt+A Disconnect All Alt+T Re&name Re&nomear Alt+N Rename Alt+N &Refresh &Atualizar Alt+R Refresh Alt+R Readable Clients / Output Ports Clientes legíveis / Portas de saída Writable Clients / Input Ports Clientes graváveis / Portas de entrada qjackctlConnect Warning Aviso This will suspend sound processing from all client applications. Are you sure? Isto suspenderá o processamento de som para todas as aplicações do cliente. Tem certeza? qjackctlConnectionsForm Audio Ã�udio &Connect &Conectar Connect currently selected ports Conectar portas selecionadas &Disconnect &Desconectar Disconnect currently selected ports Desconectar as portas selecionadas Disconnect &All Desconectar &Tudo Disconnect all currently connected ports Desconectar todas as portas selecionadas &Refresh &Atualizar Refresh current connections view Atualizar a visualização das conexões atuais Connections Conexões MIDI MIDI ALSA ALSA Expand all client ports Expandir todas as portas de clientes E&xpand All E&xpandir Tudo qjackctlConnectorView &Connect &Conectar Alt+C Connect Alt+C &Disconnect &Desconectar Alt+D Disconnect Alt+D Disconnect &All Desconectar &Tudo Alt+A Disconnect All Alt+T &Refresh &Atualizar Alt+R Refresh Alt+R qjackctlGraphCanvas Connect Conectar Disconnect Disconnectar qjackctlGraphForm Graph Gráfico &Graph &Gráfico &Edit &Editar &View &Visualizar &Zoom &Zoom Co&lors Co&res S&ort C&lassificar &Help &Ajuda &Connect &Conectar Connect Conectar Connect selected ports Conectar portas selecionadas &Disconnect &Desconectar Disconnect Desconectar Disconnect selected ports Desconectar portas selecionadas Ctrl+C Ctrl+C T&humbview M&iniatura Ctrl+D Ctrl+D Cl&ose Fe&char Close Fechar Close this application window Feche esta janela da aplicação Select &All Selecionar &Tudo Select All Selecionar Tudo Ctrl+A Ctrl+A Select &None Selecionar &Nenhum Select None Selecionar Nenhum Ctrl+Shift+A Ctrl+Shift+A Select &Invert Selecionar &Inverter Select Invert Selecionar Inverter Ctrl+I Ctrl+I &Rename... &Renomear... Rename item Renomear item Rename Item Renomear Item F2 F2 &Find... &Encontrar... Find Encontrar Find nodes Encontrar nós Ctrl+F Ctrl+F &Menubar &Barra de menu Menubar Barra de menu Show/hide the main program window menubar Mostrar/ocultar a barra de menus da janela principal do programa Ctrl+M Ctrl+M &Toolbar &Barra de ferramentas Toolbar Barra de ferramentas Show/hide main program window file toolbar Mostrar/ocultar a barra de ferramentas do arquivo da janela principal do programa &Statusbar &Barra de status Statusbar Barra de status Show/hide the main program window statusbar Mostrar/ocultar a barra de status da janela principal do programa &Top Left &Superior Esquerdo Top left Superior esquerdo Show the thumbnail overview on the top-left Mostrar a visão geral das miniaturas no canto superior esquerdo Top &Right Superior &Direito Top right Superior Direito Show the thumbnail overview on the top-right Mostrar a visão geral das miniaturas no canto superior direito Bottom &Left Inferior &Esquerdo Bottom Left Inferior Esquerdo Bottom left Inferior Esquedo Show the thumbnail overview on the bottom-left Mostrar a visão geral das miniaturas no canto inferior esquerdo &Bottom Right &Inferior Direito Bottom right Inferior Direito Show the thumbnail overview on the bottom-right Mostrar a visão geral das miniaturas no canto inferior direito &None &Nenhum None Nenhum Hide thumbview Esconder miniaturas Hide the thumbnail overview Ocultar a visão geral das miniaturas Text Beside &Icons Texto ao lado de &ícones Text beside icons Texto ao lado de ícones Show/hide text beside icons Mostrar/ocultar texto ao lado de ícones &Center &Centro Center Centro Center view Visão central &Refresh &Atualizar Refresh Atualizar Refresh view Atualizar visualização F5 F5 Zoom &In Ampli&ar Zoom In Ampliar Ctrl++ Ctrl++ Zoom &Out Diminu&ir Zoom Out Diminuir Ctrl+- Ctrl+- Zoom &Fit Ajuste de &Zoom Zoom Fit Ajuste de Zoom Ctrl+0 Ctrl+0 Zoom &Reset Redefinir &Zoom Zoom Reset Redefinir Zoom Ctrl+1 Ctrl+1 &Zoom Range &Alcance de Zoom Zoom Range Alcance de Zoom JACK &Audio... JACK &áudio... JACK Audio color Cor JACK Ã�udio JACK &MIDI... JACK &MIDI... JACK MIDI JACK MIDI JACK MIDI color Cor de JACK MIDI ALSA M&IDI... ALSA M&IDI... ALSA MIDI ALSA MIDI ALSA MIDI color Cor ALSA MIDI JACK &CV... JACK &CV... JACK CV color Cor JACK CV JACK &OSC... JACK &OSC... JACK OSC JACK OSC JACK OSC color Cor JACK OSC &Reset &Redefinir Reset colors Redefinir cores Port &Name &Nome da porta Port name Nome da porta Sort by port name Classificar por nome de porta Port &Title & Título da porta Port title Título da porta Sort by port title Classificar por título da porta Port &Index & Ã�ndice da porta Port index Ã�ndice da porta Sort by port index Classificar por índice da porta &Ascending &Ascendente Ascending Ascendente Ascending sort order Classificar por ordem ascendente &Descending &Descendente Descending Descendente Descending sort order Classificar por ordem descendente Repel O&verlapping Nodes Repelir Nós S&obrepostos Repel nodes Repelir nós Repel overlapping nodes Repelir nós sobrepostos Connect Thro&ugh Nodes Conecte-se A&través de nós Connect Through Nodes Conecte-se Através de Nós Connect through nodes Conecte-se através de nós Whether to draw connectors through or around nodes Desenhar conectores através ou ao redor dos nós &About... Sobre... About... Sobre... About Sobre... Show information about this application program Mostrar informações sobre este aplicativo About &Qt... Sobre &Qt... About Qt... Sobre Qt... About Qt Sobre Qt Show information about the Qt toolkit Mostrar informações sobre as ferramentas do Qt &Undo &Desfazer &Redo &Refazer Undo last edit action Desfazer última ação Redo last edit action Refazer última ação Zoom Zoom Ready Pronto Colors - %1 Cores - %1 qjackctlMainForm &Quit &Sair Quit processing and exit Terminar processamento e sair &Start &Iniciar Start the JACK server Iniciar servidor JACK S&top P&arar Stop the JACK server Parar servidor JACK St&atus E&stado Ab&out... So&bre... Show information about this application Mostrar informações sobre o aplicativo. Show settings and options dialog Mostrar opções e preferências &Messages &Mensagens Patch&bay Patch&bay Show/hide the patchbay editor window Mostrar/ocultar o editor de patchbay &Connect &Conexões JACK server state Estado do servidor JACK JACK server mode Modo do servidor JACK Sample rate Taxa de amostragem Time display Visor do tempo Transport state Estado do transporte Transport BPM BPM do transporte Transport time Tempo do transporte Show/hide the graph window Esconder/mostrar janela gráfica Show/hide the connections window Esconder/mostrar janela de conexões Backward transport Retroceder transporte Forward transport Avançar transporte (Alt+L) Rewind transport Rebobinar transporte Stop transport rolling Parar transporte Start transport rolling Iniciar transporte Warning Aviso successfully satisfatoriamente with exit status=%1 com saída estado %1 Could not load preset "%1". Retrying with default. Não foi possível carregar predefinição "%1". Tentando com a predefinição padrão. Could not load default preset. Sorry. Não foi possível carregar predefinição. Desculpe. Startup script... Script de inicialização... Startup script terminated O script de inicialização finalizou JACK is starting... JACK está iniciando... Could not start JACK. Sorry. Não foi possível iniciar o JACK. Desculpe. JACK is stopping... JACK está parando... The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. O programa seguirá rodando na bandeja do sistema. Para terminá-lo, por favor escolha "Sair" no menu contextual do ícone na bandeja de sistema. Shutdown script... Script de desligamento... Shutdown script terminated O script de desligamento finalizou JACK was stopped JACK foi parado Post-shutdown script... Script pós-desligamento... D-BUS: Service is available (%1 aka jackdbus). D-BUS: Disponível (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: Indisponível (%1 aka jackdbus). Don't show this message again Não mostrar esta mensagem novamente Don't ask this again Não perguntar novamente D-BUS: JACK server is starting... D-BUS: Iniciando servidor JACK... D-BUS: JACK server could not be started. Sorry D-BUS: O servidor JACK não pode ser iniciado. Desculpe D-BUS: JACK server is stopping... D-BUS: Parando o servidor JACK... D-BUS: JACK server could not be stopped. Sorry D-BUS: O servidor JACK não pôde ser parado. Desculpe Post-shutdown script terminated O script pós-desligamento finalizou D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: O servidor JACK foi iniciado (%1 aka jackdbus). The preset aliases have been changed: "%1" Do you want to save the changes? Os aliases predefinidos foram alterados: "%1" Deseja salvar as alterações?? D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: O servidor JACK foi parado (%1 aka jackdbus). Error Erro Transport time code Código de tempo de transporte Elapsed time since last reset Tempo transcorrido desde o último reset Elapsed time since last XRUN Tempo transcorrido desde o último XRUN Patchbay activated. Patchbay ativado. Patchbay deactivated. Patchbay desativado. Statistics reset. Reiniciar estatísticas. msec mseg XRUN callback (%1). XRUN callback (%1). Buffer size change (%1). Mudança de tamanho de buffer (%1). Shutdown notification. Notificação de desligamento. Freewheel started... Modo roda-livre começou... Freewheel exited. Roda-livre saiu. JACK property change. Propriedades do JACK mudaram checked verificado connected conectado disconnected desconectado failed falhou Server configuration saved to "%1". Configuração do servidor salva em "%1". Client activated. Cliente ativado. Post-startup script... Script de pós-inicialização... Post-startup script terminated O script de pós-inicialização finalizou Command line argument... Argumento da linha de comando... Command line argument started Argumento da linha de comando iniciado Client deactivated. Cliente desativado. Transport rewind. Rebobinar transporte. Transport backward. Retroceder transporte. Starting Iniciando Transport start. Iniciar transporte. Stopping Parando Transport stop. Parar transporte. Transport forward. Avançar transporte. Stopped Parado Yes Sim No Não FW FW RT TR Rolling Rolando Looping Em loop XRUN callback (%1 skipped). XRUN callback (%1 omitidos). Started Iniciado Active Ativo Activating Ativando Inactive Inativo &Hide &Ocultar D-BUS: GetParameterConstraint('%1'): %2. (%3) D-BUS: GetParameterConstraint('%1'): %2. (%3) Mi&nimize Mi&nimizar S&how M&ostrar Rest&ore Rest&aurar &Stop &Parado &Reset &Reset &Connections &Conexões Server settings will be only effective after restarting the JACK audio server. As configurações do servidor só serão efetivadas após a reinicialização do servidor de áudio JACK. Do you want to restart the JACK audio server? Deseja reiniciar o servidor de audio do JACK? D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) Information Informação Some settings will be only effective the next time you start this program. Algumas configurações só serão efetivas na próxima vez que você iniciar este programa. Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Não foi possível abrir o sequenciador do ALSA como um cliente. O patchbay MIDI do ALSA não estará disponivel. JACK is currently running. Do you want to terminate the JACK audio server? JACK se está sendo executado. Deseja finalziar o servidor de áudio JACK? Could not start JACK. Maybe JACK audio server is already started. Não foi possível incializar o JACK. Talves o JACK já tenha sido inicializado. Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Algumas aplicações de áudio estão ativas e conectadas. Deseja parar o servidor de áudio JACK? %1 is about to terminate. Are you sure? % 1 está prestes a terminar. Você tem certeza? JACK was started with PID=%1. JACK inicializou com PID=%1. JACK is being forced... JACK está sendo forçado... Patchbay reset. Patchbay redefinido JACK connection graph change. Alteração no gráfico de conexão JACK. JACK has crashed. JACK caiu. JACK timed out. Tempo de espera do JACK esgotado. JACK write error. Erro de gravação JACK. JACK read error. Error de leitura JACK. Unknown JACK error (%d). Erro JACK desconhecido (%d). ALSA connection graph change. Alteração no gráfico de conexão ALSA. JACK active patchbay scan Varredura ativa do patchbay do JACK ALSA active patchbay scan Varredura ativa do patchbay ALSA JACK connection change. Alteração de conexão JACK. ALSA connection change. Alteração de conexão ALSA. A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Uma definição de patchbay está atualmente ativa, o que é provável para refazer esta conexão: %1 -> %2 Deseja remover a conexão? Overall operation failed. Operação global falhou. Invalid or unsupported option. Opcão inválida ou não soportada. Client name not unique. O nome do cliente não é único. Server is started. O servidor foi inicializado. Unable to connect to server. Não foi possível conectar-se ao servidor. Server communication error. Erro de comunicação com o servidor. Client does not exist. Cliente não existe. Unable to load internal client. Não é possível carregar o cliente interno. Unable to initialize client. Não é possível inicializar o cliente. Unable to access shared memory. Não é possível acessar a memória compartilhada. Client protocol version mismatch. Incompatibilidade de versão de protocolo do cliente. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Não foi possível conectar-se ao servidor JACK como cliente. - %1 Por favor, verifique a janela de mensagens para mais informações. %1 (%2%) %1 (%2%) %1 % %1 % %1 Hz %1 Hz %1 frames %1 quadros %1 msec %1 mseg &Presets &Predefinições &Graph &Gráfico &Transport &Transporte &Rewind Re&bobinar &Play &Reproduzir Pa&use Pa&usa &Patchbay &Patchbay DSP Load Uso de CPU do DSP XRUN Count (notifications) Conta de XRUNs (notificações) &Backward &Retroceder &Forward &Avançar Set&up... Con&figurar... S&ession S&essão &Load... &Abrir... &Save... &Salvar... Save and &Quit... Salvar e &Sair... Save &Template... Salvar mo&delo... Show/hide the session management window Mostrar/ocultar a janela de gerenciamento de sessão Show/hide the messages log/status window Mostrar/ocultar a janela de log/status das mensagens Could not load active patchbay definition. "%1" Disabled. Não foi possível carregar a definição de patchbay ativa. "%1" Foi desabilitado. &Versioning &Versionamento Re&fresh At&ualizar %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) Transport BBT (bar.beat.ticks) Transportar BBT (bar.beat.ticks) qjackctlMessagesStatusForm Messages / Status Mensagens / Status &Messages &Mensagens Messages log Registro de mensagens Messages output log Registro de mensagens &Status &Estado Status information Informação de estado Statistics since last server startup Estatísticas desde a última inicialização do servidor Description Descrição Value Valor Reset XRUN statistic values Reiniciar estatísticas de XRUN Re&set Re&iniciar Refresh XRUN statistic values Atualizar estatísticas de XRUN &Refresh &Atualizar Server name Nome do servidor Server state Estado do servidor DSP Load Uso de CPU do DSP Sample Rate Taxa de amostragem Buffer Size Tamanho do Buffer Realtime Mode Modo Realtime Transport state Estado do transporte Transport Timecode Código de tempo do transporte Transport BBT BBT do Transporte Transport BPM BPM do transporte XRUN count since last server startup XRUNs desde a última inicialização XRUN last time detected XRUN detectado última vez XRUN last Último XRUN XRUN maximum XRUN Máximo XRUN minimum XRUN Mínimo XRUN average Média de XRUNs XRUN total Total de XRUNs Maximum scheduling delay Atraso máximo de agendamento (scheduling) Time of last reset Hora da última reinicialização Logging stopped --- %1 --- Registro parado --- %1 --- Logging started --- %1 --- Registro iniciado --- %1 --- qjackctlPaletteForm Color Themes Temas de cores Name Nome Current color palette name Paleta de cor atual Save current color palette name Salvar paleta de cor atual Save Salvar Delete current color palette name Remover nome da paleta de cor atual Delete Remover Palette Paleta Current color palette Paleta de cor atual Generate: Gerar: Base color to generate palette Cor base para gerar paleta Reset all current palette colors Redefinir as paletas de cores atuais Reset Redefinir Import a custom color theme (palette) from file Importar paleta de cor personalizada de arquivo Import... Importar... Export a custom color theme (palette) to file Exportar paleta de cor personalizada para arquivo Export... Exportar... Show Details Mostrar detalhes Import File - %1 Importar arquivo - %1 Palette files (*.%1) Arquivos de paletas (*.%1) Save Palette - %1 Salvar Paleta - %1 All files (*.*) Todos os arquivos (*.*) Warning - %1 Aviso - %1 Could not import from file: %1 Sorry. Impossível importar de: %1 Desculpe. Export File - %1 Exportar para arquivo - %1 Some settings have been changed. Do you want to discard the changes? Algumas opções foram mudadas. Deseja descartar as mudanças? Some settings have been changed: "%1". Do you want to save the changes? Algumas opções foram mudadas: "%1". Deseja manter as mudanças? qjackctlPaletteForm::PaletteModel Color Role Papel da cor Active Ativo Inactive Inativo Disabled Desabilitado qjackctlPatchbay Warning Aviso This will disconnect all sockets. Are you sure? Isso desconectará todos os soquetes. Está certo disto? qjackctlPatchbayForm &New &Novo Create a new patchbay profile Crie um novo perfil de patchbay &Load... &Abrir... Load patchbay profile Carregar perfil de patchbay &Save... &Salvar... Save current patchbay profile Salvar o perfil atual do patchbay Acti&vate Ati&var Toggle activation of current patchbay profile Ativar/desativar perfil atual do patchbay &Connect &Conectar Connect currently selected sockets Conecte os soquetes atualmente selecionados &Disconnect &Desconectar Disconnect currently selected sockets Desconectar soquetes selecionados no momento Disconnect &All Desconectar &Tudo Disconnect all currently connected sockets Desconecte todos os soquetes conectados no momento &Refresh &Atualizar Refresh current patchbay view Atualizar a exibição atual do patchbay Down Baixar Move currently selected output socket down one position Mover o soquete de saída selecionado para uma posição abaixo Add... Adicionar... Create a new output socket Criar um novo soquete de saída Edit... Editar... Edit currently selected input socket properties Editar propriedades do soquete de entrada selecionadas Up Acima Move currently selected output socket up one position Mover o soquete de saída selecionado atualmente para cima uma posição Remove Remover Remove currently selected output socket Remover soquete de saída selecionado no momento Copy... Copiar... Duplicate (copy) currently selected output socket Duplicar (copiar) o soquete de saída selecionado Patchbay Patchbay Remove currently selected input socket Remover o soquete de entrada selecionado Duplicate (copy) currently selected input socket Duplicar (copiar) o soquete de entrada selecionado Create a new input socket Criar um novo soquete de entrada Edit currently selected output socket properties Editar as propriedades do soquete de saída selecionado Warning Aviso active Ativo New Patchbay definition Nova definição de patchbay Patchbay Definition files Arquivos de definições de patchbay Load Patchbay Definition Carregar definição de patchbay Save Patchbay Definition Salvar definição de patchbay The patchbay definition has been changed: "%1" Do you want to save the changes? A definição de patchbay foi alterada: "%1" Você quer salvar as alterações?? %1 [modified] %1 [modificado] Untitled%1 Sem Título%1 Error Erro Could not load patchbay definition file: "%1" Não foi possível carregar o arquivo de definição do patchbay: "%1" Could not save patchbay definition file: "%1" Não foi possível salvar o arquivo de definição do patchbay: "%1" Create patchbay definition as a snapshot of all actual client connections? Criar definição de patchbay como um snapshot de todas as conexões atuais do cliente?? Current (recent) patchbay profile(s) Perfil(is) atual(is) (recente(s)) do patchbay Expand all items Expandir todos os elementos E&xpand All E&xpandir Todos qjackctlPatchbayView Add... Adicionar... Edit... Editar... Copy... Copiar... Remove Remover Exclusive Exclusivo Move Up Subir Move Down Abaixar &Connect &Conectar Alt+C Connect Alt+C &Disconnect &Desconectar Alt+D Disconnect Alt+D Disconnect &All Desconectar &Tudo Alt+A Disconnect All Alt+T &Refresh &Atualizar Alt+R Refresh Alt+R Forward Avançar (None) (Nenhum) qjackctlSessionForm Load session Carregar sessão &Load... &Abrir... Recent session Sessão recente &Recent &Recente Save session Salvar sessão &Save... &Salvar... Client / Ports Cliente/Portas UUID UUID Command Comando Load Session Carregar Sessão Session directory Diretório da sessão Save Session Salvar Sessão and Quit e Sair Template Modelo &Clear &Limpar Warning Aviso A session could not be found in this folder: "%1" Não foi possível encontrar uma sessão nesta pasta: "%1" %1: loading session... %1: carregando sessão... %1: load session %2. %1: carregar sessão %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Uma sessão já existe nesta pasta: "%1" Você tem certeza de sobrescrever a sessão existente? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Esta pasta já existe e não está vazia: "%1" Está certo de sobrescrever a pasta existente? %1: saving session... %1: salvando sessão... %1: save session %2. %: salvar sessão %2. Update session Atualizar sessão Save and &Quit... Salvar e &Sair... Save &Template... Salvar &Modelo... Session Sessão &Save &Salvar &Versioning &Versionamento Re&fresh At&ualizar Session clients / connections Conexões/clientes da sessão Infra-clients / commands Infra-clientes Infra-client Infra-cliente Infra-command Infra-comando Add infra-client Adicionar infra-cliente &Add &Adicionar Edit infra-client Editar infra-client &Edit &Editar Remove infra-client Remover infra-cliente Re&move Re&mover New Client Novo Cliente qjackctlSessionInfraClientItemEditor Infra-command Infra-comando qjackctlSessionSaveForm Session Sessão &Name: &Nome: Session name &Directory: Session directory Diretório da sessão Browse for session directory ... ... Save session versioning Salvar versionamento da sessão &Versioning &Versionamento Warning Aviso Session directory does not exist: "%1" Do you want to create it? Session Directory qjackctlSetupForm Settings Configurações Preset &Name: Nome da &Predefinição: (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Settings preset name Nome da predefinição de configurações &Save &Salvar Save settings as current preset name Salvar configurações como nome da predefinição atual &Delete &Deletar Delete current settings preset Excluir predefinição das configurações atuais jackd DO NOT TRANSLATE jackdmp DO NOT TRANSLATE jackstart DO NOT TRANSLATE Driv&er: Dri&ver: dummy DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 sun DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 oss DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 alsa DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 portaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 coreaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 firewire DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Parameters Parâmetros Number of periods in the hardware buffer Número de períodos no buffer de hardware Priorit&y: Prioridad&e: &Frames/Period: &Quadros/Período: 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Quadros por período entre as chamadas() de processo Port Ma&ximum: Portas Má&ximas: 21333 21333 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 Sample rate in frames per second Taxa de amostragem em quadros por segundo Scheduler priority when running realtime Prioridade do agendador ao executar em tempo real &Word Length: &Tamanho da palavra: Periods/&Buffer: Períodos/&Buffer: Word length Tamanho da palavra Maximum number of ports the JACK server can manage Número máximo de portas que o servidor JACK pode gerenciar &Wait (usec): &Espera (microseg): Sample &Rate: Taxa de &amostragem: &Timeout (msec): Limite de &Tempo (mseg): 200 200 500 500 1000 1000 2000 2000 5000 5000 Set client timeout limit in milliseconds Definir limite de tempo limite do cliente em milissegundos &Realtime &Tempo Real Use realtime scheduling Usar agendamento em tempo real No Memory Loc&k Sem b&loqueio de memória Do not attempt to lock memory, even if in realtime mode Não tente bloquear a memória, mesmo no modo de tempo real &Unlock Memory &Desbloquear Memória Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Desbloquear memória de bibliotecas comuns do kit de ferramentas (GTK+, QT, FLTK, Wine) So&ft Mode Modo &Suave Ignore xruns reported by the backend driver Ignorar xruns informados pelo driver de back-end. O JACK terá menos tendência a desconectar as portas que não respondem. Útil quando não está sendo executado em tempo real. &Monitor &Monitor Provide output monitor ports Fornecer portas do monitor de saída Force &16bit Forçar &16bit Force 16bit mode instead of failing over 32bit (default) Forçar o modo de 16 bits em vez de falhar 32 bits (padrão) H/&W Meter Medidor de H/&W Enable hardware metering on cards that support it Ativar a medição de hardware em placas que a suportam &Ignore H/W &Ignorar H/W Ignore hardware period/buffer size Ignore o período do hardware/tamanho do buffer &Output Device: &Dispositivo de saída: &Interface: &Interface: Maximum input audio hardware channels to allocate Máximo de canais de hardware de áudio de entrada para alocar &Audio: &Ã�udio: Dit&her: Sua&vizado: External output latency (frames) Latência de saída externa (quadros) &Input Device: &Dispositivo de entrada: Duplex Duplex Capture Only Somente Captura Playback Only Somente Reprodução Provide either audio capture, playback or both Fornecer captura de áudio, reprodução ou ambos hw:0 hw:0 The PCM device name to use O nome do dispositivo PCM a ser usado > > /dev/dsp /dev/dsp Alternate input device for capture Dispositivo de entrada alternativo para captura Maximum output audio hardware channels to allocate Máximo de canais de hardware de áudio de saída para alocar Alternate output device for playback Dispositivo de saída alternativo para reprodução External input latency (frames) Latência de entrada externa (quadros) None Nenhum Rectangular Retangular Shaped Perfilado Triangular Triangular Set dither mode Definir modo de suavização Whether to give verbose output on messages Mostrar saída detalhada nas mensagens Time in seconds that client is delayed after server startup Tempo em segundos do atraso do cliente após a inicialização do servidor Latency: Latência: Output latency in milliseconds, calculated based on the period, rate and buffer settings Latência de saída em milissegundos, calculada com base nas configurações de período, taxa e buffer Options Opções Scripting Scripting Execute script on Start&up: Executar script na inicializa&ção: Whether to execute a custom shell script before starting up the JACK audio server. Executar um script personalizado antes de iniciar o servidor de áudio JACK. Execute script after &Startup: &Executar script após a inicialização: Whether to execute a custom shell script after starting up the JACK audio server. Executar um script de shell personalizado após iniciar o servidor de áudio JACK. Execute script on Shut&down: Executar script no desliga&mento: Whether to execute a custom shell script before shuting down the JACK audio server. Executar um script personalizado antes de desligar o servidor de áudio JACK. Command line to be executed before starting up the JACK audio server Linha de comando a ser executada antes de iniciar o servidor de áudio JACK Scripting argument meta-symbols Variáveis especiais de argumento do script ... ... Browse for script to be executed before starting up the JACK audio server Procure por script a ser executado antes de iniciar o servidor de áudio JACK Command line to be executed after starting up the JACK audio server Linha de comando a ser executada após o início do servidor de áudio JACK Browse for script to be executed after starting up the JACK audio server Procure pelo script a ser executado depois de iniciar o servidor de áudio JACK Browse for script to be executed before shutting down the JACK audio server Procure por script a ser executado antes de desligar o servidor de áudio JACK Command line to be executed before shutting down the JACK audio server Linha de comando a ser executada antes de desligar o servidor de áudio JACK Execute script after Shu&tdown: Execute o script após o desliga&mento: Whether to execute a custom shell script after shuting down the JACK audio server. Executar um script de shell personalizado após desligar o servidor de áudio JACK. Browse for script to be executed after shutting down the JACK audio server Procure pelo script a ser executado após desligar o servidor de áudio JACK Command line to be executed after shutting down the JACK audio server Linha de comando a ser executada após o desligamento do servidor de áudio JACK Statistics Estatísticas &Capture standard output &Capturar saída padrão Whether to capture standard output (stdout/stderr) into messages window Capturar saída padrão do JACK (stdout/stderr) na janela de mensagens &XRUN detection regex: &Expressão regular para detectar &XRUN: xrun of at least ([0-9|\.]+) msecs xrun de pelo menos ([0-9|\.]+) msegs Regular expression used to detect XRUNs on server output messages Expressão regular usada para detectar XRUNs em mensagens de saída do servidor Connections Conexões 10 10 Patchbay definition file to be activated as connection persistence profile Arquivo de definição de patchbay a ser ativado como perfil de persistência de conexão Browse for a patchbay definition file to be activated Procure um arquivo de definição de patchbay a ser ativado Activate &Patchbay persistence: Ativar a &persistência do Patchbay: Whether to activate a patchbay definition for connection persistence profile. Utilizar uma definição de patchbay para o perfil de persistência de conexão. Display Display Time Display Display de tempo Transport &Time Code Código de Tempo de &Transporte Transport &BBT (bar:beat.ticks) &BBT de Transporte (bar:beat:ticks) Elapsed time since last &Reset Tiempo transcorrido desde o último &Reset Elapsed time since last &XRUN Tempo transcorrido desde o último &XRUN Sample front panel normal display font Fonte de exibição normal do painel frontal da amostra Sample big time display font Exemplo de fonte de exibição de grande duração Big Time display: Display de tempo grande: &Font... Fon&te... Select font for front panel normal display Selecione a fonte para exibição normal do painel frontal Select font for big time display Selecione a fonte para exibição em grande escala Normal display: Display normal: Messages Window Janela de mensagens Sample messages text font display Exemplo de exibição de fonte de texto de mensagens Select font for the messages text display Selecione a fonte para a exibição do texto das mensagens &Messages limit: Limite de &Mensagens: Whether to keep a maximum number of lines in the messages window Manter um número máximo de linhas na janela de mensagens 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Número máximo de linhas de mensagens para manter em vista Please do not touch these settings unless you know what you are doing. Por favor, não altere estas configurações, a menos que você saiba o que está fazendo. Connections Window Janela de conexões Sample connections view font Fonte de visualização de conexões de amostra Select font for the connections view Selecione a fonte para a visualização de conexões &Icon size: Tamanho de &Ã�cone: 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 The icon size for each item of the connections view O tamanho do ícone para cada item da visualização de conexões Ena&ble client/port aliases editing (rename) At&ivar edição de aliases de cliente/porta (renomear) Whether to enable in-place client/port name editing (rename) Ativar edição de nome de cliente/porta no local (renomear) E&nable client/port aliases Habilitar aliases para clientes/portas Whether to enable client/port name aliases on the connections window Ativar alias de nome de cliente/porta na janela de conexões Misc Misc Other Outro &Start JACK audio server on application startup Inicie o &servidor de áudio JACK na inicialização Whether to start JACK audio server immediately on application startup Iniciar o servidor de áudio JACK imediatamente na inicialização &Confirm application close Pedir &Confirmação ao sair Whether to ask for confirmation on application exit Perguntar antes de sair do qjackctl &Keep child windows always on top &Manter janelas filhas sempre no topo Whether to keep all child windows on top of the main window Manter todas as janelas filhas na parte superior da janela principal &Enable system tray icon Ativar ícone da ban&eja do sistema Whether to enable the system tray icon Ativar o ícone da bandeja do sistema S&ave JACK audio server configuration to: S&alvar a configuração del servidor JACK em: Whether to save the JACK server command-line configuration into a local file (auto-start) Salve a configuração da linha de comandos do servidor JACK em um arquivo local (início automático) .jackdrc .jackdrc The server configuration local file name (auto-start) O nome do arquivo local de configuração do servidor (início automático) Warning Aviso msec mseg n/a n/d &Preset Name Nome da &Predefinição &Server Path &Caminho do Servidor &Driver &Driver &Interface &Interface Sample &Rate &Taxa de Amostragem &Frames/Period &Quadros/Período Periods/&Buffer Períodos/&Buffer Patchbay Definition files Arquivos de definição do patchbay Some settings have been changed: "%1" Do you want to save the changes? Algumas configurações foram alteradas: "%1" Deseja salvá-las? System Sistema Cycle Ciclo HPET HPET Don't restrict self connect requests (default) Não restringir os pedidos de auto-conexão (padrão) Fail self connect requests to external ports only Falha nas solicitações de auto-conexão apenas para portas externas Ignore self connect requests to external ports only Ignorar solicitações de auto-conexão apenas para portas externas Fail all self connect requests Falha em todos os pedidos de auto-conexão Ignore all self connect requests Ignorar todos os pedidos de auto-conexão Delete preset: "%1" Are you sure? Deletar predefinição: "%1" Está certo disto? Startup Script Script de Inicialização Post-Startup Script Script de Post-Inicialização Shutdown Script Script de Desligamento Post-Shutdown Script Script de Pós-Desligamento Active Patchbay Definition Definição Ativa de Patchbay Messages Log Registro de Mensagens Log files Arquivos de registros Information Informação Some settings may be only effective next time you start this application. Algumas configurações podem ser eficazes apenas na próxima vez que você iniciar este aplicativo. Some settings have been changed. Do you want to apply the changes? Algumas configurações foram alteradas. Você quer aplicar as mudanças? The audio backend driver interface to use A interface do driver back-end de áudio a ser usada MIDI Driv&er: Driv&er MIDI: The ALSA MIDI backend driver to use O driver do ALSA MIDI para usar none nenhum raw DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 seq DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 &Verbose messages &Mensagens detalhadas plughw:0 plughw:0 /dev/audio /dev/audio &Channels: &Canais: 192000 192000 Maximum number of audio channels to allocate Número máximo de canais de áudio a serem alocados Logging Registrando Messages log file Arquivo de registro de mensagns Browse for the messages log file location Procurar o local do arquivo de log de mensagens Whether to activate a messages logging to file. Ativar um log de mensagens para o arquivo. Advanced Avançado Whether to reset all connections when a patchbay definition is activated. Redefinir todas as conexões quando uma definição de patchbay for ativada. &Reset all connections on patchbay activation &Redefinir todas as conexões na ativação do patchbay Whether to issue a warning on active patchbay port disconnections. Emitir um aviso sobre desconexões de portas de patchbay ativas. &Warn on active patchbay disconnections &Avisar sobre desconexões de patchbay ativas &Messages log file: Registro de &mensagens: Whether to enable blinking (flashing) of the server mode (RT) indicator Ativar o piscar (intermitente) do indicador do modo do servidor (RT) Blin&k server mode indicator Pisc&ar o modo do servidor &JACK client/port aliases: Aliases de cliente/poprta para &JACK: JACK client/port aliases display mode Modo de exibição de aliases de cliente/porta JACK Default Padrão First Primeiro Second Segundo JACK client/port pretty-name (metadata) display mode Modo de exibição do nome customizado do client/porta JACK (metadata) Enable JA&CK client/port pretty-names (metadata) Ativar& nomes customizados (metadata) de clientes/portas JACK Whether to ask for confirmation on JACK audio server shutdown and/or restart Solicitar confirmação de desligamento e/ou reinicialização do servidor de áudio JACK Confirm server sh&utdown and/or restart &Confirme o desligamento e/ou reinício do servidor Whether to show system tray message on main window close Mostrar mensagem da bandeja do sistema na janela principal fechar Sho&w system tray message on close Mos&trar mensagem da bandeja do sistema ao fechar Whether to start minimized to system tray Iniciar minimizado na bandeja do sistema Start minimi&zed to system tray Iniciar minimi&zado na bandeja do sistema Setup Configuração Whether to restrict client self-connections Se deve restringir as auto-conexões do cliente Whether to use server synchronous mode Se deve usar o modo síncrono do servidor Clear settings of current preset name Limpar configurações do nome da predefinição atual Clea&r Limpa&r &Use server synchronous mode &Use o modo síncrono do servidor Cloc&k source: Cloc&k source: Clock source Fonte do Clock S&elf connect mode: M&odo de auto-conexão: Custom Personalizado &Color palette theme: &Tema de paleta de cor: Custom color palette theme Tema de paleta de cor personalizado Wonton Soup DO NOT TRANSLATE KXStudio DO NOT TRANSLATE Manage custom color palette themes Gerenciar temas de paleta de cor personalizada &Widget style theme: &Tema de estilo de widget: Custom widget style theme Tema customizado de estilo de widget: Whether to enable ALSA Sequencer (MIDI) support on startup Ativar o suporte ao seqüenciador de ALSA (MIDI) na inicialização E&nable ALSA Sequencer support Ativar Seque&nciador ALSA Whether to enable JACK D-Bus interface Ativar interface JACK D-Bus &Enable JACK D-Bus interface &Ativar interface JACK D-Bus Buttons Botões Whether to hide the left button group on the main window Ocultar o grupo de botões à esquerda na janela principal Hide main window &Left buttons Ocultar os &botões da esquerda da janela principal Whether to hide the right button group on the main window Ocultar o grupo de botões direito na janela principal Hide main window &Right buttons Ocultar os &botões da direita da janela principal Whether to hide the transport button group on the main window Ocultar o grupo de botões de transporte na janela principal Hide main window &Transport buttons Ocultar botões de &Transporte da janela principal Whether to hide the text labels on the main window buttons Ocultar os rótulos de texto nos botões da janela principal Hide main window &button text labels Ocultar rótulos de texto do &botão da janela principal Whether to replace Connections with Graph button on the main window Substituir Conexões pelo botão Gráfico na janela principal Replace Connections with &Graph button Substitua Conexões pelo botão &Gráfico Defaults Padrões &Base font size: Tamanho &básico de fonts: Base application font size (pt.) Tamanho básico de tipografias para a aplicação (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to enable D-Bus interface Ativar interface D-Bus &Enable D-Bus interface &Ativar interface D-Bus Number of microseconds to wait between engine processes (dummy) Número de microssegundos a aguardar entre processos (dummy) netone DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to restrict to one single application instance (X11) Restringir a uma única instância do aplicativo (X11) Single application &instance Uma só &instância de aplicação &Name: &Nome: The JACK Audio Connection Kit sound server name O nome do servidor de áudio do JACK Audio Connection Kit &Server Name Nome do &Servidor Server path (command line prefix) Caminho do servidor (prefixo da linha de comando) &Channels I/O: &Canais de E/S: &Latency I/O: &Latência E/S: Start De&lay: Demora antes d&o início: secs segs 0 msecs 0 msegs Server Suffi&x: Sufixo do &Servidor: Server &Prefix: &Prefixo do servidor: Extra driver options (command line suffix) Opções extras para o driver (sufixo da linha de comando) Whether to stop JACK audio server on application exit Parar o servidor de áudio JACK na saída do aplicativo S&top JACK audio server on application exit Parar o servidor de áudio JACK na saída do aplicativo qjackctlSocketForm &Socket &Soquetes &Name (alias): &Nome (alias): Socket name (an alias for client name) Nome do soquete (um alias para o nome de cliente) Client name (regular expression) Nome do cliente (expressão regular) Add P&lug Adicionar P&lug Add plug to socket plug list Adicionar plugue à lista de plugues de soquetes &Plug: &Plugue: Port name (regular expression) Nome da porta (expressão regular) Socket Plugs / Ports Soquetes Plugues/Portas Socket plug list Lista de soquetes tipo plugue &Edit &Editar &Remove &Remover Remove currently selected plug from socket plug list Remover plug atualmente selecionado da lista de plugue de soquete Socket Soquete &Client: &Cliente: &Down &Baixar &Up &Subir E&xclusive E&xclusivo Enforce only one exclusive cable connection Aplicar apenas uma conexão a cabo exclusiva Type Tipo &Audio Ã�&udio Audio socket type (JACK) Soquete tipo áudio (JACK) &MIDI &MIDI MIDI socket type (ALSA) Soquete tipo MIDI (ALSA) Plugs / Ports Plugs/Portas Error Erro A socket named "%1" already exists. Um soquete chamado "%1" já existe. Add Plug Adicionar Plug Remove Remover Edit Editar Move Up Subir Move Down Abaixar Warning Aviso Some settings have been changed. Do you want to apply the changes? Algumas configurações foram alteradas. Você quer aplicar as mudanças? (None) (Nenhum) Edit currently selected plug Editar ficha atualmente selecionada Move down currently selected plug in socket plug list Mover para baixo o plug atualmente selecionado na lista de plugue de soquete Move up current selected plug in socket plug list Mover para cima a ficha selecionada atual na lista de plugues de soquete &Forward: &Avançar: Forward (clone) all connections from this socket Encaminhar (clonar) todas as conexões deste soquete MIDI socket type (JACK) Tipo de soquete MIDI (JACK) AL&SA AL&SA qjackctlSocketList Output Saída Input Entrada Socket Soquete Warning Aviso <New> - %1 <Novo> - %1 %1 about to be removed: "%2" Are you sure? A ponto de remover %1: "%2" Está certo disto? %1 <Copy> - %2 %1 <Copiar> - %2 qjackctlSocketListView Output Sockets / Plugs Soquetes de Saída/Plugues Input Sockets / Plugs Soquetes de Entrada/Plugues qjackctl-1.0.6/src/translations/PaxHeaders/qjackctl_es.ts0000644000000000000000000000013215174607203020540 xustar0030 mtime=1777536643.521914248 30 atime=1777536643.521914248 30 ctime=1777536643.521914248 qjackctl-1.0.6/src/translations/qjackctl_es.ts0000644000175000001440000063721115174607203020542 0ustar00rncbcusers PortAudioProber Probing... Detectando... Please wait, PortAudio is probing audio hardware. Por favor espere, PortAudio está detectando hardware de audio. Warning Advertencia Audio hardware probing timed out. La detección de hardware de audio ha expirado. QObject (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Start JACK audio server immediately. Arrancar servidor de audio JACK inmediatamente. Set default settings preset name. Establecer nombre preset configuración predeterminada. Set active patchbay definition file. Establecer archivo definición patchbay activo. Set default JACK audio server name. Establecer nombre servidor de audio JACK predeterminado. Show help about command line options. Mostrar ayuda sobre opciones línea de comandos. Show version information. Mostrar información de versión. Displays help on command-line options. Launch command with arguments. Lanzar comando con argumentos. [command-and-args] [comando-y-args] Option -p requires an argument (preset). La opción -p nececita un argumento (nombre de un preset). Usage: %1 [options] [command-and-args] Uso: %1 [opciones] [comandos-y-argumentos] Options: Opciones: Option -a requires an argument (path). La opción -a requiere un argumento (ruta). Option -n requires an argument (name). La opción -n necesita un argumento (nombre). %1 (%2 frames) %1 (%2 cuadros) Move Mover Rename Renombrar qjackctlAboutForm About Acerca de About Qt Acerca de Qt &Close &Cerrar Version Versión Debugging option enabled. Depuración habilitada. System tray disabled. Bandeja del sistema deshabilitada. Transport status control disabled. Reporte del estado de transporte deshabilitado. Realtime status disabled. Estado de Realtime deshabilitado. XRUN delay status disabled. Reporte del retardo de XRUN deshabilitado. Maximum delay status disabled. Reporte del retardo máximo deshabilitado. ALSA/MIDI sequencer support disabled. Soporte para secuenciador ALSA/MIDI deshabilitado. Using: Qt %1 Usando: Qt %1 JACK %1 JACK %1 Website Website This program is free software; you can redistribute it and/or modify it Este programa es software libre; Usted puede redistribuirlo y/o modificarlo under the terms of the GNU General Public License version 2 or later. bajo los términos de la Licencia Pública General GNU versión 2 o posterior. JACK MIDI support disabled. Soporte MIDI en JACK deshabilitado. JACK Port aliases support disabled. Soporte para alias de los puertos de JACK deshabilitado. D-Bus interface support disabled. Soporte para la interfaz D-Bus deshabilitado. JACK Session support disabled. Soporte para sesiones de JACK deshabilitado. qjackctlClientListView &Connect &Conectar Alt+C Connect Alt+C &Disconnect &Desconectar Alt+D Disconnect Alt+D Disconnect &All Desconectar &Todo Alt+A Disconnect All Alt+T Re&name Cambiar &Nombre Alt+N Rename Alt+N &Refresh &Refrescar Alt+R Refresh Alt+R Readable Clients / Output Ports Puertos de Salida / Clientes Legibles Writable Clients / Input Ports Puertos de Entrada / Clientes Escribibles qjackctlConnect Warning Advertencia This will suspend sound processing from all client applications. Are you sure? Esto suspenderá el procesamiento de sonido de todas las aplicaciones. Está seguro? qjackctlConnectionsForm Audio Audio &Connect &Conectar Connect currently selected ports Conectar los puertos seleccionados &Disconnect &Desconectar Disconnect currently selected ports Desconectar los puertos seleccionados Disconnect &All Desconectar &Todo Disconnect all currently connected ports Desconectar todos los puertos seleccionados &Refresh &Refrescar Refresh current connections view Refrescar la vista actual de conexiones Connections Conexiones MIDI MIDI ALSA ALSA Expand all client ports Expandir todos los puertos de los clientes E&xpand All E&xpandir Todos qjackctlConnectorView &Connect &Conectar Alt+C Connect Alt+C &Disconnect &Desconectar Alt+D Disconnect Alt+D Disconnect &All Desconectar &Todo Alt+A Disconnect All Alt+T &Refresh &Refrescar Alt+R Refresh Alt+R qjackctlGraphCanvas Connect Conectar Disconnect Desconectar qjackctlGraphForm Graph Gráfico &Graph &Gráfico &Edit &Editar &View &Ver &Zoom &Zoom Co&lors Co&lores S&ort &Ordenar &Help A&yuda &Connect &Conectar Connect Conectar Connect selected ports Conectar puertos seleccionados &Disconnect &Desconectar Disconnect Desconectar Disconnect selected ports Desconectar puertos seleccionados Ctrl+C Ctrl+C T&humbview Vista pre&via Ctrl+D Ctrl+D Cl&ose C&errar Close Cerrar Close this application window Cerrar esta ventana de aplicación Select &All Seleccion&ar Todo Select All Seleccionar Todo Ctrl+A Ctrl+A Select &None No Seleccionar &Ninguno Select None No Seleccionar Ninguno Ctrl+Shift+A Ctrl+Shift+A Select &Invert Seleccionar &Invertir Select Invert Seleccionar Invertir Ctrl+I Ctrl+I &Rename... &Renombrar... Rename item Renombrar ítem Rename Item Renombrar ítem F2 F2 &Find... Find Find nodes Ctrl+F &Menubar Barra &Menú Menubar Barra Menú Show/hide the main program window menubar Muestra/oculta la barra de menú de la ventana principal Ctrl+M Ctrl+M &Toolbar Barra Herramien&tas Toolbar Barra herramientas Show/hide main program window file toolbar Muestra/oculta la barra de herramientas de la ventana principal &Statusbar Barra E&stado Statusbar Barra Estado Show/hide the main program window statusbar Muestra/oculta la barra de estado de la ventana principal &Top Left Par&te Superior Izquierda Top left Parte superior izquierda Show the thumbnail overview on the top-left Muestra la vista previa en la parte superior izquierda Top &Right Pa&rte Superior Derecha Top right Parte superior derecha Show the thumbnail overview on the top-right Muestra la vista previa en la parte superior derecha Bottom &Left Parte In&ferior Izquierda Bottom Left Parte Inferior Izquierda Bottom left Parte inferior izquierda Show the thumbnail overview on the bottom-left Muestra la vista previa en la parte inferior izquierda &Bottom Right Parte I&nferior Derecha Bottom right Parte inferior derecha Show the thumbnail overview on the bottom-right Muestra la vista previa en la parte inferior derecha &None &Ninguno None Ninguno Hide thumbview Oculta vista previa Hide the thumbnail overview Oculta la vista previa Text Beside &Icons Texto Junto a &Iconos Text beside icons Texto junto a iconos Show/hide text beside icons Muestra/oculta texto junto a iconos &Center &Centro Center Centro Center view Vista centro &Refresh &Refrescar Refresh Refrescar Refresh view Refrescar vista F5 F5 Zoom &In Zoom &In Zoom In Zoom In Ctrl++ Ctrl++ Zoom &Out Zoom &Out Zoom Out Zoom Out Ctrl+- Ctrl+- Zoom &Fit Zoom Enca&jar Zoom Fit Zoom Encajar Ctrl+0 Ctrl+0 Zoom &Reset Zoom &Resetear Zoom Reset Zoom Resetear Ctrl+1 Ctrl+1 &Zoom Range &Zoom Rango Zoom Range Zoom Rango JACK &Audio... JACK &Audio... JACK Audio color JACK Audio color JACK &MIDI... JACK &MIDI... JACK MIDI JACK MIDI JACK MIDI color JACK MIDI color ALSA M&IDI... ALSA M&IDI... ALSA MIDI ALSA MIDI ALSA MIDI color ALSA MIDI color JACK &CV... JACK &CV... JACK CV color JACK CV color JACK &OSC... JACK &OSC... JACK OSC JACK OSC JACK OSC color JACK OSC color &Reset &Resetear Reset colors Resetear colores Port &Name &Nombre Puerto Port name Nombre puerto Sort by port name Ordenar por nombre puerto Port &Title &Título Puerto Port title Título puerto Sort by port title Ordenar por título puerto Port &Index &Ã�ndice Puerto Port index Ã�ndice puerto Sort by port index Ordenar por índice puerto &Ascending &Ascendiente Ascending Ascendiente Ascending sort order Ordenar por orden ascendiente &Descending &Descendiente Descending Descendiente Descending sort order Ordenar por orden descendiente Repel O&verlapping Nodes Repeler Nodos S&uperpuestos Repel nodes Repeler nodos Repel overlapping nodes Repeler nodos superpuestos Connect Thro&ugh Nodes Conectar a Tra&vés de Nodos Connect Through Nodes Conectar a Través de Nodos Connect through nodes Conectar a través de nodos Whether to draw connectors through or around nodes Trazar conectores a través de o alrededor de nodos &About... &Acerca de... About... Acerca de... About Acerca de Show information about this application program Muestra información sobre esta aplicación About &Qt... Acerca de &Qt... About Qt... Acerca de Qt... About Qt Acerca de Qt Show information about the Qt toolkit Muestra información sobre las herramientas Qt &Undo Des&hacer &Redo &Rehacer Undo last edit action Deshacer última acción edición Redo last edit action Rehacer última acción edición Zoom Zoom Ready Preparado Colors - %1 Colores - %1 qjackctlMainForm &Quit &Salir Quit processing and exit Terminar procesamiento y salir &Start &Iniciar Start the JACK server Iniciar el servidor JACK S&top &Detener Stop the JACK server Detener el servidor JACK St&atus &Estado Ab&out... Ace&rca de... Show information about this application Mostrar información sobre esta aplicación Show settings and options dialog Mostrar el diálogo de opciones y preferencias &Messages &Mensajes Patch&bay Patch&bay Show/hide the patchbay editor window Mostrar / ocultar el editor de patchbay &Connect &Conectar JACK server state Estado del servidor JACK JACK server mode Modo del servidor JACK Sample rate Frecuencia de muestreo Time display Visor de tiempo Transport state Estado del transporte Transport BPM BPM del transporte Transport time Tiempo del transporte Show/hide the graph window Muestra/oculta la ventana del gráfico Show/hide the connections window Muestra/oculta la ventana de conexiones Backward transport Retroceder transporte Forward transport Avanzar transporte Rewind transport Rebobinar transporte (Alt+K) Stop transport rolling Detener el transporte (Shift+Espacio) Start transport rolling Iniciar el transporte (Espacio) Warning Advertencia successfully satisfactoriamente with exit status=%1 con estado %1 Could not load preset "%1". Retrying with default. No se pudo cargar el preset "%1". Probando con el predeterminado. Could not load default preset. Sorry. Lo siento. No se pudo cargar el preset predeterminado. Startup script... Script de inicio... Startup script terminated El script de inicio finalizó JACK is starting... JACK está iniciándose... Could not start JACK. Sorry. Lo siento. No se pudo iniciar JACK. JACK is stopping... JACK está deteniéndose... The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. El programa seguirá corriendo en la bandeja del sistema. Para terminarlo, por favor eljia "Salir" en el menú contextual del ícono en la bandeja del sistema. Shutdown script... Script de apagado... Shutdown script terminated El script de apagado finalizó JACK was stopped JACK ha sido detenido Post-shutdown script... Script de post - apagado... D-BUS: Service is available (%1 aka jackdbus). D-BUS: Disponible (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: No disponible (%1 aka jackdbus). Don't show this message again No volver a mostrar este mensaje Don't ask this again No volver a preguntar esto D-BUS: JACK server is starting... D-BUS: Iniciando servidor JACK... D-BUS: JACK server could not be started. Sorry D-BUS: El servidor JACK no puede iniciarse. Disculpa D-BUS: JACK server is stopping... D-BUS: Deteniendo el servidor JACK... D-BUS: JACK server could not be stopped. Sorry D-BUS: El servidor JACK no puede detenerse. Disculpa Post-shutdown script terminated El script de post - apagado finalizó D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: El servidor JACK se ha iniciado (%1 aka jackdbus). The preset aliases have been changed: "%1" Do you want to save the changes? Los alias de presets han cambiado: "%1" Desea guardar los cambios? D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: El servidor JACK se ha detenido (%1 aka jackdbus). Error Error Transport time code Código de tiempo del transporte Elapsed time since last reset Tiempo transcurrido desde el último reset Elapsed time since last XRUN Tiempo transcurrido desde el último XRUN Patchbay activated. Patchbay activada. Patchbay deactivated. Patchbay desactivada. Statistics reset. Reiniciar estadísticas. msec mseg XRUN callback (%1). XRUN callback (%1). Buffer size change (%1). Cambio en el tamaño de buffer (%1). Shutdown notification. Notificación de apagado. Freewheel started... Freewheel iniciado... Freewheel exited. Freewheel parado. JACK property change. Cambio propiedad JACK. checked verificado connected conectado disconnected desconectado failed falló Server configuration saved to "%1". Configuración del servidor salvada en "%1". Client activated. Cliente activado. Post-startup script... Script de post - inicio... Post-startup script terminated El script de post - inicio finalizó Command line argument... Argumento de la línea de comando... Command line argument started Argumento de la línea de comando iniciado Client deactivated. Cliente desactivado. Transport rewind. Rebobinar transporte. Transport backward. Retroceder transporte. Starting Iniciando Transport start. Iniciar transporte. Stopping Deteniendo Transport stop. Detener transporte. Transport forward. Avanzar transporte. Stopped Detenido Yes Si No No FW FW RT RT Rolling Rolling Looping Looping XRUN callback (%1 skipped). XRUN callback (%1 omitidos). Started Iniciado Active Activo Activating Activando Inactive Inactivo &Hide &Ocultar D-BUS: GetParameterConstraint('%1'): %2. (%3) D-BUS: GetParameterConstraint('%1'): %2. (%3) Mi&nimize Mi&nimizar S&how &Mostrar Rest&ore &Restablecer &Stop &Detener &Reset &Reset &Connections &Conexiones Server settings will be only effective after restarting the JACK audio server. La configuración sólo se hará efectiva reiniciando el servidor JACK. Do you want to restart the JACK audio server? ¿Quieres reiniciar el servidor de audio JACK? D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) Information Información Some settings will be only effective the next time you start this program. Algunas configuraciones sólo se aplicarán la próxima vez que inicie este programa. Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. No se puede abrir el secuenciador ALSA como cliente El patchbay MIDI de ALSA no estará disponible. JACK is currently running. Do you want to terminate the JACK audio server? JACK se está ejecutando actualmente. ¿Desea detener el servidor de audio JACK? Could not start JACK. Maybe JACK audio server is already started. No puede iniciarse JACK. Quizás el servidor de audio JACK ya haya sido iniciado. Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Algunas aplicaciones de audio están activas y conectadas. Desea detener el servidor de audio JACK? %1 is about to terminate. Are you sure? %1 va a cerrarse. ¿Está seguro? JACK was started with PID=%1. JACK se inició con PID=%1. JACK is being forced... JACK está siendo forzado... Patchbay reset. Reseteo patchbay. JACK connection graph change. Cambio en gráfico de conexiones de JACK. JACK has crashed. JACK ha caído. JACK timed out. Tiempo de espera para JACK agotado. JACK write error. Error de escritura JACK. JACK read error. Error de lectura JACK. Unknown JACK error (%d). Error JACK desconocido (%d). ALSA connection graph change. Cambio en gráfico de conexiones ALSA. JACK active patchbay scan Escaneo del patchbay JACK activo ALSA active patchbay scan Escaneo del patchbay ALSA activo JACK connection change. Cambio en conexiones JACK. ALSA connection change. Cambio en conexiones de ALSA. A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Una definición de patchbay está activa actualmente, y es probable que rehaga esta conexion: %1 -> %2 ¿Desea eliminar la conexion? Overall operation failed. La operación global falló. Invalid or unsupported option. Opción inválida o no soportada. Client name not unique. El nombre de cliente no es único. Server is started. El servidor está iniciado. Unable to connect to server. No puede conectarse al servidor. Server communication error. Error de comunicación con el servidor. Client does not exist. El cliente no existe. Unable to load internal client. No puede cargarse el cliente interno. Unable to initialize client. No puede inicializarse el cliente. Unable to access shared memory. No puede accederse a la memoria compartida. Client protocol version mismatch. La versión del protocolo cliente no concuerda. Could not connect to JACK server as client. - %1 Please check the messages window for more info. No puede conectarse al servidor JACK como cliente. - %1 Por favor revise la ventana de mensajes para mas información. %1 (%2%) %1 % %1 Hz %1 frames %1 cuadros %1 msec %1 mseg &Presets &Presets &Graph &Gráfico &Transport &Transporte &Rewind Re&bobinar &Play &Reproducir Pa&use Pa&usa &Patchbay &Patchbay DSP Load Uso de CPU del DSP XRUN Count (notifications) Cuenta de XRUN (notificaciones) &Backward &Retroceder &Forward &Avanzar Set&up... Set&up... S&ession S&esion &Load... &Abrir... &Save... &Guardar... Save and &Quit... Guardar y &Salir... Save &Template... Guardar Plan&tilla... Show/hide the session management window Mostrar/ocultar la ventana para administrar sesiones Show/hide the messages log/status window Mostrar/ocultar la ventana de estado/log Could not load active patchbay definition. "%1" Disabled. No se puede cargar el patchbay. "%1" Ha sido deshabilitado. &Versioning &Versiones Re&fresh Re&frescar %1 (%2%, %3 xruns) Transport BBT (bar.beat.ticks) BBT Transporte (compás.pulsación.fracciones) Transporte BBT (bar.beat.ticks) qjackctlMessagesStatusForm Messages / Status Mensajes / Estado &Messages &Mensajes Messages log Registro de mensajes Messages output log Registro de mensajes &Status &Estado Status information Información de estado Statistics since last server startup Estadísticas desde el último inicio de JACK Description Descripción Value Valor Reset XRUN statistic values Reiniciar estadísticas de XRUN Re&set Re&iniciar Refresh XRUN statistic values Refrescar estadísticas de XRUN &Refresh &Refrescar Server name Nombre del servidor Server state Estado del Servidor DSP Load Uso de CPU del DSP Sample Rate Frecuencia de muestreo Buffer Size Tamaño de Buffer Realtime Mode Modo Realtime Transport state Estado del transporte Transport Timecode Código de tiempo del transporte Transport BBT BBT del Transporte Transport BPM BPM del transporte XRUN count since last server startup XRUNs desde el último inicio XRUN last time detected Fecha de la última XRUN detectada XRUN last Última XRUN XRUN maximum Máximo de XRUN XRUN minimum Mínimo de XRUN XRUN average Promedio de XRUN XRUN total Total de XRUN Maximum scheduling delay Máximo retardo de programación (scheduling) Time of last reset Tiempo desde el último reset Logging stopped --- %1 --- Registro detenido --- %1 --- Logging started --- %1 --- Registro iniciado --- %1 --- qjackctlPaletteForm Color Themes Esquemas de Color Name Nombre Current color palette name Nombre actual paleta de colores Save current color palette name Guardar nombre actual paleta de colores Save Guardar Delete current color palette name Borrar nombre actual paleta de colores Delete Borrar Palette Paleta Current color palette Paleta de colores actual Generate: Generar: Base color to generate palette Color base para generar paleta Reset all current palette colors Resetear todos los colores de paleta Reset Resetear Import a custom color theme (palette) from file Importar un esquema de colores (paleta) personalizado de archivo Import... Importar... Export a custom color theme (palette) to file Exportar un esquema de colores (paleta) personalizado a archivo Export... Exportar... Show Details Mostrar Detalles Import File - %1 Importar Archivo - %1 Palette files (*.%1) Archivos de paleta (*.%1) Save Palette - %1 Guarda Paleta - %1 All files (*.*) Todos los archivos (*.*) Warning - %1 Advertencia - %1 Could not import from file: %1 Sorry. No se pudo importar desde archivo: %1 Disculpe. Export File - %1 Exportar archivo - %1 Some settings have been changed. Do you want to discard the changes? Algunos ajustes han sido modificados. ¿Desea descartar los cambios? Some settings have been changed: "%1". Do you want to save the changes? Algunos ajustes han sido modificados: "%1" Desea guardarlos? qjackctlPaletteForm::PaletteModel Color Role Rol Color Active Activo Inactive Inactivo Disabled Desactivado qjackctlPatchbay Warning Advertencia This will disconnect all sockets. Are you sure? Esto desconectará todos los sockets. ¿Está seguro? qjackctlPatchbayForm &New &Nueva Create a new patchbay profile Crear perfil nuevo de patchbay &Load... &Abrir... Load patchbay profile Cargar perfil de patchbay &Save... &Guardar... Save current patchbay profile Guardar el perfil actual del patchbay Acti&vate Acti&var Toggle activation of current patchbay profile Conmutar la activación del esquema actual &Connect &Conectar Connect currently selected sockets Conectar los puertos seleccionados &Disconnect &Desconectar Disconnect currently selected sockets Desconectar los puertos seleccionados Disconnect &All Desconectar &Todo Disconnect all currently connected sockets Desconectar todos los sockets actualmente conectados &Refresh &Refrescar Refresh current patchbay view Refrescar la vista actual Down Bajar Move currently selected output socket down one position Mover el socket de salida seleccionado una posición hacia abajo Add... Añadir... Create a new output socket Crear un nuevo socket de salida Edit... Editar... Edit currently selected input socket properties Editar las propiedades del socket de entrada seleccionado Up Subir Move currently selected output socket up one position Mover el socket de salida seleccionado una posición hacia arriba Remove Eliminar Remove currently selected output socket Eliminar el socket de salida seleccionado Copy... Copiar... Duplicate (copy) currently selected output socket Duplicar (copiar) el socket de salida seleccionado Patchbay Patchbay Remove currently selected input socket Eliminar el socket de entrada seleccionado Duplicate (copy) currently selected input socket Duplicar (copiar) el socket de entrada seleccionado Create a new input socket Crear un nuevo socket de entrada Edit currently selected output socket properties Editar las propiedades del socket de salida seleccionado Warning Advertencia active activa New Patchbay definition Nuevo esquema de patchbay Patchbay Definition files Archivos de esquemas de patchbay Load Patchbay Definition Cargar esquema de patchbay Save Patchbay Definition Guardar esquema de patchbay The patchbay definition has been changed: "%1" Do you want to save the changes? La definición del patchbay ha cambiado: "%1" ¿Desea guardar los cambios? %1 [modified] %1 [modificado] Untitled%1 SinNombre%1 Error Error Could not load patchbay definition file: "%1" No se puede cargar el archivo con el esquema del patchbay: "%1" Could not save patchbay definition file: "%1" No se puede guardar el archivo con el esquema del patchbay: "%1" Create patchbay definition as a snapshot of all actual client connections? ¿Crear un esquema del patchbay en base a una instantánea de las conexiones actuales? Current (recent) patchbay profile(s) Perfil actual (reciente) de patchbay Expand all items Expandir todos los elementos E&xpand All E&xpandir Todos qjackctlPatchbayView Add... Añadir... Edit... Editar... Copy... Copiar... Remove Eliminar Exclusive Exclusivo Move Up Subir Move Down Bajar &Connect &Conectar Alt+C Connect Alt+C &Disconnect &Desconectar Alt+D Disconnect Alt+D Disconnect &All Desconectar &Todo Alt+A Disconnect All Alt+T &Refresh &Refrescar Alt+R Refresh Alt+R Forward Avanzar (None) (Ninguno) qjackctlSessionForm Load session Cargar sesión &Load... &Abrir... Recent session Sesión reciente &Recent &Reciente Save session Guardar sesión &Save... &Guardar... Client / Ports Cliente / Puertos UUID UUID Command Comando Load Session Cargar Sesión Session directory Directorio de la sesión Save Session Guardar Sesión and Quit y Salir Template Plantilla &Clear &Limpiar Warning Advertencia A session could not be found in this folder: "%1" No se encontró una sesión en esta carpeta: "%1" %1: loading session... %1: cargando sesión... %1: load session %2. %1: cargar sesión %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Una sesión ya existe en esta carpeta: "%1" ¿Está seguro de querer sobreescribirla? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Esta carpeta existe y no está vacía: "%1" ¿Está seguro de sobreescribir esta carpeta? %1: saving session... %1: guardando sesión... %1: save session %2. %1: guardar sesión %2. Update session Actualizar sesión Save and &Quit... Guardar y &Salir... Save &Template... Guardar Plan&tilla... Session Sesión &Save &Guardar &Versioning &Versiones Re&fresh Re&frescar Session clients / connections Clientes / conexiones de sesión Infra-clients / commands Infra-clientes / comandos Infra-client Infra-cliente Infra-command Infra-comando Add infra-client Añadir infra-cliente &Add &Añadir Edit infra-client Editar infra-cliente &Edit &Editar Remove infra-client Eliminar infra-cliente Re&move Eli&minar New Client Nuevo Cliente qjackctlSessionInfraClientItemEditor Infra-command Infra-comando qjackctlSessionSaveForm Session Sesión &Name: &Nombre: Session name &Directory: Session directory Directorio de la sesión Browse for session directory ... ... Save session versioning Guardar las versiones de la sesión &Versioning &Versiones Warning Advertencia Session directory does not exist: "%1" Do you want to create it? Session Directory qjackctlSetupForm Settings Configuraciones Preset &Name: &Nombre del Preset: (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Settings preset name Preset con las configuraciones &Save &Guardar Save settings as current preset name Guardar configuración en el preset actual &Delete &Eliminar Delete current settings preset Eliminar el preset con la configuración actual jackd DO NOT TRANSLATE jackdmp DO NOT TRANSLATE jackstart DO NOT TRANSLATE Driv&er: Dri&ver: dummy DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 sun DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 oss DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 alsa DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 portaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 coreaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 firewire DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Parameters Parámetros Number of periods in the hardware buffer Número de períodos en el buffer de hardware Priorit&y: &Prioridad: &Frames/Period: &Cuadros / Período: 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Cuadros por período entre llamadas a process() Port Ma&ximum: Má&ximos Puertos: 21333 21333 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 Sample rate in frames per second Frecuencia de muestreo en cuadros por segundo Scheduler priority when running realtime Prioridad del scheduler cuando se ejecuta en tiempo real &Word Length: &Largo de palabra: Periods/&Buffer: Períodos / &Buffer: Word length Tamaño de palabra Maximum number of ports the JACK server can manage Máximo número de puertos que podrá manejar el servidor JACK &Wait (usec): &Retardo (microseg): Sample &Rate: &Frecuencia de muestreo: &Timeout (msec): Límite de &Tiempo (mseg): 200 200 500 500 1000 1000 2000 2000 5000 5000 Set client timeout limit in milliseconds Establece el límite de tiempo de los clientes en milisegundos &Realtime Tiempo &Real Use realtime scheduling Usar prioridad(scheduling) de tiempo real No Memory Loc&k No b&loquear memoria Do not attempt to lock memory, even if in realtime mode No intentar bloquear memoria, incluso en modo de tiempo real &Unlock Memory &Desbloquear Memoria Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) No bloquear memoria de las librerías comunes (GTK+, QT, FLTK, Wine) So&ft Mode Modo &Tolerante Ignore xruns reported by the backend driver Ignorar las xruns reportadas por el driver de sonido. JACK tendrá menos tendencia a desconectar los puertos que no respondan. Útil cuando no se corre en tiempo real &Monitor &Monitorear Provide output monitor ports Proveer puertos para monitoreo de la salida Force &16bit Forzar &16bit Force 16bit mode instead of failing over 32bit (default) Forzar modo 16 bit en lugar de 32 bit (predeterminado) H/&W Meter Monitoreo por H/&W Enable hardware metering on cards that support it Habilitar monitoreo por hardware en las tarjetas que lo soporten &Ignore H/W &Ignorar H/W Ignore hardware period/buffer size Ignorar el tamaño de buffer / período del hardware &Output Device: Dispositiv&o de salida: &Interface: &Interfaz: Maximum input audio hardware channels to allocate Máximo número de canales de entrada por hardware a establecer &Audio: &Audio: Dit&her: &Suavizado: External output latency (frames) Latencia de la salida externa (cuadros) &Input Device: D&ispositivo de entrada: Duplex Duplex Capture Only Sólo Captura Playback Only Sólo Reproducción Provide either audio capture, playback or both Proveer de puertos de audio para captura, reproducción o ambos hw:0 The PCM device name to use Nombre del dispositivo PCM a usar > > /dev/dsp Alternate input device for capture Dispositivo de entrada alternativo para captura Maximum output audio hardware channels to allocate Máximo número de canales de salida por hardware a establecer Alternate output device for playback Dispositivo de salida alternativo para reproducción External input latency (frames) Latencia de la entrada externa (cuadros) None Ninguno Rectangular Rectangular Shaped Contorneado Triangular Triangular Set dither mode Establecer método de suavizado Whether to give verbose output on messages Mostrar información mas detallada en los mensajes Time in seconds that client is delayed after server startup Tiempo en segundos que el cliente es demorado luego de iniciar el servidor Latency: Latencia: Output latency in milliseconds, calculated based on the period, rate and buffer settings Latencia del sistema en milisegundos, calculada en base a la configuración de período, buffer y frecuencia de muestreo Options Opciones Scripting Scripting Execute script on Start&up: Script a ejecutar al iniciar el servi&dor: Whether to execute a custom shell script before starting up the JACK audio server. Ejecutar un script personalizado antes de iniciar el servidor JACK. Execute script after &Startup: &Script a ejecutar luego de iniciar: Whether to execute a custom shell script after starting up the JACK audio server. Ejecutar un script personalizado después de iniciar el servidor JACK. Execute script on Shut&down: Script a ejecutar antes de d&etener: Whether to execute a custom shell script before shuting down the JACK audio server. Ejecutar un script personalizado antes de detener el servidor JACK. Command line to be executed before starting up the JACK audio server Comando a ejecutar antes de iniciar el servidor JACK Scripting argument meta-symbols Variables especiales para pasar al script ... ... Browse for script to be executed before starting up the JACK audio server Buscar el script a ejecutar antes de iniciar el servidor de audio JACK Command line to be executed after starting up the JACK audio server Comando a ejecutar luego de iniciar el servidor JACK Browse for script to be executed after starting up the JACK audio server Buscar el script a ejecutar luego de iniciar el servidor de audio JACK Browse for script to be executed before shutting down the JACK audio server Buscar el script a ejecutar antes de terminar el servidor de audio JACK Command line to be executed before shutting down the JACK audio server Comando a ejecutar antes de detener el servidor JACK Execute script after Shu&tdown: Script a ejecutar luego de &Terminar: Whether to execute a custom shell script after shuting down the JACK audio server. Ejecutar un script personalizado después de terminar el servidor JACK. Browse for script to be executed after shutting down the JACK audio server Buscar el script a ejecutar luego de terminar el servidor de audio JACK Command line to be executed after shutting down the JACK audio server Comando a ejecutar luego de detener el servidor JACK Statistics Estadísticas &Capture standard output &Capturar salida estándar Whether to capture standard output (stdout/stderr) into messages window Capturar la salida estándar de JACK en la ventana de mensajes &XRUN detection regex: Expresión regular para detectar &XRUN: xrun of at least ([0-9|\.]+) msecs xrun de al menos ([0-9|\.]+) msegs Regular expression used to detect XRUNs on server output messages Expresión regular usada para detectar XRUNs en los mensajes del servidor Connections Conexiones 10 10 Patchbay definition file to be activated as connection persistence profile Esquemas de patchbay a activar como un perfil persistente de las conexiones Browse for a patchbay definition file to be activated Buscar el esquema de patchbay para activar Activate &Patchbay persistence: Activar &Persistencia del patchbay: Whether to activate a patchbay definition for connection persistence profile. Utilizar un perfil para conservar el esquema del patchbay entre sesiones. Display Display Time Display Display de tiempo Transport &Time Code Código de Tiempo del &Transporte Transport &BBT (bar:beat.ticks) &BBT del Transporte (compás:pulsación:frecuencia) Elapsed time since last &Reset Tiempo transcurrido desde el último &Reset Elapsed time since last &XRUN Tiempo transcurrido desde la última &XRUN Sample front panel normal display font Muestra de la fuente para el panel frontal Sample big time display font Muestra de la fuente para el display de tiempo grande Big Time display: Display de tiempo grande: &Font... Fuen&te... Select font for front panel normal display Seleccionar fuente para el panel normal Select font for big time display Seleccionar fuente para el display de tiempo grande Normal display: Display normal: Messages Window Ventana de Mensajes Sample messages text font display Muestra de la fuente para la ventana de mensajes Select font for the messages text display Seleccionar fuente para el display de mensajes &Messages limit: Límite de &Mensajes: Whether to keep a maximum number of lines in the messages window Almacenar un número limitado de líneas en la ventana de mensajes 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Máximo número de líneas para mantener en la ventana de mensajes Please do not touch these settings unless you know what you are doing. Por favor no toques estos ajustes a menos que sepas lo que haces. Connections Window Ventana de Conexiones Sample connections view font Muestra de la fuente para la ventana de conexiones Select font for the connections view Seleccionar fuente para la ventana de conexiones &Icon size: Tamaño de &Icono: 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 The icon size for each item of the connections view Tamaño de ícono para cada ítem en la vista de conexiones Ena&ble client/port aliases editing (rename) Ha&bilitar la edición de alias para los puertos / clientes (renombrarlos) Whether to enable in-place client/port name editing (rename) Permitir la edición in-situ de los nobres asignados a puertos o clientes E&nable client/port aliases Habilitar alias para los nombres de &puertos / clientes Whether to enable client/port name aliases on the connections window Permitir alias para los puertos / clientes en la ventana de conexiones Misc Otras Other Otro &Start JACK audio server on application startup Iniciar el &servidor JACK al cargar qjackctl Whether to start JACK audio server immediately on application startup Iniciar JACK de forma automática cuando se lanza qjackctl &Confirm application close Pedir &confirmación al salir Whether to ask for confirmation on application exit Preguntar antes de salir de la aplicación &Keep child windows always on top &Las ventanas hijas siempre arriba Whether to keep all child windows on top of the main window Todas las ventanas creadas por qjackctl estarán sobre la ventana principal &Enable system tray icon Habilitar ícono en band&eja del sistema Whether to enable the system tray icon Permitir íconos en la bandeja del sistema S&ave JACK audio server configuration to: Gu&ardar la configuración del servidor JACK en: Whether to save the JACK server command-line configuration into a local file (auto-start) Guardar la línea de comando de JACK a un archivo (auto - inicio) .jackdrc .jackdrc The server configuration local file name (auto-start) El archivo con la configuración de JACK (auto-inicio) Warning Advertencia msec mseg n/a n/d &Preset Name Nombre del &Preset &Server Path Ruta hacia el &Servidor &Driver &Driver &Interface &Interfaz Sample &Rate &Frecuencia de muestreo &Frames/Period &Cuadros / Período Periods/&Buffer Períodos / &Buffer Patchbay Definition files Archivos de esquema de patchbay Some settings have been changed: "%1" Do you want to save the changes? Algunas configuraciones han cambiado: "%1" ¿Desea guardarlas? System Sistema Cycle Ciclo HPET HPET Don't restrict self connect requests (default) No restringir peticiones de auto-conexión (por defecto) Fail self connect requests to external ports only Solo suspender peticiones de auto-conexión a puertos externos Ignore self connect requests to external ports only Solo ignorar peticiones de auto-conexión a puertos externos Fail all self connect requests Suspender todas las peticiones de auto-conexión Ignore all self connect requests Ignorar todas las peticiones de auto-conexión Delete preset: "%1" Are you sure? Borrar preset: "%1" ¿Está seguro? Startup Script Script de Inicio Post-Startup Script Script de Post-Inicio Shutdown Script Script de Apagado Post-Shutdown Script Script de Post-Cierre Active Patchbay Definition Esquema Activo de Patchbay Messages Log Registro de Mensajes Log files Archivos de registros Information Información Some settings may be only effective next time you start this application. Algunos ajustes solo serán efectivos la próxima vez que arranques la aplicación. Some settings have been changed. Do you want to apply the changes? Algunas configuraciones han cambiado. ¿Desea aplicar los cambios? The audio backend driver interface to use El driver de audio a utilizar MIDI Driv&er: Driv&er MIDI: The ALSA MIDI backend driver to use El driver MIDI de ALSA a utilizar none ninguno raw DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 seq DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 &Verbose messages Mensajes &Verbosos plughw:0 /dev/audio &Channels: &Canales: 192000 192000 Maximum number of audio channels to allocate El máximo número de canales de audio a utilizar Logging Registro Messages log file Archivo de registro de mensajes Browse for the messages log file location Ir hasta la ubicación del archivo con el registro de mensajes Whether to activate a messages logging to file. Guardar los mensajes a un archivo. Advanced Avanzado Whether to reset all connections when a patchbay definition is activated. Resetear todas las conexiones cuando se activa una definición de patchbay. &Reset all connections on patchbay activation &Resetear todas las conexiones con activación del patchbay Whether to issue a warning on active patchbay port disconnections. Avisar de desconexiones de puertos en patchbay activo. &Warn on active patchbay disconnections Ad&vertir cuando haya desconexiones en patchbay activo &Messages log file: Archivo con los &Mensajes: Whether to enable blinking (flashing) of the server mode (RT) indicator Hablilitar el parpadeo del indicador de modo del servidor (RT) Blin&k server mode indicator &Parpadeo del indicador de modo del servidor &JACK client/port aliases: Alias de cliente/puerto para &JACK: JACK client/port aliases display mode Modo de visualización de los alias cliente/puerto de JACK Default Predeterminado First Primero Second Segundo JACK client/port pretty-name (metadata) display mode Mostrar nombres personalizados (metadatos) de cliente/puerto JACK Enable JA&CK client/port pretty-names (metadata) Habilitar nombres personalizados (metadatos) de cliente/puerto JA&CK Whether to ask for confirmation on JACK audio server shutdown and/or restart Pedir confirmación al cerrar y/o reiniciar el servidor de audio JACK Confirm server sh&utdown and/or restart Confirmar cie&rre y/o reinicio del servidor Whether to show system tray message on main window close Mostrar mensaje en bandeja del sistema al cerrar ventana principal Sho&w system tray message on close M&ostrar mensaje en bandeja del sistema al cerrar Whether to start minimized to system tray Iniciar minimizado en la bandeja del sistema Start minimi&zed to system tray Iniciar minimi&zado en la bandeja del sistema Setup Configuración Whether to restrict client self-connections Restringir auto-conexiones de clientes Whether to use server synchronous mode Utilizar el modo síncrono del servidor Clear settings of current preset name Vaciar configuración preset actual Clea&r Vacia&r &Use server synchronous mode &Utilizar modo síncrono del servidor Cloc&k source: Fuente relo&j: Clock source Fuente reloj S&elf connect mode: Modo auto-con&exión: Custom Personalizado &Color palette theme: Esquema paleta &colores: Custom color palette theme Esquema paleta colores personalizado Wonton Soup DO NOT TRANSLATE KXStudio DO NOT TRANSLATE Manage custom color palette themes Gestionar esquema paleta colores personalizado &Widget style theme: Esquema estilo &widgets: Custom widget style theme Esquema estilo de widgets personalizado Whether to enable ALSA Sequencer (MIDI) support on startup Habilitar soporte para el Secuenciador ALSA (MIDI) al iniciar E&nable ALSA Sequencer support Habilitar Secue&nciador ALSA Whether to enable JACK D-Bus interface Activar el interfaz JACK D-Bus &Enable JACK D-Bus interface Activar int&erfaz JACK D-Bus Buttons Botones Whether to hide the left button group on the main window Ocultar el grupo de botones a la izquierda de la ventana principal Hide main window &Left buttons Ocultar botones de &la izquierda Whether to hide the right button group on the main window Ocultar el grupo de botones a la derecha de la ventana principal Hide main window &Right buttons Ocultar botones de la de&recha Whether to hide the transport button group on the main window Ocultar el grupo de botones del transporte en la ventana principal Hide main window &Transport buttons Ocultar los botones del &Transporte Whether to hide the text labels on the main window buttons Ocultar las etiquetas en los botones de la ventana principal Hide main window &button text labels Ocultar etiquetas de texto en los &botones Whether to replace Connections with Graph button on the main window Reemplazar Conexiones con botón de Gráfico en ventana principal Replace Connections with &Graph button Reemplazar Conexiones con botón de &Gráfico Defaults Predeterminados &Base font size: Tamaño &básico de tipografías: Base application font size (pt.) Tamaño básico de tipografías para la aplicación (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to enable D-Bus interface Habilitar la interfaz por D-Bus &Enable D-Bus interface &Habilitar la interfaz via D-Bus Number of microseconds to wait between engine processes (dummy) Número de microsegundos a esperar entre procesamientos (dummy) netone DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to restrict to one single application instance (X11) Restringir una sola instancia de la aplicación (X11) Single application &instance Una sola &instancia &Name: &Nombre: The JACK Audio Connection Kit sound server name El nombre del servidor JACK Audio Connection Kit &Server Name Nombre del &Servidor Server path (command line prefix) Ruta del servidor (prefijo de la línea de comando) &Channels I/O: &Canales de E/S: &Latency I/O: &Latencia E/S: Start De&lay: Demora antes de&l inicio: secs segs 0 msecs 0 msegs Server Suffi&x: Sufijo del &Servidor: Server &Prefix: &Prefijo del servidor: Extra driver options (command line suffix) Opciones extra para el driver (sufijo de la línea de comandos) Whether to stop JACK audio server on application exit Detener el servidor JACK al salir de la aplicación S&top JACK audio server on application exit De&tener servidor JACK al salir de la aplicación qjackctlSocketForm &Socket &Socket &Name (alias): &Nombre (alias): Socket name (an alias for client name) Nombre del socket (un alias para el nombre de cliente) Client name (regular expression) Nombre del cliente (expresión regular) Add P&lug Añadir P&lug Add plug to socket plug list Añadir plug a la lista de sockets &Plug: &Plug: Port name (regular expression) Nombre del puerto (expresión regular) Socket Plugs / Ports Socket Plugs / Puertos Socket plug list Lista de socket tipo plug &Edit &Editar &Remove &Eliminar Remove currently selected plug from socket plug list Eliminar el plug seleccionado de la lista Socket Socket &Client: &Cliente: &Down &Bajar &Up &Subir E&xclusive E&xclusivo Enforce only one exclusive cable connection Permitir una conexión únicamente Type Tipo &Audio A&udio Audio socket type (JACK) Socket tipo audio (JACK) &MIDI &MIDI MIDI socket type (ALSA) Socket tipo MIDI (ALSA) Plugs / Ports Plugs / Puertos Error Error A socket named "%1" already exists. Un socket llamado "%1" ya existe. Add Plug Añadir Plug Remove Eliminar Edit Editar Move Up Subir Move Down Bajar Warning Advertencia Some settings have been changed. Do you want to apply the changes? Algunas configuraciones han cambiado. ¿Desea aplicar los cambios? (None) (Ninguno) Edit currently selected plug Editar el plug seleccionado Move down currently selected plug in socket plug list Mover hacia abajo en la lista el plug seleccionado Move up current selected plug in socket plug list Mover hacia arriba en la lista el plug seleccionado &Forward: &Avanzar: Forward (clone) all connections from this socket Reenviar (clonar) todas las conexiones desde este socket MIDI socket type (JACK) Tipo de socket MIDI (JACK) AL&SA AL&SA qjackctlSocketList Output Salida Input Entrada Socket Socket Warning Advertencia <New> - %1 <Nuevo> - %1 %1 about to be removed: "%2" Are you sure? A punto de ser eliminado %1: "%2" ¿Está seguro? %1 <Copy> - %2 %1 <Copia> - %2 qjackctlSocketListView Output Sockets / Plugs Sockets de Salida / Plugs Input Sockets / Plugs Sockets de Entrada / Plugs qjackctl-1.0.6/src/translations/PaxHeaders/qjackctl_sk.ts0000644000000000000000000000013215174607203020546 xustar0030 mtime=1777536643.524914226 30 atime=1777536643.524914226 30 ctime=1777536643.524914226 qjackctl-1.0.6/src/translations/qjackctl_sk.ts0000644000175000001440000064126315174607203020552 0ustar00rncbcusers PortAudioProber Probing... ZisÅ¥ujem... Please wait, PortAudio is probing audio hardware. PoÄ�kajte, prosím, PortAudio zisÅ¥uje zvukový hardvér. Warning Upozornenie Audio hardware probing timed out. VyprÅ¡al Ä�asový limit poÄ�as zisÅ¥ovania zvukového hardvéru. QObject (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Usage: %1 [options] [command-and-args] Použitie: %1 [možnosti] [príkazy a argumenty] Options: Možnosti: Start JACK audio server immediately. Set default settings preset name. Set active patchbay definition file. Set default JACK audio server name. Show help about command line options. Show version information. Displays help on command-line options. Launch command with arguments. [command-and-args] Option -p requires an argument (preset). MožnosÅ¥ -p vyžaduje argument (prednastavenie). Option -a requires an argument (path). Možnost -a vyžaduje argument (cesta). Option -n requires an argument (name). MožnosÅ¥ -n vyžaduje argument (názov). %1 (%2 frames) %1 (%2 snímkov) Move Presunúť Rename PremenovaÅ¥ qjackctlAboutForm About O programe &Close &ZavrieÅ¥ About Qt O Qt Version Verzia Debugging option enabled. Povolená voľba pre ladenie. System tray disabled. Zakázaná systémová oblasÅ¥. Transport status control disabled. Zakázané ovládanie stavu transportu. Realtime status disabled. Zakázaný stav spúšťania v reálnom Ä�ase. XRUN delay status disabled. Zákaz stav oneskorenia XRUN. Maximum delay status disabled. Zakázaný stav najväÄ�Å¡ieho oneskorenia. JACK MIDI support disabled. JACK MIDI nie je podporovaný. JACK Session support disabled. Podpora pre sedenie JACK bola zakázaná. ALSA/MIDI sequencer support disabled. Podpora pre ALSA/MIDI radiÄ� (sequencer) bola vypnutá. Using: Qt %1 Používa: Qt %1 JACK %1 JACK %1 Website Webová stránka This program is free software; you can redistribute it and/or modify it Tento program je slobodným softvérom. Môžete ho šíriÅ¥ a/alebo upravovaÅ¥ under the terms of the GNU General Public License version 2 or later. pri dodržaní podmienok licencie GNU General Public License verzie 2 alebo neskorÅ¡ej. JACK Port aliases support disabled. Podpora pre prezývky prípojok JACK vypnutá. D-Bus interface support disabled. Podpora pre rozhranie D-Bus vypnutá. qjackctlClientListView Readable Clients / Output Ports ÄŒitateľné prípojky pre klientov/výstupy Writable Clients / Input Ports Zapisovateľné prípojky pre klientov/výstupy &Connect &SpojiÅ¥ Alt+C Connect Alt+C &Disconnect &OdpojiÅ¥ Alt+D Disconnect Alt+D Disconnect &All O&dpojiÅ¥ vÅ¡etko Alt+A Disconnect All Alt+A Re&name &PremenovaÅ¥ Alt+N Rename Alt+N &Refresh &ObnoviÅ¥ Alt+R Refresh Alt+R qjackctlConnect Warning Upozornenie This will suspend sound processing from all client applications. Are you sure? Týmto pozastavíte spracovanie zvuku pre vÅ¡etky klientske aplikácie. Ste si istý? qjackctlConnectionsForm Connections Spojenia Audio Zvuk Connect currently selected ports SpojiÅ¥ aktuálne vybraté prípojky &Connect &SpojiÅ¥ Disconnect currently selected ports OdpojiÅ¥ aktuálne vybraté prípojky &Disconnect O&dpojiÅ¥ Disconnect all currently connected ports OdpojiÅ¥ vÅ¡etky aktuálne spojené prípojky Disconnect &All OdpojiÅ¥ &vÅ¡etko Expand all client ports RozbaliÅ¥ vÅ¡etky klientske prípojky E&xpand All Ro&zbaliÅ¥ vÅ¡etko Refresh current connections view ObnoviÅ¥ pohľad na aktuálne spojenia &Refresh &ObnoviÅ¥ MIDI MIDI ALSA ALSA qjackctlConnectorView &Connect &SpojiÅ¥ Alt+C Connect Alt+C &Disconnect &OdpojiÅ¥ Alt+D Disconnect Alt+D Disconnect &All OdpojiÅ¥ &vÅ¡etko Alt+A Disconnect All Alt+A &Refresh &ObnoviÅ¥ Alt+R Refresh Alt+R qjackctlGraphCanvas Connect SpojiÅ¥ Disconnect RozpojiÅ¥ qjackctlGraphForm Graph Graf &Graph &Graf &Edit Úp&ravy &View &Pohľad &Zoom &ZväÄ�Å¡enie Co&lors &Farby S&ort &TriediÅ¥ &Help Po&mocník &Connect &Spojenie Connect SpojiÅ¥ Connect selected ports SpojiÅ¥ vybraté prípojky &Disconnect &OdpojiÅ¥ Disconnect OdpojiÅ¥ Disconnect selected ports OdpojiÅ¥ vybraté prípojky Ctrl+C T&humbview Ctrl+D Cl&ose &ZavrieÅ¥ Close ZavrieÅ¥ Close this application window ZavrieÅ¥ okno tohto programu Select &All VybraÅ¥ &vÅ¡etko Select All Vybrat vÅ¡etko Ctrl+A Ctrl+A Select &None NevybraÅ¥ &niÄ� Select None NevybraÅ¥ niÄ� Ctrl+Shift+A Ctrl+Shift+A Select &Invert OtoÄ�iÅ¥ &výber Select Invert OtoÄ�iÅ¥ výber Ctrl+I Ctrl+I &Rename... &PremenovaÅ¥... Rename item PremenovaÅ¥ položku Rename Item PremenovaÅ¥ položku F2 F2 &Find... Find Find nodes Ctrl+F &Menubar &Ponuková liÅ¡ta Menubar Ponuková liÅ¡ta Show/hide the main program window menubar ZobraziÅ¥/skryÅ¥ hlavné okno programu s ponukovou liÅ¡tou Ctrl+M Ctrl+M &Toolbar &Nástrojová liÅ¡ta Toolbar Nástrojová liÅ¡ta Show/hide main program window file toolbar ZobraziÅ¥/skryÅ¥ hlavné okno programu s nástrojovou liÅ¡tou &Statusbar &Stavový riadok Statusbar Stavový riadok Show/hide the main program window statusbar ZobraziÅ¥/skryÅ¥ stavový riadok hlavného okna programu &Top Left Top left Show the thumbnail overview on the top-left Top &Right Top right Show the thumbnail overview on the top-right Bottom &Left Bottom Left Bottom left Show the thumbnail overview on the bottom-left &Bottom Right Bottom right Show the thumbnail overview on the bottom-right &None None Žiadny Hide thumbview Hide the thumbnail overview Text Beside &Icons Text &vedľa ikon Text beside icons Text vedľa ikon Show/hide text beside icons ZobraziÅ¥/skryÅ¥ text vedľa ikon &Center &CentrovaÅ¥ Center CentrovaÅ¥ Center view CentrovaÅ¥ pohľad &Refresh &ObnoviÅ¥ Refresh ObnoviÅ¥ Refresh view ObnoviÅ¥ pohľad F5 F5 Zoom &In &PriblížiÅ¥ Zoom In PriblížiÅ¥ Ctrl++ Ctrl++ Zoom &Out &OddialiÅ¥ Zoom Out OddialiÅ¥ Ctrl+- Ctrl+- Zoom &Fit &PrispôsobiÅ¥ oknu Zoom Fit PrispôsobiÅ¥ oknu Ctrl+0 Ctrl+0 Zoom &Reset PoužiÅ¥ &predvolené zväÄ�Å¡enie Zoom Reset PoužiÅ¥ predvolené zväÄ�Å¡enie Ctrl+1 Ctrl+1 &Zoom Range Rozsah &zväÄ�Å¡enia Zoom Range Rozsah zväÄ�Å¡enia JACK &Audio... JACK &Audio... JACK Audio color Farba JACK Audio JACK &MIDI... JACK &MIDI... JACK MIDI JACK MIDI JACK MIDI color Farba JACK MIDI ALSA M&IDI... ALSA MIDI ALSA MIDI ALSA MIDI color Farba ALSA MIDI JACK &CV... JACK &CV... JACK CV color Farba JACK CV JACK &OSC... JACK &OSC... JACK OSC JACK OSC JACK OSC color Farba JACK OSC &Reset &ObnoviÅ¥ predvolené Reset colors ObnoviÅ¥ predvolené farby Port &Name &Názov prípojky (port) Port name Názov prípojky (port) Sort by port name TriediÅ¥ podľa názvu prípojky (port) Port &Title &Názov prípojky (port) Port title Názov prípojky (port) Sort by port title TriediÅ¥ podľa názvu prípojky (port) Port &Index Čí&slo prípojky (port) Port index Číslo prípojky (port) Sort by port index TriediÅ¥ podľa Ä�ísla prípojky (port) &Ascending &Vzostupne Ascending Vzostupne Ascending sort order Vzostupné poradie triedenia &Descending &Zostupne Descending Zostupne Descending sort order Zostupné poradie triedenia Repel O&verlapping Nodes Repel nodes Repel overlapping nodes Connect Thro&ugh Nodes Connect Through Nodes Connect through nodes Whether to draw connectors through or around nodes &About... &O programe... About... O programe... About O programe Show information about this application program ZobraziÅ¥ informácie o tomto programe About &Qt... O &Qt... About Qt... O Qt... About Qt O Qt Show information about the Qt toolkit ZobraziÅ¥ informácie o sade nástrojov prostredia Qt &Undo &Späť &Redo &Znova Undo last edit action VrátiÅ¥ poslednú úpravu späť Redo last edit action VykonaÅ¥ poslednú upravu znova Zoom ZväÄ�Å¡enie Ready Pripravený Colors - %1 Farby - %1 qjackctlMainForm Quit processing and exit ZastaviÅ¥ spracovanie a ukonÄ�iÅ¥ program &Quit &UkonÄ�iÅ¥ Start the JACK server SpustiÅ¥ server JACK &Start &SpustiÅ¥ Stop the JACK server ZastaviÅ¥ server JACK S&top &ZastaviÅ¥ St&atus S&tav Show information about this application ZobraziÅ¥ informácie o tomto programe Ab&out... &O programe... Set&up... &Nastavenia... Show settings and options dialog ZobraziÅ¥ dialógové okno pre nastavenia a možnosti &Messages &Hlásenia Show/hide the patchbay editor window ZobraziÅ¥/skryÅ¥ okno editoru so zapájacou doskou &Patchbay &Zapájacia doska &Connect S&pojiÅ¥ JACK server state Stav serveru JACK JACK server mode Režim servera JACK DSP Load ZaÅ¥aženie DSP Sample rate Vzorkovacia frekvencia XRUN Count (notifications) PoÄ�et XRUN (oznámenia) Time display Údaj o Ä�ase Transport state Stav transportu Transport BPM Transport BPM Transport time ÄŒas transportu Show/hide the session management window ZobraziÅ¥/skryÅ¥ okno so správou sedenia Show/hide the messages log/status window ZobraziÅ¥/skryÅ¥ okno so záznamami/stavom Show/hide the graph window ZobraziÅ¥/skryÅ¥ okno s grafom Show/hide the connections window ZobraziÅ¥/skryÅ¥ okno so spojeniami Backward transport Transport naspäť &Backward &Naspäť Forward transport Transport vpred &Forward &Vpred Rewind transport PretoÄ�iÅ¥ transport naspäť &Rewind &PretoÄ�iÅ¥ naspäť Stop transport rolling ZastaviÅ¥ chod transportu Pa&use &PozastaviÅ¥ Start transport rolling SpustiÅ¥ chod transportu &Play &PrehraÅ¥ Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Nepodarilo sa otvoriÅ¥ radiÄ� (sekvencér) ALSA ako klienta. Zapájacia doska ALSA MIDI nebude dostupná. D-BUS: Service is available (%1 aka jackdbus). D-BUS: Služba je dostupná (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: Služba nie je dostupná (%1 aka jackdbus). Information Informácie Warning Upozornenie JACK is currently running. Do you want to terminate the JACK audio server? Server JACK je aktuálne spustený. Chcete ukonÄ�iÅ¥ zvukový server JACK? successfully úspeÅ¡ne with exit status=%1 s návratovou hodnotou = %1 Could not start JACK. Maybe JACK audio server is already started. Jack sa nepodarilo spustiÅ¥. Možno je už server JACK spustený. Could not load preset "%1". Retrying with default. Nepodarilo sa naÄ�ítaÅ¥ nastavenie "%1". Skúšam to opäť s predvoleným nastavením. Could not load default preset. Sorry. Nepodarilo sa naÄ�ítaÅ¥ predvolené nastavenie. Ľutujem. Startup script... Spúšťací skript... Startup script terminated Spúšťací skript bol ukonÄ�ený D-BUS: JACK server is starting... D-BUS: Spúšťa sa server JACK... D-BUS: JACK server could not be started. Sorry D-BUS: Server JACK sa nepodarilo spustiÅ¥. Ľutujem JACK is starting... JACK sa spúšťa... Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Niektoré klientske zvukové aplikácie sú stále aktívne a pripojené. Chcete zastaviÅ¥ zvukový server JACK? JACK is stopping... JACK sa zastavuje... Shutdown script... Vypínací skript... Don't ask this again Už sa nepýtaÅ¥ Shutdown script terminated Vypínací skript bol ukonÄ�ený D-BUS: JACK server is stopping... D-BUS: Zastavuje sa server JACK... D-BUS: JACK server could not be stopped. Sorry D-BUS: Server JACK se nepodarilo zastaviÅ¥. Ľutujem Post-shutdown script... Skript po vypnutí... Post-shutdown script terminated Skript po vypnutí bol ukonÄ�ený JACK was started with PID=%1. JACK bol spustený s PID = %1. %1 is about to terminate. Are you sure? D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: Server JACK bol spustený (%1 alebo tiež jackdbus). JACK is being forced... JACK je nútený... JACK was stopped JACK bol zastavený D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: Server JACK bol zastavený (%1 alebo tiež jackdbus). Error Chyba Transport time code Transport Ä�asového kódu Elapsed time since last reset ÄŒas od posledného obnovenia továrenských nastavení Elapsed time since last XRUN ÄŒas od posledného XRUN Patchbay activated. Zapájacia doska aktivovaná. Patchbay deactivated. Zapájacia doska deaktivovaná. Statistics reset. Å tatistiky vynulované. msec ms JACK connection graph change. Graf spojení JACK zmenený. XRUN callback (%1). Spätné volanie (callback) XRUN (%1). Buffer size change (%1). VeľkosÅ¥ vyrovnávacej pamäte zmenená (%1). Shutdown notification. Oznámenie o zastavení. Could not start JACK. Sorry. Nepodarilo sa spustiÅ¥ JACK. Ľutujem. JACK has crashed. JACK spadol. JACK timed out. JACK - Ä�as vyprÅ¡al. JACK write error. Chyba pri zápise do JACKu. JACK read error. Chyba pri Ä�ítaní JACKu. Unknown JACK error (%d). Neznáma chyba JACKu (%d). ALSA connection graph change. Graf spojení ALSA zmenený. JACK active patchbay scan Skenovanie aktívnej zapájacej dosky JACK ALSA active patchbay scan Skenovanie aktívnej zapájacej dosky ALSA JACK connection change. Spojenie JACK zmenené. ALSA connection change. Spojenie ALSA zmenené. checked skontrolované connected spojené disconnected odpojené failed zlyhalo A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Definícia zapájacej dosky je teraz aktívna, Ä�o pravdepodobne znamená prerobenie tohto spojenia: %1 -> %2 Chcete odstrániÅ¥ spojenie zapájacej dosky? The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Program bude bežaÅ¥ Ä�alej v systémovej liÅ¡te. Pre ukonÄ�enie programu vyberte, prosím, "UkonÄ�iÅ¥" v kontextovej ponuke ikony na systémovej liÅ¡te. Don't show this message again Toto hlásenie už viac nezobrazovaÅ¥ The preset aliases have been changed: "%1" Do you want to save the changes? Prezývky pre prednastavenia boli zmenené: "%1" Chcete uložiÅ¥ zmeny? Transport BBT (bar.beat.ticks) Transport BBT (takt:doba.tiknutie - bar:beat.ticks) Patchbay reset. Uvedenie zapájacej dosky do predvolených nastavení. Could not load active patchbay definition. "%1" Disabled. Nepodarilo sa nahraÅ¥ definíciu aktívnej zapájacej dosky. "%1" Zakázané. Freewheel started... Voľnobeh spustený... Freewheel exited. Voľnobeh ukonÄ�ený. JACK property change. VlastnosÅ¥ JACK zmenená. Overall operation failed. Celková operácia sa nepodarila. Invalid or unsupported option. Neplatná alebo nepodporovaná voľba. Client name not unique. Názov klienta nie je jedineÄ�ný. Server is started. Server je spustený. Unable to connect to server. Nedá sa pripojiÅ¥ k serveru. Server communication error. Chyba pri komunikácii so serverom. Client does not exist. Klient neexistuje. Unable to load internal client. Nepodarilo sa naÄ�ítaÅ¥ interného klienta. Unable to initialize client. Nepodarilo sa inicializovaÅ¥ klienta. Unable to access shared memory. Nepodarilo sa pristúpiÅ¥ ku zdieľanej pamäti. Client protocol version mismatch. Nesedí verzia protokolu klienta. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Nepodarilo sa pripojiÅ¥ k serveru JACK ako klient. - %1 ÄŽalÅ¡ie informácie nájdete v okno s hláseniami. Server configuration saved to "%1". Nastavenie servera uložené do "%1". Client activated. Klient aktivovaný. Post-startup script... Skript po spustení... Post-startup script terminated Skript po spustení skonÄ�il Command line argument... Argument pre príkazový riadok... Command line argument started Argument pre príkazový riadok spustený Client deactivated. Klient deaktivovaný. Transport rewind. PretoÄ�iÅ¥ transport naspäť. Transport backward. Transport späť. Starting Spúšťa sa Transport start. Spustenie transportu. Stopping Zastavuje sa Transport stop. Transport zastavený. Transport forward. Transport vpred. Stopped Zastavené %1 (%2%) %1 (%2 %) %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 snímkov Yes Ã�no No Nie FW FW RT RT Rolling Ide Looping Zapína sa do jednoduchého obvodu %1 msec %1 ms XRUN callback (%1 skipped). Spätné volanie (callback) XRUN (%1 preskoÄ�ených). Started Spustené Active Aktívny Activating Aktivuje sa Inactive Neaktívny &Hide &SkryÅ¥ D-BUS: GetParameterConstraint('%1'): %2. (%3) D-BUS: GetParameterConstraint('%1'): %2. (%3) Mi&nimize &MinimalizovaÅ¥ S&how &ZobraziÅ¥ Rest&ore O&bnoviÅ¥ &Stop &ZastaviÅ¥ &Reset &ObnoviÅ¥ predvolené &Presets &Prednastavenia &Versioning &Verzovanie Re&fresh &AktualizovaÅ¥ S&ession Se&denie &Load... &NaÄ�ítaÅ¥... &Save... &UložiÅ¥... Save and &Quit... UložiÅ¥ a &ukonÄ�iÅ¥... Save &Template... UložiÅ¥ ako Å¡a&blónu... &Connections &Spojenia Patch&bay &Zapájacia doska &Graph &Graf &Transport &Transport Server settings will be only effective after restarting the JACK audio server. Nastavenia serveru sa prejavia až po opätovnom spustení serveru JACK. Do you want to restart the JACK audio server? Chcete zvukový server JACK spustiÅ¥ znovu? D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: NastaviÅ¥ hodnotu parametra SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: VynulovaÅ¥ hodnotu parametra ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS: ZískaÅ¥ hodnotu parametra GetParameterValue('%1'): %2. (%3) Some settings will be only effective the next time you start this program. Niektoré nastavenia sa prejavia až po Ä�alÅ¡om spustení tohto programu. qjackctlMessagesStatusForm Messages / Status Hlásenia/Stav &Messages &Správy Messages log Záznam správ Messages output log Výstup so záznamom správ &Status &Stav Status information Informácie o stave Statistics since last server startup Å tatistiky od posledného spustenia servera Description Popis Value Hodnota Reset XRUN statistic values VynulovaÅ¥ Å¡tatistiky hodnôt XRUN Re&set &VynulovaÅ¥ Refresh XRUN statistic values ObnoviÅ¥ údaje v Å¡tatistike XRUN &Refresh &ObnoviÅ¥ Server name Názov servera Server state Stav servera DSP Load ZaÅ¥aženie DSP Sample Rate Vzorkovacia frekvencia Buffer Size VeľkosÅ¥ vyrovnávacej pamäte Realtime Mode Režim skutoÄ�ného Ä�asu Transport state Stav transportu Transport Timecode Transport Ä�asového kódu Transport BBT Transport BBT Transport BPM Transport BPM XRUN count since last server startup PoÄ�et XRUN od posledného spustenia servera XRUN last time detected ÄŒas poslednej detekcie XRUN XRUN last Posledné XRUN XRUN maximum NajväÄ�Å¡ia hodnota XRUN XRUN minimum NajmenÅ¡ia hodnota XRUN XRUN average Priemerná hodnota XRUN XRUN total Celkový poÄ�et XRUN Maximum scheduling delay NajväÄ�Å¡ie oneskorenie Ä�asu Time of last reset ÄŒas od posledného vynulovania hodnôt Logging stopped --- %1 --- Záznam zastavený --- %1 --- Logging started --- %1 --- Záznam spustený --- %1 --- qjackctlPaletteForm Color Themes Farebné motívy Name Názov Current color palette name Názov aktuálnej farebnej palety Save current color palette name UložiÅ¥ názov aktuálnej farebnej palety Save UložiÅ¥ Delete current color palette name OdstrániÅ¥ názov aktuálnej farebnej palety Delete OdstrániÅ¥ Palette Paleta Current color palette Aktuálna farebná paleta Generate: GenerovaÅ¥: Base color to generate palette Základná farba pre vytvorenie palety Reset all current palette colors VynulovaÅ¥ vÅ¡etky farby palety Reset VynulovaÅ¥ Import a custom color theme (palette) from file ImportovaÅ¥ vlastný farebný motív (paletu) zo súboru Import... ImportovaÅ¥... Export a custom color theme (palette) to file ExportovaÅ¥ vlastný farebný motív (paletu) do súboru Export... ExportovaÅ¥... Show Details ZobraziÅ¥ podrobnosti Import File - %1 ImportovaÅ¥ súbor - %1 Palette files (*.%1) Súbory s paletami (*.%1) Save Palette - %1 All files (*.*) VÅ¡etky súbory (*.*) Warning - %1 Upozornenie - %1 Could not import from file: %1 Sorry. Import zo súboru skonÄ�il s chybou. %1 Ľutujem. Export File - %1 ExportovaÅ¥ súbor - %1 Some settings have been changed. Do you want to discard the changes? Niektoré nastavenia boli zmenené. Chcete zahodiÅ¥ zmeny? Some settings have been changed: "%1". Do you want to save the changes? Niektoré nastavenia boli zmenené: "%1" Chcete uložiÅ¥ zmeny? qjackctlPaletteForm::PaletteModel Color Role Farebná rola Active Aktívna Inactive Neaktívna Disabled Vypnutá qjackctlPatchbay Warning Upozornenie This will disconnect all sockets. Are you sure? Toto odpojí vÅ¡etky zásuvky. Ste si istý? qjackctlPatchbayForm Patchbay Zapájacia doska Move currently selected output socket down one position Posunúť aktuálne vybratú výstupnú zásuvku o jednu pozíciu nižšie Down Nižšie Create a new output socket VytvoriÅ¥ novú výstupnú zásuvku Add... PridaÅ¥... Edit currently selected input socket properties UpraviÅ¥ vlastnosti aktuálne vybratej vstupnej zásuvky Edit... UpraviÅ¥... Move currently selected output socket up one position Posunúť aktuálne vybratú výstupnú zásuvku o jednu pozíciu vyššie Up Vyššie Remove currently selected output socket OdstrániÅ¥ aktuálne vybratú výstupnú zásuvku Remove OdstrániÅ¥ Duplicate (copy) currently selected output socket DuplikovaÅ¥ (kopírovaÅ¥ ) aktuálne vybratú výstupnú zásuvku Copy... KopírovaÅ¥... Remove currently selected input socket OdstrániÅ¥ aktuálne vybratú vstupnú zásuvku Duplicate (copy) currently selected input socket DuplikovaÅ¥ (kopírovaÅ¥ ) aktuálne vybratú vstupnú zásuvku Create a new input socket VytvoriÅ¥ novú vstupnú zásuvku Edit currently selected output socket properties UpraviÅ¥ vlastnosti aktuálne vybratej výstupnej zásuvky Connect currently selected sockets SpojiÅ¥ aktuálne vybraté zásuvky &Connect S&pojiÅ¥ Disconnect currently selected sockets OdpojiÅ¥ aktuálne vybraté zásuvky &Disconnect &OdpojiÅ¥ Disconnect all currently connected sockets OdpojiÅ¥ vÅ¡etky aktuálne vybraté zásuvky Disconnect &All &OdpojiÅ¥ vÅ¡etko Expand all items RozbaliÅ¥ vÅ¡etky položky E&xpand All RozbaliÅ¥ &vÅ¡etko Refresh current patchbay view ObnoviÅ¥ pohľad na aktuálnu zapájaciu dosku &Refresh &ObnoviÅ¥ Create a new patchbay profile VytvoriÅ¥ nový profil zapájacej dosky &New &Nový Load patchbay profile NaÄ�ítaÅ¥ profil zapájacej dosky &Load... &NaÄ�ítaÅ¥... Save current patchbay profile UložiÅ¥ aktuálny profil zapájacej dosky &Save... &UložiÅ¥... Current (recent) patchbay profile(s) Aktuálny (naposledy použitý) profil(y) zapájacej dosky Toggle activation of current patchbay profile Prepnúť aktivovanie aktuálneho profilu zapájacej dosky Acti&vate &AktivovaÅ¥ Warning Upozornenie The patchbay definition has been changed: "%1" Do you want to save the changes? Definícia zapájacej dosky bola zmenená: "%1" Chcete uložiÅ¥ zmeny? %1 [modified] %1 [zmenený] Untitled%1 Bez názvu%1 Error Chyba Could not load patchbay definition file: "%1" Nepodarilo sa nahraÅ¥ súbor s definíciou zapájacej dosky: "%1" Could not save patchbay definition file: "%1" Nepodarilo sa uložiÅ¥ súbor s definíciou zapájacej dosky: "%1" New Patchbay definition Nová definícia zapájacej dosky Create patchbay definition as a snapshot of all actual client connections? VytvoriÅ¥ definíciu zapájacej dosky ako snímok vÅ¡etkých súÄ�asných klientskych spojení? Load Patchbay Definition NaÄ�ítaÅ¥ definíciu zapájacej dosky Patchbay Definition files Súbory s definíciami zapájacej dosky Save Patchbay Definition UložiÅ¥ definíciu zapájacej dosky active aktívne qjackctlPatchbayView Add... PridaÅ¥... Edit... UpraviÅ¥... Copy... KopírovaÅ¥... Remove OdstrániÅ¥ Exclusive Výhradný Forward Dopredu (None) (Žiadny) Move Up Presunúť vyššie Move Down Presunúť nižšie &Connect &SpojiÅ¥ Alt+C Connect Alt+C &Disconnect &OdpojiÅ¥ Alt+D Disconnect Alt+D Disconnect &All &OdpojiÅ¥ vÅ¡etko Alt+A Disconnect All Alt+A &Refresh &ObnoviÅ¥ Alt+R Refresh Alt+R qjackctlSessionForm Session Sedenie Load session NaÄ�ítaÅ¥ sedenie &Load... &NaÄ�ítaÅ¥... Recent session Naposledy otvorené sedenie &Recent &Naposledy otvorené Save session UložiÅ¥ sedenie &Versioning &Verzovanie Re&fresh Ob&noviÅ¥ Session clients / connections Klienti sedenia/spojenia Infra-clients / commands Infra-klienti/Príkazy Infra-client Infra-klient Infra-command Infra-príkaz Add infra-client PridaÅ¥ infra-klienta &Add Prid&aÅ¥ Edit infra-client UpraviÅ¥ infra-klienta &Edit &UpraviÅ¥ Remove infra-client OdstrániÅ¥ infra-klienta Re&move &OdstrániÅ¥ &Save... &UložiÅ¥... Update session ObnoviÅ¥ sedenie Client / Ports Klient/Prípojky UUID UUID Command Príkaz &Save &UložiÅ¥ Load Session NaÄ�ítaÅ¥ sedenie Session directory Adresár so sedením Save Session UložiÅ¥ sedenie and Quit a ukonÄ�iÅ¥ Template Å ablóna &Clear &VyÄ�istiÅ¥ Warning Upozornenie A session could not be found in this folder: "%1" Sedenie v tomto prieÄ�inku sa nepodarilo nájsÅ¥: "%1" %1: loading session... %1: naÄ�ítava sa sedenie... %1: load session %2. %1: naÄ�ítaÅ¥ sedenie %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? V tomto prieÄ�inku už existuje sedenie: "%1" Ste si istý, že chcete prepísaÅ¥ existujúce sedenie? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Tento prieÄ�inok už existuje a nie je prázdny: "%1" Ste si istý, že chcete prepísaÅ¥ existujúci prieÄ�inok? %1: saving session... %1: ukladá sa sedenie... %1: save session %2. %1: uložiÅ¥ sedenie %2. New Client Nový klient Save and &Quit... UložiÅ¥ a &ukonÄ�iÅ¥... Save &Template... UložiÅ¥ ako Å¡&ablónu... qjackctlSessionInfraClientItemEditor Infra-command Infra-príkaz qjackctlSessionSaveForm Session Sedenie &Name: &Názov: Session name &Directory: Session directory Adresár so sedením Browse for session directory ... ... Save session versioning UložiÅ¥ verzovanie sedenia &Versioning &Verzovanie Warning Upozornenie Session directory does not exist: "%1" Do you want to create it? Session Directory qjackctlSetupForm Settings Nastavenia Preset &Name: Názov prednastaveni&a: Settings preset name Názov prednastavenia (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Save settings as current preset name UložiÅ¥ nastavenia pod aktuálnym názvom prednastavenia &Save &UložiÅ¥ Delete current settings preset OdstrániÅ¥ aktuálne prednastavenie &Delete &OdstrániÅ¥ jackd DO NOT TRANSLATE jackdmp DO NOT TRANSLATE jackstart DO NOT TRANSLATE Driv&er: &OvládaÄ�: The audio backend driver interface to use OvládaÄ� pre zvukové rozhranie, ktoré sa má použiÅ¥ dummy DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 sun DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 oss DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 alsa DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 portaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 coreaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 firewire DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Parameters Parametre MIDI Driv&er: Ovlá&daÄ� MIDI: The ALSA MIDI backend driver to use OvládaÄ� ALSA MIDI, ktorý sa bude používaÅ¥ none žiadny raw DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 seq DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Time in seconds that client is delayed after server startup ÄŒas v sekundách, o ktorý je klient oneskorený po spustení servera Latency: Oneskorenie (latencia): Output latency in milliseconds, calculated based on the period, rate and buffer settings Oneskorenie (latencia) výstupu v ms, ktorého výpoÄ�et je založený na nastavení periódy, frekvencie a vyrovnávacej pamäte Use realtime scheduling PoužiÅ¥ spracovanie v reálnom Ä�ase &Realtime &Reálny Ä�as Do not attempt to lock memory, even if in realtime mode NepokúšaÅ¥ sa uzamknúť pamäť, ani v režime reálneho Ä�asu No Memory Loc&k &NezamykaÅ¥ pamäť Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Odomknúť pamäť bežných knižníc s nástrojmi (GTK+, QT, FLTK, Wine) &Unlock Memory &Odomknúť pamäť Ignore xruns reported by the backend driver IgnorovaÅ¥ xruny hlásené ovládaÄ�om So&ft Mode &Jednoduchý režim Provide output monitor ports Poskytnúť prípojky pre sledovanie výstupov (monitory) &Monitor &Sledovanie (monitor) Force 16bit mode instead of failing over 32bit (default) VynútiÅ¥ 16bitový režim miesto preklopenia do 32bitového (predvolený) Force &16bit VynútiÅ¥ &16bitový režim Enable hardware metering on cards that support it PovoliÅ¥ prístrojové meranie pri kartách, ktoré to podporujú H/&W Meter H/&W meradlo Ignore hardware period/buffer size IgnorovaÅ¥ hardvérovú periódu/veľkosÅ¥ vyrovnávacej pamäte &Ignore H/W &IgnorovaÅ¥ h/w Whether to give verbose output on messages PoužívaÅ¥ podrobný výstup v hláseniach &Verbose messages &Podrobné hlásenia &Output Device: &Výstupné zariadenie: &Interface: &Rozhranie: Maximum input audio hardware channels to allocate Maximálny poÄ�et prideliteľných vstupných zvukových kanálov hardvéru &Audio: &Zvuk: Dit&her: Vloženie Å¡umu do signálu (dit&hering): External output latency (frames) Externé výstupné oneskorenie (latencia) v snímkoch &Input Device: Vstupné zar&iadenie: Provide either audio capture, playback or both Poskytnúť buÄ� zaznamenávanie zvuku, prehrávanie alebo obe Duplex Obojsmerný (duplex) Capture Only Iba zaznamenávanie Playback Only Iba prehrávanie The PCM device name to use Názov zariadenia PCM, ktoré sa má použiÅ¥ hw:0 hw:0 plughw:0 plughw:0 /dev/audio /dev/audio /dev/dsp /dev/dsp > > Alternate input device for capture Záložné vstupné zariadenie pre zaznamenávanie Maximum output audio hardware channels to allocate Maximálny poÄ�et prideliteľných výstupných zvukových kanálov hardvéru Alternate output device for playback Záložné výstupné zariadenie pre prehrávanie External input latency (frames) Externé vstupné oneskorenie (latencia) v snímkoch Set dither mode NastaviÅ¥ režim vloženia Å¡umu do signálu (dithering) None Žiadny Rectangular Obdĺžnikový Shaped Obalová krivka Triangular Trojuholníkový Number of periods in the hardware buffer PoÄ�et periód vo vyrovnávacej pamäti hardvéru Priorit&y: &Priorita: &Frames/Period: &Snímky/Perióda: Frames per period between process() calls Snímkov za periódu medzi volaniami process() 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Port Ma&ximum: &Maximálny poÄ�et prípojok: &Channels: &Kanály: 21333 21333 Sample rate in frames per second Vzorkovacia frekvencia v snímkoch za sekundu 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Scheduler priority when running realtime Priorita schedulera pri behu v reálnom Ä�ase &Word Length: &Dĺžka slova: Periods/&Buffer: &Periódy/Vyrovnávacia pamäť: Word length Dĺžka slova Maximum number of ports the JACK server can manage NajväÄ�ší poÄ�et prípojok, ktoré môže JACK spravovaÅ¥ &Wait (usec): &ÄŒakaÅ¥ (µs): Sample &Rate: Frekvencia &vzorkovania: Maximum number of audio channels to allocate Maximálny poÄ�et prideliteľných zvukových kanálov &Timeout (msec): &PrekroÄ�enie Ä�asu (ms): Set client timeout limit in milliseconds NastaviÅ¥ hranicu pre prekroÄ�enie Ä�asu pre klienta v milisekundách 200 200 500 500 1000 1000 2000 2000 5000 5000 &Channels I/O: &Kanály vstup/výstup: &Latency I/O: &Oneskorenie vstup/výstup: Server Suffi&x: Príp&ona servera: Start De&lay: Oneskorenie sp&ustenia: secs s 0 msecs 0 ms Advanced PokroÄ�ilé Options Možnosti Scripting Skriptovanie Whether to execute a custom shell script before starting up the JACK audio server. SpustiÅ¥ vlastný shellový skript pred spustením zvukového servera JACK. Execute script on Start&up: VykonaÅ¥ skript pri &spustení: Whether to execute a custom shell script after starting up the JACK audio server. SpustiÅ¥ vlastný shellový skript po spustení zvukového servera JACK. Execute script after &Startup: VykonaÅ¥ skript &po spustení: Whether to execute a custom shell script before shuting down the JACK audio server. SpustiÅ¥ vlastný shellový skript pred zastavením zvukového servera JACK. Execute script on Shut&down: VykonaÅ¥ skript pri &zastavení: Command line to be executed before starting up the JACK audio server Príkazový riadok, ktorý bude spustený pred Å¡tartom zvukového servera JACK Scripting argument meta-symbols Metasymboly pre argumenty skriptovania Browse for script to be executed before starting up the JACK audio server VybraÅ¥ skript, ktorý bude spustený pred Å¡tartom zvukového servera JACK ... ... Command line to be executed after starting up the JACK audio server Príkazový riadok, ktorý bude spustený po Å¡tarte zvukového servera JACK Browse for script to be executed after starting up the JACK audio server VybraÅ¥ skript, ktorý bude spustený po Å¡tarte zvukového servera JACK Browse for script to be executed before shutting down the JACK audio server VybraÅ¥ skript, ktorý bude spustený pred vypnutím zvukového servera JACK Command line to be executed before shutting down the JACK audio server Príkazový riadok, ktorý bude spustený pred vypnutím zvukového servera JACK Whether to execute a custom shell script after shuting down the JACK audio server. SpustiÅ¥ vlastný shellový skript po zastavení zvukového servera JACK. Execute script after Shu&tdown: SpustiÅ¥ skript po &zastavení: Browse for script to be executed after shutting down the JACK audio server VybraÅ¥ skript, ktorý bude spustený po zastavení zvukového servera JACK Command line to be executed after shutting down the JACK audio server Príkazový riadok, ktorý bude spustený po zastavení zvukového servera JACK Statistics Å tatistiky Whether to capture standard output (stdout/stderr) into messages window PosielaÅ¥ Å¡tandardný výstup (stdout/stderr) do okna s hláseniami &Capture standard output &ZachytávaÅ¥ Å¡tandardný výstup &XRUN detection regex: Regulárny výraz pre detekciu &XRUN: Regular expression used to detect XRUNs on server output messages Regulárny výraz použitý pre detekciu XRUNov v hláseniach posielaných serverom xrun of at least ([0-9|\.]+) msecs xrun aspoň ([0-9|\.]+) ms Connections Spojenia Whether to enable JACK D-Bus interface ÄŒi povoliÅ¥ rozhranie JACK D-Bus &Enable JACK D-Bus interface &PovoliÅ¥ rozhranie D-Bus JACK Whether to replace Connections with Graph button on the main window V hlavnom okne nahradiÅ¥ tlaÄ�idlo Spojenia tlaÄ�idlom Graf Replace Connections with &Graph button NahradiÅ¥ tlaÄ�idlo Spojenia tlaÄ�idlom &Graf 10 10 Patchbay definition file to be activated as connection persistence profile NastaviÅ¥ súbor s definíciou zapájacej dosky ako stály profil spojenia Browse for a patchbay definition file to be activated VybraÅ¥ súbor s definíciou zapájacej dosky, ktorý sa má aktivovaÅ¥ Whether to activate a patchbay definition for connection persistence profile. AktivovaÅ¥ definíciu zapájacej dosky pre stály profil spojenia. Activate &Patchbay persistence: AktivovaÅ¥ &stály profil so zapájacou doskou: Logging Zaznamenávanie Messages log file Súbor so záznamom správ Browse for the messages log file location VybraÅ¥ umiestnenie súboru so záznamom správ Whether to activate a messages logging to file. AktivovaÅ¥ zapisovanie správ do súboru. Setup Nastavenia Whether to restrict client self-connections ObmedziÅ¥ vlastné klientske spojenia Whether to use server synchronous mode PoužiÅ¥ synchrónny režim servera Clear settings of current preset name Clea&r &Use server synchronous mode &PoužiÅ¥ synchrónny režim servera Please do not touch these settings unless you know what you are doing. Nemeňte, prosím, tieto nastavenia, ak neviete, Ä�o znamenajú. Server &Prefix: P&redpona servera: Cloc&k source: Zdroj &hodín: Clock source Zdroj hodín S&elf connect mode: Režim &vlastného spojenia: Extra driver options (command line suffix) ÄŽalÅ¡ie možnosti ovládaÄ�a (prípona príkazového riadka) Whether to reset all connections when a patchbay definition is activated. NastaviÅ¥ vÅ¡etky spojenia na predvolené pri aktivovaní definície zapájacej dosky. &Reset all connections on patchbay activation &NastaviÅ¥ vÅ¡etky spojenia na predvolené hodnoty pri aktivovaní zapájacej dosky Whether to issue a warning on active patchbay port disconnections. VypísaÅ¥ varovanie pri odpojení aktívnych prípojok zapájacej dosky. &Warn on active patchbay disconnections &UpozorňovaÅ¥ pri odpojení aktívnych prípojok zapájacej dosky &Messages log file: &Súbor so záznamom správ: Display Zobrazenie Time Display Údaj o Ä�ase Transport &Time Code Transport &Ä�asového kódu Transport &BBT (bar:beat.ticks) Transport &BBT (takt:doba.tiknutia) Elapsed time since last &Reset ÄŒ&as od posledného obnovenia továrenských nastavení Elapsed time since last &XRUN ÄŒas od posledného &XRUN Sample front panel normal display font Ukážka zobrazenia bežného písma na prednom paneli Sample big time display font Ukážka písma veľkého zobrazenia údaju o Ä�ase Big Time display: Veľké zobrazenie údaju o Ä�ase: Select font for front panel normal display VybraÅ¥ písmo pre bežné zobrazenie na prednom paneli &Font... &Písmo... Select font for big time display VybraÅ¥ písmo pre veľké zobrazenie údaju o Ä�ase Normal display: Bežné zobrazenie: Whether to enable blinking (flashing) of the server mode (RT) indicator PovoliÅ¥ blikanie indikátora režimu servera (RT) Blin&k server mode indicator P&ovoliÅ¥ blikanie indikátora režimu servera (RT) Custom Vlastné &Color palette theme: &Motív farebnej palety: Custom color palette theme Vlastný motív farebnej palety Wonton Soup DO NOT TRANSLATE KXStudio DO NOT TRANSLATE Manage custom color palette themes SpravovaÅ¥ vlastné motívy farebnej palety &Widget style theme: Motív Å¡týlu &prvkov: Custom widget style theme Vlastný motív Å¡týlu prvkov Messages Window Okno so správami Sample messages text font display Ukážka zobrazenia písma textu správ Select font for the messages text display VybraÅ¥ písmo pre zobrazenie textu správ Whether to keep a maximum number of lines in the messages window NastaviÅ¥ maximálny poÄ�et riadkov zobrazených v okne so správami &Messages limit: &Limit správ: The maximum number of message lines to keep in view Maximálny poÄ�et riadkov, ktoré sa zobrazia v okne správ 100 100 250 250 2500 2500 Connections Window Prehľad spojení Sample connections view font Ukážka písma v prehľade spojení Select font for the connections view VybraÅ¥ písmo pre prehľad spojení &Icon size: &VeľkosÅ¥ ikon: The icon size for each item of the connections view VeľkosÅ¥ jednotlivých symbolov v prehľade spojení 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 Whether to enable in-place client/port name editing (rename) PovoliÅ¥ editovanie mena klienta/prípojky na mieste (premenovanie) Ena&ble client/port aliases editing (rename) Po&voliÅ¥ editovanie mena klienta/prípojky na mieste (premenovanie) Whether to enable client/port name aliases on the connections window PovoliÅ¥ prezývky klienta/prípojky v okne s prehľadom spojení E&nable client/port aliases &PovoliÅ¥ prezývky klienta/prípojky Server path (command line prefix) Cesta k serveru (predpona príkazového riadka) Misc Rôzne Other ÄŽalÅ¡ie Whether to start JACK audio server immediately on application startup SpustiÅ¥ zvukový server JACK ihneÄ� po spustení aplikácie &Start JACK audio server on application startup &SpustiÅ¥ zvukový server JACK ihneÄ� po spustení aplikácie Whether to ask for confirmation on application exit ŽiadaÅ¥ o potvrdenie pri ukonÄ�ení aplikácie JACK client/port pretty-name (metadata) display mode Režim zobrazenia pekných názvov (metadát) klientov/prípojok JACK Enable JA&CK client/port pretty-names (metadata) PovoliÅ¥ pekné názvy (metadáta) pre klientov/prípojky JA&CK &Confirm application close &PotvrdiÅ¥ ukonÄ�enie aplikácie Whether to ask for confirmation on JACK audio server shutdown and/or restart ŽiadaÅ¥ o potvrdenie pri vypínaní servera JACK a/alebo jeho reÅ¡tarte Confirm server sh&utdown and/or restart PotvrdzovaÅ¥ &vypnutie servera a/alebo jeho reÅ¡tartovanie Whether to keep all child windows on top of the main window VÅ¡etky ostatné okná zobrazovaÅ¥ nad hlavným oknom &Keep child windows always on top &VÅ¡etky ostatné okná zobrazovaÅ¥ vždy nad Whether to enable the system tray icon ZobrazovaÅ¥ ikonu v systémovej liÅ¡te &Enable system tray icon Po&voliÅ¥ ikonu v systémovej liÅ¡te Whether to start minimized to system tray SpustiÅ¥ program minimalizovaný do ikony na systémovej liÅ¡te Start minimi&zed to system tray SpustiÅ¥ program &minimalizovaný do ikony na systémovej liÅ¡te Whether to save the JACK server command-line configuration into a local file (auto-start) Nastavenie príkazového riadka na spustenie servera JACK uložiÅ¥ do lokálneho súboru (auto-start) S&ave JACK audio server configuration to: &UložiÅ¥ konfiguráciu zvukového servera JACK do: The server configuration local file name (auto-start) Názov lokálneho súboru s nastavením servera (auto-start) .jackdrc .jackdrc Whether to enable ALSA Sequencer (MIDI) support on startup PovoliÅ¥ podporu (MIDI) pre radiÄ� (sekvencer) ALSA pri spustení E&nable ALSA Sequencer support P&ovoliÅ¥ podporu (MIDI) pre radiÄ� (sekvencer) ALSA Buttons TlaÄ�idlá Whether to hide the left button group on the main window SkryÅ¥ skupinu s tlaÄ�idlami naľavo v hlavnom okne Hide main window &Left buttons SkryÅ¥ ľ&avé tlaÄ�idlá v hlavnom okne Whether to hide the right button group on the main window SkyÅ¥ skupinu s tlaÄ�idlami napravo v hlavnom okne Hide main window &Right buttons SkryÅ¥ &pravé tlaÄ�idlá v hlavnom okne Whether to hide the transport button group on the main window SkryÅ¥ skupinu s tlaÄ�idlami pre transport v hlavnom okne Hide main window &Transport buttons SkryÅ¥ tlaÄ�idlá t&ransportu v hlavnom okne Whether to hide the text labels on the main window buttons SkryÅ¥ textové popisy tlaÄ�idiel v hlavnom okne Hide main window &button text labels SkryÅ¥ textové popisy &tlaÄ�idiel v hlavnom okne System Systém Cycle Cyklus HPET HPET Don't restrict self connect requests (default) NeobmedzovaÅ¥ požiadavky na vlastné spojenia (predvolené) Fail self connect requests to external ports only PreruÅ¡iÅ¥ požiadavky na vlastné spojenia iba pre externé prípojky Ignore self connect requests to external ports only IgnorovaÅ¥ požiadavky na vlastné spojenia iba pre externé prípojky Fail all self connect requests PreruÅ¡iÅ¥ vÅ¡etky požiadavky na vlastné spojenia Ignore all self connect requests IgnorovaÅ¥ vÅ¡etky požiadavky na vlastné spojenia Warning Upozornenie Some settings have been changed: "%1" Do you want to save the changes? Niektoré nastavenia boli zmenené: "%1" Chcete uložiÅ¥ zmeny? Delete preset: "%1" Are you sure? OdstrániÅ¥ prednastavenie: "%1" Ste si istý? msec ms n/a n/a &Preset Name Názov prednastaveni&a &Server Name &Názov servera &Server Path &Cesta k serveru &Driver &OvládaÄ� &Interface &Rozhranie Sample &Rate Vzorkovacia &frekvencia &Frames/Period &Snímky/Perióda Periods/&Buffer Periódy/&Vyrovnávacia pamäť Startup Script Skript pre spustenie Post-Startup Script Skript po spustení Shutdown Script Skript pre vypnutie Post-Shutdown Script Skript po vypnutí Active Patchbay Definition Definícia aktívnej zapájacej dosky Patchbay Definition files Súbory s definíciou zapájacej dosky Messages Log Záznam správ Log files Súbory so zápismi Information Informácie Some settings may be only effective next time you start this application. Niektoré nastavenia sa prejavia až po Ä�alÅ¡om spustení tohto programu. Some settings have been changed. Do you want to apply the changes? Niektoré nastavenia boli zmenené. Chcete použiÅ¥ zmeny? &JACK client/port aliases: &Prezývky pre klientov/prípojky JACK: JACK client/port aliases display mode Režim zobrazení prezývok klientov/prípojok JACK Default Predvolené First Prvý Second Druhý Whether to show system tray message on main window close Pri zatvorení hlavného okna zobraziÅ¥ správu v systémovej liÅ¡te Sho&w system tray message on close &ZobraziÅ¥ správu v systémovej liÅ¡te pri zatvorení Whether to stop JACK audio server on application exit ZastaviÅ¥ zvukový server JACK pri ukonÄ�ení aplikácie S&top JACK audio server on application exit &ZastaviÅ¥ zvukový server JACK pri ukonÄ�ení aplikácie Defaults Predvolené &Base font size: &Základná veľkosÅ¥ písma: Base application font size (pt.) Základná veľkosÅ¥ písma v aplikácii (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 &Name: &Názov: The JACK Audio Connection Kit sound server name Názov zvukového servera JACK Audio Connection Kit netone DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Number of microseconds to wait between engine processes (dummy) PoÄ�et mikrosekúnd medzi procesmi ovládaÄ�a (dummy) Whether to enable D-Bus interface ÄŒi povoliÅ¥ rozhranie D-Bus &Enable D-Bus interface &PovoliÅ¥ rozhranie D-Bus Whether to restrict to one single application instance (X11) ÄŒi obmedziÅ¥ beh iba na jednu inÅ¡tanciu programu (X11) Single application &instance &Iba jedna inÅ¡tancia qjackctlSocketForm Socket Zásuvka &Socket &Zásuvka &Name (alias): &Názov (Prezývka): Socket name (an alias for client name) Názov zásuvky (prezývka pre názov klienta) Client name (regular expression) Názov pre klienta (regulárny výraz) Add plug to socket plug list PridaÅ¥ zástrÄ�ku do zoznamu do zástrÄ�kami do zásuvky Add P&lug &PridaÅ¥ zástrÄ�ku &Plug: &ZástrÄ�ka: Port name (regular expression) Názov prípojky (regulárny výraz) Socket plug list Zoznam so zástrÄ�kami do zásuvky Socket Plugs / Ports ZástrÄ�ky do zásuvky/Prípojky Edit currently selected plug UpraviÅ¥ aktuálne zvolenú zástrÄ�ku &Edit &UpraviÅ¥ Remove currently selected plug from socket plug list OdstrániÅ¥ aktuálne zvolenú zástrÄ�ku zo zoznamu &Remove &OdstrániÅ¥ &Client: &Klient: Move down currently selected plug in socket plug list Posunúť aktuálne zvolenú zástrÄ�ku v zozname nižšie &Down &Nižšie Move up current selected plug in socket plug list Posunúť aktuálne zvolenú zástrÄ�ku v zozname vyššie &Up &Vyššie Enforce only one exclusive cable connection VynútiÅ¥ jedno výluÄ�né káblové spojenie E&xclusive Vý&luÄ�né &Forward: &KlonovaÅ¥: Forward (clone) all connections from this socket KlonovaÅ¥ vÅ¡etky spojenia z tejto zásuvky Type Typ Audio socket type (JACK) Zvukový typ zásuvky JACK &Audio &Zvuk MIDI socket type (JACK) MIDI typ zásuvky (JACK) &MIDI &JACK-MIDI MIDI socket type (ALSA) MIDI typ zásuvky (ALSA) AL&SA AL&SA Plugs / Ports ZástrÄ�ky/Prípojky Error Chyba A socket named "%1" already exists. Zásuvka s názvom "%1" už existuje. Warning Upozornenie Some settings have been changed. Do you want to apply the changes? Niektoré nastavenia boli zmenené. Chcete použiÅ¥ zmeny? Add Plug PridaÅ¥ zástrÄ�ku Edit UpraviÅ¥ Remove OdstrániÅ¥ Move Up Presunúť vyššie Move Down Presunúť nižšie (None) (Žiadny) qjackctlSocketList Output Výstup Input Vstup Socket Zásuvka <New> - %1 <Nový> %1 Warning Upozornenie %1 about to be removed: "%2" Are you sure? %1 má byÅ¥ odstránené: "%2" Ste si istý? %1 <Copy> - %2 %1 <Kópia> - %2 qjackctlSocketListView Output Sockets / Plugs Výstupné zásuvky/zástrÄ�ky Input Sockets / Plugs Vstupné zásuvky/zástrÄ�ky qjackctl-1.0.6/src/translations/PaxHeaders/qjackctl_it.ts0000644000000000000000000000012715174607203020551 xustar0029 mtime=1777536643.52291424 29 atime=1777536643.52291424 29 ctime=1777536643.52291424 qjackctl-1.0.6/src/translations/qjackctl_it.ts0000644000175000001440000063666015174607203020556 0ustar00rncbcusers PortAudioProber Probing... Rilevamento... Please wait, PortAudio is probing audio hardware. Aspetta per favore, PortAudio sta rilevando l'hardware audio. Warning Attenzione Audio hardware probing timed out. Rilevazione hardware audio fallita. QObject (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Start JACK audio server immediately. Set default settings preset name. Set active patchbay definition file. Set default JACK audio server name. Show help about command line options. Show version information. Displays help on command-line options. Launch command with arguments. [command-and-args] Option -p requires an argument (preset). L'opzione -p richiede un argomento (preset). Usage: %1 [options] [command-and-args] Uso: %1 [opzioni] [comandi-e-argomenti] Options: Opzioni: Option -a requires an argument (path). L'opzione -a richiede un argomento (indirizzo). Option -n requires an argument (name). L'opzione -n richiede un argomento (nome). %1 (%2 frames) %1 (%2 fotogrammi) Move Rename qjackctlAboutForm About Info About Qt Info su QT &Close &Chiudi Version Versione Debugging option enabled. Opzione di debugging abilitata. System tray disabled. Area di notifica disabilitata. Transport status control disabled. Controllo dello stato del transport disabilitato. Realtime status disabled. Stato Realtime disabilitato. XRUN delay status disabled. Stato del ritardo degli XRUN disabilitato. Maximum delay status disabled. Stato del massimo ritardo disabilitato. ALSA/MIDI sequencer support disabled. Supporto del sequencer ALSA/MIDI disabilitato. Using: Qt %1 JACK %1 Website Sito Web This program is free software; you can redistribute it and/or modify it Questo programma è free software; è possibile ridistribuirlo e/o modificarlo under the terms of the GNU General Public License version 2 or later. nei termini della Licenza Pubblica Generale GNU versione 2 o superiore. JACK MIDI support disabled. Supporto del MIDI di Jack disabilitato. JACK Port aliases support disabled. Supporto per gli alias delle porte di Jack disabilitato. D-Bus interface support disabled. Supporto per l'interfaccia D-Bus disabilitato. JACK Session support disabled. supporto per le Sessioni di JACK disabilitato. qjackctlClientListView &Connect &Connetti &Disconnect &Disconnetti Disconnect &All Disconnetti &Tutto Re&name Ri&nomina &Refresh &Aggiorna Readable Clients / Output Ports Clients leggibili / Porte d'uscita Writable Clients / Input Ports Clients Scrivibili / Porte d'entrata Alt+C Connect Connetti Alt+C Alt+D Disconnect Disconnetti Alt+D Alt+A Disconnect All Disconnetti Tutto Alt+A Alt+N Rename Rinomina Alt+N Alt+R Refresh Aggiorna Alt+R qjackctlConnect Warning Attenzione This will suspend sound processing from all client applications. Are you sure? Quest'azione sospenderà l'elaborazione del suono da tutte le applicazioni clients. Sei sicuro? qjackctlConnectionsForm Audio Audio &Connect &Connetti Connect currently selected ports Connetti le porte selezionate &Disconnect &Disconnetti Disconnect currently selected ports Disconnetti le porte selezionate Disconnect &All Disconnetti &Tutto Disconnect all currently connected ports Disconnetti tutte le porte connesse &Refresh &Aggiorna Refresh current connections view Aggiorna la situazione delle connessioni Connections Connessioni MIDI MIDI ALSA ALSA Expand all client ports Espandi tutte le porte dei clients E&xpand All E&spandi tutto qjackctlConnectorView &Connect &Connetti Disconnect &All Disconnetti &Tutto &Refresh &Aggiorna Alt+C Connect Connetti Alt+C &Disconnect &Disconnetti Alt+D Disconnect Disconnetti Alt+D Alt+A Disconnect All Disconnetti Tutto Alt+A Alt+R Refresh Aggiorna Alt+R qjackctlGraphCanvas Connect Connetti Disconnect Disconnetti qjackctlGraphForm Graph &Graph Grafico &Edit &Modifica &View &Visualizza &Zoom &Zoom Co&lors S&ort &Help &Aiuto &Connect &Connetti Connect Connetti Connect selected ports Connetti le porte selezionate &Disconnect &Disconnetti Disconnect Disconnetti Disconnect selected ports Disconnetti le porte selezionate Ctrl+C T&humbview Ctrl+D Cl&ose Close Close this application window Select &All Seleziona &tutto Select All Seleziona tutto Ctrl+A Ctrl+A Select &None Non selezionare &nulla Select None Non selezionare nulla Ctrl+Shift+A Ctrl+Shift+A Select &Invert Selezione &inversa Select Invert Selezione inversa Ctrl+I Ctrl+I &Rename... Rename item Rename Item F2 F2 &Find... Find Find nodes Ctrl+F &Menubar Barra del &menu Menubar Barra del menu Show/hide the main program window menubar Mostra/nascondi la barra del menu della finestra principale del programma Ctrl+M Ctrl+M &Toolbar Barra degli s&trumenti Toolbar Barra degli strumenti Show/hide main program window file toolbar Mostra/nascondi la barra degli strumenti della finestra principale del programma &Statusbar Barra di &stato Statusbar Barra di stato Show/hide the main program window statusbar Mostra/nascondi la barra di stato della finestra principale del programma &Top Left Top left Show the thumbnail overview on the top-left Top &Right Top right Show the thumbnail overview on the top-right Bottom &Left Bottom Left Bottom left Show the thumbnail overview on the bottom-left &Bottom Right Bottom right Show the thumbnail overview on the bottom-right &None None Nessuno Hide thumbview Hide the thumbnail overview Text Beside &Icons Testo dietro le &icone Text beside icons Testo dietro le icone Show/hide text beside icons Mostra/nasconi testo dietro le icone &Center &Centro Center Centro Center view Visualizzazione centrata &Refresh &Aggiorna Refresh Aggiorna Refresh view Aggiorna la visualizzazione F5 F5 Zoom &In &Ingrandisci Zoom In Ingrandisci Ctrl++ Ctrl++ Zoom &Out Rim&picciolisci Zoom Out Rimpicciolisci Ctrl+- Ctrl+- Zoom &Fit &Adatta zoom Zoom Fit Adatta zoom Ctrl+0 Ctrl+0 Zoom &Reset &Ripristina zoom Zoom Reset Ripristina zoom Ctrl+1 Ctrl+1 &Zoom Range Zoom Range JACK &Audio... JACK Audio color JACK &MIDI... JACK MIDI JACK MIDI color ALSA M&IDI... ALSA MIDI ALSA MIDI color JACK &CV... JACK CV color JACK &OSC... JACK OSC JACK OSC color &Reset &Reset Reset colors Port &Name Port name Sort by port name Port &Title Port title Sort by port title Port &Index Port index Sort by port index &Ascending Ascending Ascending sort order &Descending Descending Descending sort order Repel O&verlapping Nodes Repel nodes Repel overlapping nodes Connect Thro&ugh Nodes Connect Through Nodes Connect through nodes Whether to draw connectors through or around nodes &About... &Info... About... Info... About Info Show information about this application program Mostra informazioni a proposito di questo programma applicativo About &Qt... Info su &Qt... About Qt... Info su Qt... About Qt Info su Qt Show information about the Qt toolkit Mostra informazioni a proposito del kit di strumenti Qt &Undo &Annulla &Redo &Ripeti Undo last edit action Redo last edit action Zoom Ready Pronto Colors - %1 qjackctlMainForm &Quit &Esci Quit processing and exit Termina il processo sonoro ed esci &Start &Avvia Start the JACK server Avvia il server JACK S&top &Ferma Stop the JACK server Ferma il server JACK St&atus &Stato Ab&out... Inf&o su... Show information about this application Mostra le info riguardo questo software Show settings and options dialog Mostra la finestra delle impostazioni/opzioni &Messages &Messaggi Patch&bay Patch&bay Show/hide the patchbay editor window Mostra/nascondi la finestra del patchbay &Connect &Connetti JACK server state Stato del server JACK JACK server mode Modalità del server JACK Sample rate Frequenza di Campionamento Time display Visuale del Tempo Transport state Stato del transport Transport BPM BPM del transport Transport time Tempo del transport Show/hide the graph window Show/hide the connections window Backward transport Retrocedi transport Forward transport Avanza transport Rewind transport Riavvolgi transport Stop transport rolling Ferma il transport Start transport rolling Fai partire il transport Warning Attenzione successfully con successo with exit status=%1 con stato di uscita %1 Could not load preset "%1". Retrying with default. Non sono riuscito a caricare il preset "%1". Provo con il predefinito. Could not load default preset. Sorry. Non riesco a caricare il preset predefinito. Mi dispiace. Startup script... Script di inizio... Startup script terminated Script di inizio terminato JACK is starting... JACK sta partendo... Could not start JACK. Sorry. Non riesco ad avviare JACK. Mi dispiace. JACK is stopping... JACK si sta arrestando... The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Il programma continuerà a lavorare nel vassoio di sistema (system tray). Per terminarlo, clicca su "Esci" nel menù del tasto destro sull icona nel vassoio. Shutdown script... Script d'arresto... Shutdown script terminated Script d'arresto terminato JACK was stopped JACK è stato fermato Post-shutdown script... Script di post - arresto... D-BUS: Service is available (%1 aka jackdbus). D-BUS: Servizio disponibile (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: Servizio non disponibile (%1 aka jackdbus). Don't show this message again Non mostrare più questo messaggio Don't ask this again Non chiederlo di nuovo D-BUS: JACK server is starting... D-BUS: JACK si sta avviando... D-BUS: JACK server could not be started. Sorry D-BUS: il server JACK non può essere avviato. Mi dispiace D-BUS: JACK server is stopping... D-BUS: JACK si sta arrestando... D-BUS: JACK server could not be stopped. Sorry D-BUS: il server JACK non può essere arrestato. Mi dispiace Post-shutdown script terminated Script di post - arresto terminato D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: JACK è stato avviato (%1 aka jackdbus). The preset aliases have been changed: "%1" Do you want to save the changes? Gli alias delle porte sono cambiati: "%1" Salvare i cambiamenti? D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: JACK è stato fermato (%1 aka jackdbus). Error Errore Transport time code Codice temporale del transport Elapsed time since last reset Tempo trascorso dall'ultimo reset Elapsed time since last XRUN Tempo trascorso dall'ultimo XRUN Patchbay activated. Patchbay attivato. Patchbay deactivated. Patchbay disattivato. Statistics reset. Resetta le statistiche. msec msec XRUN callback (%1). XRUN callback (%1). Buffer size change (%1). Cambio della dimensione del buffer (%1). Shutdown notification. Notifica dell'arresto. Freewheel started... Freewheel exited. JACK property change. Cambio di una proprietà di JACK. checked verificato connected connesso disconnected disconnesso failed fallito Server configuration saved to "%1". Configurazione del server salvata in "%1". Client activated. Client attivato. Post-startup script... Script post - avvio... Post-startup script terminated Script di post - avvio terminato Command line argument... Argomento della linea di comando... Command line argument started Argomento della linea di comando eseguita Client deactivated. Client disattivato. Transport rewind. Riavvorgere il transport. Transport backward. Retrocedere il transport. Starting Avvio Transport start. Transport partito. Stopping Arresto Transport stop. Transport arrestato. Transport forward. Avanzare il transport. Stopped Arrestato Yes Si No No FW RT RT Rolling Riproduzione Looping Looping XRUN callback (%1 skipped). XRUN callback (%1 omitidos). Started Avviato Active Attivo Activating Attivazione Inactive Inattivo &Hide &Nascondi D-BUS: GetParameterConstraint('%1'): %2. (%3) Mi&nimize Mi&nimizza S&how &Mostra Rest&ore &Ristabilisci &Stop &Ferma &Reset &Reset &Connections &Connessioni Server settings will be only effective after restarting the JACK audio server. I cambiamenti diventeranno effettivi solo al riavvio di JACK. Do you want to restart the JACK audio server? D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) Information Informazioni Some settings will be only effective the next time you start this program. Alcune modifiche saranno effettive solo al prossimo avvio dell'applicazione. Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Non riesco ad aprire il sequencer ALSA come client. Il Patchbay MIDI non sarà disponibile. JACK is currently running. Do you want to terminate the JACK audio server? JACK è attualmente attivato. Vuoi arrestare il server JACK? Could not start JACK. Maybe JACK audio server is already started. Non riesco ad avviare JACK. Forse il server JACK è già avviato. Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Alcune applicazioni audio sono ancora attive e connesse. Vuoi arrestare il server JACK? %1 is about to terminate. Are you sure? JACK was started with PID=%1. JACK è stato avviato con PID=%1. JACK is being forced... JACK viene forzato... Patchbay reset. Ripristino della patchbay. JACK connection graph change. Grafico delle connessioni di JACK modificato. JACK has crashed. JACK ha crashato. JACK timed out. Tempo d'attesa per JACK terminato. JACK write error. Errore di scrittura di JACK. JACK read error. Errore di lettura di JACK. Unknown JACK error (%d). Errore di JACK sconosciuto (%d). ALSA connection graph change. Cambiamento nel grafico delle connessioni di ALSA. JACK active patchbay scan Scansione del patchbay per JACK activo ALSA active patchbay scan Scansione del patchbay per ALSA attivo JACK connection change. Connessioni di JACK cambiate. ALSA connection change. Connessioni di ALSA cambiate. A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Una connessione è definita nel Patchbay, che probabilmente ripeterà la connessione: %1 -> %2 Vuoi rimuovere questa connessione dal Patchbay? Overall operation failed. Operazione fallita. Invalid or unsupported option. Opzione non valida o non supportata. Client name not unique. Il nome del client non è unico. Server is started. Il server JACK è stato avviato. Unable to connect to server. Impossibile connettersi al server JACK. Server communication error. Errore di comunicazione col server JACK. Client does not exist. Il client non esiste. Unable to load internal client. Impossibile caricare il client interno. Unable to initialize client. Impossibile inizializzare il client. Unable to access shared memory. Impossibile accedere alla memoria condivisa. Client protocol version mismatch. La versione del protocollo del client è incongruente. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Non sono riuscito ad avviare JACK come client. - %1 Controlla la finestra dei messaggi per maggiori informazioni. %1 (%2%) %1 (%2%) %1 % %1 % %1 Hz %1 Hz %1 frames %1 fotogrammi %1 msec %1 msec &Presets &Presets &Graph &Grafico &Transport &Transport &Rewind &Riavvolgi &Play Ri&produci Pa&use Pa&usa &Patchbay &Patchbay DSP Load Carico DSP XRUN Count (notifications) Conteggio XRUN (notifiche) &Backward R&etrocedi &Forward &Avanza Set&up... Imp&ostazioni... S&ession S&essioni &Load... &Apri... &Save... &Salva... Save and &Quit... Salva ed E&sci... Save &Template... Salva &Modello... Show/hide the session management window Mostra/Nascondi la finestra di gestione delle sessioni Show/hide the messages log/status window Mostra/Nascondi la finestra di stato/log Could not load active patchbay definition. "%1" Disabled. Non riesco a caricare il file del patchbay attivo. "%1" Disabilitato. &Versioning &Versione Re&fresh Agg&iorna %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) Transport BBT (bar.beat.ticks) BBT del Transport (battito:pulsazione:frazioni) qjackctlMessagesStatusForm Messages / Status &Messages &Messaggi Messages log Log dei messaggi Messages output log Log dei messaggi di output &Status &Stato Status information Informazioni sullo Stato Statistics since last server startup Statistiche dall'ultimo avvio del server Description Descrizione Value Valore Reset XRUN statistic values Reimposta le statistiche degli XRUN Re&set Reimpo&sta Refresh XRUN statistic values Aggiorna le statistiche degli XRUN &Refresh &Refresh Server name Nome del server Server state Stato del server DSP Load Carico DSP Sample Rate Frequenza di campionamento Buffer Size Dimensione del buffer Realtime Mode Modo Realtime Transport state Stato del transport Transport Timecode Codice temporale del transport Transport BBT BBT del transport Transport BPM BPM del transport XRUN count since last server startup Conteggio degli XRUN dall'ultimo avvio del server XRUN last time detected Momento dell'ultimo XRUN XRUN last Ultimo XRUN XRUN maximum XRUN massimi XRUN minimum XRUN minimi XRUN average XRUN medi XRUN total XRUN totali Maximum scheduling delay Massimo ritardo nello scheduling Time of last reset Tempo dell'ultimo reset Logging stopped --- %1 --- Logging fermato --- %1 --- Logging started --- %1 --- Logging avviato --- %1 --- qjackctlPaletteForm Color Themes Name Current color palette name Save current color palette name Save Delete current color palette name Delete Palette Current color palette Generate: Base color to generate palette Reset all current palette colors Reset Import a custom color theme (palette) from file Import... Export a custom color theme (palette) to file Export... Show Details Import File - %1 Palette files (*.%1) Save Palette - %1 All files (*.*) Warning - %1 Could not import from file: %1 Sorry. Export File - %1 Some settings have been changed. Do you want to discard the changes? Some settings have been changed: "%1". Do you want to save the changes? qjackctlPaletteForm::PaletteModel Color Role Active Attivo Inactive Inattivo Disabled qjackctlPatchbay Warning Attenzione This will disconnect all sockets. Are you sure? Questo disconnetterà tutte le porte. Sei sicuro? qjackctlPatchbayForm &New &Nuovo Create a new patchbay profile Crea un nuovo profilo Patchbay &Load... &Apri... Load patchbay profile Carica il profilo del Patchbay &Save... &Salva... Save current patchbay profile Salva il profilo corrente del Patchbay Acti&vate Atti&va Toggle activation of current patchbay profile Modifica lo stato di attivazione del Patchbay corrente &Connect &Connetti Connect currently selected sockets Connetti le porte selezionate &Disconnect &Disconnetti Disconnect currently selected sockets Disconnetti le porte selezionate Disconnect &All Disconnetti &Tutto Disconnect all currently connected sockets Disconnetti tutte le porte connesse &Refresh &Aggiorna Refresh current patchbay view Aggiorna la vista del Patchbay Down Giù Move currently selected output socket down one position Muovi la porta selezionata in basso Add... Aggiungi... Create a new output socket Crea una nuova porta d'uscita Edit... Modifica... Edit currently selected input socket properties Modifica la porta d'entrata selezionata Up Su Move currently selected output socket up one position Muovi la porta selezionata in alto Remove Rimuovi Remove currently selected output socket Rimuovi la porta d'uscita selezionata Copy... Copia... Duplicate (copy) currently selected output socket Duplica (copia) la porta d'uscita selezionata Patchbay Remove currently selected input socket Rimuovi la porta d'entrata selezionata Duplicate (copy) currently selected input socket Duplica (copia) la porta d'entrata selezionata Create a new input socket Crea una nuova porta d'entrata Edit currently selected output socket properties Modifica la porta d'uscita selezionata Warning Attenzione active attivo New Patchbay definition Nuova definizione del Patchbay Patchbay Definition files Files di definizione del Patchbay Load Patchbay Definition Carica definizione del Patchbay Save Patchbay Definition Salva definizione del Patchbay The patchbay definition has been changed: "%1" Do you want to save the changes? Le definizioni del Patchbay sono cambiate: "%1" Vuoi salvare le modifiche? %1 [modified] %1 [modificato] Untitled%1 Senza titolo%1 Error Errore Could not load patchbay definition file: "%1" Non riesco a caricare il file di definizioni del Patchbay: "%1" Could not save patchbay definition file: "%1" Non riesco a salvare il file di definizioni del Patchbay: "%1" Create patchbay definition as a snapshot of all actual client connections? Creo un Patchbay partendo dalle connessioni attuali? Current (recent) patchbay profile(s) Profilo (recente) del Patchbay Expand all items Espandi tutti gli elementi E&xpand All E&spandi tutto qjackctlPatchbayView Add... Aggiungi... Edit... Modifica... Copy... Copia... Remove Rimuovi Exclusive Esclusiva Move Up Porta su Move Down Porta giù &Connect &Connetti &Disconnect &Disconnetti Disconnect &All Desconnetti &Tutto &Refresh &Aggiorna Alt+R Refresh Alt+A Forward Avanza (None) (Nessuno) Alt+C Connect Connetti Alt+C Alt+D Disconnect Disconnetti Alt+D Alt+A Disconnect All Disconnetti Tutto Alt+A qjackctlSessionForm Load session Carica Sessione &Load... &Apri... Recent session Sessione recente &Recent &Recente Save session Salva sessione &Save... &Salva... Client / Ports Client / Porte UUID UUID Command Comando Load Session Carica Sessione Session directory Cartella della Sessione Save Session Salva Sessione and Quit ed Esci Template Modello &Clear Pulis&ci Warning Attenzione A session could not be found in this folder: "%1" non riesco a trovare una Sessione in questa cartella: "%1" %1: loading session... %1: carico la sessione... %1: load session %2. %1: carico la sessione %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Una Sessione esiste già in questa cartella: "%1" Sovrascivo la Sessione? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Questa cartella esiste già e non è vuota: "%1" Sovrascrivo la cartella? %1: saving session... %1: salvo la sessione... %1: save session %2. %1: salvo la sessione %2. Update session Aggiorna sessione Save and &Quit... Salva ed Es&ci... Save &Template... Salva &Modello... Session &Save &Salva &Versioning &Versione Re&fresh Agg&iorna Session clients / connections Clients / connessioni della sessione Infra-clients / commands Comandi / infra-clients Infra-client Infra-client Infra-command Infra-comando Add infra-client Aggiungi un infra-client &Add &Aggiungi Edit infra-client Modifica un infra-client &Edit &Modifica Remove infra-client Rimuovi un infra-client Re&move &Rimuovi New Client Nuovo client qjackctlSessionInfraClientItemEditor Infra-command Infra-comando qjackctlSessionSaveForm Session &Name: &Nome: Session name &Directory: Session directory Cartella della Sessione Browse for session directory ... ... Save session versioning Salva la versione della sessione &Versioning &Versione Warning Attenzione Session directory does not exist: "%1" Do you want to create it? Session Directory qjackctlSetupForm Settings Impostazioni Preset &Name: &Nome del Preset: (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Settings preset name Nome del preset &Save &Salva Save settings as current preset name Salva le impostazioni sul preset corrente &Delete &Elimina Delete current settings preset Elimina il preset con le impostazioni correnti jackd DO NOT TRANSLATE jackdmp DO NOT TRANSLATE jackstart DO NOT TRANSLATE Driv&er: Dri&ver: dummy DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 sun DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 oss DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 alsa DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 portaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 coreaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 firewire DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Parameters Parametri Number of periods in the hardware buffer Numero di periodi nel buffer hardware Priorit&y: &Priorità: &Frames/Period: &Fotogrammi/Periodo: 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Fotogrammi per periodo tra chiamate a process() Port Ma&ximum: Numero mas&simo di porte: 21333 21333 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 Sample rate in frames per second Frequenza di campionamento in fotogrammi al secondo Scheduler priority when running realtime Priorità dello scheduler quando eseguito in realtime &Word Length: &Lunghezza delle parole: Periods/&Buffer: Periodi/&Buffer: Word length Lunghezza delle parole Maximum number of ports the JACK server can manage Numero massimo di porte che JACK può gestire &Wait (usec): &Attesa massima (microsec): Sample &Rate: &Campionamento: &Timeout (msec): &Attesa massima (msec): 200 200 500 500 1000 1000 2000 2000 5000 5000 Set client timeout limit in milliseconds Imposta il limite di tempo di attesa per il client, in msec &Realtime Tempo &Reale Use realtime scheduling Usa priorità dello scheduling in tempo reale No Memory Loc&k Non b&loccare memoria Do not attempt to lock memory, even if in realtime mode Non bloccare la memoria, anche in tempo reale &Unlock Memory &Sblocca Memoria Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Sblocca la memoria per i toolkit classici (GTK+, QT, FLTK, Wine) So&ft Mode Modo So&ft Ignore xruns reported by the backend driver Ignora gli XRUN provenienti dal driver &Monitor &Monitor Provide output monitor ports Attiva porte d'uscita per il monitor Force &16bit Forza &16bit Force 16bit mode instead of failing over 32bit (default) Forza il modo 16bit invece del predefinito 32bit H/&W Meter Meter Hard&ware Enable hardware metering on cards that support it Abilita il metering per le schede che lo supportano &Ignore H/W &Ignora HardWare Ignore hardware period/buffer size Ignora la dimensione periodo/buffer dell'hardware &Output Device: Dispositiv&o d'uscita: &Interface: &Interfaccia: Maximum input audio hardware channels to allocate Numero massimo di canali hardware d'entrata &Audio: A&udio: Dit&her: Dit&her: External output latency (frames) Latenza esterna d'uscita (fotogrammi) &Input Device: D&ispositivo d'entrata: Duplex Duplex Capture Only Solo Cattura Playback Only Solo Riproduzione Provide either audio capture, playback or both Scegli se abilitare l'audio in cattura, in registrazione o entrambi hw:0 hw:0 The PCM device name to use Nome del dispositivo PCM da usare > > /dev/dsp Alternate input device for capture Seleziona il dispositivo alternativo d'entrata per la registrazione Maximum output audio hardware channels to allocate Numero massimo di canali hardware d'uscita Alternate output device for playback Seleziona il dispositivo alternativo d'uscita per la riproduzione External input latency (frames) Latenza esterna d'entrata (fotogrammi) None Nessuno Rectangular Rettangolare Shaped Modellato Triangular Triangolare Set dither mode Scegli il modo del dither Whether to give verbose output on messages Verbosità nei messaggi d'uscita Time in seconds that client is delayed after server startup Tempo di ritardo nell'avvio del server JACK (in secondi) Latency: Latenza: Output latency in milliseconds, calculated based on the period, rate and buffer settings Latenza d'uscita in millisecondi, calcolata in base al rapporto fra periodo, fotogrammi e buffer Options Opzioni Scripting Scripting Execute script on Start&up: Esegui script prima dell'Avvi&o: Whether to execute a custom shell script before starting up the JACK audio server. Eseguire uno script prima dell'avvio del server JACK. Execute script after &Startup: Esegui script dopo l'Avv&io: Whether to execute a custom shell script after starting up the JACK audio server. Eseguire uno script dopo l'avvio del server JACK. Execute script on Shut&down: Esegui script prima dell'Ar&resto: Whether to execute a custom shell script before shuting down the JACK audio server. Eseguire uno script prima dell'arresto del server JACK. Command line to be executed before starting up the JACK audio server Comando da eseguire prima dell'avvio di JACK Scripting argument meta-symbols Meta simboli utilizzabili negli script ... ... Browse for script to be executed before starting up the JACK audio server Cerca uno script da eseguire prima dell'avvio del server JACK Command line to be executed after starting up the JACK audio server Comando da eseguire dopo l'avvio di JACK Browse for script to be executed after starting up the JACK audio server Cerca uno script da eseguire dopo l'avvio del server JACK Browse for script to be executed before shutting down the JACK audio server Cerca uno script da eseguire prima dell'arresto del server JACK Command line to be executed before shutting down the JACK audio server Comando da eseguire prima dell'arresto di JACK Execute script after Shu&tdown: Esegui script dopo l'Ar&resto: Whether to execute a custom shell script after shuting down the JACK audio server. Eseguire uno script dopo l'arresto di JACK. Browse for script to be executed after shutting down the JACK audio server Cerca uno script da eseguire dopo l'arresto del server JACK Command line to be executed after shutting down the JACK audio server Comando da eseguire dopo l'arresto di JACK Statistics Statistiche &Capture standard output &Cattura l'output standard dei comandi Whether to capture standard output (stdout/stderr) into messages window Catturare l'output standard nella finestra dei messaggi &XRUN detection regex: Espressione regolare per individuare gli &XRUN: xrun of at least ([0-9|\.]+) msecs XRUN di ([0-9|\.]+) msecs al massimo Regular expression used to detect XRUNs on server output messages Espressione regolare usata per il riconoscimento degli XRUN Connections Connessioni 10 10 Patchbay definition file to be activated as connection persistence profile Attiva il Patchbay in maniera persistente Browse for a patchbay definition file to be activated Sfoglia i file per caricare un Patchbay salvato Activate &Patchbay persistence: Attiva un &Patchbay persistente: Whether to activate a patchbay definition for connection persistence profile. Attiva un Patchbay predefinito per effettuare connessioni persistenti. Display Display Time Display Display del tempo Transport &Time Code Codice temporale del &Transport Transport &BBT (bar:beat.ticks) &BBT del Transport (battuta:pulsazione:frazioni) Elapsed time since last &Reset Tempo trascorso dall'ultimo &Reset Elapsed time since last &XRUN Tempo trascorso dall'ultimo &XRUN Sample front panel normal display font Carattere normale da mostrare nel display frontale Sample big time display font Carattere grande da mostrare nel display frontale Big Time display: Display grande del tempo: &Font... Cara&ttere... Select font for front panel normal display Tipo di carattere normale da mostrare nel display frontale Select font for big time display Tipo di carattere grande da mostrare nel display frontale Normal display: Display normale: Messages Window Finestra dei messaggi Sample messages text font display Tipo di carattere per la finestra dei messaggi Select font for the messages text display Seleziona il tipo di carattere per la finestra dei messaggi &Messages limit: Limite dei &Messaggi: Whether to keep a maximum number of lines in the messages window Se limitare ad un numero massimo di righe nella finestra dei messaggi 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Il numero massimo di messaggi da mostrare a vista Please do not touch these settings unless you know what you are doing. Si prega di non toccare queste impostazioni se non sai cosa stai facendo. Connections Window Finestra delle Connessioni Sample connections view font Tipo di carattere per la finestra delle connessioni Select font for the connections view Seleziona il tipo di carattere per la finestra delle connessioni &Icon size: Dimensione delle &Icone: 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 The icon size for each item of the connections view Dimensione delle icone per gli elementi nella finestra delle connessioni Ena&ble client/port aliases editing (rename) A&bilita la modifica degli alias di clients/porte (rinomina) Whether to enable in-place client/port name editing (rename) Permetti la modifica veloce dei nomi dei clients/porte E&nable client/port aliases Abilita gli alias per &porte/clients Whether to enable client/port name aliases on the connections window Permetti gli alias per i nomi dei clients/porte Misc Varie Other Altro &Start JACK audio server on application startup Avvia il &server JACK all'avvio dell'applicazione Whether to start JACK audio server immediately on application startup Avvia immediatamente il server JACK all'avvio dell'applicazione &Confirm application close &Chiedi conferma alla chiusura Whether to ask for confirmation on application exit Chiedi conferma prima di chiudere l'applicazione &Keep child windows always on top Mantieni le finestre fi&glie sempre sopra le altre Whether to keep all child windows on top of the main window Scegli se mantenere le finestre figlie sempre sopra le altre &Enable system tray icon Abilita l'icona nel vassoio di sist&ema Whether to enable the system tray icon Scegli se visualizzare un'icona sul vassoio di sistema (system tray) S&ave JACK audio server configuration to: S&alva la configurazione di JACK in: Whether to save the JACK server command-line configuration into a local file (auto-start) Scegli se salvare la configurazione del server JACK in un file locale (all'avvio) .jackdrc .jackdrc The server configuration local file name (auto-start) Configurazione locale del server (all'avvio) Warning Attenzione msec msec n/a n/d &Preset Name Nome del &Preset &Server Path Indirizzo del &Server &Driver &Driver &Interface &Interfaccia Sample &Rate &Frequenza di campionamento &Frames/Period &Fotogrammi/Periodo Periods/&Buffer Periodi/&Buffer Patchbay Definition files Files di definizione del Patchbay Some settings have been changed: "%1" Do you want to save the changes? Alcune impostazioni sono cambiate: "%1" Vuoi salvarle? System Cycle HPET Don't restrict self connect requests (default) Fail self connect requests to external ports only Ignore self connect requests to external ports only Fail all self connect requests Ignore all self connect requests Delete preset: "%1" Are you sure? Cancello Preset: "%1" Sei sicuro? Startup Script Script all'avvio Post-Startup Script Script dopo l'avvio Shutdown Script Script all'arresto Post-Shutdown Script Script dopo l'arresto Active Patchbay Definition Definizione attiva del Patchbay Messages Log Log dei messaggi Log files Files di log Information Informazioni Some settings may be only effective next time you start this application. Some settings have been changed. Do you want to apply the changes? Alcune impostazioni sono cambiate. Vuoi applicare i cambiamenti? The audio backend driver interface to use Driver dell'interfaccia audio da usare MIDI Driv&er: Driv&er MIDI: The ALSA MIDI backend driver to use Driver MIDI di ALSA da usare none nessuno raw DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 seq DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 &Verbose messages &Verbosità nei messaggi plughw:0 plughw:0 /dev/audio /dev/audio &Channels: &Canali: 192000 192000 Maximum number of audio channels to allocate Massimo numero di canali audio allocabili Logging Logging Messages log file File di log dei messaggi Browse for the messages log file location Scegli il file in cui loggare i messaggi Whether to activate a messages logging to file. Scegli se attivare il logging dei messaggi su file. Advanced Avanzate Whether to reset all connections when a patchbay definition is activated. Ripristinare o no tutte le connessioni quando una definizione di patchbay è attivata. &Reset all connections on patchbay activation &Ripristina tutte le connessioni all'attivazione di una patchbay Whether to issue a warning on active patchbay port disconnections. Mostrare o no un avviso sulle disconnessioni di porte attive di una patchbay &Warn on active patchbay disconnections &Avvisa sulle disconnessioni di una patchbay attiva &Messages log file: File log dei &messaggi: Whether to enable blinking (flashing) of the server mode (RT) indicator Scegli se abilitare l'indicazione intermittente della modalità del server (RT) Blin&k server mode indicator Intermittenza nell'indicatore modo ser&ver &JACK client/port aliases: Alias clients/porte di &JACK: JACK client/port aliases display mode Modalità di visualizzazione degli alias di clients/porte Default Predefinito First Primo Second Secondo JACK client/port pretty-name (metadata) display mode Modo di visualizzazione « bel-nome » (metadati) di client/porta JACK Enable JA&CK client/port pretty-names (metadata) Attiva i «bei-nomi» (metadati) di client/porta JA&CK Whether to ask for confirmation on JACK audio server shutdown and/or restart Confirm server sh&utdown and/or restart Whether to show system tray message on main window close Mostrare o no il messaggio dell'area di notifica al momento della chiusura della finestra principale Sho&w system tray message on close &Mostrare il messaggio dell'area di notifica alla chiusura Whether to start minimized to system tray Avvia l'applicazione minimizzata come icona nel vassoio di sistema (system tray) Start minimi&zed to system tray Avvia minimi&zzato nel vassoio di sistema Setup Whether to restrict client self-connections Whether to use server synchronous mode Clear settings of current preset name Clea&r &Use server synchronous mode Cloc&k source: Clock source S&elf connect mode: Custom &Color palette theme: Custom color palette theme Wonton Soup DO NOT TRANSLATE KXStudio DO NOT TRANSLATE Manage custom color palette themes &Widget style theme: Custom widget style theme Whether to enable ALSA Sequencer (MIDI) support on startup Scegli se abilitare il sequencer ALSA (MIDI) all'avvio E&nable ALSA Sequencer support Abilita se&quencer ALSA Whether to enable JACK D-Bus interface Attivare o no l'interfaccia JACK D-Bus &Enable JACK D-Bus interface &Attiva l'interfaccia JACK D-Bus Buttons Pulsanti Whether to hide the left button group on the main window Scegli se nascondere i pulsanti a sinistra nella finestra principale Hide main window &Left buttons Nascondi i pu&lsanti di sinistra nella finestra principale Whether to hide the right button group on the main window Scegli se nascondere i pulsanti a destra nella finestra principale Hide main window &Right buttons Nascondi i pulsanti di dest&ra nella finestra principale Whether to hide the transport button group on the main window Scegli se nascondere i pulsanti del transport nella finestra principale Hide main window &Transport buttons Nascondi i pulsanti del &Transport nella finestra principale Whether to hide the text labels on the main window buttons Scegli se nascondere il testo dei pulsanti nella finestra principale Hide main window &button text labels Nascondi il testo dei p&ulsanti nella finestra principale Whether to replace Connections with Graph button on the main window Replace Connections with &Graph button Defaults Predefinite &Base font size: Dimensione &base dei caratteri: Base application font size (pt.) Dimesione predefinita dei caratteri nell'applicazione (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to enable D-Bus interface Scegli se abilitare l'interfaccia D-Bus &Enable D-Bus interface &Abilita l'interfaccia D-Bus Number of microseconds to wait between engine processes (dummy) Microsecondi d'attesa fra i processi del motore (dummy) netone DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to restrict to one single application instance (X11) Scegli se registrare un'unica istanza dell'applicazione (X11) Single application &instance Permetti una sola &istanza &Name: &Nome: The JACK Audio Connection Kit sound server name Il nome del server audio Jack &Server Name Nome del &Server Server path (command line prefix) Indirizzo del server (prefisso nella riga di comando) &Channels I/O: &Canali I/O: &Latency I/O: &Latenza I/O: Start De&lay: Ritardo a&ll'avvio: secs secondi 0 msecs 0 millisecondi Server Suffi&x: Suffisso per il Ser&ver: Server &Prefix: Prefis&so per il Server: Extra driver options (command line suffix) Opzioni extra per il driver (suffisso nella riga di comando) Whether to stop JACK audio server on application exit Fermare o no il server audio JACK all'uscita dell'applicazione S&top JACK audio server on application exit &Fermare il server audio JACK alla chiusura dell'applicazione qjackctlSocketForm &Socket &Socket &Name (alias): &Nome (alias): Socket name (an alias for client name) Nome del socket (un alias per il nome del client) Client name (regular expression) Nome del client (espressione regolare) Add P&lug Aggiungi p&resa Add plug to socket plug list Aggiungi una presa alla lista delle prese &Plug: &Presa: Port name (regular expression) Nome della porta (espressione regolare) Socket Plugs / Ports Prese / Porte del Socket Socket plug list Lista dei socket tipo presa &Edit &Modifica &Remove &Rimuovi Remove currently selected plug from socket plug list Rimuovi la presa selezionata dalla lista del socket Socket Socket &Client: &Client: &Down &Giù &Up S&u E&xclusive Esclusi&vo Enforce only one exclusive cable connection Permetti una connessione da un solo cavo Type Tipo &Audio &Audio Audio socket type (JACK) Socket di tipo audio (JACK) &MIDI &MIDI MIDI socket type (ALSA) Socket di tipo MIDI (ALSA) Plugs / Ports Prese / Porte Error Errore A socket named "%1" already exists. Un socket chiamato "%1" esiste già. Add Plug Aggiungi presa Remove Rimuovi Edit Modifica Move Up Sposta Su Move Down Sposta Giù Warning Attenzione Some settings have been changed. Do you want to apply the changes? Alcune impostazioni sono state modificate. Applicare le modifiche ora? (None) (Nessuno) Edit currently selected plug Modifica la presa selezionata Move down currently selected plug in socket plug list Sposta giù la presa selezionata nella lista socket Move up current selected plug in socket plug list Sposta su la presa selezionata nella lista socket &Forward: C&lona: Forward (clone) all connections from this socket Clona tutte le connessioni di questo socket MIDI socket type (JACK) Tipo di socket MIDI (JACK) AL&SA AL&SA qjackctlSocketList Output Uscita Input Entrata Socket Socket Warning Attenzione <New> - %1 <Nuovo> - %1 %1 about to be removed: "%2" Are you sure? Sto per rimuovere %1: "%2" Sei sicuro? %1 <Copy> - %2 %1 <Copia> - %2 qjackctlSocketListView Output Sockets / Plugs Sockets / Prese d'uscita Input Sockets / Plugs Sockets / Prese d'entrata qjackctl-1.0.6/src/translations/PaxHeaders/qjackctl_ja.ts0000644000000000000000000000013115174607203020522 xustar0030 mtime=1777536643.523914233 29 atime=1777536643.52291424 30 ctime=1777536643.523914233 qjackctl-1.0.6/src/translations/qjackctl_ja.ts0000644000175000001440000065424615174607203020534 0ustar00rncbcusers PortAudioProber Probing... 検査中... Please wait, PortAudio is probing audio hardware. ã�Šå¾…ã�¡ã��ã� ã�•ã�„。PortAudioã�Œã‚ªãƒ¼ãƒ‡ã‚£ã‚ªãƒ�ードウェアを検査中ã�§ã�™ã€‚ Warning 警告 Audio hardware probing timed out. オーディオãƒ�ードウェア検査ã�Œã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã�—ã�¾ã�—ã�Ÿã€‚ QObject (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Usage: %1 [options] [command-and-args] Options: Start JACK audio server immediately. Set default settings preset name. Set active patchbay definition file. Set default JACK audio server name. Show help about command line options. Show version information. Displays help on command-line options. Launch command with arguments. [command-and-args] Option -p requires an argument (preset). Option -a requires an argument (path). Option -n requires an argument (name). %1 (%2 frames) Move Rename qjackctlAboutForm About QjackCtlã�«ã�¤ã�„ã�¦ &Close é–‰ã�˜ã‚‹(&C) About Qt Qtã�«ã�¤ã�„ã�¦ Version ãƒ�ージョン Debugging option enabled. デãƒ�ッグオプションã�¯æœ‰åйã�§ã�™ã€‚ System tray disabled. システムトレイã�¯ç„¡åйã�§ã�™ã€‚ Transport status control disabled. トランスãƒ�ートステータスコントロールã�¯ç„¡åйã�§ã�™ã€‚ Realtime status disabled. リアルタイムステータスã�¯ç„¡åйã�§ã�™ã€‚ XRUN delay status disabled. XRUNé�…延検出ã�¯ç„¡åйã�§ã�™ã€‚ Maximum delay status disabled. 最大é�…延ステータスã�¯ç„¡åйã�§ã�™ã€‚ JACK Port aliases support disabled. Jackãƒ�ートエイリアスサãƒ�ートã�¯ç„¡åйã�§ã�™ã€‚ JACK MIDI support disabled. JACK MIDIサãƒ�ートã�¯ç„¡åйã�§ã�™ã€‚ JACK Session support disabled. JACKセッションサãƒ�ートã�¯ç„¡åйã�§ã�™ã€‚ ALSA/MIDI sequencer support disabled. ALSA/MIDIシーケンサーサãƒ�ートã�¯ç„¡åйã�§ã�™ã€‚ D-Bus interface support disabled. D-Busインターフェイスサãƒ�ートã�¯ç„¡åйã�§ã�™ã€‚ Using: Qt %1 Qt %1 を使用 JACK %1 JACK %1 Website ウェブサイト This program is free software; you can redistribute it and/or modify it ã�“ã�®ãƒ—ログラムã�¯ãƒ•リーソフトウェアã�§ã�™; GNU一般公衆ライセンスãƒ�ージョン2以é™�ã�® under the terms of the GNU General Public License version 2 or later. æ�¡ä»¶ã�®å…ƒã�§ã€�ã�‚ã�ªã�Ÿã�¯ã�“ã�®ãƒ—ログラムをå†�é…�布ã�‹ã�¤/ã�‚ã‚‹ã�„ã�¯å¤‰æ›´ã�§ã��ã�¾ã�™ã€‚ qjackctlClientListView Readable Clients / Output Ports 出力å�¯èƒ½ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆ/出力ãƒ�ート Writable Clients / Input Ports 入力å�¯èƒ½ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆ/入力ãƒ�ート &Connect 接続(&C) Alt+C Connect &Disconnect 切断(&D) Alt+D Disconnect Disconnect &All ã�™ã�¹ã�¦åˆ‡æ–­(&A) Alt+A Disconnect All Re&name リãƒ�ーム(&N) Alt+N Rename &Refresh æ›´æ–°(&R) Alt+R Refresh qjackctlConnect Warning 警告 This will suspend sound processing from all client applications. Are you sure? ã�™ã�¹ã�¦ã�®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚¢ãƒ—リケーションã�® サウンド処ç�†ã‚’サスペンドã�—ã�¾ã�™ã€‚ よã‚�ã�—ã�„ã�§ã�™ã�‹? qjackctlConnectionsForm Connections 接続 Audio オーディオ Connect currently selected ports é�¸æŠžã�—ã�¦ã�„ã‚‹ãƒ�ートを接続ã�—ã�¾ã�™ &Connect 接続(&C) Disconnect currently selected ports é�¸æŠžã�—ã�¦ã�„ã‚‹ãƒ�ートを切断ã�—ã�¾ã�™ &Disconnect 切断(&D) Disconnect all currently connected ports 接続ã�—ã�¦ã�„ã‚‹ã�™ã�¹ã�¦ã�®ãƒ�ートを切断ã�—ã�¾ã�™ Disconnect &All ã�™ã�¹ã�¦åˆ‡æ–­(&A) Expand all client ports ã�™ã�¹ã�¦ã�®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒ�ートを展開ã�—ã�¾ã�™ E&xpand All ã�™ã�¹ã�¦å±•é–‹(&X) Refresh current connections view 接続ã�®è¡¨ç¤ºã‚’æ›´æ–°ã�—ã�¾ã�™ &Refresh æ›´æ–°(&R) MIDI ALSA qjackctlConnectorView &Connect 接続(&C) Alt+C Connect &Disconnect 切断(&D) Alt+D Disconnect Disconnect &All ã�™ã�¹ã�¦åˆ‡æ–­(&A) Alt+A Disconnect All &Refresh æ›´æ–°(&R) Alt+R Refresh qjackctlGraphCanvas Connect 接続 Disconnect 切断 qjackctlGraphForm Graph グラフ &Graph グラフ(&G) &Edit 編集(&E) &View 表示(&V) &Zoom 拡大/縮å°�(&Z) Co&lors 色(&L) S&ort 並ã�¹æ›¿ã�ˆ(&O) &Help ヘルプ(&H) &Connect 接続(&C) Connect 接続 Connect selected ports é�¸æŠžã�—ã�Ÿãƒ�ートを接続ã�—ã�¾ã�™ &Disconnect 切断(&D) Disconnect 切断 Disconnect selected ports é�¸æŠžã�—ã�Ÿãƒ�ートを切断ã�—ã�¾ã�™ Ctrl+C T&humbview Ctrl+D Cl&ose é–‰ã�˜ã‚‹(&O) Close é–‰ã�˜ã‚‹ Close this application window ã�“ã�®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’終了ã�—ã�¾ã�™ Select &All å…¨ã�¦é�¸æŠž(&A) Select All ã�™ã�¹ã�¦é�¸æŠžã�—ã�¾ã�™ Ctrl+A Select &None é�¸æŠžã�®è§£é™¤(&N) Select None é�¸æŠžã‚’解除ã�—ã�¾ã�™ Ctrl+Shift+A Select &Invert é�¸æŠžã�®å��転(&I) Select Invert é�¸æŠžã‚’å��転ã�—ã�¾ã�™ Ctrl+I &Rename... アイテムå��ã�®å¤‰æ›´(&R)... Rename item アイテムå��を変更ã�—ã�¾ã�™ Rename Item アイテムå��ã�®å¤‰æ›´ F2 &Find... Find Find nodes Ctrl+F &Menubar メニューãƒ�ー(&M) Menubar メニューãƒ�ー Show/hide the main program window menubar メインプログラムウィンドウã�®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãƒ�ーã�®è¡¨ç¤ºã‚’切り替ã�ˆã�¾ã�™ Ctrl+M &Toolbar ツールãƒ�ー(&T) Toolbar ツールãƒ�ー Show/hide main program window file toolbar メインプログラムウィンドウã�®ãƒ„ールãƒ�ーã�®è¡¨ç¤ºã‚’切り替ã�ˆã�¾ã�™ &Statusbar ステータスãƒ�ー(&S) Statusbar ステータスãƒ�ー Show/hide the main program window statusbar メインプログラムウィンドウã�®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒ�ーを表示ã�—ã�Ÿã‚Šéš ã�—ã�Ÿã‚Šã�—ã�¾ã�™ &Top Left Top left Show the thumbnail overview on the top-left Top &Right Top right Show the thumbnail overview on the top-right Bottom &Left Bottom Left Bottom left Show the thumbnail overview on the bottom-left &Bottom Right Bottom right Show the thumbnail overview on the bottom-right &None None Hide thumbview Hide the thumbnail overview Text Beside &Icons アイコンテキストã�®è¡¨ç¤º(&I) Text beside icons アイコンテキストã�®è¡¨ç¤º Show/hide text beside icons アイコンテキストを表示ã�—ã�Ÿã‚Šéš ã�—ã�Ÿã‚Šã�—ã�¾ã�™ &Center 中央寄ã�›(&C) Center 中央寄ã�› Center view 中央寄ã�›ã�—ã�¾ã�™ &Refresh æ›´æ–°(&R) Refresh æ›´æ–° Refresh view ビューを更新ã�—ã�¾ã�™ F5 Zoom &In 拡大(&I) Zoom In 拡大 Ctrl++ Zoom &Out 縮å°�(&O) Zoom Out 縮å°� Ctrl+- Zoom &Fit ウィンドウã�«å�ˆã‚�ã�›ã‚‹(&F) Zoom Fit ウィンドウã�«å�ˆã‚�ã�›ã‚‹ Ctrl+0 Zoom &Reset 表示ã�®ãƒªã‚»ãƒƒãƒˆ(&R) Zoom Reset 表示リセット Ctrl+1 &Zoom Range é�¸æŠžç¯„囲ã�®æ‹¡å¤§(&Z) Zoom Range é�¸æŠžç¯„囲を拡大ã�—ã�¾ã�™ JACK &Audio... JACK Audio (&A)... JACK Audio color JACK Audioã�®è‰² JACK &MIDI... JACK MIDI (&M)... JACK MIDI JACK MIDI JACK MIDI color JACK MIDIã�®è‰² ALSA M&IDI... ALSA MIDI ALSA MIDI ALSA MIDI color ALSA MIDIã�®è‰² JACK &CV... JACK CV (&C)... JACK CV color JACK CVã�®è‰² JACK &OSC... JACK OSC(&O)... JACK OSC JACK OSC JACK OSC color JACK OSCã�®è‰² &Reset リセット(&R) Reset colors é…�色ã�®ãƒªã‚»ãƒƒãƒˆ Port &Name ãƒ�ートå��(&N) Port name ãƒ�ートå�� Sort by port name ãƒ�ートå��ã�§ä¸¦ã�¹æ›¿ã�ˆ Port &Title ãƒ�ートタイトル(&T) Port title ãƒ�ートタイトル Sort by port title ãƒ�ートタイトルã�§ä¸¦ã�¹æ›¿ã�ˆ Port &Index ãƒ�ートインデックス(&I) Port index ãƒ�ートインデックス Sort by port index ãƒ�ートインデックスã�§ä¸¦ã�¹æ›¿ã�ˆ &Ascending 昇順(&A) Ascending 昇順ã�§ä¸¦ã�¹æ›¿ã�ˆ Ascending sort order 昇順ã�§ä¸¦ã�¹æ›¿ã�ˆã�¾ã�™ &Descending é™�é †(&D) Descending é™�é †ã�§ä¸¦ã�¹æ›¿ã�ˆ Descending sort order é™�é †ã�§ä¸¦ã�¹æ›¿ã�ˆã�¾ã�™ Repel O&verlapping Nodes Repel nodes Repel overlapping nodes Connect Thro&ugh Nodes Connect Through Nodes Connect through nodes Whether to draw connectors through or around nodes &About... qjackctlã�«ã�¤ã�„ã�¦(&A)... About... QjackCtlã�«ã�¤ã�„ã�¦... About QjackCtlã�«ã�¤ã�„ã�¦ Show information about this application program ã�“ã�®ã‚¢ãƒ—リケーションプログラムã�«ã�¤ã�„ã�¦ã�®æƒ…報を表示ã�—ã�¾ã�™ About &Qt... Qtã�«ã�¤ã�„ã�¦(&Q)... About Qt... Qtã�«ã�¤ã�„ã�¦... About Qt Qtã�«ã�¤ã�„ã�¦ Show information about the Qt toolkit Qtツールキットã�«ã�¤ã�„ã�¦ã�®æƒ…報を表示ã�—ã�¾ã�™ &Undo å…ƒã�«æˆ»ã�™(&U) &Redo やり直ã�™(&R) Undo last edit action ç›´å‰�ã�®ä½œæ¥­ã‚’å�–り消ã�—ã�¾ã�™ Redo last edit action å�–り消ã�—ã�Ÿä½œæ¥­ã‚’やり直ã�—ã�¾ã�™ Zoom 拡大率 Ready 準備ã�§ã��ã�¾ã�—ã�Ÿ Colors - %1 色 - %1 qjackctlMainForm Start the JACK server JACKサーãƒ�ーを開始ã�—ã�¾ã�™ &Start é–‹å§‹(&S) Stop the JACK server JACKサーãƒ�ã‚’å�œæ­¢ã�—ã�¾ã�™ S&top å�œæ­¢(&T) JACK server state JACKサーãƒ�ーã�®çŠ¶æ…‹ JACK server mode JACKサーãƒ�ーã�®ãƒ¢ãƒ¼ãƒ‰ DSP Load DSPã�®è² è�· Sample rate サンプルレート XRUN Count (notifications) XRUNã�®å›žæ•°(通知) Time display 時間ã�®è¡¨ç¤º Transport state トランスãƒ�ートã�®çŠ¶æ…‹ Transport BPM トランスãƒ�ートã�®BPM Transport time トランスãƒ�ートã�®æ™‚é–“ Quit processing and exit 処ç�†ã‚’終ã‚�らã�›çµ‚了ã�—ã�¾ã�™ &Quit 終了(&Q) Show/hide the session management window セッション管ç�†ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã�®è¡¨ç¤ºã‚’切り替ã�ˆã�¾ã�™ S&ession セッション(&E) Show/hide the messages log/status window メッセージログ/状態ウィンドウを表示ã�—ã�Ÿã‚Šéš ã�—ã�Ÿã‚Šã�—ã�¾ã�™ &Messages メッセージ(&M) Show settings and options dialog 設定ã�¨ã‚ªãƒ—ションダイアログを表示 Set&up... 設定(&U)... Show/hide the graph window グラフウィンドウã�®è¡¨ç¤ºã‚’切り替ã�ˆã�¾ã�™ Show/hide the connections window 接続ウィンドウã�®è¡¨ç¤ºã‚’切り替ã�ˆã�¾ã�™ &Connect 接続(&C) Show/hide the patchbay editor window パッãƒ�ベイ編集ウィンドウã�®è¡¨ç¤ºã‚’切り替ã�ˆã�¾ã�™ &Patchbay パッãƒ�ベイ(&P) Rewind transport トランスãƒ�ートを先頭ã�«æˆ»ã�—ã�¾ã�™ &Rewind 先頭ã�«æˆ»ã�™(&R) Backward transport トランスãƒ�ートを逆å†�生ã�—ã�¾ã�™ &Backward 逆å†�生(&B) Start transport rolling トランスãƒ�ートã�®ãƒ­ãƒ¼ãƒªãƒ³ã‚°ã‚’スタートã�—ã�¾ã�™ &Play å†�生(&P) Stop transport rolling トランスãƒ�ートã�®ãƒ­ãƒ¼ãƒªãƒ³ã‚°ã‚’ストップã�—ã�¾ã�™ Pa&use 一時å�œæ­¢(&U) Forward transport トランスãƒ�ートを早é€�りã�—ã�¾ã�™ &Forward æ—©é€�り(&F) Show information about this application ã�“ã�®ã‚¢ãƒ—リケーションã�«ã�¤ã�„ã�¦ã�®æƒ…報を表示ã�—ã�¾ã�™ Ab&out... 情報(&O)... Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. クライアントã�¨ã�—ã�¦ALSAシーケンサーを開ã��ã�“ã�¨ã�Œã�§ã��ã�¾ã�›ã‚“ã�§ã�—ã�Ÿ ALSA MIDIパッãƒ�ベイã�¯åˆ©ç”¨ã�§ã��ã�¾ã�›ã‚“。 D-BUS: Service is available (%1 aka jackdbus). D-BUS: サービスを利用ã�§ã��ã�¾ã�™ (%1 ã�Œjackdbusã‚’æ„�味ã�—ã�¾ã�™)。 D-BUS: Service not available (%1 aka jackdbus). D-BUS: サービスを利用ã�§ã��ã�¾ã�›ã‚“ (%1 ã�Œjackdbusã‚’æ„�味ã�—ã�¾ã�™)。 Information 情報 The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. ã�“ã�®ãƒ—ログラムã�¯ã‚·ã‚¹ãƒ†ãƒ ãƒˆãƒ¬ã‚¤ã�«è¡¨ç¤ºã�•れã�¾ã�™ã€‚ プログラムを終了ã�™ã‚‹æ™‚ã�¯ã€�システムトレイアイコンã�® コンテキストメニューã�§"Quit"ã‚’é�¸æŠžã�—ã�¦ä¸‹ã�•ã�„。 Don't show this message again ã�“ã�®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å†�表示ã�—ã�¾ã�›ã‚“ Warning 警告 JACK is currently running. Do you want to terminate the JACK audio server? JACKã�¯å‹•作中ã�§ã�™ã€‚ JACKオーディオサーãƒ�ーを終了ã�—ã�¾ã�™ã�‹ï¼Ÿ %1 is about to terminate. Are you sure? %1を終了ã�—よã�†ã�¨ã�—ã�¦ã�„ã�¾ã�™: よã‚�ã�—ã�„ã�§ã�™ã�‹? successfully æˆ�功 with exit status=%1 終了ステータス = %1 Could not start JACK. Maybe JACK audio server is already started. JACKã‚’é–‹å§‹ã�§ã��ã�¾ã�›ã‚“ã�§ã�—ã�Ÿã€‚ ã�Šã��らã��JACKサウンドサーãƒ�ーã�¯ã‚‚ã�†é–‹å§‹ã�—ã�¦ã�„ã�¾ã�™ã€‚ Could not load preset "%1". Retrying with default. プリセット "%1" をロードã�§ã��ã�¾ã�›ã‚“。 デフォルトã�®è¨­å®šã�§ãƒªãƒˆãƒ©ã‚¤ã�—ã�¾ã�™ã€‚ Could not load default preset. Sorry. デフォルトã�®ãƒ—リセットをロードã�§ã��ã�¾ã�›ã‚“。 ã�”ã‚�ã‚“ã�ªã�•ã�„。 Startup script... スタートアップスクリプト... Startup script terminated スタートアップスクリプトã�¯çµ‚了ã�—ã�¾ã�—ã�Ÿ D-BUS: JACK server is starting... D-BUS: JACKサーãƒ�ーを開始ã�—ã�¦ã�„ã�¾ã�™... D-BUS: JACK server could not be started. Sorry D-BUS: JACKサーãƒ�ーを開始ã�§ã��ã�¾ã�›ã‚“。 ã�”ã‚�ã‚“ã�ªã�•ã�„ JACK is starting... JACKã‚’é–‹å§‹ã�—ã�¦ã�„ã�¾ã�™... Some client audio applications are still active and connected. Do you want to stop the JACK audio server? アクティブã�ªæŽ¥ç¶šã‚’æŒ�ã�£ã�¦ã�„るオーディオã�® クライアントã�Œã�‚りã�¾ã�™ JACKオーディオサーãƒ�ーを終了ã�—ã�¾ã�™ã�‹ï¼Ÿ Shutdown script... シャットダウンスクリプト... Shutdown script terminated シャットダウンスクリプトã�¯çµ‚了ã�—ã�¾ã�—ã�Ÿ JACK is stopping... JACKを終了ã�—ã�¦ã�„ã�¾ã�™... D-BUS: JACK server is stopping... D-BUS: JACKサーãƒ�ーを終了ã�—ã�¦ã�„ã�¾ã�™... D-BUS: JACK server could not be stopped. Sorry D-BUS: JACKサーãƒ�ーを終了ã�§ã��ã�¾ã�›ã‚“ã�§ã�—ã�Ÿã€‚ ã�”ã‚�ã‚“ã�ªã�•ã�„ JACK was started with PID=%1. JACKã�¯ãƒ—ロセスID=%1ã�§é–‹å§‹ã�—ã�¾ã�—ã�Ÿã€‚ D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: JACKサーãƒ�ーã�¯ã‚¹ã‚¿ãƒ¼ãƒˆã�—ã�¾ã�—ã�Ÿ (%1 ã�Œjackdbusã‚’æ„�味ã�—ã�¾ã�™)。 JACK is being forced... JACKを強制終了ã�—ã�¾ã�™... JACK was stopped JACKã�¯çµ‚了ã�—ã�¾ã�—ã�Ÿ D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: JACKサーãƒ�ーã�¯çµ‚了ã�—ã�¾ã�—ã�Ÿ (%1 ã�Œjackdbusã‚’æ„�味ã�—ã�¾ã�™)。 Post-shutdown script... ãƒ�ストシャットダウンスクリプト... Post-shutdown script terminated ãƒ�ストシャットダウンスクリプトã�¯çµ‚了ã�—ã�¾ã�—ã�Ÿ Error エラー Don't ask this again ã�“ã�®è³ªå•�を繰り返ã�•ã�ªã�„ The preset aliases have been changed: "%1" Do you want to save the changes? プリセットã�®ã‚¨ã‚¤ãƒªã‚¢ã‚¹å��ã�Œå¤‰æ›´ã�•れã�¦ã�„ã�¾ã�™: "%1" 変更をä¿�å­˜ã�—ã�¾ã�™ã�‹? Transport BBT (bar.beat.ticks) トランスãƒ�ートã�®BBT(bar: beat, ticks) Transport time code トランスãƒ�ートã�®ã‚¿ã‚¤ãƒ ã‚³ãƒ¼ãƒ‰ Elapsed time since last reset 最後ã�®ãƒªã‚»ãƒƒãƒˆã�‹ã‚‰ã�®çµŒé�Žæ™‚é–“ Elapsed time since last XRUN 最後ã�®XRUNã�‹ã‚‰ã�®çµŒé�Žæ™‚é–“ Patchbay reset. パッãƒ�ベイã�®ãƒªã‚»ãƒƒãƒˆã€‚ Could not load active patchbay definition. "%1" Disabled. アクティブã�ªãƒ‘ッãƒ�ベイ定義をロードã�§ã��ã�¾ã�›ã‚“。 "%1" 無効ã�«ã�—ã�¾ã�—ã�Ÿã€‚ Patchbay activated. パッãƒ�ベイを有効ã�«ã�—ã�¾ã�—ã�Ÿã€‚ Patchbay deactivated. パッãƒ�ベイを無効ã�«ã�—ã�¾ã�—ã�Ÿã€‚ Statistics reset. 統計ã�®ãƒªã‚»ãƒƒãƒˆã€‚ msec ミリ秒 JACK connection graph change. JACK接続グラフを変更ã�—ã�¾ã�—ã�Ÿã€‚ XRUN callback (%1). XRUNコールãƒ�ック (%1)。 Buffer size change (%1). ãƒ�ッファサイズを変更ã�—ã�¾ã�—ã�Ÿ (%1)。 Shutdown notification. シャットダウンã�®é€šçŸ¥ã€‚ Freewheel started... Freewheelã�§é–‹å§‹ã�—ã�¾ã�—ã�Ÿ... Freewheel exited. Freewheelã�§çµ‚了ã�—ã�¾ã�—ã�Ÿã€‚ Could not start JACK. Sorry. JACKã‚’é–‹å§‹ã�§ã��ã�¾ã�›ã‚“ã�§ã�—ã�Ÿã€‚ ã�”ã‚�ã‚“ã�ªã�•ã�„。 JACK has crashed. JACKã�¯ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã�—ã�¾ã�—ã�Ÿã€‚ JACK timed out. JACKã�¯ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã�—ã�¾ã�—ã�Ÿã€‚ JACK write error. JACK書ã��è¾¼ã�¿ã‚¨ãƒ©ãƒ¼ã€‚ JACK read error. JACK読ã�¿å‡ºã�—エラー。 Unknown JACK error (%d). ä¸�明ã�ªJACKエラー (%d)。 JACK property change. JACKã�®ãƒ—ロパティーを変更ã�—ã�¾ã�—ã�Ÿã€‚ ALSA connection graph change. ALSA接続グラフを変更ã�—ã�¾ã�—ã�Ÿã€‚ JACK active patchbay scan JACKã�®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã�ªãƒ‘ッãƒ�ベイã�®ã‚¹ã‚­ãƒ£ãƒ³ ALSA active patchbay scan ALSAã�®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã�ªãƒ‘ッãƒ�ベイã�®ã‚¹ã‚­ãƒ£ãƒ³ JACK connection change. JACKã�®æŽ¥ç¶šã‚’変更ã�—ã�¾ã�—ã�Ÿã€‚ ALSA connection change. ALSAã�®ã‚³ãƒ�クションを変更ã�—ã�¾ã�—ã�Ÿã€‚ checked 確èª�済ã�¿ connected 接続中 disconnected 接続ã�ªã�— failed 失敗 A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? ã�“ã�®æŽ¥ç¶šã‚’å†�度やり直ã�™ã‚ˆã�†ã�ªãƒ‘ッãƒ�ベイ定義ã�Œ ç�¾åœ¨ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã�§ã�™: %1 -> %2 パッãƒ�ベイ接続を削除ã�—ã�¾ã�™ã�‹? Overall operation failed. å…¨æ“�作ã�Œå¤±æ•—ã�—ã�¾ã�—ã�Ÿã€‚ Invalid or unsupported option. ä¸�æ­£ã�ªã‚ªãƒ—ションã�‹ã€�サãƒ�ートã�•れã�¦ã�„ã�ªã�„オプションã�§ã�™ã€‚ Client name not unique. é‡�複ã�—ã�Ÿã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå��ã�§ã�™ã€‚ Server is started. サーãƒ�ーを開始ã�—ã�¾ã�—ã�Ÿã€‚ Unable to connect to server. サーãƒ�ーã�«æŽ¥ç¶šã�™ã‚‹ã�“ã�¨ã�Œã�§ã��ã�¾ã�›ã‚“。 Server communication error. サーãƒ�ーã�¨ã�®ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚¨ãƒ©ãƒ¼ã�§ã�™ã€‚ Client does not exist. クライアントã�Œå­˜åœ¨ã�—ã�¾ã�›ã‚“。 Unable to load internal client. 内部クライアントをロードã�§ã��ã�¾ã�›ã‚“。 Unable to initialize client. クライアントをåˆ�期化ã�§ã��ã�¾ã�›ã‚“。 Unable to access shared memory. 共有メモリーã�¸ã‚¢ã‚¯ã‚»ã‚¹ã�§ã��ã�¾ã�›ã‚“。 Client protocol version mismatch. クライアントã�®ãƒ—ロトコルãƒ�ージョンã�Œä¸€è‡´ã�—ã�¾ã�›ã‚“。 Could not connect to JACK server as client. - %1 Please check the messages window for more info. JACKサーãƒ�ーã�¨ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã�¨ã�—ã�¦æŽ¥ç¶šã�™ã‚‹ã�“ã�¨ã�Œã�§ã��ã�¾ã�›ã‚“。 - %1 メッセージウィンドウã�§è©³ç´°ã�ªæƒ…報を確èª�ã�—ã�¦ã��ã� ã�•ã�„。 Server configuration saved to "%1". サーãƒ�ー設定を "%1" ã�«ä¿�å­˜ã�—ã�¾ã�—ã�Ÿã€‚ Client activated. クライアントã�¯æœ‰åйã�§ã�™ã€‚ Post-startup script... ãƒ�ストスタートアップスクリプト... Post-startup script terminated ãƒ�ストスタートアップスクリプトを終了ã�—ã�¾ã�—ã�Ÿ Command line argument... コマンドライン引数... Command line argument started コマンドライン引数ã�®é–‹å§‹ Client deactivated. クライアントã�¯ç„¡åйã�§ã�™ã€‚ Transport rewind. トランスãƒ�ートを開始点ã�¾ã�§æˆ»ã�—ã�¾ã�™ã€‚ Transport backward. トランスãƒ�ートを逆å†�生ã�—ã�¾ã�™ã€‚ Starting é–‹å§‹ Transport start. トランスãƒ�ートを開始ã�—ã�¾ã�—ã�Ÿã€‚ Stopping å�œæ­¢ Transport stop. トランスãƒ�ートをå�œæ­¢ã�—ã�¾ã�—ã�Ÿã€‚ Transport forward. トランスãƒ�ートを早é€�りã�—ã�¾ã�™ã€‚ Stopped å�œæ­¢ %1 (%2%) %1 (%2%, %3 xruns) %1 % %1 Hz %1 frames %1 フレーム Yes ã�¯ã�„ No ã�„ã�„ã�ˆ FW RT Rolling ローリング Looping ループ %1 msec %1ミリ秒 XRUN callback (%1 skipped). XRUNコールãƒ�ック (%1 をスキップ)。 Started é–‹å§‹ Active 有効 Activating 有効化 Inactive 無効 &Hide éš ã�™(&H) D-BUS: GetParameterConstraint('%1'): %2. (%3) Mi&nimize 最å°�化(&N) S&how 表示(&H) Rest&ore å…ƒã�«æˆ»ã�™(&O) &Stop å�œæ­¢(&S) &Reset リセット(&R) &Presets プリセット(&P) &Load... 読ã�¿å‡ºã�—(&L)... &Save... ä¿�å­˜(&S)... Save and &Quit... ä¿�å­˜ã�—ã�¦çµ‚了(&Q)... Save &Template... テンプレートをä¿�å­˜(&T)... &Versioning ãƒ�ージョン(&V) Re&fresh æ›´æ–°(&F) St&atus 状態(&A) &Connections 接続(&C) Patch&bay パッãƒ�ベイ(&B) &Graph グラフ(&G) &Transport トランスãƒ�ート(&T) Server settings will be only effective after restarting the JACK audio server. サーãƒ�ー設定ã�¯JACKオーディオサーãƒ�ーをå†�起動後ã�« 有効ã�¨ã�ªã‚Šã�¾ã�™ã€‚ Do you want to restart the JACK audio server? JACKオーディオサーãƒ�ーをå†�èµ·å‹•ã�—ã�¾ã�™ã�‹? Some settings will be only effective the next time you start this program. ã�„ã��ã�¤ã�‹ã�®è¨­å®šã�¯ã�“ã�®ãƒ—ログラムを次回ã�«èµ·å‹•ã�—ã�Ÿæ™‚ã�« 有効ã�¨ã�ªã‚Šã�¾ã�™ã€‚ D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) qjackctlMessagesStatusForm Messages / Status メッセージ/ステータス &Messages メッセージ(&M) Messages log メッセージã�®ãƒ­ã‚° Messages output log メッセージ出力ログ &Status 状態(&S) Status information 状態ã�®æƒ…å ± Statistics since last server startup 最後ã�«ã‚µãƒ¼ãƒ�ーã�Œé–‹å§‹ã�—ã�¦ã�‹ã‚‰ã�®çµ±è¨ˆ Description é …ç›® Value 値 Reset XRUN statistic values XRUN統計値をリセットã�—ã�¾ã�™ Re&set リセット(&S) Refresh XRUN statistic values XRUN統計値を更新ã�—ã�¾ã�™ &Refresh æ›´æ–°(&R) Server name サーãƒ�ーå�� Server state サーãƒ�ーã�®çŠ¶æ…‹ DSP Load DSPè² è�· Sample Rate サンプルレート Buffer Size ãƒ�ッファサイズ Realtime Mode リアルタイムモード Transport state トランスãƒ�ートã�®çŠ¶æ…‹ Transport Timecode トランスãƒ�ートã�®ã‚¿ã‚¤ãƒ ã‚³ãƒ¼ãƒ‰ Transport BBT トランスãƒ�ートã�®BBT Transport BPM トランスãƒ�ートã�®BPM XRUN count since last server startup 最後ã�«ã‚µãƒ¼ãƒ�ーã�Œé–‹å§‹ã�—ã�¦ã�‹ã‚‰ã�®XRUNã�®å›žæ•° XRUN last time detected XRUNã�Œæœ€å¾Œã�«æ¤œå‡ºã�•れã�Ÿæ™‚é–“ XRUN last 最後ã�®XRUN XRUN maximum XRUNã�®æœ€å¤§å€¤ XRUN minimum XRUNã�®æœ€å°�値 XRUN average XRUNã�®å¹³å�‡å€¤ XRUN total XRUNã�®å�ˆè¨ˆ Maximum scheduling delay スケジュールé�…å»¶ã�®æœ€å¤§å€¤ Time of last reset 最後ã�®ãƒªã‚»ãƒƒãƒˆã�®æ™‚é–“ Logging stopped --- %1 --- Logging started --- %1 --- qjackctlPaletteForm Color Themes é…�色ã�®ãƒ†ãƒ¼ãƒž Name å��å‰� Current color palette name ç�¾åœ¨ã�®è‰²ãƒ‘レットå�� Save current color palette name ç�¾åœ¨ã�®è‰²ãƒ‘レットå��ã‚’ä¿�å­˜ã�—ã�¾ã�™ Save ä¿�å­˜ Delete current color palette name ç�¾åœ¨ã�®è‰²ãƒ‘レットå��を削除ã�—ã�¾ã�™ Delete 削除 Palette パレット Current color palette ç�¾åœ¨ã�®è‰²ãƒ‘レット Generate: 作æˆ�: Base color to generate palette パレットを作æˆ�ã�™ã‚‹ãƒ™ãƒ¼ã‚¹ã�¨ã�ªã‚‹è‰² Reset all current palette colors ç�¾åœ¨ã�®è‰²ãƒ‘レットå��ã‚’å…¨ã�¦ãƒªã‚»ãƒƒãƒˆã�—ã�¾ã�™ Reset リセット Import a custom color theme (palette) from file ファイルã�‹ã‚‰ã‚«ã‚¹ã‚¿ãƒ è‰²ãƒ†ãƒ¼ãƒž(パレット)をインãƒ�ートã�—ã�¾ã�™ Import... インãƒ�ート... Export a custom color theme (palette) to file ファイルã�¸ã‚«ã‚¹ã‚¿ãƒ è‰²ãƒ†ãƒ¼ãƒž(パレット)をエクスãƒ�ートã�—ã�¾ã�™ Export... エクスãƒ�ート... Show Details 詳細表示 Import File - %1 ファイルã�®ã‚¤ãƒ³ãƒ�ート - %1 Palette files (*.%1) パレットファイル (*.%1) Save Palette - %1 All files (*.*) 全ファイル (*.*) Warning - %1 警告 - %1 Could not import from file: %1 Sorry. ファイルã�‹ã‚‰ã‚¤ãƒ³ãƒ�ートã�§ã��ã�¾ã�›ã‚“ã�§ã�—ã�Ÿ: %1 ã�”ã‚�ã‚“ã�ªã�•ã�„。 Export File - %1 ファイルã�®ã‚¨ã‚¯ã‚¹ãƒ�ート - %1 Some settings have been changed. Do you want to discard the changes? 設定ã�Œå¤‰æ›´ã�•れã�¦ã�„ã�¾ã�™ã€‚ 変更を破棄ã�—ã�¾ã�™ã�‹? Some settings have been changed: "%1". Do you want to save the changes? 設定ã�®ä¸€éƒ¨ã�Œå¤‰æ›´ã�•れã�¦ã�„ã�¾ã�™: "%1"。 変更をä¿�å­˜ã�—ã�¾ã�™ã�‹? qjackctlPaletteForm::PaletteModel Color Role 色ã�®å½¹å‰² Active 有効 Inactive 無効 Disabled 使用ä¸�å�¯ qjackctlPatchbay Warning 警告 This will disconnect all sockets. Are you sure? ã�™ã�¹ã�¦ã�®ã‚½ã‚±ãƒƒãƒˆã‚’切断ã�—ã�¾ã�™ よã‚�ã�—ã�„ã�§ã�™ã�‹? qjackctlPatchbayForm Patchbay パッãƒ�ベイ Move currently selected output socket down one position é�¸æŠžã�—ã�¦ã�„る出力ソケットを下ã�¸ç§»å‹•ã�—ã�¾ã�™ Down 下ã�¸ Create a new output socket æ–°ã�—ã�„出力ソケットを作æˆ�ã�—ã�¾ã�™ Add... 追加... Edit currently selected input socket properties é�¸æŠžã�—ã�¦ã�„る入力ソケットã�®ãƒ—ロパティを編集ã�—ã�¾ã�™ Edit... 編集... Move currently selected output socket up one position é�¸æŠžã�—ã�¦ã�„る出力ソケットを上ã�«ç§»å‹•ã�—ã�¾ã�™ Up 上ã�¸ Remove currently selected output socket é�¸æŠžã�—ã�¦ã�„る出力ソケットを削除ã�—ã�¾ã�™ Remove 削除 Duplicate (copy) currently selected output socket é�¸æŠžã�—ã�¦ã�„る出力ソケットを複製(コピー)ã�—ã�¾ã�™ Copy... コピー... Remove currently selected input socket é�¸æŠžã�—ã�¦ã�„る入力ソケットを削除ã�—ã�¾ã�™ Duplicate (copy) currently selected input socket é�¸æŠžã�—ã�¦ã�„る入力ソケットを複製(コピー)ã�—ã�¾ã�™ Create a new input socket æ–°ã�—ã�„入力ソケットを作æˆ�ã�—ã�¾ã�™ Edit currently selected output socket properties é�¸æŠžã�—ã�¦ã�„る出力ソケットã�®ãƒ—ロパティを編集ã�—ã�¾ã�™ Connect currently selected sockets é�¸æŠžã�—ã�¦ã�„るソケットを接続ã�—ã�¾ã�™ &Connect 接続(&C) Disconnect currently selected sockets é�¸æŠžã�—ã�¦ã�„るソケットを切断ã�—ã�¾ã�™ &Disconnect 切断(&D) Disconnect all currently connected sockets 接続ã�•れã�¦ã�„ã‚‹ã�™ã�¹ã�¦ã�®ã‚½ã‚±ãƒƒãƒˆã‚’切断ã�—ã�¾ã�™ Disconnect &All ã�™ã�¹ã�¦åˆ‡æ–­(&A) Expand all items ã�™ã�¹ã�¦ã�®ã‚¢ã‚¤ãƒ†ãƒ ã‚’展開ã�—ã�¾ã�™ E&xpand All ã�™ã�¹ã�¦å±•é–‹(&X) Refresh current patchbay view パッãƒ�ベイã�®è¡¨ç¤ºã‚’æ›´æ–°ã�—ã�¾ã�™ &Refresh æ›´æ–°(&R) Create a new patchbay profile æ–°ã�—ã�„パッãƒ�ベイプロファイルを作æˆ�ã�—ã�¾ã�™ &New æ–°è¦�(&N) Load patchbay profile パッãƒ�ベイプロファイルを読ã�¿å‡ºã�—ã�¾ã�™ &Load... 読ã�¿è¾¼ã�¿(&L)... Save current patchbay profile パッãƒ�ベイプロファイルをä¿�å­˜ã�—ã�¾ã�™ &Save... ä¿�å­˜(&S)... Current (recent) patchbay profile(s) ç�¾åœ¨ã�®(最近ã�®)パッãƒ�ベイプロファイル Toggle activation of current patchbay profile ç�¾åœ¨ã�®ãƒ‘ッãƒ�ベイプロファイルを有効ã�«ã�—ã�Ÿã‚Šç„¡åйã�«ã�—ã�¾ã�™ Acti&vate 有効化(&V) Warning 警告 The patchbay definition has been changed: "%1" Do you want to save the changes? パッãƒ�ベイã�®å®šç¾©ã‚’変更ã�—ã�¾ã�—ã�Ÿ: "%1" 変更をä¿�å­˜ã�—ã�¾ã�™ã�‹? %1 [modified] %1 [変更] Untitled%1 無題%1 Error エラー Could not load patchbay definition file: "%1" パッãƒ�ベイ定義ファイルを読ã�¿å‡ºã�›ã�¾ã�›ã‚“: "%1" Could not save patchbay definition file: "%1" パッãƒ�ベイ定義ファイルをä¿�å­˜ã�§ã��ã�¾ã�›ã‚“: "%1" New Patchbay definition æ–°è¦�パッãƒ�ベイ定義 Create patchbay definition as a snapshot of all actual client connections? ç�¾åœ¨æœ‰åйã�ªå…¨ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæŽ¥ç¶šã‚’スナップショットã�¨ã�—ã�¦ パッãƒ�ベイ定義を作æˆ�ã�—ã�¾ã�™ã�‹? Load Patchbay Definition パッãƒ�ベイã�®å®šç¾©ã‚’読ã�¿å‡ºã�—ã�¾ã�™ Patchbay Definition files パッãƒ�ベイ定義ファイル Save Patchbay Definition パッãƒ�ベイã�®å®šç¾©ã‚’ä¿�å­˜ã�—ã�¾ã�™ active アクティブ qjackctlPatchbayView Add... 追加... Edit... 編集... Copy... コピー... Remove 削除 Exclusive 排他的 Forward æ—©é€�り (None) (ã�ªã�—) Move Up 上ã�¸ç§»å‹• Move Down 下ã�¸ç§»å‹• &Connect 接続(&C) Alt+C Connect &Disconnect 切断(&D) Alt+D Disconnect Disconnect &All ã�™ã�¹ã�¦åˆ‡æ–­(&A) Alt+A Disconnect All &Refresh æ›´æ–°(&R) Alt+R Refresh qjackctlSessionForm Session セッション Load session セッションを読ã�¿å‡ºã�—ã�¾ã�™ &Load... 読ã�¿å‡ºã�—(&L)... Recent session 最近ã�®ã‚»ãƒƒã‚·ãƒ§ãƒ³ &Recent 最近ã�®ã‚»ãƒƒã‚·ãƒ§ãƒ³(&R) Save session セッションをä¿�å­˜ã�—ã�¾ã�™ &Save ä¿�å­˜(&S) &Versioning ãƒ�ージョン(&V) Update session セッションã�®æ›´æ–° Re&fresh æ›´æ–°(&F) Session clients / connections セッションã�®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆ/接続 Client / Ports クライアント/ãƒ�ート UUID Command コマンド Infra-clients / commands インフラクライアント/コマンド Infra-client インフラクライアント Infra-command インフラコマンド Add infra-client インフラクライアントを追加ã�—ã�¾ã�™ &Add 追加(&A) Edit infra-client インフラクライアントを編集ã�—ã�¾ã�™ &Edit 編集(&E) Remove infra-client インフラクライアントを削除ã�—ã�¾ã�™ Re&move 削除(&M) &Save... ä¿�å­˜(&S)... Save and &Quit... ä¿�å­˜ã�—ã�¦çµ‚了(&Q)... Save &Template... テンプレートをä¿�å­˜(&T)... Load Session セッションを読ã�¿å‡ºã�— Session directory セッションã�®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª Save Session セッションã�®ä¿�å­˜ and Quit ã�¨çµ‚了 Template テンプレート &Clear クリア(&C) Warning 警告 A session could not be found in this folder: "%1" ã�“ã�®ãƒ•ォルダーã�«ã‚»ãƒƒã‚·ãƒ§ãƒ³ã�¯ã�‚りã�¾ã�›ã‚“: "%1" %1: loading session... %1: セッションを読ã�¿å‡ºã�—ã�¦ã�„ã�¾ã�™... %1: load session %2. %1: セッションã�®èª­ã�¿å‡ºã�— %2。 A session already exists in this folder: "%1" Are you sure to overwrite the existing session? セッションã�¯ã�™ã�§ã�«ã�“ã�®ãƒ•ォルダーã�«ã�‚りã�¾ã�™: "%1" 存在ã�™ã‚‹ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’上書ã��ã�—ã�¾ã�™ã�‹? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? ã�“ã�®ãƒ•ォルダーã�¯ã�™ã�§ã�«å­˜åœ¨ã�—ã�¦ã�„ã�¦ã€�空ã�§ã�™: "%1" 存在ã�™ã‚‹ãƒ•ォルダーを上書ã��ã�—ã�¾ã�™ã�‹? %1: saving session... %1: セッションをä¿�å­˜ã�—ã�¦ã�„ã�¾ã�™... %1: save session %2. %1: セッションã�®ä¿�å­˜ %2。 New Client æ–°è¦�クライアント qjackctlSessionInfraClientItemEditor Infra-command インフラコマンド qjackctlSessionSaveForm Session セッション &Name: å��å‰�(&N): Session name &Directory: Session directory セッションã�®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª Browse for session directory ... Save session versioning セッションã�®ãƒ�ージョンをä¿�å­˜ã�—ã�¾ã�™ &Versioning ãƒ�ージョン(&V) Warning 警告 Session directory does not exist: "%1" Do you want to create it? Session Directory qjackctlSetupForm Settings 設定 Preset &Name: プリセットå��(&N): Settings preset name プリセット設定å�� (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Save settings as current preset name 設定をç�¾åœ¨ã�®ãƒ—リセットå��ã�¨ã�—ã�¦ä¿�å­˜ &Save ä¿�å­˜(&S) Delete current settings preset ç�¾åœ¨ã�®ãƒ—リセットを削除ã�—ã�¾ã�™ &Delete 削除(&D) jackd DO NOT TRANSLATE jackdmp DO NOT TRANSLATE jackstart DO NOT TRANSLATE &Name: å��å‰�(&N): The JACK Audio Connection Kit sound server name JACK Audio Connection Kitサウンドサーãƒ�ーå�� Driv&er: ドライãƒ�ー(&E): The audio backend driver interface to use 使用ã�™ã‚‹ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªãƒ�ックエンドドライãƒ�ーインターフェイス dummy DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 sun DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 oss DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 alsa DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 portaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 coreaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 firewire DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 net DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 netone DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Parameters パラメーター MIDI Driv&er: MIDIドライãƒ�ー(&E): The ALSA MIDI backend driver to use 使用ã�™ã‚‹ALSA MIDIãƒ�ックエンドドライãƒ�ー none raw DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 seq DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Time in seconds that client is delayed after server startup サーãƒ�ーを開始ã�—ã�¦ã�‹ã‚‰ã�®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã�Œé�…å»¶ã�™ã‚‹æ™‚é–“(ç§’) Latency: レイテンシー: Output latency in milliseconds, calculated based on the period, rate and buffer settings ピリオドã€�サンプルレートã��ã�—ã�¦ãƒ�ッファーサイズã�‹ã‚‰è¨ˆç®—ã�—ã�Ÿã€�出力ã�®ãƒ¬ã‚¤ãƒ†ãƒ³ã‚· (ミリ秒) Use realtime scheduling リアルタイムスケジューリングを使用ã�—ã�¾ã�™ &Realtime リアルタイム(&R) Do not attempt to lock memory, even if in realtime mode リアルタイムモードã�§ã�ªã��ã�¦ã‚‚ã€�メモリーをロックã�—ã�ªã�„よã�†ã�«ã�—ã�¾ã�™ No Memory Loc&k メモリーロックを無効(&K) Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) 一般的ã�ªãƒ„ールキットライブラリーã�®ãƒ¡ãƒ¢ãƒªãƒ¼ã‚’アンロックã�™ã‚‹ (GTK+, QT, FLTK, Wine) &Unlock Memory メモリーã�®ã‚¢ãƒ³ãƒ­ãƒƒã‚¯(&U) Ignore xruns reported by the backend driver ãƒ�ックエンドドライãƒ�ーã�Œå ±å‘Šã�™ã‚‹XRUNを無視ã�—ã�¾ã�™ So&ft Mode ソフトモード(&F) Provide output monitor ports 出力モニター用ã�«ãƒ�ートをæ��ä¾›ã�—ã�¾ã�™ &Monitor モニター(&M) Force 16bit mode instead of failing over 32bit (default) 32ビットモード(デフォルト)ã�§å¤±æ•—ã�™ã‚‹å ´å�ˆã�«16ビットモードを強制ã�—ã�¾ã�™ Force &16bit 強制的ã�«16bitを使用(&1) Enable hardware metering on cards that support it ãƒ�ードウェアメーターをサãƒ�ートã�—ã�¦ã�„るカードã�§ã�¯ã��れを有効ã�«ã�—ã�¾ã�™ H/&W Meter H/Wメーターを有効(&W) Ignore hardware period/buffer size ãƒ�ードウェアã�®ãƒ”リオド/ãƒ�ッファーサイズを無視ã�—ã�¾ã�™ &Ignore H/W H/Wを無視(&I) Whether to give verbose output on messages メッセージã�«è©³ç´°ã�ªå‡ºåŠ›ã‚’è¡Œã�†ã�‹ã�©ã�†ã�‹ &Verbose messages 詳細ã�ªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸(&V) &Output Device: 出力デãƒ�イス(&O): &Interface: インターフェース(&I): Maximum input audio hardware channels to allocate 割り当ã�¦ã‚‹å…¥åŠ›ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªãƒ�ードウェアãƒ�ャンãƒ�ルã�®æœ€å¤§å€¤ &Audio: オーディオ(&A): Dit&her: ディザリング(&H): External output latency (frames) 外部出力ã�®ãƒ¬ã‚¤ãƒ†ãƒ³ã‚·ãƒ¼(フレーム) &Input Device: 入力デãƒ�イス(&I): Provide either audio capture, playback or both 音声ã�®å…¥åŠ›ã�‹å‡ºåŠ›ã€�ã�‚ã‚‹ã�„ã�¯å…¥å‡ºåŠ›ã�‹ã‚‰é�¸æŠžã�—ã�¾ã�™ Duplex 入出力 Capture Only 入力ã�®ã�¿ Playback Only 出力ã�®ã�¿ The PCM device name to use 使用ã�™ã‚‹PCMデãƒ�イスå�� hw:0 plughw:0 /dev/audio /dev/dsp > Alternate input device for capture 録音ã�®ã�Ÿã‚�ã�®å…¥åŠ›ãƒ‡ãƒ�イスをé�¸æŠž Maximum output audio hardware channels to allocate 割り当ã�¦ã‚‹ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªå‡ºåŠ›ãƒ�ードウェアãƒ�ャンãƒ�ルã�®æœ€å¤§å€¤ Alternate output device for playback å†�生ã�®ã�Ÿã‚�ã�®å‡ºåŠ›ãƒ‡ãƒ�イス External input latency (frames) 外部入力ã�®ãƒ¬ã‚¤ãƒ†ãƒ³ã‚·ãƒ¼(フレーム) Set dither mode ディザリングモードを設定ã�—ã�¾ã�™ None Rectangular Shaped Triangular Number of periods in the hardware buffer ãƒ�ードウェアãƒ�ッファーã�®ãƒ”リオド数 Priorit&y: 優先度(&Y): &Frames/Period: フレーム/ピリオド(&F): Frames per period between process() calls process()呼ã�³å‡ºã�—é–“ã�®ãƒ”リオド毎ã�®ãƒ•レーム数 16 32 64 128 256 512 1024 2048 4096 Port Ma&ximum: 最大ãƒ�ート数(&X): &Channels: ãƒ�ャンãƒ�ル数(&C): Number of microseconds to wait between engine processes (dummy) エンジンã�®å‡¦ç�†é–“ã�®å¾…ã�¡æ™‚間をマイクロ秒ã�§æŒ‡å®šã�—ã�¾ã�™(dummy) 21333 Sample rate in frames per second サンプリングレートを1ç§’ã�‚ã�Ÿã‚Šã�®ãƒ•レーム数ã�§æŒ‡å®šã�—ã�¾ã�™ 22050 32000 44100 48000 88200 96000 192000 Scheduler priority when running realtime リアルタイムモードã�§å‹•作ã�—ã�¦ã�„ã‚‹å ´å�ˆã�®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã�«ã�Šã�‘る優先度を設定ã�—ã�¾ã�™ &Word Length: ワード長(&W): Periods/&Buffer: ピリオド/ãƒ�ッファー(&B): Word length ワード長 Maximum number of ports the JACK server can manage JACKサーãƒ�ーã�Œç®¡ç�†ã�™ã‚‹ãƒ�ートã�®æœ€å¤§æ•° &Wait (usec): å¾…ã�¡æ™‚é–“(マイクロ秒)(&W): Sample &Rate: サンプルレート(&R): Maximum number of audio channels to allocate 割り当ã�¦ã‚‹ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªãƒ�ャンãƒ�ルã�®æœ€å¤§å€¤ &Timeout (msec): タイムアウト(ミリ秒)(&T): Set client timeout limit in milliseconds クライアントã�®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã�®æœ€å¤§å€¤ã‚’ミリ秒ã�§æŒ‡å®šã�—ã�¾ã�™ Setup セットアップ Whether to restrict client self-connections クライアントã�®ã‚»ãƒ«ãƒ•接続モードを制é™�ã�™ã‚‹ã�‹ã�©ã�†ã�‹ Whether to use server synchronous mode サーãƒ�ーã�®synchronousモードを使用ã�™ã‚‹ã�‹ã�©ã�†ã�‹ &Use server synchronous mode サーãƒ�ーã�®synchronousモードを使用ã�™ã‚‹(&U) Please do not touch these settings unless you know what you are doing. 何をã�—よã�†ã�¨ã�—ã�¦ã�„ã‚‹ã�‹çŸ¥ã�£ã�¦ã�„ã‚‹å ´å�ˆã�«é™�りã�“れらã�®è¨­å®šã‚’変更ã�—ã�¦ã��ã� ã�•ã�„。 200 500 1000 2000 5000 Cloc&k source: クロックソース(&K): Clock source クロックソース S&elf connect mode: セルフ接続モード(&E): Options オプション Scripting スクリプト Whether to execute a custom shell script before starting up the JACK audio server. JACKオーディオサーãƒ�ーを開始ã�™ã‚‹å‰�ã�«ä»»æ„�ã�®ã‚·ã‚§ãƒ«ã‚¹ã‚¯ãƒªãƒ—トを実行ã�™ã‚‹ã�‹ã�©ã�†ã�‹ã€‚ Execute script on Start&up: スタートアップ時ã�«ã‚¹ã‚¯ãƒªãƒ—トを実行(&U): Whether to execute a custom shell script after starting up the JACK audio server. JACKオーディオサーãƒ�ーを開始ã�—ã�Ÿç›´å¾Œã�«ä»»æ„�ã�®ã‚·ã‚§ãƒ«ã‚¹ã‚¯ãƒªãƒ—トを実行ã�™ã‚‹ã�‹ã�©ã�†ã�‹ã€‚ Execute script after &Startup: スタートアップ後ã�«ã‚¹ã‚¯ãƒªãƒ—トを実行(&S): Whether to execute a custom shell script before shuting down the JACK audio server. JACKオーディオサーãƒ�ーを終了ã�™ã‚‹ç›´å‰�ã�«ä»»æ„�ã�®ã‚·ã‚§ãƒ«ã‚¹ã‚¯ãƒªãƒ—トを実行ã�™ã‚‹ã�‹ã�©ã�†ã�‹ã€‚ Execute script on Shut&down: シャットダウン時ã�«ã‚¹ã‚¯ãƒªãƒ—トを実行(&D): Command line to be executed before starting up the JACK audio server JACKオーディオサーãƒ�ーを開始ã�™ã‚‹å‰�ã�«å®Ÿè¡Œã�™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ Scripting argument meta-symbols メタシンボルã�¨ã�—ã�¦ä½¿ã�ˆã‚‹ã‚¹ã‚¯ãƒªãƒ—ト引数 Browse for script to be executed before starting up the JACK audio server JACKオーディオサーãƒ�ーを開始ã�™ã‚‹å‰�ã�«å®Ÿè¡Œã�™ã‚‹ã‚¹ã‚¯ãƒªãƒ—トをå�‚ç…§ã�—ã�¾ã�™ ... Command line to be executed after starting up the JACK audio server JACKオーディオサーãƒ�ーを開始ã�—ã�Ÿå¾Œã�«å®Ÿè¡Œã�™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ Browse for script to be executed after starting up the JACK audio server JACKオーディオサーãƒ�ーを開始ã�—ã�Ÿå¾Œã�«å®Ÿè¡Œã�™ã‚‹ã‚¹ã‚¯ãƒªãƒ—トをå�‚ç…§ã�—ã�¾ã�™ Browse for script to be executed before shutting down the JACK audio server JACKオーディオサーãƒ�ーを終了ã�™ã‚‹ç›´å‰�ã�«å®Ÿè¡Œã�™ã‚‹ã‚¹ã‚¯ãƒªãƒ—トをå�‚ç…§ã�—ã�¾ã�™ Command line to be executed before shutting down the JACK audio server JACKオーディオサーãƒ�ーを終了ã�™ã‚‹ç›´å‰�ã�«å®Ÿè¡Œã�™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ Whether to execute a custom shell script after shuting down the JACK audio server. JACKオーディオサーãƒ�ーを終了ã�—ã�Ÿç›´å¾Œã�«ä»»æ„�ã�®ã‚·ã‚§ãƒ«ã‚¹ã‚¯ãƒªãƒ—トを実行ã�™ã‚‹ã�‹ã�©ã�†ã�‹ã€‚ Execute script after Shu&tdown: シャットダウン後ã�«ã‚¹ã‚¯ãƒªãƒ—トを実行(&T): Browse for script to be executed after shutting down the JACK audio server JACKオーディオサーãƒ�ーを終了ã�—ã�Ÿç›´å¾Œã�«å®Ÿè¡Œã�™ã‚‹ã‚¹ã‚¯ãƒªãƒ—トをå�‚ç…§ã�—ã�¾ã�™ Command line to be executed after shutting down the JACK audio server JACKオーディオサーãƒ�ーを終了ã�—ã�Ÿç›´å¾Œã�«å®Ÿè¡Œã�™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ Statistics 統計 Whether to capture standard output (stdout/stderr) into messages window メッセージウィンドウ中ã�«æ¨™æº–出力(stdout/stderr)を記録ã�™ã‚‹ã�‹ã�©ã�†ã�‹ &Capture standard output 標準出力ã�®è¨˜éŒ²(&C) &XRUN detection regex: XRUN検出ã�®æ­£è¦�表ç�¾(&X): Regular expression used to detect XRUNs on server output messages サーãƒ�ー出力メッセージ内ã�«ã�Šã�„ã�¦XRUNを検出ã�—ã�Ÿéš›ã�«ä½¿ç”¨ã�•れる正è¦�表ç�¾ xrun of at least ([0-9|\.]+) msecs Connections 接続 Whether to reset all connections when a patchbay definition is activated. パッãƒ�ベイ定義を有効ã�«ã�—ã�Ÿéš›ã�«å…¨æŽ¥ç¶šã‚’リセットã�™ã‚‹ã�‹ã�©ã�†ã�‹ã€‚ &Reset all connections on patchbay activation パッãƒ�ベイ有効化ã�«ä¼´ã�„全接続をリセットã�™ã‚‹(&R) Whether to issue a warning on active patchbay port disconnections. アクティブã�ªãƒ‘ッãƒ�ベイãƒ�ート切断時ã�«è­¦å‘Šã‚’表示ã�™ã‚‹ã�‹ã�©ã�†ã�‹ã€‚ &Warn on active patchbay disconnections アクティブã�ªãƒ‘ッãƒ�ベイ切断時ã�«è­¦å‘Š(&W) Custom カスタム &Color palette theme: 色パレットテーマ(&C): Custom color palette theme カスタム色パレットテーマ Wonton Soup DO NOT TRANSLATE KXStudio DO NOT TRANSLATE Manage custom color palette themes カスタム色パレットテーマを管ç�†ã�—ã�¾ã�™ &Widget style theme: ウィジェットスタイルテーマ(&W): Custom widget style theme カスタムウィジェットスタイルテーマ Whether to enable JACK D-Bus interface JACK D-Busインターフェイスを有効ã�«ã�™ã‚‹ã�‹ã�©ã�†ã�‹ &Enable JACK D-Bus interface JACK D-Busインターフェイスã�®æœ‰åŠ¹åŒ–(&E) Whether to replace Connections with Graph button on the main window メインウィンドウã�®æŽ¥ç¶šãƒœã‚¿ãƒ³ã‚’グラフボタンã�¨ç½®ã��æ�›ã�ˆã‚‹ã�‹ã�©ã�†ã�‹ Replace Connections with &Graph button 接続ボタンをグラフボタンã�¨ç½®ã��æ�›ã�ˆã‚‹(&G) 10 Patchbay definition file to be activated as connection persistence profile 接続ã�«ã�Šã�„ã�¦æŒ�ç¶šã�—ã�¦æœ‰åйã�«ã�™ã‚‹ãƒ‘ッãƒ�ベイ定義ファイルを指定ã�—ã�¾ã�™ Browse for a patchbay definition file to be activated 有効ã�«ã�™ã‚‹ãƒ‘ッãƒ�ベイ定義ã�®å�‚ç…§ Whether to activate a patchbay definition for connection persistence profile. 接続ã�«ã�Šã�„ã�¦æŒ�ç¶šã�—ã�¦æœ‰åйã�«ã�™ã‚‹ãƒ‘ッãƒ�ベイ定義を有効ã�«ã�™ã‚‹ã�‹ã�©ã�†ã�‹ã€‚ Activate &Patchbay persistence: パッãƒ�ベイã�®æŒ�続を有効化(&P): Logging ログã�®è¨˜éŒ² Messages log file メッセージログファイル Browse for the messages log file location メッセージログファイルã�®å ´æ‰€ã‚’å�‚ç…§ã�—ã�¾ã�™ Whether to activate a messages logging to file. メッセージログをファイルã�«è¨˜éŒ²ã�™ã‚‹ã�‹ã�©ã�†ã�‹ã€‚ Server &Prefix: サーãƒ�ー接頭辞(&P): Server path (command line prefix) サーãƒ�ーパス(コマンドライン接頭辞) &Channels I/O: ãƒ�ャンãƒ�ルI/O(&C): &Latency I/O: レイテンシーI/O(&L): Server Suffi&x: サーãƒ�ー接尾辞(&X): Extra driver options (command line suffix) ä»»æ„�ã�®ãƒ‰ãƒ©ã‚¤ãƒ�ーオプション(コマンドライン接尾辞) Start De&lay: 開始ディレイ(&L): secs ç§’ 0 msecs 0ミリ秒 Clear settings of current preset name ç�¾åœ¨ã�®ãƒ—リセットå��ã�®è¨­å®šã‚’クリアã�—ã�¾ã�™ Clea&r クリア(&R) &Messages log file: メッセージログファイル(&M): Display 表示 Time Display 時間表示 Transport &Time Code トランスãƒ�ートã�®ã‚¿ã‚¤ãƒ ã‚³ãƒ¼ãƒ‰(&T) Transport &BBT (bar:beat.ticks) トランスãƒ�ートã�®BBT(bar: beat, ticks)(&B) Elapsed time since last &Reset 最後ã�®ãƒªã‚»ãƒƒãƒˆã�‹ã‚‰ã�®çµŒé�Žæ™‚é–“(&R) Elapsed time since last &XRUN 最後ã�®XRUNã�‹ã‚‰ã�®çµŒé�Žæ™‚é–“(&X) Sample front panel normal display font フロントパãƒ�ルã�®é€šå¸¸è¡¨ç¤ºã�®ã‚µãƒ³ãƒ—ルフォント Sample big time display font ビッグタイム表示ã�®ãƒ•ォントサンプル Big Time display: ビッグタイム表示: Select font for front panel normal display フロントパãƒ�ルã�®é€šå¸¸è¡¨ç¤ºã�«ä½¿ç”¨ã�™ã‚‹ãƒ•ォントをé�¸æŠžã�—ã�¾ã�™ &Font... フォント(&F)... Select font for big time display ビッグタイム表示ã�«ä½¿ç”¨ã�™ã‚‹ãƒ•ォントをé�¸æŠžã�—ã�¾ã�™ Normal display: 通常表示: Whether to enable blinking (flashing) of the server mode (RT) indicator サーãƒ�ーモード(RT)インジケーターを点滅ã�™ã‚‹ã�‹ã�©ã�†ã�‹ Blin&k server mode indicator サーãƒ�ーモードインジケーターã�®ç‚¹æ»…(&K) Messages Window メッセージウィンドウ Sample messages text font display メッセージテキスト表示ã�«ä½¿ç”¨ã�™ã‚‹ãƒ•ォントã�®ã‚µãƒ³ãƒ—ル Select font for the messages text display メッセージテキスト表示ã�«ä½¿ç”¨ã�™ã‚‹ãƒ•ォントをé�¸æŠžã�—ã�¾ã�™ Whether to keep a maximum number of lines in the messages window メッセージビューã�«ï¼‘度ã�«è¡¨ç¤ºã�§ã��る行数ã�®æœ€å¤§å€¤ &Messages limit: メッセージリミット(&M): The maximum number of message lines to keep in view メッセージビューã�«ï¼‘度ã�«è¡¨ç¤ºã�§ã��る行数ã�®æœ€å¤§å€¤ 100 250 2500 Connections Window 接続ウィンドウ Sample connections view font 接続ビューã�«ä½¿ç”¨ã�™ã‚‹ãƒ•ォントã�®ã‚µãƒ³ãƒ—ル Select font for the connections view 接続ビューã�«ä½¿ç”¨ã�™ã‚‹ãƒ•ォントをé�¸æŠžã�—ã�¾ã�™ &Icon size: アイコンサイズ(&I): The icon size for each item of the connections view コãƒ�クションビューã�«è¡¨ç¤ºã�•れるアイコンã�®ã‚µã‚¤ã‚º 16 x 16 32 x 32 64 x 64 Whether to enable client/port name aliases on the connections window 接続ウィンドウã�§ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆ/ãƒ�ートã�®ã‚¨ã‚¤ãƒªã‚¢ã‚¹å��を有効ã�¨ã�™ã‚‹ã�‹ã�©ã�†ã�‹ E&nable client/port aliases クライアント/ãƒ�ートã�®ã‚¨ã‚¤ãƒªã‚¢ã‚¹å��ã�®æœ‰åŠ¹åŒ–(&N) Whether to enable in-place client/port name editing (rename) クライアント/ãƒ�ートå��ã�®ç·¨é›†ï¼ˆãƒªãƒ�ーム) Ena&ble client/port aliases editing (rename) クライアント/ãƒ�ートã�®ã‚¨ã‚¤ãƒªã‚¢ã‚¹å��編集(リãƒ�ーム)を有効化(&B) &JACK client/port aliases: JACKクライアント/ãƒ�ート エイリアス(&J): Advanced 高度 JACK client/port aliases display mode JACKã�®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆ/ãƒ�ートエイリアス表示モード Default デフォルト First 1番目 Second 2番目 JACK client/port pretty-name (metadata) display mode JACKクライアント/ãƒ�ートã�®ã‚�ã�‹ã‚Šã‚„ã�™ã�„å��å‰�(メタデータ)表示モード Enable JA&CK client/port pretty-names (metadata) JACKクライアント/ãƒ�ートã�®ã‚�ã�‹ã‚Šã‚„ã�™ã�„å��å‰�(メタデータ)を有効ã�«ã�—ã�¾ã�™(&C) Misc ã��ã�®ä»– Other ã��ã�®ä»– Whether to start JACK audio server immediately on application startup アプリケーション開始直後ã�«JACKオーディオサーãƒ�ーを開始ã�™ã‚‹ã�‹ã�©ã�†ã�‹ &Start JACK audio server on application startup JACKオーディオサーãƒ�ーã�®è‡ªå‹•èµ·å‹•(&S) Whether to ask for confirmation on application exit アプリケーションã�Œçµ‚了ã�™ã‚‹éš›ã�«ç¢ºèª�ã�™ã‚‹ã�‹ã�©ã�†ã�‹ &Confirm application close アプリケーションã�®çµ‚了ã�®ç¢ºèª�(&C) Whether to keep all child windows on top of the main window å­�ウィンドウを常ã�«å‰�é�¢ã�«è¡¨ç¤ºã�™ã‚‹ã�‹ã�©ã�†ã�‹ &Keep child windows always on top å­�ウィンドウを常ã�«å‰�é�¢è¡¨ç¤º(&K) Whether to enable the system tray icon システムトレイアイコンを有効ã�«ã�™ã‚‹ã�‹ã�©ã�†ã�‹ &Enable system tray icon システムトレイアイコンを有効(&E) Whether to show system tray message on main window close メインウィンドウを閉ã�˜ã‚‹æ™‚システムトレイメッセージを表示ã�™ã‚‹ã�‹ã�©ã�†ã�‹ Sho&w system tray message on close 終了時ã�«ã‚·ã‚¹ãƒ†ãƒ ãƒˆãƒ¬ã‚¤ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã�™ã‚‹(&W) Whether to start minimized to system tray 開始時ã�«ã‚·ã‚¹ãƒ†ãƒ ãƒˆãƒ¬ã‚¤ã‚¢ã‚¤ã‚³ãƒ³ã�®ã�¿è¡¨ç¤ºã�™ã‚‹ã�‹ã�©ã�†ã�‹ Start minimi&zed to system tray 開始時ã�«ã‚·ã‚¹ãƒ†ãƒ ãƒˆãƒ¬ã‚¤ã�«æœ€å°�化ã�™ã‚‹(&Z) Whether to restrict to one single application instance (X11) アプリケーションã�®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’ã�²ã�¨ã�¤ã�«åˆ¶é™�ã�™ã‚‹ã�‹ã�©ã�†ã�‹(X11) Single application &instance シングルアプリケーションインスタンス(&I) Whether to save the JACK server command-line configuration into a local file (auto-start) JACKサーãƒ�ーã�®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³è¨­å®šã‚’ローカルファイルã�«ä¿�å­˜ã�™ã‚‹ã�‹ã�©ã�†ã�‹(自動ã�§ä¿�å­˜ã�•れã�¾ã�™) Whether to ask for confirmation on JACK audio server shutdown and/or restart JACKオーディオサーãƒ�ーã�®ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã�¨å†�起動時ã�«ç¢ºèª�ã�™ã‚‹ã�‹ã�©ã�†ã�‹ Confirm server sh&utdown and/or restart サーãƒ�ーã�®ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã�¨å†�èµ·å‹•ã�®ç¢ºèª�(&U) S&ave JACK audio server configuration to: JACKオーディオサーãƒ�ー設定ã�®ä¿�存先(&A): The server configuration local file name (auto-start) サーãƒ�ー設定ローカルファイルå��(自動起動) .jackdrc Whether to enable ALSA Sequencer (MIDI) support on startup 開始時ã�«ALSAシーケンサー(MIDI)サãƒ�ートを有効ã�«ã�™ã‚‹ã�‹ã�©ã�†ã�‹ E&nable ALSA Sequencer support ALSAシーケンサーサãƒ�ートを有効化(&N) Whether to enable D-Bus interface D-Busインターフェイスを有効ã�«ã�™ã‚‹ã�‹ã�©ã�†ã�‹ &Enable D-Bus interface D-Busインターフェースã�®æœ‰åŠ¹åŒ–(&E) Whether to stop JACK audio server on application exit アプリケーションã�Œçµ‚了ã�™ã‚‹æ™‚ã�«JACKオーディオサーãƒ�ーをå�œæ­¢ã�™ã‚‹ã�‹ã�©ã�†ã�‹ S&top JACK audio server on application exit JACKオーディオサーãƒ�ーã�®è‡ªå‹•終了(&S) Buttons ボタン Whether to hide the left button group on the main window メインウィンドウ上ã�®å·¦å�´ãƒœã‚¿ãƒ³ã‚°ãƒ«ãƒ¼ãƒ—ã‚’éš ã�™ã�‹ã�©ã�†ã�‹ Hide main window &Left buttons メインウィンドウ左å�´ã�®ãƒœã‚¿ãƒ³ã‚’éš ã�™(&L) Whether to hide the right button group on the main window メインウィンドウ上ã�®å�³å�´ãƒœã‚¿ãƒ³ã‚°ãƒ«ãƒ¼ãƒ—ã‚’éš ã�™ã�‹ã�©ã�†ã�‹ Hide main window &Right buttons メインウィンドウå�³å�´ã�®ãƒœã‚¿ãƒ³ã‚’éš ã�™(&R) Whether to hide the transport button group on the main window メインウィンドウã�®ãƒˆãƒ©ãƒ³ã‚¹ãƒ�ートボタングループを隠ã�™ã�‹ã�©ã�†ã�‹ Hide main window &Transport buttons メインウィンドウã�®ãƒˆãƒ©ãƒ³ã‚¹ãƒ�ートボタンを隠ã�™(&T) Whether to hide the text labels on the main window buttons メインウィンドウボタン上ã�®ãƒ†ã‚­ã‚¹ãƒˆãƒ©ãƒ™ãƒ«ã‚’éš ã�™ã�‹ã�©ã�†ã�‹ Hide main window &button text labels メインウィンドウボタンã�®ãƒ†ã‚­ã‚¹ãƒˆãƒ©ãƒ™ãƒ«ã‚’éš ã�™(&B) Defaults デフォルト &Base font size: 基本フォントサイズ(&B): Base application font size (pt.) アプリケーションã�®åŸºæœ¬ãƒ•ォントサイズ(pt) 6 7 8 9 11 12 System Cycle サイクル HPET Don't restrict self connect requests (default) セルフ接続ã�®è¦�求を制é™�ã�—ã�ªã�„(デフォルト) Fail self connect requests to external ports only 外部ãƒ�ートã�«å¯¾ã�—ã�¦ã�®ã�¿ã‚»ãƒ«ãƒ•接続ã�®è¦�求を失敗ã�•ã�›ã‚‹ Ignore self connect requests to external ports only 外部ãƒ�ートã�«å¯¾ã�™ã‚‹ã‚»ãƒ«ãƒ•接続ã�®è¦�求を無視ã�™ã‚‹ Fail all self connect requests セルフ接続ã�®ã�™ã�¹ã�¦ã�®è¦�求を失敗ã�•ã�›ã�¾ã�™ Ignore all self connect requests セルフ接続ã�®ã�™ã�¹ã�¦ã�®è¦�求を無視ã�—ã�¾ã�™ Warning 警告 Some settings have been changed: "%1" Do you want to save the changes? 設定ã�®ä¸€éƒ¨ã�Œå¤‰æ›´ã�•れã�¦ã�„ã�¾ã�™: "%1" 変更をä¿�å­˜ã�—ã�¾ã�™ã�‹? Delete preset: "%1" Are you sure? プリセットを削除ã�—ã�¾ã�™: "%1" よã‚�ã�—ã�„ã�§ã�™ã�‹? msec ミリ秒 n/a &Preset Name プリセットå��(&P) &Server Name サーãƒ�ーå��(&S) &Server Path サーãƒ�ーパス(&S) &Driver ドライãƒ�ー(&D) &Interface インターフェース(&I) Sample &Rate サンプルレート(&R) &Frames/Period フレーム/ピリオド(&F) Periods/&Buffer ピリオド/ãƒ�ッファー(&B) Startup Script スタートアップスクリプト Post-Startup Script ãƒ�ストスタートアップスクリプト Shutdown Script シャットダウンスクリプト Post-Shutdown Script ãƒ�ストシャットダウンスクリプト Active Patchbay Definition 有効ã�ªãƒ‘ッãƒ�ベイ定義 Patchbay Definition files パッãƒ�ベイ定義ファイル Messages Log メッセージログ Log files ログファイル Information 情報 Some settings may be only effective next time you start this application. ã�„ã��ã�¤ã�‹ã�®è¨­å®šã�¯ã�“ã�®ãƒ—ログラムを 次回ã�«èµ·å‹•ã�—ã�Ÿæ™‚ã�«æœ‰åйã�¨ã�ªã‚Šã�¾ã�™ã€‚ Some settings have been changed. Do you want to apply the changes? 設定ã�Œå¤‰æ›´ã�•れã�¾ã�—ã�Ÿã€‚ 変更をé�©ç”¨ã�—ã�¾ã�™ã�‹? qjackctlSocketForm Socket ソケット &Socket ソケット(&S) &Name (alias): å��å‰�(エイリアス)(&N): Socket name (an alias for client name) ソケットå��(クライアントå��ã�®ã‚¨ã‚¤ãƒªã‚¢ã‚¹) Client name (regular expression) クライアントå�� (æ­£è¦�表ç�¾) Add plug to socket plug list プラグをソケットプラグリストã�«è¿½åŠ ã�—ã�¾ã�™ Add P&lug プラグ追加(&L) &Plug: プラグ(&P): Port name (regular expression) ãƒ�ートå�� (æ­£è¦�表ç�¾) Socket plug list ソケットプラグã�®ãƒªã‚¹ãƒˆ Socket Plugs / Ports ソケットプラグ/ãƒ�ート Edit currently selected plug é�¸æŠžã�—ã�¦ã�„るプラグを編集ã�—ã�¾ã�™ &Edit 編集(&E) Remove currently selected plug from socket plug list ソケットプラグリストã�‹ã‚‰é�¸æŠžã�—ã�¦ã�„るプラグを削除ã�—ã�¾ã�™ &Remove 削除(&R) &Client: クライアント(&C): Move down currently selected plug in socket plug list ソケットプラグリストã�§é�¸æŠžã�—ã�¦ã�„るプラグを下ã�«ç§»å‹•ã�—ã�¾ã�™ &Down 下ã�¸(&D) Move up current selected plug in socket plug list ソケットプラグリストã�§é�¸æŠžã�—ã�¦ã�„るプラグを上ã�«ç§»å‹•ã�—ã�¾ã�™ &Up 上ã�¸(&U) Enforce only one exclusive cable connection 排他的ã�ªã‚±ãƒ¼ãƒ–ル接続を強制ã�—ã�¾ã�™ E&xclusive 排他的(&X) &Forward: 転é€�(&F): Forward (clone) all connections from this socket ã�“ã�®ã‚½ã‚±ãƒƒãƒˆã�‹ã‚‰ã�™ã�¹ã�¦ã�®æŽ¥ç¶šã‚’転é€�(クローン)ã�—ã�¾ã�™ Type タイプ Audio socket type (JACK) オーディオソケットタイプ(JACK) &Audio オーディオ(&A) MIDI socket type (JACK) MIDIソケットタイプ(JACK) &MIDI MIDI socket type (ALSA) MIDIソケットタイプ(ALSA) AL&SA ALSA(&S) Plugs / Ports プラグ/ãƒ�ート Error エラー A socket named "%1" already exists. ソケットå�� "%1" ã�¯ã�™ã�§ã�«å­˜åœ¨ã�—ã�¾ã�™ã€‚ Warning 警告 Some settings have been changed. Do you want to apply the changes? 設定ã�Œå¤‰æ›´ã�•れã�¾ã�—ã�Ÿã€‚ 変更をé�©ç”¨ã�—ã�¾ã�™ã�‹? Add Plug プラグã�®è¿½åŠ  Edit 編集 Remove 削除 Move Up 上ã�¸ç§»å‹• Move Down 下ã�¸ç§»å‹• (None) (ã�ªã�—) qjackctlSocketList Output 出力 Input 入力 Socket ソケット <New> - %1 <æ–°è¦�> - %1 Warning 警告 %1 about to be removed: "%2" Are you sure? %1を削除ã�—よã�†ã�¨ã�—ã�¦ã�„ã�¾ã�™: "%2" よã‚�ã�—ã�„ã�§ã�™ã�‹? %1 <Copy> - %2 %1 <コピー> - %2 qjackctlSocketListView Output Sockets / Plugs 出力ソケット / プラグ Input Sockets / Plugs 入力ソケット / プラグ qjackctl-1.0.6/src/translations/PaxHeaders/qjackctl_cs.ts0000644000000000000000000000013215174607203020536 xustar0030 mtime=1777536643.519914262 30 atime=1777536643.517914276 30 ctime=1777536643.519914262 qjackctl-1.0.6/src/translations/qjackctl_cs.ts0000644000175000001440000064272615174607203020547 0ustar00rncbcusers PortAudioProber Probing... Zjišťuje se... Please wait, PortAudio is probing audio hardware. PoÄ�kejte, prosím, PortAudio zjišťuje zvukový hardware. Warning Varování Audio hardware probing timed out. DoÅ¡lo k pÅ™ekroÄ�ení Ä�asu pÅ™i zjišťování zvukového hardware. QObject (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Usage: %1 [options] [command-and-args] Použití: %1 [volby] [příkazy a argumenty] Options: Volby: Start JACK audio server immediately. Spustit zvukový server JACK okamžitÄ›. Set default settings preset name. Nastavit název pÅ™ednastavení výchozího nastavení. Set active patchbay definition file. Nastavit soubor s vymezením Ä�inné zapojovací desky. Set default JACK audio server name. Nastavit výchozí název zvukového serveru JACK. Show help about command line options. Ukázat nápovÄ›du k volbám příkazového řádku. Show version information. Ukázat informace o verzi. Displays help on command-line options. Launch command with arguments. Spustit příkaz s argumenty. [command-and-args] [příkaz a argumenty] Option -p requires an argument (preset). Volba -p vyžaduje argument (preset, pÅ™ednastavení). Option -a requires an argument (path). Volba -a vyžaduje argument (cesta). Option -n requires an argument (name). Volba -n vyžaduje argument (název). %1 (%2 frames) %1 (%2 snímků) Move PÅ™esunout Rename PÅ™ejmenovat qjackctlAboutForm About O programu &Close &Zavřít About Qt O Qt Version Verze Debugging option enabled. Povolena volba pro ladÄ›ní. System tray disabled. Zakázána oznamovací oblast. Transport status control disabled. Zakázáno ovládání stavu pÅ™edání. Realtime status disabled. Zakázán stav provádÄ›ní ve skuteÄ�ném Ä�ase. XRUN delay status disabled. Zakázán stav zpoždÄ›ní XRUN. Maximum delay status disabled. Zakázán stav nejvÄ›tšího zpoždÄ›ní. JACK MIDI support disabled. JACK MIDI není podporován. JACK Session support disabled. Podpora pro sezení JACK byla zakázána. ALSA/MIDI sequencer support disabled. ALSA/MIDI Å™adiÄ� (sequencer) není podporován. Using: Qt %1 Používající: Qt %1 JACK %1 JACK %1 Website Stránky This program is free software; you can redistribute it and/or modify it Tento program je svobodným programem. Můžete jej šířit a/nebo upravit under the terms of the GNU General Public License version 2 or later. za podmínek GNU General Public License ve verzi 2 nebo pozdÄ›jší. JACK Port aliases support disabled. Podpora pro pÅ™ezdívky přípojek JACK zakázána. D-Bus interface support disabled. Podpora pro rozhraní D-Bus zakázána. qjackctlClientListView Readable Clients / Output Ports ÄŒitelné přípojky pro klienty/výstupy Writable Clients / Input Ports Zapisovatelné přípojky pro klienty/výstupy &Connect &Spojit Alt+C Connect Alt+C &Disconnect &Rozpojit Alt+D Disconnect Alt+D Disconnect &All &Rozpojit vÅ¡e Alt+A Disconnect All Alt+A Re&name &PÅ™ejmenovat Alt+N Rename Alt+N &Refresh &Obnovit Alt+R Refresh Alt+R qjackctlConnect Warning Varování This will suspend sound processing from all client applications. Are you sure? Tímto se pozastaví zpracování zvuku u vÅ¡ech klientských aplikací. Jste si jistý? qjackctlConnectionsForm Connections Spojení Audio Zvuk Connect currently selected ports Spojit nyní vybrané přípojky &Connect &Spojit Disconnect currently selected ports Rozpojit nyní vybrané přípojky &Disconnect &Rozpojit Disconnect all currently connected ports Rozpojit vÅ¡echny nyní spojené přípojky Disconnect &All &Rozpojit vÅ¡e Expand all client ports Rozbalit vÅ¡echny klientské přípojky E&xpand All Rozbalit &vÅ¡e Refresh current connections view Obnovit pohled na nynÄ›jší spojení &Refresh &Obnovit MIDI JACK-MIDI ALSA ALSA-MIDI qjackctlConnectorView &Connect &Spojit Alt+C Connect Alt+C &Disconnect &Rozpojit Alt+D Disconnect Alt+D Disconnect &All Rozpojit &vÅ¡e Alt+A Disconnect All Alt+A &Refresh &Obnovit Alt+R Refresh Alt+R qjackctlGraphCanvas Connect Spojit Disconnect Rozpojit qjackctlGraphForm Graph Graf &Graph &Graf &Edit Úp&ravy &View &Pohled &Zoom &ZvÄ›tÅ¡ení Co&lors &Barvy S&ort Ř&adit &Help &NápovÄ›da &Connect &Spojení Connect Spojit Connect selected ports Spojit vybrané přípojky &Disconnect &Rozpojit Disconnect Rozpojit Disconnect selected ports Rozpojit vybrané přípojky Ctrl+C Ctrl+C T&humbview &Náhled Ctrl+D Ctrl+D Cl&ose &Zavřít Close Zavřít Close this application window Zavřít okno tohoto programu Select &All Vybrat &vÅ¡e Select All Vybrat vÅ¡e Ctrl+A Ctrl+A Select &None Nevybrat &nic Select None Nevybrat nic Ctrl+Shift+A Ctrl+Shift+A Select &Invert Obrátit &výbÄ›r Select Invert Obrátit výbÄ›r Ctrl+I Ctrl+I &Rename... &PÅ™ejmenovat... Rename item PÅ™ejmenovat položku Rename Item PÅ™ejmenovat položku F2 F2 &Find... Find Find nodes Ctrl+F &Menubar Pruh s &nabídkou Menubar Pruh s nabídkou Show/hide the main program window menubar Ukázat/Skrýt hlavní okno programu s nabídkovým pruhem Ctrl+M Ctrl+M &Toolbar Pruh s &nástroji Toolbar Pruh s nástroji Show/hide main program window file toolbar Ukázat/Skrýt hlavní okno programu s nástrojovým pruhem &Statusbar &Stavový řádek Statusbar Stavový řádek Show/hide the main program window statusbar Ukázat/Skrýt stavový řádek hlavního okna programu &Top Left &NahoÅ™e vlevo Top left NahoÅ™e vlevo Show the thumbnail overview on the top-left Zobrazit pÅ™ehled náhledů v levém horním rohu Top &Right NahoÅ™e v&pravo Top right NahoÅ™e vpravo Show the thumbnail overview on the top-right Zobrazit pÅ™ehled náhledů v pravém horním rohu Bottom &Left &Dole vlevo Bottom Left Dole vlevo Bottom left Dole vlevo Show the thumbnail overview on the bottom-left Zobrazit pÅ™ehled náhledů v levém dolním rohu &Bottom Right &Dole vpravo Bottom right Dole vpravo Show the thumbnail overview on the bottom-right Zobrazit pÅ™ehled náhledů v pravém dolním rohu &None Žá&dný None Žádný Hide thumbview Skrýt náhled Hide the thumbnail overview Skrýt pÅ™ehled náhledů Text Beside &Icons Text &vedle ikon Text beside icons Text vedle ikon Show/hide text beside icons Ukázat/Skrýt text vedle ikon &Center &VystÅ™edit Center VystÅ™edit Center view VystÅ™edit pohled &Refresh &Obnovit Refresh Obnovit Refresh view Obnovit pohled F5 F5 Zoom &In &PÅ™iblížit Zoom In PÅ™iblížit Ctrl++ Ctrl++ Zoom &Out &Oddálit Zoom Out Oddálit Ctrl+- Ctrl+- Zoom &Fit &PÅ™izpůsobit zvÄ›tÅ¡ení Zoom Fit PÅ™izpůsobit zvÄ›tÅ¡ení Ctrl+0 Ctrl+0 Zoom &Reset &Vrátit zvÄ›tÅ¡ení na výchozí Zoom Reset Vrátit zvÄ›tÅ¡ení na výchozí Ctrl+1 Ctrl+1 &Zoom Range Rozsah &zvÄ›tÅ¡ení Zoom Range Rozsah zvÄ›tÅ¡ení JACK &Audio... JACK &Audio... JACK Audio color Barva JACK Audio JACK &MIDI... JACK &MIDI... JACK MIDI JACK MIDI JACK MIDI color Barva JACK MIDI ALSA M&IDI... ALSA M&IDI... ALSA MIDI ALSA MIDI ALSA MIDI color Barva ALSA MIDI JACK &CV... JACK &CV... JACK CV color Barva JACK CV JACK &OSC... JACK &OSC... JACK OSC JACK OSC JACK OSC color Barva JACK OSC &Reset &Obnovit výchozí Reset colors Obnovit výchozí barvy Port &Name &Název přípojky (port) Port name Název přípojky (port) Sort by port name Řadit podle názvu přípojky (port) Port &Title &Titulek přípojky (port) Port title Titulek přípojky (port) Sort by port title Řadit podle titulku přípojky (port) Port &Index Čí&slo přípojky (port) Port index Číslo přípojky (port) Sort by port index Řadit podle Ä�ísla přípojky (port) &Ascending &VzestupnÄ› Ascending VzestupnÄ› Ascending sort order Vzestupné poÅ™adí Å™azení &Descending &SestupnÄ› Descending SestupnÄ› Descending sort order Sestupné poÅ™adí Å™azení Repel O&verlapping Nodes Zamítnout &pÅ™ekrývající se uzly Repel nodes Zamítnout uzly Repel overlapping nodes Zamítnout pÅ™ekrývající se uzly Connect Thro&ugh Nodes PÅ™ipojit &pÅ™es uzly Connect Through Nodes PÅ™ipojit pÅ™es uzly Connect through nodes PÅ™ipojit pÅ™es uzly Whether to draw connectors through or around nodes Zda kreslit konektory skrz nebo kolem uzlů &About... &O programu... About... O programu... About O programu Show information about this application program Ukázat informace o tomto programu About &Qt... O &Qt... About Qt... O Qt... About Qt O Qt Show information about the Qt toolkit Ukázat informace o sadÄ› nástrojů prostÅ™edí Qt &Undo &ZpÄ›t &Redo &Znovu Undo last edit action Vrátit poslední úpravu zpÄ›t Redo last edit action Provést poslední úpravu znovu Zoom ZvÄ›tÅ¡ení Ready PÅ™ipraven Colors - %1 Barvy - %1 qjackctlMainForm Quit processing and exit UkonÄ�it zpracování signálu a ukonÄ�it program &Quit &UkonÄ�it Start the JACK server Spustit server JACK &Start &Spustit Stop the JACK server Zastavit server JACK S&top &Zastavit St&atus &Stav Show information about this application Ukázat informace o této aplikaci Ab&out... &O... Set&up... &Nastavení... Show settings and options dialog Ukázat dialogové okno pro nastavení a volby &Messages &Hlášení Show/hide the patchbay editor window Ukázat/Skrýt okno editoru se zapojovací deskou &Patchbay &Zapojovací deska &Connect &Spojit JACK server state Stav serveru JACK JACK server mode Režim serveru JACK DSP Load Zatížení DSP Sample rate Vzorkovací kmitoÄ�et XRUN Count (notifications) PoÄ�et XRUN (oznámení) Time display Údaj o Ä�ase Transport state Stav pÅ™edání Transport BPM PÅ™edání BPM Transport time ÄŒas pÅ™edání Show/hide the session management window Ukázat/Skrýt okno se správou sezení Show/hide the messages log/status window Ukázat/Skrýt okno se zápisy/stavem hlášení Show/hide the graph window Ukázat/Skrýt okno s grafem Show/hide the connections window Ukázat/Skrýt okno s obsahem Backward transport PÅ™edání zpÄ›t &Backward &ZpÄ›t Forward transport PÅ™edání dopÅ™edu &Forward &DopÅ™edu Rewind transport PÅ™edání pÅ™etoÄ�it zpÄ›t &Rewind &PÅ™etoÄ�it zpÄ›t Stop transport rolling Zastavit chod pÅ™edání Pa&use &Pozastavit Start transport rolling Spustit chod pÅ™edání &Play &PÅ™ehrát Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. NepodaÅ™ilo se otevřít Å™adiÄ� (sekvencer) ALSA jako klienta. Zapojovací deska ALSA MIDI nebude dostupná. D-BUS: Service is available (%1 aka jackdbus). D-BUS: Služba je dostupná (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: Služba není dostupná (%1 aka jackdbus). Information Informace Warning Varování JACK is currently running. Do you want to terminate the JACK audio server? Server JACK nyní běží. Chcete ukonÄ�it zvukový server JACK? successfully úspěšnÄ› with exit status=%1 s vrácenou hodnotou = %1 Could not start JACK. Maybe JACK audio server is already started. JACK se nepodaÅ™ilo spustit. Možná je server JACK už spuÅ¡tÄ›n. Could not load preset "%1". Retrying with default. Nastavení "%1" se nepodaÅ™ilo nahrát. Zkouší se znovu s výchozím pÅ™ednastavením. Could not load default preset. Sorry. NepodaÅ™ilo se nahrát výchozí pÅ™ednastavení. Promiňte. Startup script... Skript pro spuÅ¡tÄ›ní... Startup script terminated Skript pro spuÅ¡tÄ›ní ukonÄ�en D-BUS: JACK server is starting... D-BUS: SpouÅ¡tí se server JACK... D-BUS: JACK server could not be started. Sorry D-BUS: Server JACK se nepodaÅ™ilo spustit. Promiňte JACK is starting... JACK se spouÅ¡tí... Some client audio applications are still active and connected. Do you want to stop the JACK audio server? NÄ›které z klientských zvukových aplikací jsou stále Ä�inné a spojené. Chcete zastavit zvukový server JACK? JACK is stopping... JACK se zastavuje... Shutdown script... Skript pro zastavení chodu... Don't ask this again Neptat se znovu Shutdown script terminated Skript pro zastavení chodu ukonÄ�en D-BUS: JACK server is stopping... D-BUS: Zastavuje se server JACK... D-BUS: JACK server could not be stopped. Sorry D-BUS: Server JACK se nepodaÅ™ilo zastavit. Promiňte Post-shutdown script... Skript pro po-zastavení chodu... Post-shutdown script terminated Skript pro po-zastavení chodu ukonÄ�en JACK was started with PID=%1. JACK byl puÅ¡tÄ›n s PID = %1. %1 is about to terminate. Are you sure? %1 má být skonÄ�en. Jste si jistý? D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: Server JACK byl spuÅ¡tÄ›n (%1 aka jackdbus). JACK is being forced... JACK je nucen... JACK was stopped JACK byl zastaven D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: Server JACK byl zastaven (%1 aka jackdbus). Error Chyba Transport time code PÅ™edání Ä�asového kódu Elapsed time since last reset ÄŒas uplynulý od posledního obnovení výchozího nastavení Elapsed time since last XRUN ÄŒas uplynulý od posledního XRUN Patchbay activated. Zapojovací deska uvedena do chodu. Patchbay deactivated. Zapojovací deska vyÅ™azena z provozu. Statistics reset. Obnovení vychozího nastavení statistiky. msec ms JACK connection graph change. Nákres spojení JACK zmÄ›nÄ›n. XRUN callback (%1). Zavolání nazpátek XRUN (%1). Buffer size change (%1). Velikost vyrovnávací pamÄ›ti zmÄ›nÄ›na (%1). Shutdown notification. Oznámení o zastavení. Could not start JACK. Sorry. NepodaÅ™ilo se spustit JACK. Promiňte. JACK has crashed. JACK spadl. JACK timed out. PÅ™ekroÄ�ení Ä�asu u JACK. JACK write error. Chyba pÅ™i psaní u JACK. JACK read error. Chyba pÅ™i Ä�tení u JACK. Unknown JACK error (%d). Neznámá chyba u JACK (%d). ALSA connection graph change. Nákres spojení ALSA zmÄ›nÄ›n. JACK active patchbay scan Prohlédnutí Ä�inné zapojovací desky JACK ALSA active patchbay scan Prohlédnutí Ä�inné zapojovací desky ALSA JACK connection change. Spojení JACK zmÄ›nÄ›no. ALSA connection change. Spojení ALSA zmÄ›nÄ›no. checked pÅ™ezkouÅ¡eno connected spojeno disconnected rozpojeno failed nepodaÅ™ilo se A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Vymezení zapojovací desky je nyní aktivní, což pravdÄ›podobnÄ› znamená pÅ™edÄ›lat toto spojení: %1 -> %2 Chcete odstranit spojení zapojovací desky? The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Program poběží dále v oznamovací Ä�ásti panelu. Pro ukonÄ�ení programu vyberte, prosím, "UkonÄ�it" v související nabídce vyskakující z ikony v oznamovací Ä�ásti panelu. Don't show this message again Toto hlášení neukazovat znovu The preset aliases have been changed: "%1" Do you want to save the changes? PÅ™ezdívky pro pÅ™ednastavení byly zmÄ›nÄ›ny: "%1" Chcete uložit zmÄ›ny? Transport BBT (bar.beat.ticks) PÅ™edání BBT (takt:doba.tiknutí - bar:beat.ticks) Patchbay reset. Uvedení zapojovací desky do výchozího stavu. Could not load active patchbay definition. "%1" Disabled. NepodaÅ™ilo se nahrát vymezení Ä�inné zapojovací desky. "%1" Zakázáno. Freewheel started... VolnobÄ›h spuÅ¡tÄ›n... Freewheel exited. VolnobÄ›h ukonÄ�en. JACK property change. Vlastnost JACK zmÄ›nÄ›na. Overall operation failed. Celková operace se nezdaÅ™ila. Invalid or unsupported option. Neplatná nebo nepodporovaná volba. Client name not unique. Název klienta není jedineÄ�ný. Server is started. Server je spuÅ¡tÄ›n. Unable to connect to server. Nelze se pÅ™ipojit k serveru. Server communication error. Chyba spojení se serverem. Client does not exist. Klient neexistuje. Unable to load internal client. NepodaÅ™ilo se nahrát vnitÅ™ního klienta. Unable to initialize client. NepodaÅ™ilo se inicializovat vnitÅ™ního klienta. Unable to access shared memory. NepodaÅ™ilo se pÅ™istoupit ke sdílené pamÄ›ti. Client protocol version mismatch. Nevhodná verze klientského protokolu. Could not connect to JACK server as client. - %1 Please check the messages window for more info. NepodaÅ™ilo se pÅ™ipojit k serveru JACK jako klient. - %1 Další informace hledejte, prosím, v oknÄ› s hlášením. Server configuration saved to "%1". Nastavení serveru uloženo do "%1". Client activated. Klient uveden do chodu. Post-startup script... Skript pro po-spuÅ¡tÄ›ní... Post-startup script terminated Skript pro po-spuÅ¡tÄ›ní ukonÄ�en Command line argument... Argument pro příkazový řádek... Command line argument started Argument pro příkazový řádek spuÅ¡tÄ›n Client deactivated. Klient vyÅ™azen z provozu. Transport rewind. PÅ™edání pÅ™etoÄ�it zpÄ›t. Transport backward. PÅ™edání zpÄ›t. Starting SpouÅ¡tí se Transport start. Spustit pÅ™edání. Stopping Zastavuje se Transport stop. Zastavit pÅ™edání. Transport forward. PÅ™edání dopÅ™edu. Stopped Zastaveno %1 (%2%) %1 (%2 %) %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 snímků Yes Ano No Ne FW FW RT RT Rolling Jede Looping Zapíná se do jednoduchého obvodu %1 msec %1 ms XRUN callback (%1 skipped). Zavolání nazpátek XRUN (%1 pÅ™eskoÄ�eno). Started Běží Active ÄŒinný Activating Uvádí se do chodu Inactive NeÄ�inný &Hide &Skrýt D-BUS: GetParameterConstraint('%1'): %2. (%3) D-BUS: Získat omezení parametru GetParameterConstraint('%1'): %2. (%3) Mi&nimize &ZmenÅ¡it S&how &Ukázat Rest&ore &Nahrát znovu &Stop &Zastavit &Reset &Obnovit výchozí &Presets &PÅ™ednastavení &Versioning &Verzování Re&fresh Ob&novit S&ession &Sezení &Load... &Nahrát... &Save... &Uložit... Save and &Quit... Uložit a &ukonÄ�it... Save &Template... Uložit jako &pÅ™edlohu... &Connections &Spojení Patch&bay &Zapojovací deska &Graph &Graf &Transport &PÅ™edání Server settings will be only effective after restarting the JACK audio server. Nastavení serveru se projeví až po novém spuÅ¡tÄ›ní serveru JACK. Do you want to restart the JACK audio server? Chcete zvukový server JACK spustit znovu? D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: Nastavit hodnotu parametru SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: Nastavit znovu hodnotu parametru ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS: Získat hodnotu parametru GetParameterValue('%1'): %2. (%3) Some settings will be only effective the next time you start this program. NÄ›která nastavení se projeví až tehdy, když příštÄ› spustíte tento program. qjackctlMessagesStatusForm Messages / Status Hlášení/Stav &Messages &Hlášení Messages log Zápis hlášení Messages output log Zápis hlášení o výstupu &Status &Stav Status information Informace o stavu Statistics since last server startup Statistika od posledního spuÅ¡tÄ›ní serveru Description Popis Value Hodnota Reset XRUN statistic values Obnovit výchozí hodnoty údajů ve statistice XRUN Re&set &Obnovit výchozí Refresh XRUN statistic values Obnovit údaje ve statistice XRUN &Refresh &Obnovit Server name Název serveru Server state Stav serveru DSP Load Zatížení DSP Sample Rate Vzorkovací kmitoÄ�et Buffer Size Velikost vyrovnávací pamÄ›ti Realtime Mode Režim skuteÄ�ného Ä�asu Transport state Stav pÅ™edání Transport Timecode PÅ™edání Ä�asového kódu Transport BBT PÅ™edání BBT Transport BPM PÅ™edání BPM XRUN count since last server startup PoÄ�et XRUN od posledního spuÅ¡tÄ›ní serveru XRUN last time detected ÄŒas posledního zjiÅ¡tÄ›ní XRUN XRUN last Poslední XRUN XRUN maximum NejvÄ›tší poÄ�et XRUN XRUN minimum Nejmenší poÄ�et XRUN XRUN average PrůmÄ›rný poÄ�et XRUN XRUN total Celkový poÄ�et XRUN Maximum scheduling delay NejvÄ›tší zpoždÄ›ní Ä�asu Time of last reset ÄŒas od posledního obnovení výchozího nastavení Logging stopped --- %1 --- Zápis zastaven --- %1 --- Logging started --- %1 --- Zápis spuÅ¡tÄ›n --- %1 --- qjackctlPaletteForm Color Themes Barevné motivy Name Název Current color palette name Název nynÄ›jší palety barev Save current color palette name Uložit název nynÄ›jší palety barev Save Uložit Delete current color palette name Smazat název nynÄ›jší palety barev Delete Smazat Palette Paleta Current color palette NynÄ›jší paleta barev Generate: VytvoÅ™it: Base color to generate palette Základní barva pro vytvoÅ™ení palety Reset all current palette colors Nastavit vÅ¡echny barvy palety barev na výchozí Reset Obnovit výchozí Import a custom color theme (palette) from file Zavést vlastní barevný motiv (paleta) ze souboru Import... Zavést... Export a custom color theme (palette) to file Vyvést vlastní barevný motiv (paleta) do souboru Export... Vyvést... Show Details Ukázat podrobnosti Import File - %1 Zavést soubor - %1 Palette files (*.%1) Soubory s paletami (*.%1) Save Palette - %1 Uložit paletu - %1 All files (*.*) VÅ¡echny soubory (*.*) Warning - %1 Varování - %1 Could not import from file: %1 Sorry. NepodaÅ™ilo se zavést ze souboru. %1 Promiňte. Export File - %1 Vyvést soubor - %1 Some settings have been changed. Do you want to discard the changes? NÄ›která nastavení byla zmÄ›nÄ›na. Chcete zahodit zmÄ›ny? Some settings have been changed: "%1". Do you want to save the changes? NÄ›která nastavení byla zmÄ›nÄ›na: "%1" Chcete uložit zmÄ›ny? qjackctlPaletteForm::PaletteModel Color Role Barevná role Active ÄŒinné Inactive NeÄ�inné Disabled Zakázáno qjackctlPatchbay Warning Varování This will disconnect all sockets. Are you sure? Tento krok odpojí vÅ¡echny zásuvky. Jste si jistýr? qjackctlPatchbayForm Patchbay Zapojovací deska Move currently selected output socket down one position Posunout nyní vybrané výstupní zásuvky dolů o jedno místo Down Dolů Create a new output socket VytvoÅ™it novou výstupní zásuvku Add... PÅ™idat... Edit currently selected input socket properties Upravit vlastnosti nyní vybrané vstupní zásuvky Edit... Upravit... Move currently selected output socket up one position Posunout nyní vybrané výstupní zásuvky nahoru o jedno místo Up Nahoru Remove currently selected output socket Odstranit nyní vybranou výstupní zásuvku Remove Odstranit Duplicate (copy) currently selected output socket Zdvojit (kopírovat) nyní vybranou výstupní zásuvku Copy... Kopírovat... Remove currently selected input socket Odstranit nyní vybranou vstupní zásuvku Duplicate (copy) currently selected input socket Zdvojit (kopírovat) nyní vybranou vstupní zásuvku Create a new input socket VytvoÅ™it novou vstupní zásuvku Edit currently selected output socket properties Upravit vlastnosti nyní vybrané výstupní zásuvky Connect currently selected sockets Spojit nyní vybrané zásuvky &Connect &Spojit Disconnect currently selected sockets Odpojit nyní vybrané zásuvky &Disconnect &Odpojit Disconnect all currently connected sockets Odpojit vÅ¡echny nyní spojené zásuvky Disconnect &All &Odpojit vÅ¡e Expand all items Rozbalit vÅ¡echny položky E&xpand All Rozbalit &vÅ¡e Refresh current patchbay view Obnovit nynÄ›jší pohled na zapojovací desku &Refresh &Obnovit Create a new patchbay profile VytvoÅ™it nový profil zapojovací desky &New &Nový Load patchbay profile Nahrát profil zapojovací desky &Load... &Nahrát... Save current patchbay profile Uložit nynÄ›jší profil zapojovací desky &Save... &Uložit... Current (recent) patchbay profile(s) NynÄ›jší (naposledy použité) profil(y) zapojovací desky Toggle activation of current patchbay profile PÅ™epnout spuÅ¡tÄ›ní nynÄ›jšího profilu zapojovací desky Acti&vate &Spustit Warning Varování The patchbay definition has been changed: "%1" Do you want to save the changes? Vymezení zapojovací desky bylo zmÄ›nÄ›no: "%1" Chcete uložit zmÄ›ny? %1 [modified] %1 [zmÄ›nÄ›n] Untitled%1 Bez názvu%1 Error Chyba Could not load patchbay definition file: "%1" NepodaÅ™ilo se nahrát soubor s vymezením zapojovací desky: "%1" Could not save patchbay definition file: "%1" NepodaÅ™ilo se uložit soubor s vymezením zapojovací desky: "%1" New Patchbay definition Nové vymezení zapojovací desky Create patchbay definition as a snapshot of all actual client connections? VytvoÅ™it vymezení zapojovací desky jako snímek vÅ¡ech skuteÄ�ných klientských spojení? Load Patchbay Definition Nahrát vymezení zapojovací desky Patchbay Definition files Soubory s vymezením zapojovací desky Save Patchbay Definition Uložit vymezení zapojovací desky active Ä�inný qjackctlPatchbayView Add... PÅ™idat... Edit... Upravit... Copy... Kopírovat... Remove Odstranit Exclusive Výhradní Forward DopÅ™edu (None) (Žádný) Move Up PÅ™esunout nahoru Move Down PÅ™esunout dolů &Connect &Spojit Alt+C Connect Alt+C &Disconnect &Rozpojit Alt+D Disconnect Alt+D Disconnect &All &Rozpojit vÅ¡e Alt+A Disconnect All Alt+A &Refresh &Obnovit Alt+R Refresh Alt+R qjackctlSessionForm Session Sezení Load session Nahrát sezení &Load... &Nahrát... Recent session Naposledy otevÅ™ené sezení &Recent &Naposledy otevÅ™ené Save session Uložit sezení &Versioning &Verzování Re&fresh Ob&novit Session clients / connections Klienti sezení/spojení Infra-clients / commands Infra-klienti/Příkazy Infra-client Infra-klient Infra-command Infra-příkaz Add infra-client PÅ™idat infra-klient &Add PÅ™id&at Edit infra-client Upravit infra-klient &Edit &Upravit Remove infra-client Odstranit infra-klient Re&move &Odstranit &Save... &Uložit... Update session Obnovit sezení Client / Ports Klient/Přípojky UUID UUID Command Příkaz &Save &Uložit Load Session Nahrát sezení Session directory Adresář se sezením Save Session Uložit sezení and Quit a ukonÄ�it Template PÅ™edloha &Clear &Smazat Warning Varování A session could not be found in this folder: "%1" Sezení se v této složce nepodaÅ™ilo nalézt: "%1" %1: loading session... %1: nahrává se sezení... %1: load session %2. %1: nahrát sezení %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? V této složce již existuje sezení: "%1" Jste si jistý, že chcete pÅ™epsat stávající sezení? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Tato složka již existuje a není prázdná: "%1" Jste si jistý, že chcete pÅ™epsat stávající složku? %1: saving session... %1: ukládá se sezení... %1: save session %2. %1: uložit sezení %2. New Client Nový klient Save and &Quit... Uložit a &ukonÄ�it... Save &Template... Uložit jako &pÅ™edlohu... qjackctlSessionInfraClientItemEditor Infra-command Infra-příkaz qjackctlSessionSaveForm Session Sezení &Name: &Název: Session name &Directory: Session directory Adresář se sezením Browse for session directory ... ... Save session versioning Uložit verzování sezení &Versioning &Verzování Warning Varování Session directory does not exist: "%1" Do you want to create it? Session Directory qjackctlSetupForm Settings Nastavení Preset &Name: &Název pÅ™ednastavení: Settings preset name Název pro pÅ™ednastavení nastavení (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Save settings as current preset name Uložit nastavení s nynÄ›jším názvem pÅ™ednastavení &Save &Uložit Delete current settings preset Smazat pÅ™ednastavení nynÄ›jšího nastavení &Delete &Smazat jackd DO NOT TRANSLATE jackdmp DO NOT TRANSLATE jackstart DO NOT TRANSLATE Driv&er: &OvladaÄ�: The audio backend driver interface to use Rozhraní ovladaÄ�e k zadní Ä�ásti zvuku, které se bude používat dummy DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 sun DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 oss DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 alsa DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 portaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 coreaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 firewire DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Parameters Parametry MIDI Driv&er: Ovla&daÄ� MIDI: The ALSA MIDI backend driver to use OvladaÄ� k zadní Ä�ásti ALSA MIDI, který se bude používat none žádný raw DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 seq DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Time in seconds that client is delayed after server startup ÄŒas v sekundách, o který je klient opoždÄ›n po spuÅ¡tÄ›ní serveru Latency: Prodleva: Output latency in milliseconds, calculated based on the period, rate and buffer settings Výstupní prodleva v milisekundách, jejíž výpoÄ�et je založen na nastavení údobí (period), rychlosti (snímání) a vyrovnávací pamÄ›ti Use realtime scheduling Použít zpracování ve skuteÄ�ném Ä�ase &Realtime &SkuteÄ�ný Ä�as Do not attempt to lock memory, even if in realtime mode NepokouÅ¡ejte se uzamknout paměť, dokonce ani v režimu skuteÄ�ného Ä�asu No Memory Loc&k &Neuzamknout paměť Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Odemknout paměť běžných knihoven s nástroji (GTK+, QT, FLTK, Wine) &Unlock Memory &Odemknout paměť Ignore xruns reported by the backend driver PÅ™ehlížet xruns hlášené ovladaÄ�em zadní Ä�ásti So&ft Mode &Snadný režim Provide output monitor ports Poskytnout přípojky pro sledování výstupu &Monitor &Sledování Force 16bit mode instead of failing over 32bit (default) Vynutit 16bitový režim namísto selhání ve 32bitovém (výchozí) Force &16bit Vynutit &16bitový režim Enable hardware metering on cards that support it Povolit přístrojové měření u karet, které to podporují H/&W Meter H/&W měřidlo Ignore hardware period/buffer size PÅ™ehlížet údobí (periodu)/velikost vyrovnávací pamÄ›ti přístroje &Ignore H/W &PÅ™ehlížet H/W Whether to give verbose output on messages Dát hlášením podrobný výstup &Verbose messages &Podrobná hlášení &Output Device: &Výstupní zařízení: &Interface: &Rozhraní: Maximum input audio hardware channels to allocate NejvÄ›tší množství pÅ™idÄ›litelných vstupních zvukových přístrojových kanálů &Audio: &Zvuk: Dit&her: &Vložení Å¡umu do signálu (dithering): External output latency (frames) VnÄ›jší výstupní prodleva (snímky) &Input Device: Vstup&ní zařízení: Provide either audio capture, playback or both Poskytnout buÄ� zachytávání zvuku, pÅ™ehrávání nebo obojí Duplex Zdvojený Capture Only Pouze zachytávání Playback Only Pouze pÅ™ehrávání The PCM device name to use Název používaného zařízení PCM hw:0 hw:0 plughw:0 plughw:0 /dev/audio /dev/audio /dev/dsp /dev/dsp > > Alternate input device for capture Střídat vstupní zařízení pro zachytávání Maximum output audio hardware channels to allocate NejvÄ›tší množství pÅ™idÄ›litelných výstupních zvukových přístrojových kanálů Alternate output device for playback Střídat výstupní zařízení pro pÅ™ehrávání External input latency (frames) VnÄ›jší vstupní prodleva (snímky) Set dither mode Nastavit režim vložení Å¡umu do signálu (dithering) None Žádný Rectangular Obdélníkový Shaped Obalová kÅ™ivka Triangular Trojúhelníkový Number of periods in the hardware buffer PoÄ�et údobí (period) ve vyrovnávací pamÄ›ti přístroje Priorit&y: &PÅ™ednost: &Frames/Period: &Snímky/Údobí (perioda): Frames per period between process() calls Snímků za údobí (periodu) mezi voláním process() Aufrufen 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Port Ma&ximum: &NejvÄ›tší poÄ�et přípojek: &Channels: &Kanály: 21333 21333 Sample rate in frames per second Vzorkovací kmitoÄ�et (rychlost snímkování) ve snímcích za sekundu 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Scheduler priority when running realtime PÅ™ednost rozvrhu pÅ™i bÄ›hu ve skuteÄ�ném Ä�ase &Word Length: &Délka slova: Periods/&Buffer: Ú&dobí/Vyrovnávací paměť: Word length Délka slova Maximum number of ports the JACK server can manage NejvÄ›tší poÄ�et přípojek, které server JACK může spravovat &Wait (usec): &ÄŒekat (µs): Sample &Rate: Vzorkovací &kmitoÄ�et: Maximum number of audio channels to allocate NejvÄ›tší množství pÅ™idÄ›litelných zvukových kanálů &Timeout (msec): &PÅ™ekroÄ�ení Ä�asu (ms): Set client timeout limit in milliseconds Nastavit mez pro pÅ™ekroÄ�ení Ä�asu u klienta; údaj v milisekundách 200 200 500 500 1000 1000 2000 2000 5000 5000 &Channels I/O: &Kanály vstup/výstup: &Latency I/O: &Prodleva vstup/výstup: Server Suffi&x: Příp&ona serveru: Start De&lay: &ZpoždÄ›ní spuÅ¡tÄ›ní: secs s 0 msecs 0 ms Advanced PokroÄ�ilé Options Volby Scripting Skriptování Whether to execute a custom shell script before starting up the JACK audio server. Provést vlastní shellový skript pÅ™ed spuÅ¡tÄ›ním zvukového serveru JACK. Execute script on Start&up: Provést skript pÅ™i &spuÅ¡tÄ›ní: Whether to execute a custom shell script after starting up the JACK audio server. Provést vlastní shellový skript po spuÅ¡tÄ›ní zvukového serveru JACK. Execute script after &Startup: Provést skript &po spuÅ¡tÄ›ní: Whether to execute a custom shell script before shuting down the JACK audio server. Provést vlastní shellový skript pÅ™ed zastavením zvukového serveru JACK. Execute script on Shut&down: Provést skript pÅ™i zasta&vení: Command line to be executed before starting up the JACK audio server Příkazový řádek k provedení pÅ™ed spuÅ¡tÄ›ním zvukového serveru JACK Scripting argument meta-symbols Meta symboly pro argument pÅ™i skriptování Browse for script to be executed before starting up the JACK audio server Vybrat skript, který se provede pÅ™ed spuÅ¡tÄ›ním zvukového serveru JACK ... ... Command line to be executed after starting up the JACK audio server Příkazový řádek k provedení po spuÅ¡tÄ›ní zvukového serveru JACK Browse for script to be executed after starting up the JACK audio server Vybrat skript, který se provede po spuÅ¡tÄ›ní zvukového serveru JACK Browse for script to be executed before shutting down the JACK audio server Vybrat skript, který se provede pÅ™ed zastavením zvukového serveru JACK Command line to be executed before shutting down the JACK audio server Příkazový řádek k provedení pÅ™ed zastavením zvukového serveru JACK Whether to execute a custom shell script after shuting down the JACK audio server. Provést vlastní shellový skript po zastavení zvukového serveru JACK. Execute script after Shu&tdown: Provést skript po zas&tavení: Browse for script to be executed after shutting down the JACK audio server Vybrat skript, který se provede po zastavení zvukového serveru JACK Command line to be executed after shutting down the JACK audio server Příkazový řádek k provedení po zastavení zvukového serveru JACK Statistics Statistika Whether to capture standard output (stdout/stderr) into messages window Vést obvyklý výstup (stdout/stderr) do okna s hlášeními &Capture standard output &Vést obvyklý výstup &XRUN detection regex: Pravidelný výraz pro zjiÅ¡tÄ›ní &XRUN: Regular expression used to detect XRUNs on server output messages Pravidelný výraz užitý pro poznání XRUN v hlášeních posílaných serverem xrun of at least ([0-9|\.]+) msecs xrun alespoň ([0-9|\.]+) ms Connections Spojení Whether to enable JACK D-Bus interface Zda povolit rozhraní D-Bus JACJ &Enable JACK D-Bus interface &Povolit rozhraní D-Bus JACK Whether to replace Connections with Graph button on the main window Nahradit v hlavním oknÄ› Spojení tlaÄ�ítkem pro graf Replace Connections with &Graph button Nahradit Spojení tlaÄ�ítkem pro &graf 10 10 Patchbay definition file to be activated as connection persistence profile Spustit soubor s vymezením zapojovací desky jako stálý profil spojení Browse for a patchbay definition file to be activated Vybrat soubor s vymezením zapojovací desky pro spuÅ¡tÄ›ní Whether to activate a patchbay definition for connection persistence profile. Spustit stálý profil s vymezením zapojovací desky spojení. Activate &Patchbay persistence: Spustit stálý profil se &zapojovací deskou: Logging ProvádÄ›ní zápisu Messages log file Soubor se zápisem hlášení Browse for the messages log file location Vybrat místo pro umístÄ›ní souboru se zápisem hlášení Whether to activate a messages logging to file. Zapnout provádÄ›ní zápisu hlášení do souboru. Setup Nastavení Whether to restrict client self-connections Zda omezit vlastní spojení klienta Whether to use server synchronous mode Zda použít synchronizaÄ�ní režim serveru Clear settings of current preset name Vyprázdnit nastavení nynÄ›jšího názvu pÅ™ednastavení Clea&r &Vymazat &Use server synchronous mode &Použít synchronizaÄ�ní režim serveru Please do not touch these settings unless you know what you are doing. Nedotýkejte se, prosím, tÄ›chto nastavení, pokud nevíte, co dÄ›láte. Server &Prefix: PÅ™e&dpona serveru: Cloc&k source: Zdroj &hodin: Clock source Zdroj hodin S&elf connect mode: Režim &vlastního spojení: Extra driver options (command line suffix) Další volby pro ovladaÄ� (přípona příkazového řádku) Whether to reset all connections when a patchbay definition is activated. Nastavit vÅ¡echna spojení na výchozí hodnoty, když je zapnuto vymezení zapojovací desky. &Reset all connections on patchbay activation &Nastavit vÅ¡echna spojení pÅ™i zapnutí zapojovací desky na výchozí hodnoty Whether to issue a warning on active patchbay port disconnections. Vydat varování pÅ™i odpojení přípojek Ä�inné zapojovací desky. &Warn on active patchbay disconnections &Varovat pÅ™i odpojení Ä�inné zapojovací desky &Messages log file: &Soubor se zápisem hlášení: Display Zobrazit Time Display Údaj o Ä�ase Transport &Time Code PÅ™edání &Ä�asového kódu Transport &BBT (bar:beat.ticks) PÅ™edání &BBT (takt:doba.tiknutí - bar:beat.ticks) Elapsed time since last &Reset ÄŒas uplynulý od posledního &obnovení výchozího nastavení Elapsed time since last &XRUN ÄŒas uplynulý od posledního &XRUN Sample front panel normal display font PÅ™edvést písmo pro obvyklé zobrazení na pÅ™ední stranÄ› panelu Sample big time display font PÅ™edvést písmo pro velké zobrazení údaje o Ä�ase Big Time display: Velké zobrazení údaje o Ä�ase: Select font for front panel normal display Vybrat písmo pro zobrazení písma na pÅ™ední stranÄ› panelu &Font... &Písmo... Select font for big time display Vybrat písmo pro velké zobrazení údaje o Ä�ase Normal display: Obvyklé zobrazení: Whether to enable blinking (flashing) of the server mode (RT) indicator Povolit mrkání indikátoru serverového režimu (realtime -RT) Blin&k server mode indicator Zobrazovat mr&kání indikátoru režimu serveru Custom Vlastní &Color palette theme: &Motiv palety barev: Custom color palette theme Vlastní motiv palety barev Wonton Soup DO NOT TRANSLATE KXStudio DO NOT TRANSLATE Manage custom color palette themes Spravovat vlastní motivy palety barev &Widget style theme: Motiv stylu &prvku: Custom widget style theme Vlastní motiv stylu prvku Messages Window Okno s hlášením Sample messages text font display PÅ™edvést zobrazení textu v oknÄ› s hlášením Select font for the messages text display Vybrat písmo pro zobrazení textu hlášení Whether to keep a maximum number of lines in the messages window UrÄ�it nejvÄ›tší poÄ�et řádků zobrazovaných v oknÄ› s hlášením &Messages limit: &NejvÄ›tší poÄ�et hlášení: The maximum number of message lines to keep in view NejvÄ›tší poÄ�et řádků zobrazovaných v oknÄ› s hlášením 100 100 250 250 2500 2500 Connections Window PÅ™ehled spojení Sample connections view font PÅ™edvést zobrazení písma v pÅ™ehledu spojení Select font for the connections view Vybrat písmo pro pÅ™ehled spojení &Icon size: &Velikost ikon: The icon size for each item of the connections view Velikost jednotlivých symbolů v pÅ™ehledu spojení 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 Whether to enable in-place client/port name editing (rename) Povolit úpravu vedlejšího názvu (pÅ™ezdívka) klienta/přípojky (pÅ™ejmenování) Ena&ble client/port aliases editing (rename) Po&volit úpravu vedlejšího názvu (pÅ™ezdívka) klienta/přípojky (pÅ™ejmenování) Whether to enable client/port name aliases on the connections window Povolit vedlejší názvy (pÅ™ezdívky) klienta/přípojky v pÅ™ehledu spojení E&nable client/port aliases &Povolit vedlejší názvy (pÅ™ezdívky) klienta/přípojky Server path (command line prefix) Cesta k serveru (pÅ™edpona příkazového řádku) Misc Různé Other Další Whether to start JACK audio server immediately on application startup Spustit zvukový server JACK okamžitÄ› pÅ™i spuÅ¡tÄ›ní aplikace &Start JACK audio server on application startup &Spustit zvukový server JACK okamžitÄ› pÅ™i spuÅ¡tÄ›ní aplikace Whether to ask for confirmation on application exit Žádat o potvrzení pÅ™i ukonÄ�ení aplikace JACK client/port pretty-name (metadata) display mode Režim zobrazení pÄ›kných názvů (popisná data) pro klienty/přípojky JACK Enable JA&CK client/port pretty-names (metadata) Povolit pÄ›kné názvy (popisná data) pro klienty/přípojky JA&CK &Confirm application close &Potvrdit ukonÄ�ení aplikace Whether to ask for confirmation on JACK audio server shutdown and/or restart Zeptat se na potvrzení pÅ™i vypnutí zvukového serveru JACK a/nebo jeho restartování Confirm server sh&utdown and/or restart Potvrdit &vypnutí serveru a/nebo jeho restartování Whether to keep all child windows on top of the main window VÅ¡echna další okna udržovat nad hlavním oknem &Keep child windows always on top &VÅ¡echna další okna udržovat vždy nahoÅ™e Whether to enable the system tray icon Ukázat ikonu v systémové Ä�ásti panelu &Enable system tray icon Po&volit ikonu v systémové Ä�ásti panelu Whether to start minimized to system tray Spustit program zmenÅ¡ený do systémové Ä�ásti panelu Start minimi&zed to system tray Spustit program &zmenÅ¡ený do systémové Ä�ásti panelu Whether to save the JACK server command-line configuration into a local file (auto-start) Nastavení příkazového řádku ke spuÅ¡tÄ›ní serveru JACK-uložit do místního souboru (auto-start) S&ave JACK audio server configuration to: Nastavení ke spuÅ¡tÄ›ní serveru JACK &uložit jako: The server configuration local file name (auto-start) Název místního souboru s nastavením serveru (auto-start) .jackdrc .jackdrc Whether to enable ALSA Sequencer (MIDI) support on startup Povolit podporu (MIDI) pro Å™adiÄ� (sekvencer) ALSA pÅ™i spuÅ¡tÄ›ní E&nable ALSA Sequencer support P&ovolit podporu (MIDI) pro Å™adiÄ� (sekvencer) ALSA Buttons TlaÄ�ítka Whether to hide the left button group on the main window Skrýt skupinu s tlaÄ�ítky nalevo v hlavním oknÄ› Hide main window &Left buttons Skrýt &levá tlaÄ�ítka v hlavním oknÄ› Whether to hide the right button group on the main window Skrýt skupinu s tlaÄ�ítky napravo v hlavním oknÄ› Hide main window &Right buttons Skrýt &pravá tlaÄ�ítka v hlavním oknÄ› Whether to hide the transport button group on the main window Skrýt skupinu s tlaÄ�ítky pro pÅ™edání v hlavním oknÄ› Hide main window &Transport buttons Skrýt &pÅ™edávací tlaÄ�ítka v hlavním oknÄ› Whether to hide the text labels on the main window buttons Skrýt textové popisky tlaÄ�ítek v hlavním oknÄ› Hide main window &button text labels Skrýt textové popisky &tlaÄ�ítek v hlavním oknÄ› System Systém Cycle Kolo HPET HPET Don't restrict self connect requests (default) Neomezovat požadavky na vlastní spojení (výchozí) Fail self connect requests to external ports only Nesplnit požadavky na vlastní spojení jen pro vnÄ›jší přípojky Ignore self connect requests to external ports only PÅ™ehlížet požadavky na vlastní spojení jen pro vnÄ›jší přípojky Fail all self connect requests Nesplnit vÅ¡echny požadavky na vlastní spojení Ignore all self connect requests PÅ™ehlížet vÅ¡echny požadavky na vlastní spojení Warning Varování Some settings have been changed: "%1" Do you want to save the changes? NÄ›která nastavení byla zmÄ›nÄ›na: "%1" Chcete uložit zmÄ›ny? Delete preset: "%1" Are you sure? Smazat pÅ™ednastavení "%1" Jste si jistý? msec ms n/a n/a &Preset Name &Název pÅ™ednastavení &Server Name &Název serveru &Server Path &Cesta k serveru &Driver &OvladaÄ� &Interface &Rozhraní Sample &Rate Vzorkovací &kmitoÄ�et &Frames/Period &Snímky/Údobí (perioda) Periods/&Buffer Ú&dobí/Vyrovnávací paměť Startup Script Skript pro spuÅ¡tÄ›ní Post-Startup Script Skript pro po-spuÅ¡tÄ›ní Shutdown Script Skript pro zastavení chodu Post-Shutdown Script Skript pro po-zastavení chodu Active Patchbay Definition Vymezení Ä�inné zapojovací desky Patchbay Definition files Soubory s vymezením zapojovací desky Messages Log Zápis s hlášením Log files Soubory se zápisy Information Informace Some settings may be only effective next time you start this application. NÄ›která nastavení se projeví až tehdy, když příštÄ› spustíte tento program. Some settings have been changed. Do you want to apply the changes? NÄ›která nastavení byla zmÄ›nÄ›na. Chcete použít zmÄ›ny? &JACK client/port aliases: Vedlejší názvy (pÅ™ezdívky) pro klienty/přípojky &JACK: JACK client/port aliases display mode Režim zobrazení vedlejších názvů (pÅ™ezdívek) pro klienty/přípojky JACK Default Výchozí First První Second Druhý Whether to show system tray message on main window close Ukázat zprávu v oznamovací oblasti panelu pÅ™i zavÅ™ení hlavního okna Sho&w system tray message on close &Ukázat zprávu v oznamovací oblasti panelu pÅ™i zavÅ™ení Whether to stop JACK audio server on application exit Zastavit zvukový server JACK pÅ™i ukonÄ�ení aplikace S&top JACK audio server on application exit &Zastavit zvukový server JACK pÅ™i ukonÄ�ení aplikace Defaults Výchozí &Base font size: &Základní velikost písma: Base application font size (pt.) Základní velikost písma v aplikaci (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 &Name: &Název: The JACK Audio Connection Kit sound server name Název zvukového serveru JACK Audio Connection Kit netone DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Number of microseconds to wait between engine processes (dummy) PoÄ�et mikrosekund, po které se Ä�eká mezi strojovými procesy (dummy) Whether to enable D-Bus interface Zda povolit rozhraní D-Bus &Enable D-Bus interface &Povolit rozhraní D-Bus Whether to restrict to one single application instance (X11) Zda omezit na úroveň jednoho programu (X11) Single application &instance Ú&roveň jednoho programu qjackctlSocketForm Socket Zásuvka &Socket &Zásuvka &Name (alias): &Název (PÅ™ezdívka): Socket name (an alias for client name) Název zásuvky (pÅ™ezdívka pro název klienta) Client name (regular expression) Název pro klienta (pravidelný výraz) Add plug to socket plug list PÅ™idat zástrÄ�ku do seznamu se zástrÄ�kami do zásuvky Add P&lug &PÅ™idat zástrÄ�ku &Plug: &ZástrÄ�ka: Port name (regular expression) Název přípojky (pravidelný výraz) Socket plug list Seznam se zástrÄ�kami do zásuvky Socket Plugs / Ports ZástrÄ�ky do zásuvky/Přípojky Edit currently selected plug Upravit nyní vybranou zástrÄ�ku &Edit &Upravit Remove currently selected plug from socket plug list Odstranit nyní vybranou zástrÄ�ku ze seznamu se zástrÄ�kami do zásuvky &Remove &Odstranit &Client: &Klient: Move down currently selected plug in socket plug list Posunout nyní vybranou zástrÄ�ku v seznamu se zástrÄ�kami do zásuvky dolů &Down &Dolů Move up current selected plug in socket plug list Posunout nyní vybranou zástrÄ�ku v seznamu se zástrÄ�kami do zásuvky nahoru &Up &Nahoru Enforce only one exclusive cable connection Vynutit jedno výluÄ�né kabelové spojení E&xclusive Vý&luÄ�né &Forward: &DopÅ™edu: Forward (clone) all connections from this socket PÅ™edat vÅ¡echna spojení z této zásuvky (klonovat) Type Typ Audio socket type (JACK) Zvukový typ zásuvky (napojení) JACK &Audio &Zvuk MIDI socket type (JACK) MIDI typ zásuvky (napojení) (JACK) &MIDI &JACK-MIDI MIDI socket type (ALSA) MIDI typ zásuvky (napojení) (ALSA) AL&SA AL&SA-MIDI Plugs / Ports ZástrÄ�ky/Přípojky Error Chyba A socket named "%1" already exists. Zásuvka s názvem "%1" již existuje. Warning Varování Some settings have been changed. Do you want to apply the changes? NÄ›která nastavení byla zmÄ›nÄ›na. Chcete použít zmÄ›ny? Add Plug PÅ™idat zástrÄ�ku Edit Upravit Remove Odstranit Move Up PÅ™esunout nahoru Move Down PÅ™esunout dolů (None) (Žádný) qjackctlSocketList Output Výstup Input Vstup Socket Zásuvka <New> - %1 <Nový> %1 Warning Varování %1 about to be removed: "%2" Are you sure? %1 má být odstranÄ›no: "%2" Jste si jistý? %1 <Copy> - %2 %1 <Kopírovat> - %2 qjackctlSocketListView Output Sockets / Plugs Výstupní zásuvky/zástrÄ�ky Input Sockets / Plugs Vstupní zásuvky/zástrÄ�ky qjackctl-1.0.6/src/translations/PaxHeaders/qjackctl_tr.ts0000644000000000000000000000013215174607203020556 xustar0030 mtime=1777536643.525914219 30 atime=1777536643.524914226 30 ctime=1777536643.525914219 qjackctl-1.0.6/src/translations/qjackctl_tr.ts0000644000175000001440000064235215174607203020562 0ustar00rncbcusers PortAudioProber Probing... İnceleniyor... Please wait, PortAudio is probing audio hardware. Lütfen bekleyin, PortAudio ses donanımını araÅŸtırıyor. Warning Uyarı Audio hardware probing timed out. Ses donanımı incelemesi zaman aşımına uÄŸradı. QObject (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Usage: %1 [options] [command-and-args] Kullanımı: %1 [seçenekler] [komut ve bağımsız deÄŸiÅŸkenler] Options: Seçenekler: Start JACK audio server immediately. JACK ses sunucusunu hemen baÅŸlatın. Set default settings preset name. Varsayılan ayarların ön ayar adını ayarlayın. Set active patchbay definition file. Etkin baÄŸlantı paneli tanım dosyasını ayarlayın. Set default JACK audio server name. Varsayılan JACK ses sunucusu adını ayarlayın. Show help about command line options. Komut satırı seçenekleriyle ilgili yardımı göster. Show version information. Sürüm bilgilerini göster. Displays help on command-line options. Launch command with arguments. Argümanlarla komutu baÅŸlatın. [command-and-args] [komut ve argümanlar] Option -p requires an argument (preset). Seçenek -p bir bağımsız deÄŸiÅŸken (ön ayar) gerektirir. Option -a requires an argument (path). Seçenek -a bir argüman (yol) gerektirir. Option -n requires an argument (name). Seçenek -n bir argüman (isim) gerektirir. %1 (%2 frames) %1 (%2 kare) Move Taşı Rename Yeniden adlandır qjackctlAboutForm About Hakkında &Close &Kapat About Qt Qt Hakkında Version Sürüm Debugging option enabled. Hata ayıklama seçeneÄŸi etkin. System tray disabled. Sistem tepsisi devre dışı. Transport status control disabled. Aktarım durumu kontrolü devre dışı. Realtime status disabled. Gerçek zamanlı durum devre dışı. XRUN delay status disabled. XRUN gecikme durumu devre dışı. Maximum delay status disabled. Maksimum gecikme durumu devre dışı. JACK MIDI support disabled. JACK MIDI desteÄŸi devre dışı bırakıldı. JACK Session support disabled. JACK Oturumu desteÄŸi devre dışı bırakıldı. ALSA/MIDI sequencer support disabled. ALSA/MIDI sıralayıcı desteÄŸi devre dışı. Using: Qt %1 Kullanılıyor: Qt %1 JACK %1 JACK %1 Website Web sitesi This program is free software; you can redistribute it and/or modify it Bu program özgür bir yazılımdır; yeniden dağıtabilir ve/veya deÄŸiÅŸtirebilirsiniz under the terms of the GNU General Public License version 2 or later. GNU Genel Kamu Lisansı sürüm 2 veya üzeri koÅŸulları kapsamında. JACK Port aliases support disabled. JACK BaÄŸlantı noktası takma ad desteÄŸi devre dışı. D-Bus interface support disabled. D-Bus arayüz desteÄŸi devre dışı. qjackctlClientListView Readable Clients / Output Ports Okunabilir İstemciler / Çıkış BaÄŸlantı Noktaları Writable Clients / Input Ports Yazılabilir İstemciler / GiriÅŸ BaÄŸlantı Noktaları &Connect &BaÄŸlan Alt+C Connect Alt+C &Disconnect &BaÄŸlantıyı Kes Alt+D Disconnect Alt+D Disconnect &All &Tüm BaÄŸlantıları Kes Alt+A Disconnect All Alt+A Re&name &Yeniden adlandır Alt+N Rename Alt+N &Refresh &Yenile Alt+R Refresh Alt+R qjackctlConnect Warning Uyarı This will suspend sound processing from all client applications. Are you sure? Bu, tüm istemci uygulamalarında ses iÅŸlemeyi askıya alacaktır. Emin misin? qjackctlConnectionsForm Connections BaÄŸlantılar Audio Ses Connect currently selected ports Seçili baÄŸlantı noktalarını baÄŸlayın &Connect &BaÄŸlan Disconnect currently selected ports Seçili baÄŸlantı noktalarının baÄŸlantısını kes &Disconnect &BaÄŸlantıyı kes Disconnect all currently connected ports BaÄŸlı olan tüm baÄŸlantı noktalarının baÄŸlantısını kesin Disconnect &All &Tüm BaÄŸlantıları Kes Expand all client ports Tüm istemci baÄŸlantı noktalarını geniÅŸlet E&xpand All &Hepsini geniÅŸlet Refresh current connections view Mevcut baÄŸlantılar görünümünü yenile &Refresh &Yenile MIDI MIDI ALSA ALSA qjackctlConnectorView &Connect &BaÄŸlan Alt+C Connect Alt+C &Disconnect &BaÄŸlantıyı Kes Alt+D Disconnect Alt+D Disconnect &All &Tüm BaÄŸlantıları Kes Alt+A Disconnect All Alt+A &Refresh &Yenile Alt+R Refresh Alt+R qjackctlGraphCanvas Connect BaÄŸlan Disconnect BaÄŸlantıyı Kes qjackctlGraphForm Graph Grafik &Graph &Grafik &Edit &Düzenle &View &Görünüm &Zoom &YakınlaÅŸtır Co&lors &Renkler S&ort &Sırala &Help Y&ardım &Connect &BaÄŸlan Connect BaÄŸlan Connect selected ports Seçilen baÄŸlantı noktalarını baÄŸlayın &Disconnect &BaÄŸlantıyı Kes Disconnect BaÄŸlantıyı Kes Disconnect selected ports Seçili baÄŸlantı noktalarının baÄŸlantısını kes Ctrl+C Ctrl+C T&humbview Ctrl+D Ctrl+D Cl&ose &Kapat Close Kapat Close this application window Bu uygulama penceresini kapat Select &All Hepsini &seç Select All Hepsini seç Ctrl+A Ctrl+A Select &None Hi&çbirini Seçme Select None Hiçbirini Seçme Ctrl+Shift+A Ctrl+Shift+A Select &Invert Seçimi &Çevir Select Invert Seçimi Çevir Ctrl+I Ctrl+I Ctrl+I &Rename... Y&eniden adladır... Rename item Öğeyi yeniden adlandır Rename Item Öğeyi yeniden adlandır F2 F2 &Find... Find Find nodes Ctrl+F &Menubar &Menü çubuÄŸu Menubar Menü ÇubuÄŸu Show/hide the main program window menubar Ana program penceresi menü çubuÄŸunu göster/gizle Ctrl+M Ctrl+M &Toolbar Araç &çubuÄŸu Toolbar Araç çubuÄŸu Show/hide main program window file toolbar Ana program penceresi araç çubuÄŸunu göster/gizle &Statusbar &Durum çubuÄŸu Statusbar Durum çubuÄŸu Show/hide the main program window statusbar Ana program penceresi durum çubuÄŸunu göster/gizle &Top Left Top left Show the thumbnail overview on the top-left Top &Right Top right Show the thumbnail overview on the top-right Bottom &Left Bottom Left Bottom left Show the thumbnail overview on the bottom-left &Bottom Right Bottom right Show the thumbnail overview on the bottom-right &None None Hiçbiri Hide thumbview Hide the thumbnail overview Text Beside &Icons &Simgeler Metnin Yanında Text beside icons Simgelerin metnin yanında Show/hide text beside icons Simgelerin yanındaki metni göster/gizle &Center &Ortala Center Ortala Center view Orta görünüm &Refresh &Yenile Refresh Yenile Refresh view Görünümü yenile F5 F5 Zoom &In &YakınlaÅŸ Zoom In YakınlaÅŸ Ctrl++ Ctrl++ Zoom &Out Uzak&klaÅŸ Zoom Out UzaklaÅŸ Ctrl+- Ctrl+- Zoom &Fit Sığ&dır Zoom Fit Sığdır Ctrl+0 Ctrl+0 Zoom &Reset YakınlaÅŸtırmayı sı&fırla Zoom Reset YakınlaÅŸtırmayı Sıfırla Ctrl+1 Ctrl+1 &Zoom Range Seçili Alan&ı YalınlaÅŸtır Zoom Range YakınlaÅŸtırma Oranı JACK &Audio... JACK &Ses... JACK Audio color JACK Ses rengi JACK &MIDI... JACK &MIDI... JACK MIDI JACK MIDI JACK MIDI color JACK MIDI rengi ALSA M&IDI... ALSA M&IDI... ALSA MIDI ALSA MIDI ALSA MIDI color ALSA MIDI rengi JACK &CV... JACK &CV... JACK CV color JACK CV rengi JACK &OSC... JACK &OSC... JACK OSC JACK OSC JACK OSC color JACK OSC rengi &Reset &Sıfırla Reset colors Renkleri sıfırla Port &Name BaÄŸlantı Noktası &Adı Port name BaÄŸlantı Noktası Adı Sort by port name BaÄŸlantı noktası adına göre sırala Port &Title BaÄŸlantı Noktası &BaÅŸlığı Port title BaÄŸlantı Noktası BaÅŸlığı Sort by port title BaÄŸlantı Noktası Başığına Göre Sırala Port &Index BaÄŸlantı Nokt&ası Dizini Port index BaÄŸlantı Noktası Dizini Sort by port index BaÄŸlantı noktası dizinine göre sırala &Ascending A&rtan Ascending Artan Ascending sort order Artan sıralama düzeni &Descending A&zalan Descending Azalan Descending sort order Azalan sıralama düzeni Repel O&verlapping Nodes Çakışan Düğ&ümleri Reddet Repel nodes Reddedilen düğümler Repel overlapping nodes Çakışan Düğümleri Reddet Connect Thro&ugh Nodes Düğümler Aracılığıyla BaÄŸla&n Connect Through Nodes Düğümler Aracılığıyla BaÄŸlan Connect through nodes Düğümler aracılığıyla baÄŸlan Whether to draw connectors through or around nodes BaÄŸlayıcıların düğümlerin içinden mi yoksa çevresinden mi çizileceÄŸi &About... &Hakkında... About... Hakkında... About HAkkında Show information about this application program Bu program hakkındaki bilgileri göster About &Qt... &QT Hakkında... About Qt... Qt Hakkında... About Qt Qt Hakkında Show information about the Qt toolkit Qt araç seti hakkındaki bilgileri göster &Undo &Geri Al &Redo &Yeniden Yap Undo last edit action Son düzenleme iÅŸlemini geri al Redo last edit action Son düzenleme eylemini yeniden yap Zoom YakınlaÅŸtır Ready Hazır Colors - %1 Renkler - %1 qjackctlMainForm Quit processing and exit Çalışmayı bırak ve çık &Quit &Çıkış Start the JACK server JACK sunucusunu baÅŸlat &Start &BaÅŸlat Stop the JACK server JACK sunucusunu durdur S&top &Durdur St&atus D&urum Show information about this application Bu uygulama hakkındaki bilgileri göster Ab&out... &Hakkında... Set&up... &Ayarlar... Show settings and options dialog Ayarlar ve seçenekler iletiÅŸim kutusunu göster &Messages &Mesajlar Show/hide the patchbay editor window BaÄŸlantı paneli düzenleyici penceresini göster/gizle &Patchbay BaÄŸlantı &Paneli &Connect &BaÄŸlan JACK server state JACK sunucu durumu JACK server mode JACK sunucu modu DSP Load DSP-Yükü Sample rate Örnekleme oranı XRUN Count (notifications) XRUN Sayısı (bildirimler) Time display Zaman göstergesi Transport state Transport durumu Transport BPM Transport BPM Transport time Transport zamanı Show/hide the session management window Oturum yönetimi penceresini göster/gizle Show/hide the messages log/status window Mesaj günlüğü/durum penceresini göster/gizle Show/hide the graph window Grafik penceresini göster/gizle Show/hide the connections window BaÄŸlantı penceresini göster/gizle Backward transport Geriye &Backward &Geriye Forward transport İleriye &Forward &İlerle Rewind transport Geri sarma &Rewind G&eri sar Stop transport rolling Transport hareketini durdur Pa&use &Duraklat Start transport rolling Transport hareketini baÅŸlat &Play &Oynat Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. ALSA sıralayıcısı istemci olarak açılamadı. ALSA MIDI baÄŸlantı paneli kullanılamayacak. D-BUS: Service is available (%1 aka jackdbus). D-BUS: Servis mevcut (%1 diÄŸer adıyla jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: Servisi mevcut deÄŸil (%1 diÄŸer adıyla jackdbus). Information Bilgi Don't show this message again Bu mesajı bir daha gösterme Warning Uyarı JACK is currently running. Do you want to terminate the JACK audio server? JACK ÅŸu anda çalışıyor. JACK ses sunucusunu sonlandırmak istiyor musunuz? %1 is about to terminate. Are you sure? %1 sonlandırılmak üzere. Emin misin? successfully baÅŸarılı with exit status=%1 çıkış durumu=%1 ile Could not start JACK. Maybe JACK audio server is already started. JACK baÅŸlatılamadı. Belki JACK ses sunucusu zaten baÅŸlatılmıştır. Could not load preset "%1". Retrying with default. "%1" ön ayarı yüklenemedi. Varsayılan olarak yeniden deneniyor. Could not load default preset. Sorry. Varsayılan ön ayar yüklenemedi. Üzgünüm. Startup script... BaÅŸlangıç betiÄŸi... Startup script terminated BaÅŸlangıç betiÄŸi sonlandırıldı D-BUS: JACK server is starting... D-BUS: JACK sunucusu baÅŸlatılıyor... D-BUS: JACK server could not be started. Sorry D-BUS: JACK sunucusu baÅŸlatılamadı. Üzgünüm JACK is starting... JACK baÅŸlıyor... Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Bazı istemci ses uygulamaları hala aktif ve baÄŸlılar. JACK ses sunucusunu durdurmak istiyor musunuz? JACK is stopping... JACK durduruluyor... Shutdown script... Kapatma betiÄŸi... The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Program sistem tepsisinde çalışmaya devam edecektir. Programı sonlandırmak için lütfen sistem tepsisi/içerik menüsünden "Çık"ı seçin. Don't ask this again Bunu bir daha sorma Shutdown script terminated Kapatma betiÄŸi sonlandırıldı D-BUS: JACK server is stopping... D-BUS: JACK sunucusu durduruluyor... D-BUS: JACK server could not be stopped. Sorry D-BUS: JACK sunucusu durdurulamadı. Üzgünüm Post-shutdown script... Kapatma sonrası betiÄŸi... Post-shutdown script terminated Kapatma sonrası betiÄŸi sonlandırıldı JACK was started with PID=%1. JACK, PID=%1 ile baÅŸlatıldı. The preset aliases have been changed: "%1" Do you want to save the changes? Ön ayarlı takma adlar deÄŸiÅŸtirildi: "%1" DeÄŸiÅŸiklikleri kaydetmek istiyor musunuz? D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: JACK sunucusu baÅŸlatıldı (%1 diÄŸer adıyla jackdbus). JACK is being forced... JACK zorlanıyor... JACK was stopped JACK durduruldu D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: JACK sunucusu durduruldu (%1 diÄŸer adıyla jackdbus). Error Hata Transport BBT (bar.beat.ticks) Transport BBT (ölçü:vuruÅŸ.ticks) Transport time code Transport zaman Kodu Elapsed time since last reset Son sıfırlamadan bu yana geçen süre Elapsed time since last XRUN Son XRUN'dan bu yana geçen süre Patchbay reset. BaÄŸlantı paneli sıfırlandı. Could not load active patchbay definition. "%1" Disabled. Etkin baÄŸlantı paneli tanımı yüklenemedi. "%1" Engellendi. Patchbay activated. BaÄŸlantı Paneli etkinleÅŸtirildi. Patchbay deactivated. BaÄŸlantı paneli devre dışı bırakıldı. Statistics reset. İstatistikler sıfırlandı. msec msec JACK connection graph change. JACK baÄŸlantı grafiÄŸi deÄŸiÅŸikliÄŸi. XRUN callback (%1). XRUN geri dönüşü (%1). Buffer size change (%1). Arabellek boyutu deÄŸiÅŸikliÄŸi (%1). Shutdown notification. Kapatma uyarıları. Freewheel started... BAşıboÅŸ hareket baÅŸlatıldı... Freewheel exited. BaşıboÅŸ hareketten çıkeıldı. Could not start JACK. Sorry. JACK baÅŸlatılamadı. Üzgünüm. JACK has crashed. JACK çöktü. JACK timed out. JACK zaman aşımına uÄŸradı. JACK write error. JACK yazma hatası. JACK read error. JACK okuma hatası. Unknown JACK error (%d). Bilinmeyen JACK hatası (%d). JACK property change. JACK özelliÄŸi deÄŸiÅŸikliÄŸi. ALSA connection graph change. ALSA baÄŸlantı grafiÄŸi deÄŸiÅŸikliÄŸi. JACK active patchbay scan JACK aktif baÄŸlantı paneli taraması ALSA active patchbay scan ALSA aktif baÄŸlantı paneli taraması JACK connection change. JACK baÄŸlantısı deÄŸiÅŸikliÄŸi. ALSA connection change. ALSA baÄŸlantı deÄŸiÅŸikliÄŸi. checked kontrol connected baÄŸlandı disconnected baÄŸlantıyı kesildi failed baÅŸarısız A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Åžu anda bir baÄŸlantı paneli tanımı etkin, bu baÄŸlantıyı yeniden yapmak muhtemeldir: %1 -> %2 Patchbay baÄŸlantısını kaldırmak istiyor musunuz? Overall operation failed. Genel iÅŸlem baÅŸarısız oldu. Invalid or unsupported option. Geçersiz veya desteklenmeyen seçenek. Client name not unique. İstemci adı benzersiz deÄŸil. Server is started. Sunucu baÅŸlatıldı. Unable to connect to server. Sunucuya baÄŸlanılamıyor. Server communication error. Sunucu iletiÅŸim hatası. Client does not exist. İstemci mevcut deÄŸil. Unable to load internal client. Dahili istemci yüklenemiyor. Unable to initialize client. İstemci baÅŸlatılamıyor. Unable to access shared memory. Paylaşılan belleÄŸe eriÅŸilemiyor. Client protocol version mismatch. İstemci protokolü sürüm uyuÅŸmazlığı. Could not connect to JACK server as client. - %1 Please check the messages window for more info. İstemci olarak JACK sunucusuna baÄŸlanılamadı. - %1 Daha fazla bilgi için lütfen mesaj penceresini kontrol edin. Server configuration saved to "%1". Sunucu yapılandırması "%1" dizinine kaydedildi. Client activated. İstemci etkinleÅŸtirildi. Post-startup script... BaÅŸlangıç sonrası betiÄŸi... Post-startup script terminated BaÅŸlangıç sonrası betiÄŸi sonlandırıldı Command line argument... Komut satırı argümanı... Command line argument started Komut satırı argümanı baÅŸlatıldı Client deactivated. İstemci devre dışı bırakıldı. Transport rewind. Geri sarma. Transport backward. Geriye. Starting BaÅŸlatılıyor Transport start. Oynat. Stopping Durduruluyor Transport stop. Durdur. Transport forward. İleriye. Stopped Durduruldu %1 (%2%) %1 (%2 %) %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 Frames Yes Evet No Hayır FW FW RT GZ Rolling Hareket Ediyor Looping Döngü %1 msec %1 ms XRUN callback (%1 skipped). XRUN geri dönüşü (%1 atlananlar). Started BaÅŸlatıldı Active Aktif Activating EtkinleÅŸtiriliyor Inactive Etkin deÄŸil &Hide &Gizli D-BUS: GetParameterConstraint('%1'): %2. (%3) D-BUS: Parametre Kısıtlamasını Al('%1'): %2. (%3) Mi&nimize K&üçült S&how &Göster Rest&ore &Geri Yükle &Stop &Durdur &Reset &Sıfırla &Presets &Ön ayarlar &Versioning Sürüm &oluÅŸturma Re&fresh &Yenile S&ession &Oturum &Load... &Yükle... &Save... &Kaydet... Save and &Quit... Kaydet ve &Cık... Save &Template... &Åžablonu Kaydet... &Connections &BaÄŸlantılar Patch&bay BaÄŸlantı &Paneli &Graph &Grafik &Transport &Transport Server settings will be only effective after restarting the JACK audio server. Sunucu ayarları yalnızca JACK ses sunucusunun yeniden baÅŸlatılmasından sonra geçerli olacaktır. Do you want to restart the JACK audio server? JACK ses sunucusunu yeniden baÅŸlatmak istiyor musunuz? D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: Parametre DeÄŸerini Ayarlayın('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: Parametre DeÄŸerini Sıfırla('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS: Parametre DeÄŸerini Al('%1'): %2. (%3) Some settings will be only effective the next time you start this program. Bazı ayarlar programın bir sonraki baÅŸlangıcında etkili olacaktır. qjackctlMessagesStatusForm Messages / Status Mesajlar/Durum &Messages &Mesajlar Messages log Mesajlar günlüğü Messages output log Mesajlar çıkış günlüğü &Status &Durum Status information Durum bilgisi Statistics since last server startup Son sunucu baÅŸlangıcından bu yana istatistikler Description Tanım Value DeÄŸer Reset XRUN statistic values XRUN istatistik deÄŸerlerini sıfırla Re&set &Sıfırla Refresh XRUN statistic values XRUN istatistik deÄŸerlerini tazele &Refresh &Tazele Server name Sunucu adı Server state Sunucu durumu DSP Load DSP yükü Sample Rate Örnekleme oranı Buffer Size Arabellek Boyutu Realtime Mode Gerçek Zamanlı Modu Transport state Transport durumu Transport Timecode Transport Zaman Kodu Transport BBT Transport BBT Transport BPM Transport BPM XRUN count since last server startup Sunucunun son baÅŸlangıcından bu yana XRUN sayısı XRUN last time detected XRUN'ın en son algılandığı zaman XRUN last Son XRUN XRUN maximum En çok XRUN XRUN minimum En az XRUN XRUN average XRUN ortalaması XRUN total Toplam XRUN Maximum scheduling delay Maksimum planlama gecikmesi Time of last reset Son sıfırlama zamanı Logging stopped --- %1 --- Günlüğe kaydetme durduruldu --- %1 --- Logging started --- %1 --- Günlüğe kaydetme baÅŸlatıldı --- %1 --- qjackctlPaletteForm Color Themes Renk Temaları Name İsim Current color palette name Geçerli renk paleti adı Save current color palette name Geçerli renk paleti adını kaydet Save Kaydet Delete current color palette name Geçerli renk paleti adını sil Delete Sil Palette Palet Current color palette Geçerli renk paleti Generate: OluÅŸtur: Base color to generate palette Palet oluÅŸturmak için temel renk Reset all current palette colors Mevcut tüm palet renklerini sıfırla Reset Sıfırla Import a custom color theme (palette) from file Dosyadan özel bir renk temasını (palet) içe aktar Import... İçe aktar... Export a custom color theme (palette) to file Özel bir renk temasını (palet) dosyaya aktarma Export... Dışa Aktar... Show Details Detayları Göster Import File - %1 %1 dosyasını içe aktar Palette files (*.%1) Palet dosyaları (*.%1) Save Palette - %1 All files (*.*) Tüm dosyalar (*.*) Warning - %1 Uyarı - %1 Could not import from file: %1 Sorry. Dosyadan içe aktarılamadı: %1 Üzgünüm. Export File - %1 Dosyayı Dışa Aktar - %1 Some settings have been changed. Do you want to discard the changes? Bazı ayarlar deÄŸiÅŸtirildi. DeÄŸiÅŸiklikleri silmek istiyor musunuz? Some settings have been changed: "%1". Do you want to save the changes? Bazı ayarlar deÄŸiÅŸtirildi: "%1". DeÄŸiÅŸiklikleri kaydetmek istiyor musunuz? qjackctlPaletteForm::PaletteModel Color Role Renk Rolü Active Etkin Inactive Etkin deÄŸil Disabled Devredışı qjackctlPatchbay Warning Uyarı This will disconnect all sockets. Are you sure? Bu, tüm soketlerin baÄŸlantısını kesecektir. Emin misin? qjackctlPatchbayForm Patchbay BaÄŸlantı Paneli Move currently selected output socket down one position Seçili olan çıkış soketini bir konum aÅŸağıya taşı Down AÅŸağı Create a new output socket Yeni bir çıkış soketi oluÅŸturun Add... Ekle... Edit currently selected input socket properties Åžu anda seçili olan giriÅŸ soketi özelliklerini düzenle Edit... Düzenle... Move currently selected output socket up one position Seçili olan çıkış soketini bir konum yukarı taşı Up Yukarı Remove currently selected output socket Åžu anda seçili olan çıkış soketini kaldır Remove Kaldır Duplicate (copy) currently selected output socket Åžu anda seçili olan çıkış soketini çoÄŸalt (kopyala) Copy... Kopyala... Remove currently selected input socket Åžu anda seçili olan giriÅŸ soketini kaldır Duplicate (copy) currently selected input socket Åžu anda seçili olan giriÅŸ soketini çoÄŸalt (kopyala) Create a new input socket Yeni bir giriÅŸ soketi oluÅŸturun Edit currently selected output socket properties Åžu anda seçili çıkış soketi özelliklerini düzenle Connect currently selected sockets Åžu anda seçili olan soketleri baÄŸlayın &Connect &BaÄŸlan Disconnect currently selected sockets Åžu anda seçili olan soketlerin baÄŸlantısını kesin &Disconnect Ba&ÄŸlantıyı Kes Disconnect all currently connected sockets Åžu anda baÄŸlı olan tüm soketlerin baÄŸlantısını kesin Disconnect &All Bütün BaÄŸ. &Kes Expand all items Tüm öğeleri geniÅŸlet E&xpand All Tümün&ü geniÅŸlet Refresh current patchbay view Mevcut baÄŸlantı paneli görünümünü yenile &Refresh &Yenile Create a new patchbay profile Yeni bir baÄŸlantı paneli profili oluÅŸturun &New &Yeni Load patchbay profile BaÄŸlantı paneli profilini yükle &Load... &Yükle... Save current patchbay profile Mevcut baÄŸlantı paneli profilini kaydet &Save... &Kaydet... Current (recent) patchbay profile(s) Güncel (yeni) baÄŸlantı paneli profil(ler)i Toggle activation of current patchbay profile Mevcut baÄŸlantı paneli profilinin etkinleÅŸtirilmesini aç/kapat Acti&vate &EtkinleÅŸtir Warning Uyarı The patchbay definition has been changed: "%1" Do you want to save the changes? BaÄŸlantı paneli tanımı deÄŸiÅŸtirildi: "%1" DeÄŸiÅŸiklikleri kaydetmek istiyor musunuz? %1 [modified] %1 [deÄŸiÅŸtirildi] Untitled%1 BaÅŸlıksız%1 Error Hata Could not load patchbay definition file: "%1" BaÄŸlantı paneli tanım dosyası yüklenemedi: "%1" Could not save patchbay definition file: "%1" BaÄŸlantı paneli tanım dosyası kaydedilemedi: "%1" New Patchbay definition Yeni baÄŸlantı paneli tanımı Create patchbay definition as a snapshot of all actual client connections? Tüm istemci baÄŸlantılarının anlık görüntü olarak baÄŸlantı paneli tanımı oluÅŸturulsun mu? Load Patchbay Definition BaÄŸlantı Paneli Tanımını Yükle Patchbay Definition files BaÄŸlantı Paneli Tanımını Kaydet Save Patchbay Definition BaÄŸlantı Paneli Tanımını Kaydet active etkin qjackctlPatchbayView Add... Ekle... Edit... Düzenle... Copy... Kopyala... Remove Sil Exclusive Özel Forward İleri (None) (Hiçbiri) Move Up Yukarı taşı Move Down AÅŸağı Taşı &Connect &BaÄŸlan Alt+C Connect Alt+C &Disconnect &BaÄŸlantıyı Kes Alt+D Disconnect Alt+D Disconnect &All &Tüm BaÄŸlantıları Kes Alt+A Disconnect All Alt+A &Refresh &Yenile Alt+R Refresh Alt+R qjackctlSessionForm Session Oturum Load session Oturum yükle &Load... &Yükle... Recent session Önceki Oturum &Recent &Önceki Save session Oturumu kaydet &Versioning Sürüm &oluÅŸtur Re&fresh &Yenile Infra-clients / commands Alt-istemciler / komutlar Infra-client Alt-istemci Infra-command Alt-komut Add infra-client Alt-istemci Ekle &Add &Ekle Edit infra-client Alt-istemciyi Düzenle &Edit &Düzenle Remove infra-client Alt-istemci Kaldır Re&move &Kaldır &Save... &Kaydet... Update session Oturumu Güncelle Session clients / connections Oturum istemcileri/baÄŸlantıları Client / Ports İstemci / BaÄŸlantı Noktaları UUID UUID Command Komut &Save &Kaydet Load Session Oturum Yükle Session directory Oturum dizini Save Session Oturumu Kaydet and Quit ve Çık Template Åžablon &Clear &Temizle Warning Uyarı A session could not be found in this folder: "%1" Bu klasörde bir oturum bulunamadı: "%1" %1: loading session... %1: oturum yükleniyor... %1: load session %2. %1: oturum yükleniyor %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Bu klasörde zaten bir oturum var: "%1" Mevcut oturumun üzerine yazacağınızdan emin misiniz? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Bu klasör zaten mevcut ve boÅŸ deÄŸil: "%1" Mevcut klasörün üzerine yazacağınızdan emin misiniz? %1: saving session... %1: oturum kaydediliyor... %1: save session %2. %1: oturum kaydediliyor %2. New Client Yeni İstemci Save and &Quit... Kaydet ve &Cık... Save &Template... &Åžablonu Kaydet... qjackctlSessionInfraClientItemEditor Infra-command Alt-komut qjackctlSessionSaveForm Session Oturum &Name: &İsmi: Session name &Directory: Session directory Oturum dizini Browse for session directory ... ... Save session versioning Oturum sürümünü kaydet &Versioning Warning Uyarı Session directory does not exist: "%1" Do you want to create it? Session Directory qjackctlSetupForm Settings Ayarlar Preset &Name: &Önayar Adı: Settings preset name Ayarlar önayar adı (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Save settings as current preset name Ayarları mevcut ön ayar adı olarak kaydedin &Save &Kaydet Delete current settings preset Mevcut ön ayarları sil &Delete &Sil jackd DO NOT TRANSLATE jackdmp DO NOT TRANSLATE jackstart DO NOT TRANSLATE Driv&er: Sü&rücü: The audio backend driver interface to use Kullanılacak ses arka uç sürücüsü arayüzü dummy DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 sun DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 oss DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 alsa DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 portaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 coreaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 firewire DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Parameters Parametreler MIDI Driv&er: MIDI S&ürücüsü: The ALSA MIDI backend driver to use Kullanılacak ALSA MIDI arka uç sürücüsü none hiçbiri raw DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 seq DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Time in seconds that client is delayed after server startup Sunucu baÅŸlatıldıktan sonra istemcinin geciktiÄŸi saniye cinsinden süre Latency: Gecikme: Output latency in milliseconds, calculated based on the period, rate and buffer settings Dönem, hız ve arabellek ayarlarına göre hesaplanan, milisaniye cinsinden çıkış gecikmesi Use realtime scheduling Gerçek zamanlı düzenlemeyi kullanın &Realtime &Gerçek Zamanlı Do not attempt to lock memory, even if in realtime mode Gerçek zamanlı modda olsa bile belleÄŸi kilitlemeye çalışmayın No Memory Loc&k Bellek Kilidi &Yok Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Yaygın araç seti kitaplıkları (GTK+, QT, FLTK, Wine) belleÄŸinin kilidini açın &Unlock Memory &Bellek Kilidini Aç Ignore xruns reported by the backend driver Arka uç sürücüsü tarafından bildirilen xrun'ları yoksay So&ft Mode &YumuÅŸak Mod Provide output monitor ports Çıkış monitör baÄŸlantı noktalarını saÄŸlayın &Monitor &Monitör Force 16bit mode instead of failing over 32bit (default) 32 bitin üzerine çıkmak yerine 16 bit modunu zorlayın (varsayılan) Force &16bit &16bit'i zorla Enable hardware metering on cards that support it Destekleyen kartlarda donanım ölçümünü etkinleÅŸtirin H/&W Meter H/&W Ölçer Ignore hardware period/buffer size Donanım periyodunu/arabellek boyutunu göz ardı et &Ignore H/W &H/W'yi Yoksay Whether to give verbose output on messages Mesajlara ayrıntılı çıktı verilip verilmeyeceÄŸi &Verbose messages &Ayrıntılı mesajlar &Output Device: &Çıkış aygıtı: &Interface: &Arayüz: Maximum input audio hardware channels to allocate Atanacak maksimum ses giriÅŸ donanımı &Audio: &Ses: Dit&her: Tit&reme: External output latency (frames) Harici çıkış gecikmesi (kareler) &Input Device: &GiriÅŸ Cihazı: Provide either audio capture, playback or both Ses yakalama, oynatma veya her ikisini de saÄŸlayın Duplex Çift Yönlü Capture Only Yalnızca Yakala Playback Only Yalnızca Oynatma The PCM device name to use Kullanılacak PCM cihazı adı hw:0 hw:0 plughw:0 plughw:0 /dev/audio /dev/audio /dev/dsp /dev/dsp > > Alternate input device for capture Yakalama için alternatif giriÅŸ cihazı Maximum output audio hardware channels to allocate Atanacak maksimum ses çıkış donanımı Alternate output device for playback Oynatma için alternatif çıkış cihazı External input latency (frames) Harici giriÅŸ gecikmesi (kareler) Set dither mode Titreme modunu ayarla None Hiçbiri Rectangular Dikdörtgen Shaped ÅžekillendirilmiÅŸ Triangular Üçgensel Number of periods in the hardware buffer Donanım arabelleÄŸindeki dönem sayısı Server &Prefix: Sunucu &Öneki: Server path (command line prefix) Sunucu yolu (komut satırı öneki) Priorit&y: &Öncelik: &Frames/Period: &Çerçeveler/Dönem: Frames per period between process() calls İşem() çaÄŸrıları arasındaki dönem başına kare sayısı 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Port Ma&ximum: Maksimum BaÄŸlantı &Noktası : &Channels: &Kanallar: 21333 21333 Sample rate in frames per second Saniye başına kare cinsinden örnekleme hızı 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Scheduler priority when running realtime Gerçek zamanlı çalıştırırken zamanlayıcı önceliÄŸi &Word Length: &Kelime uzunluÄŸu: Periods/&Buffer: Dönemler/&Tampon: Word length Kelime uzunluÄŸu Maximum number of ports the JACK server can manage JACK sunucusunun yönetebileceÄŸi maksimum baÄŸlantı noktası sayısı &Wait (usec): &Bekle (usec): Sample &Rate: &Örnekleme Oranı: Maximum number of audio channels to allocate Atanacak maksimum ses kanalı sayısı &Timeout (msec): &Zaman Aşımı (msn): Set client timeout limit in milliseconds İstemci zaman aşımı sınırını milisaniye cinsinden ayarla 200 200 500 500 1000 1000 2000 2000 5000 5000 &Channels I/O: &Kanallar G/Ç: &Latency I/O: &Gecikme G/Ç: Server Suffi&x: Sunucu Ek&i: Start De&lay: BaÅŸlangıç &Gecikmesi: secs s 0 msecs 0 ms Whether to restrict client self-connections İstemcinin kendi kendine baÄŸlantılarının kısıtlanıp kısıtlanmayacağı Advanced GeliÅŸmiÅŸ Clear settings of current preset name Geçerli ön ayar adının ayarlarını temizle Clea&r &Temizle Cloc&k source: &Saat kaynağı: Clock source Saat kaynağı S&elf connect mode: K&endi kendine baÄŸlantı modu: Options Seçenekler Scripting Betik Whether to execute a custom shell script before starting up the JACK audio server. JACK ses sunucusunu baÅŸlatmadan önce özel bir betik yürütülüp yürütülmeyeceÄŸi. Execute script on Start&up: Açılırken &betiÄŸi çalıştır: Whether to execute a custom shell script after starting up the JACK audio server. JACK ses sunucusunu baÅŸlattıktan sonra özel birbetiÄŸin yürütülüp yürütülmeyeceÄŸi. Execute script after &Startup: BaÅŸlatmadan &sonra betiÄŸi çalıştır: Whether to execute a custom shell script before shuting down the JACK audio server. JACK ses sunucusunu kapatmadan önce özel bir betiÄŸin yürütülüp yürütülmeyeceÄŸi. Execute script on Shut&down: Kapanırken be&tiÄŸi çalıştır: Command line to be executed before starting up the JACK audio server JACK ses sunucusunu baÅŸlatmadan önce yürütülecek betik Scripting argument meta-symbols Betik deÄŸiÅŸkeninin meta sembolleri Browse for script to be executed before starting up the JACK audio server JACK ses sunucusunu baÅŸlatmadan önce yürütülecek betiÄŸe göz atın ... ... Command line to be executed after starting up the JACK audio server JACK ses sunucusunu baÅŸlattıktan sonra yürütülecek komut satırı Browse for script to be executed after starting up the JACK audio server JACK ses sunucusunu baÅŸlattıktan sonra yürütülecek komut dosyasına göz atın Browse for script to be executed before shutting down the JACK audio server JACK ses sunucusunu kapatmadan önce yürütülecek komut dosyasına göz atın Command line to be executed before shutting down the JACK audio server JACK ses sunucusunu kapatmadan önce yürütülecek komut satırı Whether to execute a custom shell script after shuting down the JACK audio server. JACK ses sunucusunu kapattıktan sonra özel bir kabuk komut dosyasının yürütülüp yürütülmeyeceÄŸi. Execute script after Shu&tdown: Kapatmadan sonra &betiÄŸi çalıştır: Browse for script to be executed after shutting down the JACK audio server JACK ses sunucusu kapatıldıktan sonra yürütülecek komut dosyasına göz atın Command line to be executed after shutting down the JACK audio server JACK ses sunucusu kapatıldıktan sonra yürütülecek komut satırı Statistics İstatistik Whether to capture standard output (stdout/stderr) into messages window Mesaj penceresine standart çıktının (stdout/stderr) yakalanıp yakalanmayacağı &Capture standard output &Standart çıktıyı yakala &XRUN detection regex: &XRUN algılama ifadesi: Regular expression used to detect XRUNs on server output messages Sunucu çıkış mesajlarındaki XRUN'ları tespit etmek için kullanılan normal ifade xrun of at least ([0-9|\.]+) msecs en az ([0-9|\.]+) msn xrun Connections BaÄŸlantılar KXStudio KXStudio Whether to enable JACK D-Bus interface JACK D-Bus arayüzünün etkinleÅŸtirilip etkinleÅŸtirilmeyeceÄŸi &Enable JACK D-Bus interface &JACK D-Bus arayüzünü etkinleÅŸtir Whether to replace Connections with Graph button on the main window BaÄŸlantıların ana penceredeki Grafik düğmesiyle deÄŸiÅŸtirilip deÄŸiÅŸtirilmeyeceÄŸi Replace Connections with &Graph button BaÄŸlantıları &Grafik düğmesiyle deÄŸiÅŸtir 10 10 Patchbay definition file to be activated as connection persistence profile BaÄŸlantı paneli tanım dosyası kalıcı baÄŸlantı profili olarak etkinleÅŸtirilecek Browse for a patchbay definition file to be activated EtkinleÅŸtirilecek bir baÄŸlantı paneli tanım dosyasına göz atın Whether to activate a patchbay definition for connection persistence profile. Kalıcı baÄŸlantı profili için bir baÄŸlantı paneli tanımının etkinleÅŸtirilip etkinleÅŸtirilmeyeceÄŸi. Activate &Patchbay persistence: &BaÄŸlantı paneli kalıcılığını etkinleÅŸtirin: Logging Günlük Messages log file Mesajlar günlük dosyası Browse for the messages log file location Mesajlar günlük dosyası konumuna göz atın Whether to activate a messages logging to file. Günlüğe kaydedilen mesajların etkinleÅŸtirilip etkinleÅŸtirilmeyeceÄŸi. Setup Kurulum Whether to use server synchronous mode Sunucu senkronize modunun kullanılıp kullanılmayacağı &Use server synchronous mode &Sunucu eÅŸzamanlı modunu kullan Please do not touch these settings unless you know what you are doing. Ne yaptığınızı bilmiyorsanız lütfen bu ayarlara dokunmayın. Extra driver options (command line suffix) Ekstra sürücü seçenekleri (komut satırı son eki) Whether to reset all connections when a patchbay definition is activated. Bir baÄŸlantı paneli tanımı etkinleÅŸtirildiÄŸinde tüm baÄŸlantıların sıfırlanıp sıfırlanmayacağı. &Reset all connections on patchbay activation &BaÄŸlantı paneli aktivasyonundaki tüm baÄŸlantıları sıfırla Whether to issue a warning on active patchbay port disconnections. Etkin baÄŸlantı panelinin baÄŸlantı kesintilerinde uyarı verilip verilmeyeceÄŸi. &Warn on active patchbay disconnections &Etkin baÄŸlantı paneli kesintilerinde uyar &Messages log file: &Mesajlar günlük dosyası: Display Görünüm Time Display Zaman Görünümü Transport &Time Code Transport &Zaman Kodu Transport &BBT (bar:beat.ticks) Transport &BBT (ölçü:vuruÅŸ.ticks) Elapsed time since last &Reset Son &Sıfırlamadan bu yana geçen süre Elapsed time since last &XRUN Son &XRUN'dan bu yana geçen süre Sample front panel normal display font Örnek ön panel normal ekran yazı tipi Sample big time display font Örnek büyük zamanlı ekran yazı tipi Big Time display: Büyük Zaman ekranı: Select font for front panel normal display Ön panel normal ekranı için yazı tipini seçin &Font... &Yazı tipi... Select font for big time display Büyük zamanlı gösterim için yazı tipini seçin Normal display: Normal ekran: Whether to enable blinking (flashing) of the server mode (RT) indicator Sunucu modu (RT) göstergesinin yanıp sönmesinin (yanıp sönmesinin) etkinleÅŸtirilip etkinleÅŸtirilmeyeceÄŸi Blin&k server mode indicator Yanıp sönen sunucu modu gösterges&i Custom Özel &Color palette theme: &Renk paleti teması: Custom color palette theme Özel renk paleti teması Wonton Soup DO NOT TRANSLATE Manage custom color palette themes Özel renk paleti temalarını yönetin &Widget style theme: &Widget stili teması: Custom widget style theme Özel widget stili teması Messages Window Mesajlar Penceresi Sample messages text font display Örnek mesaj metin yazı tipi ekranı Select font for the messages text display Mesaj metin ekranı için yazı tipini seçin Whether to keep a maximum number of lines in the messages window Mesaj penceresinde maksimum sayıda satır tutulup tutulmayacağı &Messages limit: &Mesaj sınırı: The maximum number of message lines to keep in view Görünümde tutulacak maksimum mesaj satırı sayısı 100 100 250 250 2500 2500 Connections Window BaÄŸlantılar Penceresi Sample connections view font Örnek baÄŸlantılar görünüm yazı tipi Select font for the connections view BaÄŸlantılar görünümü için yazı tipini seçin &Icon size: &Simge boyutu: The icon size for each item of the connections view BaÄŸlantılar görünümünün her bir öğesi için simge boyutu 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 Whether to enable in-place client/port name editing (rename) Yerinde istemci/baÄŸlantı noktası adı düzenlemenin etkinleÅŸtirilip etkinleÅŸtirilmeyeceÄŸi (yeniden adlandırma) Ena&ble client/port aliases editing (rename) İstemci/&baÄŸlantı noktası takma adlarını düzenlemeyi etkinleÅŸtir (yeniden adlandır) Whether to enable client/port name aliases on the connections window BaÄŸlantılar penceresinde istemci/baÄŸlantı noktası adı takma adlarının etkinleÅŸtirilip etkinleÅŸtirilmeyeceÄŸi E&nable client/port aliases İstemci/baÄŸlantı noktası takma adlarını &etkinleÅŸtir Misc ÇeÅŸitli Other Whether to start JACK audio server immediately on application startup JACK ses sunucusunun uygulama baÅŸlangıcında hemen baÅŸlatılıp baÅŸlatılmayacağı &Start JACK audio server on application startup &Uygulama baÅŸlangıcında JACK ses sunucusunu baÅŸlat Whether to ask for confirmation on application exit Çıkışında onay sorulup sorulmayacağı JACK client/port pretty-name (metadata) display mode JACK istemcisi/baÄŸlantı noktası güzel adı (meta veriler) görüntüleme modu Enable JA&CK client/port pretty-names (metadata) JA&CK istemci/baÄŸlantı noktası güzel adlarını (meta veriler) etkinleÅŸtirin &Confirm application close &Uygulamayı kapatmayı onayla Whether to ask for confirmation on JACK audio server shutdown and/or restart JACK ses sunucusunun kapatılması ve/veya yeniden baÅŸlatılması konusunda onay istenip istenmeyeceÄŸi Confirm server sh&utdown and/or restart S&unucunun kapatılmasını ve/veya yeniden baÅŸlatılmasını onaylayın Whether to keep all child windows on top of the main window Tüm alt pencerelerin ana pencerenin üstünde tutulup tutulmayacağı &Keep child windows always on top &Alt pencereleri her zaman üstte tut Whether to enable the system tray icon Sistem tepsisi simgesinin etkinleÅŸtirilip etkinleÅŸtirilmeyeceÄŸi &Enable system tray icon &Sistem tepsisi simgesini etkinleÅŸtir Whether to start minimized to system tray Sistem tepsisine simge durumunda küçültülüp baÅŸlatılmayacağı Start minimi&zed to system tray Sistem tepsisinde k&üçültülmüş olarak baÅŸlat Whether to save the JACK server command-line configuration into a local file (auto-start) JACK sunucusu komut satırı yapılandırmasının yerel bir dosyaya kaydedilip kaydedilmeyeceÄŸi (otomatik baÅŸlatma) S&ave JACK audio server configuration to: &JACK ses sunucusu yapılandırmasını ÅŸu ÅŸekilde kaydedin: The server configuration local file name (auto-start) Sunucu yapılandırması yerel dosya adı (otomatik baÅŸlatma) .jackdrc .jackdrc Whether to enable ALSA Sequencer (MIDI) support on startup BaÅŸlangıçta ALSA Sıralayıcı (MIDI) desteÄŸinin etkinleÅŸtirilip etkinleÅŸtirilmeyeceÄŸi E&nable ALSA Sequencer support &ALSA Sıralayıcı desteÄŸini etkinleÅŸtirin Buttons Düğmeler Whether to hide the left button group on the main window Ana pencerede sol düğme grubunun gizlenip gizlenmeyeceÄŸi Hide main window &Left buttons Ana pencerede &Soldaki düğmeleri gizle Whether to hide the right button group on the main window Ana pencerede saÄŸdaki düğme grubunun gizlenip gizlenmeyeceÄŸi Hide main window &Right buttons Ana pencerede &SaÄŸdaki düğmeleri gizle Whether to hide the transport button group on the main window Ana pencerede transport düğmesi grubunun gizlenip gizlenmeyeceÄŸi Hide main window &Transport buttons Ana pencerede &Transport düğmelerini gizle Whether to hide the text labels on the main window buttons Ana pencere düğmelerindeki metin etiketlerinin gizlenip gizlenmeyeceÄŸi Hide main window &button text labels Ana pencerede &düğme metinlerini gizle System Sistem Cycle Döngü HPET HPET Don't restrict self connect requests (default) Kendi kendine baÄŸlantı isteklerini kısıtlama (varsayılan) Fail self connect requests to external ports only Yalnızca harici baÄŸlantı noktalarına yapılan kendi kendine baÄŸlantı istekleri baÅŸarısız oldu Ignore self connect requests to external ports only Yalnızca harici baÄŸlantı noktalarına yönelik kendi kendine baÄŸlanma isteklerini yoksay Fail all self connect requests Tüm kendi kendine baÄŸlantı isteklerinin baÅŸarısız Ignore all self connect requests Tüm kendi kendine baÄŸlanma isteklerini yoksay Warning Uyarı Some settings have been changed: "%1" Do you want to save the changes? Bazı ayarlar deÄŸiÅŸtirildi: "%1" DeÄŸiÅŸiklikleri kaydetmek istiyor musunuz? Delete preset: "%1" Are you sure? Ön ayarı sil: "%1" Emin misin? msec ms n/a n/a &Preset Name &Ön Ayar Adı &Server Name &Sunucu adı &Server Path &Sunucu yolu &Driver &Sürücü &Interface &Arayüz Sample &Rate Örnekleme &Hızı &Frames/Period &Çerçeveler/Dönem Periods/&Buffer Dönemler/&Tampon Startup Script BaÅŸlangıç betiÄŸi Post-Startup Script BaÅŸlangıç Sonrası BetiÄŸi Shutdown Script Kapatma betiÄŸi Post-Shutdown Script Kapatma Sonrası BetiÄŸi Active Patchbay Definition Aktif BaÄŸlantı Paneli Tanımı Patchbay Definition files BaÄŸlantı Paneli Tanım dosyaları Messages Log Mesaj Günlüğü Log files Günlük dosyaları Information Bilgi Some settings may be only effective next time you start this application. Bazı ayarlar yalnızca bu uygulamayı bir sonraki baÅŸlatışınızda etkili olabilir. Some settings have been changed. Do you want to apply the changes? Bazı ayarlar deÄŸiÅŸtirildi. DeÄŸiÅŸiklikleri uygulamak istiyor musunuz? &JACK client/port aliases: &JACK istemci/baÄŸlantı noktası takma adları: JACK client/port aliases display mode JACK istemcisi/baÄŸlantı noktası takma adları görüntüleme modu Default Varsayılan First Birinci Second İkinci Whether to show system tray message on main window close Ana pencere kapatıldığında sistem tepsisi mesajının gösterilip gösterilmeyeceÄŸi Sho&w system tray message on close Kapatıldığın&da sistem tepsisi mesajını göster Whether to stop JACK audio server on application exit Uygulama çıkışında JACK ses sunucusunun durdurulup durdurulmayacağı S&top JACK audio server on application exit Uygulama çıkışında JACK ses sunucusunu &durdur Defaults Varsayılanlar &Base font size: &Temel yazı tipi boyutu: Base application font size (pt.) Temel uygulama yazı tipi boyutu (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to enable D-Bus interface D-Bus arayüzünün etkinleÅŸtirilip etkinleÅŸtirilmeyeceÄŸi &Enable D-Bus interface &D-Bus arayüzünü etkinleÅŸtir Number of microseconds to wait between engine processes (dummy) Motor iÅŸlemleri arasında beklenecek mikrosaniye sayısı (dummy) &Name: &İsmi: The JACK Audio Connection Kit sound server name JACK Ses baÄŸlantı araçları sunucusu adı netone DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to restrict to one single application instance (X11) Tek bir uygulama örneÄŸiyle sınırlandırılıp kısıtlanmayacağı (X11) Single application &instance Tek uygulama &örneÄŸi qjackctlSocketForm Socket BaÄŸlantı &Socket &BaÄŸlantısı &Name (alias): &İsim (Takma ad): Socket name (an alias for client name) BaÄŸlantı adı (istemci adı için bir takma ad) Client name (regular expression) İstemci adı (normal ifade) Add plug to socket plug list Soket fiÅŸ listesine baÄŸlantı ekle Add P&lug BaÄŸlantı &Ekle &Plug: BaÄŸ&lantı Noktaları: Port name (regular expression) BaÄŸlantı noktası adı (normal ifade) Socket plug list BaÄŸlantı fiÅŸi listesi Socket Plugs / Ports BaÄŸlantı FiÅŸleri / BaÄŸlantı Noktaları Edit currently selected plug Åžu anda seçili olan fiÅŸi düzenle &Edit &Düzenle Remove currently selected plug from socket plug list Åžu anda seçili olan fiÅŸi baÄŸlantı fiÅŸi listesinden kaldır &Remove &Kaldır &Client: &İstemci: Move down currently selected plug in socket plug list &Down &AÅŸağı Move up current selected plug in socket plug list &Up &Yukarı Enforce only one exclusive cable connection Yalnızca tek bir özel kablo baÄŸlantısına zorunlu kılın E&xclusive &Özel &Forward: &İleri: Forward (clone) all connections from this socket Type Tip Audio socket type (JACK) Ses soketi tipi (JACK) &Audio &Ses MIDI socket type (JACK) MIDI soket tipi (JACK) &MIDI &MIDI MIDI socket type (ALSA) MIDI soket tipi (ALSA) AL&SA &ALSA Plugs / Ports FiÅŸler / BaÄŸlantı Noktaları Error Hata A socket named "%1" already exists. "%1" adlı bir baÄŸlantı zaten mevcut. Warning Uyarı Some settings have been changed. Do you want to apply the changes? Bazı ayarlar deÄŸiÅŸtirildi. DeÄŸiÅŸiklikleri uygulamak istiyor musunuz? Add Plug BaÄŸlantı Ekle Edit Düzenle Remove Kaldır Move Up Yukarı Taşı Move Down AÅŸağı Taşı (None) (Hiçbiri) qjackctlSocketList Output Çıkış Input GiriÅŸ Socket BaÄŸlantı <New> - %1 <Yeni> - %1 Warning Uyarı %1 about to be removed: "%2" Are you sure? %1 kaldırılmak üzere: "%2" Emin misin? %1 <Copy> - %2 %1 <Kopyala> - %2 qjackctlSocketListView Output Sockets / Plugs Çıkış BaÄŸlantıları Input Sockets / Plugs GiriÅŸ BaÄŸlantıları qjackctl-1.0.6/src/translations/PaxHeaders/qjackctl_de.ts0000644000000000000000000000013215174607203020521 xustar0030 mtime=1777536643.521914248 30 atime=1777536643.519914262 30 ctime=1777536643.521914248 qjackctl-1.0.6/src/translations/qjackctl_de.ts0000644000175000001440000063413615174607203020526 0ustar00rncbcusers PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning Warnung Audio hardware probing timed out. QObject (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Usage: %1 [options] [command-and-args] Benutzung: %1 [Optionen] [Kommandos und Argumente] Options: Optionen: Start JACK audio server immediately. Set default settings preset name. Set active patchbay definition file. Set default JACK audio server name. Show help about command line options. Show version information. Displays help on command-line options. Launch command with arguments. [command-and-args] Option -p requires an argument (preset). Option -p benötigt ein Argument (Preset). Option -a requires an argument (path). Option -a benötigt ein Argument (Pfad). Option -n requires an argument (name). Option -n benötigt ein Argument (Name). %1 (%2 frames) Move Rename qjackctlAboutForm About &Close &Schließen About Qt Über Qt Version Version Debugging option enabled. Debugging-Option aktiviert. System tray disabled. Benachrichtigungsfeld deaktiviert. Transport status control disabled. Transportstatuskontrolle abgeschaltet. Realtime status disabled. Echtzeitstatus deaktiviert. XRUN delay status disabled. XRUN Verzögerungsstatus abgeschaltet. Maximum delay status disabled. Status für maximale Verzögerung abgeschaltet. JACK MIDI support disabled. JACK MIDI wird nicht unterstütz. JACK Session support disabled. JACK Session nicht unterstützt. ALSA/MIDI sequencer support disabled. ALSA/MIDI Sequencer wird nicht unterstützt. Using: Qt %1 JACK %1 Website Webseite This program is free software; you can redistribute it and/or modify it Dieses Programm ist freie Software; Sie können es gemäß der under the terms of the GNU General Public License version 2 or later. GNU General Public License weiterverteilen und/oder modifizieren. JACK Port aliases support disabled. Alternativnamen für JACK-Anschlüsse abgeschaltet. D-Bus interface support disabled. Unterstützung der D-Bus-Schnittstelle abgeschaltet. qjackctlClientListView Readable Clients / Output Ports Lesbare Clients/Ausgänge Writable Clients / Input Ports Beschreibbare Clients/Eingänge &Connect &Verbinden Alt+C Connect Alt+V &Disconnect &Trennen Alt+D Disconnect Alt+T Disconnect &All &Alle trennen Alt+A Disconnect All Alt+A Re&name &Umbenennen Alt+N Rename Alt+U &Refresh Au&ffrischen Alt+R Refresh Alt+F qjackctlConnect Warning Warnung This will suspend sound processing from all client applications. Are you sure? Hiermit wird die Klangverarbeitung aller Client-Anwendungen unterbrochen. Sind Sie sicher? qjackctlConnectionsForm Connections Verbindungen Audio Audio Connect currently selected ports Ausgewählte Anschlüsse verbinden &Connect &Verbinden Disconnect currently selected ports Ausgewählte Anschlüsse trennen &Disconnect &Trennen Disconnect all currently connected ports Alle verbundenen Anschlüsse trennen Disconnect &All &Alle trennen Expand all client ports Alle Client-Anschlüsse aufklappen E&xpand All Alle auf&klappen Refresh current connections view Ansicht der bestehenden Verbindungen erneuern &Refresh &Auffrischen MIDI JACK-MIDI ALSA ALSA-MIDI qjackctlConnectorView &Connect &Verbinden Alt+C Connect Alt+V &Disconnect &Trennen Alt+D Disconnect Trennen Disconnect &All &Alle trennen Alt+A Disconnect All Alt+A &Refresh Au&ffrischen Alt+R Refresh Alt+F qjackctlGraphCanvas Connect Disconnect qjackctlGraphForm Graph &Graph &Edit &Bearbeiten &View &Zoom Co&lors S&ort &Help &Connect Connect Connect selected ports &Disconnect &Trennen Disconnect Disconnect selected ports Ctrl+C T&humbview Ctrl+D Cl&ose Close Close this application window Select &All Select All Ctrl+A Select &None Select None Ctrl+Shift+A Select &Invert Select Invert Ctrl+I &Rename... Rename item Rename Item F2 &Find... Find Find nodes Ctrl+F &Menubar Menubar Show/hide the main program window menubar Ctrl+M &Toolbar Toolbar Show/hide main program window file toolbar &Statusbar Statusbar Show/hide the main program window statusbar &Top Left Top left Show the thumbnail overview on the top-left Top &Right Top right Show the thumbnail overview on the top-right Bottom &Left Bottom Left Bottom left Show the thumbnail overview on the bottom-left &Bottom Right Bottom right Show the thumbnail overview on the bottom-right &None None Keiner Hide thumbview Hide the thumbnail overview Text Beside &Icons Text beside icons Show/hide text beside icons &Center Center Center view &Refresh Refresh Refresh view F5 Zoom &In Zoom In Ctrl++ Zoom &Out Zoom Out Ctrl+- Zoom &Fit Zoom Fit Ctrl+0 Zoom &Reset Zoom Reset Ctrl+1 &Zoom Range Zoom Range JACK &Audio... JACK Audio color JACK &MIDI... JACK MIDI JACK MIDI color ALSA M&IDI... ALSA MIDI ALSA MIDI color JACK &CV... JACK CV color JACK &OSC... JACK OSC JACK OSC color &Reset &Zurücksetzen Reset colors Port &Name Port name Sort by port name Port &Title Port title Sort by port title Port &Index Port index Sort by port index &Ascending Ascending Ascending sort order &Descending Descending Descending sort order Repel O&verlapping Nodes Repel nodes Repel overlapping nodes Connect Thro&ugh Nodes Connect Through Nodes Connect through nodes Whether to draw connectors through or around nodes &About... About... About Show information about this application program About &Qt... About Qt... About Qt Über Qt Show information about the Qt toolkit &Undo &Redo Undo last edit action Redo last edit action Zoom Ready Colors - %1 qjackctlMainForm Quit processing and exit Signalverarbeitung und Programm beenden &Quit &Beenden Start the JACK server JACK-Server starten &Start &Start Stop the JACK server JACK-Server beenden S&top S&topp St&atus St&atus... Show information about this application Informationen über diese Anwendung anzeigen Ab&out... &Über... Set&up... &Einstellungen... Show settings and options dialog Dialogfenster für Einstellungen und Optionen anzeigen &Messages &Meldungen... Show/hide the patchbay editor window Steckfeldfenster anzeigen/verbergen &Patchbay Ste&ckfeld... &Connect &Verbinden... JACK server state Status des JACK-Servers JACK server mode Modus des JACK-Servers DSP Load DSP-Last Sample rate Abtastrate XRUN Count (notifications) XRUN Anzahl (Benachrichtigungen) Time display Zeitanzeige Transport state Transportstatus Transport BPM Transport BPM Transport time Transport Zeit Show/hide the session management window Fenster für Sitzungsmanagement anzeigen/verbergen Show/hide the messages log/status window Meldungsfenster anzeigen/verbergen Show/hide the graph window Show/hide the connections window Backward transport Transport rückwärts &Backward &Rückwärts Forward transport Transport vorwärts &Forward &Vorwärts Rewind transport Transport zurückspulen &Rewind &Zurückspulen Stop transport rolling Transportvorgang anhalten Pa&use Pa&usieren Start transport rolling Transportvorgang starten &Play Abs&pielen Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. ALSA Sequencer konnte nicht als Client geöffnet werden. Das ALSA-MIDI-Steckfeld wird nicht verfügbar sein. D-BUS: Service is available (%1 aka jackdbus). D-BUS: Dienst ist verfügbar (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-Bus: Dienst ist nicht verfügbar (%1 aka jackdbus). Information Information Don't show this message again Diese Meldung nicht mehr anzeigen Warning Warnung JACK is currently running. Do you want to terminate the JACK audio server? Der JACK-Server läuft noch. Wollen Sie diesen beenden? %1 is about to terminate. Are you sure? successfully erfolgreich with exit status=%1 mit Rückgabewert = %1 Could not start JACK. Maybe JACK audio server is already started. Konnte JACK nicht starten. Möglicherweise läuft der JACK-Server schon. Could not load preset "%1". Retrying with default. Konnte Einstellung "%1" nicht laden. Versuche erneut mit Voreinstellung. Could not load default preset. Sorry. Konnte leider die Voreinstellung nicht laden. Startup script... Start-Skript... Startup script terminated Start-Skript beendet D-BUS: JACK server is starting... D-BUS: JACK-Server startet... D-BUS: JACK server could not be started. Sorry D-BUS: JACK-Server konnte nicht gestartet werden. Tut mir Leid JACK is starting... JACK startet... Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Einige Client-Audio-Anwendungen sind noch aktiv und verbunden. Wollen Sie den JACK-Server anhalten? JACK is stopping... JACK fährt herunter... Shutdown script... Herunterfahr-Skript... The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Programm läuft weiter sichtbar als Symbol im Benachrichtigungsfeld. Zum Beenden des Programms, wählen Sie bitte "Beenden" im Kontextmenü des Benachrichtigungsfeldsymbols. Don't ask this again Nicht nochmal nachfragen Shutdown script terminated Herunterfahr-Skript beendet D-BUS: JACK server is stopping... D-BUS: JACK-Server fährt herunter... D-BUS: JACK server could not be stopped. Sorry D-BUS: JACK-Server konnte nicht angehalten werden. Tut mir Leid Post-shutdown script... Nach-Herunterfahr-Skript... Post-shutdown script terminated Nach-Herunterfahr-Skript beendet JACK was started with PID=%1. JACK wurde mit PID = %1 gestartet. The preset aliases have been changed: "%1" Do you want to save the changes? Die Alternativbezeichnungen für Voreinstellungen wurden verändert: "%1" Änderungen speichern? D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: JACK-Server wurde gestartet (%1 aka jackdbus). JACK is being forced... JACK wird gezwungen... JACK was stopped JACK wurde angehalten D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: JACK-Server wurde angehalten (%1 aka jackdbus). Error Fehler Transport BBT (bar.beat.ticks) Transport BBT (bar.beat.ticks) Transport time code Transport Timecode Elapsed time since last reset Seit dem letzten Zurücksetzen vergangene Zeit Elapsed time since last XRUN Seit dem letzten XRUN vergangene Zeit Patchbay reset. Steckfeld zurückgesetzt. Could not load active patchbay definition. "%1" Disabled. Konnte aktive Steckfelddefinition nicht laden. Patchbay activated. Steckfeld aktiviert. Patchbay deactivated. Steckfeld deaktiviert. Statistics reset. Statistik zurückgesetzt. msec ms JACK connection graph change. Schaubild der JACK-Verbindungen geändert. XRUN callback (%1). Buffer size change (%1). Puffergröße geändert (%1). Shutdown notification. Benachrichtigung zum Herunterfahren. Freewheel started... Freewheel exited. Could not start JACK. Sorry. Konnte JACK nicht starten. JACK has crashed. JACK ist abgestürzt. JACK timed out. JACK Zeitüberschreitung. JACK write error. JACK Schreibfehler. JACK read error. JACK Lesefehler. Unknown JACK error (%d). Unbekannter JACK-Fehler (%d). JACK property change. JACK-Eigenschaft geändert. ALSA connection graph change. Schaubild der ALSA-Verbindungen geändert. JACK active patchbay scan JACK aktive Steckfeldsuche ALSA active patchbay scan ALSA aktive Steckfeldsuche JACK connection change. JACK-Verbindung geändert. ALSA connection change. ALSA-Verbindung geändert. checked überprüft connected verbunden disconnected getrennt failed fehlgeschlagen A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Zur Zeit ist eine Steckfeldkonfiguration aktiv, die wahrscheinlich diese Verbindung rückgängig macht: %1 -> %2 Wollen Sie diese Steckfeldverbindung entfernen? Overall operation failed. Gesamtbetrieb schlug fehl. Invalid or unsupported option. Ungültige oder nicht unterstützte Option. Client name not unique. Name des Clients nicht einzigartig. Server is started. Server ist gestartet. Unable to connect to server. Verbindungsaufnahme zum Server gescheitert. Server communication error. Server-Kommunikationsfehler. Client does not exist. Client existiert nicht. Unable to load internal client. Interner Client konnte nicht geladen werden. Unable to initialize client. Client konnte nicht initialisiert werden. Unable to access shared memory. Kein Zugriff auf Shared Memory möglich. Client protocol version mismatch. Unpassende Client-Protokollversion Could not connect to JACK server as client. - %1 Please check the messages window for more info. Keine Verbindungsaufnahme als Client zum JACK-Server möglich. - %1 Bitte sehen Sie im Meldungsfenster nach weiteren Informationen. Server configuration saved to "%1". Serverkonfiguration nach "%1" gespeichert. Client activated. Client aktiviert Post-startup script... Nach-Start-Skript... Post-startup script terminated Nach-Start-Skript beendet Command line argument... Kommandozeilenargument... Command line argument started Kommandozeilenargument gestartet Client deactivated. Client deaktiviert. Transport rewind. Transport zurückspulen. Transport backward. Transport zurück. Starting Startet Transport start. Transport starten. Stopping Stoppe Transport stop. Transport anhalten. Transport forward. Transport vorwärts. Stopped Steht %1 (%2%) %1 (%2 %) %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 Frames Yes Ja No Nein FW RT RT Rolling Rollt Looping Schleifen ausführend %1 msec %1 ms XRUN callback (%1 skipped). XRUN callback (%1 übersprungen). Started Läuft Active Aktiv Activating Aktivierend Inactive Inaktiv &Hide &Verbergen D-BUS: GetParameterConstraint('%1'): %2. (%3) Mi&nimize Mi&nimieren S&how An&zeigen Rest&ore Neu&laden &Stop &Stopp &Reset &Zurücksetzen &Presets &Voreinstellungen &Versioning &Versionierung Re&fresh Au&ffrischen S&ession S&itzung... &Load... &Laden... &Save... &Speichern... Save and &Quit... Speichern und &beenden... Save &Template... &Vorlage speichern... &Connections &Verbindungen Patch&bay Steck&feld &Graph &Transport &Transport Server settings will be only effective after restarting the JACK audio server. Die Server-Einstellungen werden erst nach einem Neustart des JACK-Servers wirksam. Do you want to restart the JACK audio server? D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) Some settings will be only effective the next time you start this program. Einige Einstellungen werden erst nach einem Neustart des Programms wirksam. qjackctlMessagesStatusForm Messages / Status &Messages &Meldungen Messages log Meldungsprotokoll Messages output log Meldungsausgabeprotokoll &Status &Status Status information Statusinformationen Statistics since last server startup Statistik seit dem letzten Serverstart Description Beschreibung Value Wert Reset XRUN statistic values Daten der XRUN-Statistik zurücksetzen Re&set &Zurücksetzen Refresh XRUN statistic values Daten der XRUN-Statistik erneuern &Refresh &Auffrischen Server name Servername Server state Serverstatus DSP Load DSP-Last Sample Rate Abtastrate Buffer Size Puffergröße Realtime Mode Echtzeit-Modus Transport state Transportstatus Transport Timecode Transport Timecode Transport BBT Transport BBT Transport BPM Transport BPM XRUN count since last server startup Anzahl XRUNs seit dem letzten Serverstart XRUN last time detected Zeitpunkt der letzten XRUN-Beobachtung XRUN last Letzter XRUN XRUN maximum XRUN Maximum XRUN minimum XRUN Minimum XRUN average XRUN Durchschnitt XRUN total XRUN Summe Maximum scheduling delay Maximale Zeitverzögerung Time of last reset Zeitpunkt der letzten Zurücksetzung Logging stopped --- %1 --- Protokollierung angehalten --- %1 --- Logging started --- %1 --- Protokollierung gestartet --- %1 --- qjackctlPaletteForm Color Themes Name Current color palette name Save current color palette name Save Delete current color palette name Delete Palette Current color palette Generate: Base color to generate palette Reset all current palette colors Reset Import a custom color theme (palette) from file Import... Export a custom color theme (palette) to file Export... Show Details Import File - %1 Palette files (*.%1) Save Palette - %1 All files (*.*) Warning - %1 Could not import from file: %1 Sorry. Export File - %1 Some settings have been changed. Do you want to discard the changes? Some settings have been changed: "%1". Do you want to save the changes? qjackctlPaletteForm::PaletteModel Color Role Active Aktiv Inactive Inaktiv Disabled qjackctlPatchbay Warning Warnung This will disconnect all sockets. Are you sure? Diese Aktion wird alle Anschlüsse trennen. Sind Sie sicher? qjackctlPatchbayForm Patchbay Move currently selected output socket down one position Ausgewählten Ausgangsanschlus eine Position nach unten verschieben Down Ab Create a new output socket Einen neuen Ausgangsanschlus anlegen Add... Hinzufügen... Edit currently selected input socket properties Eigenschaften des gewählten Eingangsanschlusses bearbeiten Edit... Bearbeiten... Move currently selected output socket up one position Ausgewählten Ausgangsanschluss eine Position nach oben verschieben Up Auf Remove currently selected output socket Ausgewählten Ausgangsanschluss entfernen Remove Entfernen Duplicate (copy) currently selected output socket Dupliziere den gewählten Ausgangsanschluss Copy... Kopieren... Remove currently selected input socket Ausgewählten Eingangsanschluss entfernen Duplicate (copy) currently selected input socket Dupliziere den gewählten Eingangsanschluss Create a new input socket Einen neuen Eingangsanschluss anlegen Edit currently selected output socket properties Eigenschaften des gewählten Ausgangsanschlusses bearbeiten Connect currently selected sockets Gewählte Anschlüsse miteinander verbinden &Connect &Verbinden Disconnect currently selected sockets Verbindung zwischen den gewählten Anschlüssen trennen &Disconnect &Trennen Disconnect all currently connected sockets Alle verbundenen Anschlüsse trennen Disconnect &All &Alle trennen Expand all items Alle Einträge aufklappen E&xpand All Alle auf&klappen Refresh current patchbay view Steckfeldansicht auffrischen &Refresh Auf&frischen Create a new patchbay profile Neues Steckfeldprofil anlegen &New &Neu Load patchbay profile Steckfeldprofil laden &Load... &Laden... Save current patchbay profile Aktuelles Steckfeldprofil speichern &Save... &Speichern... Current (recent) patchbay profile(s) Aktuelle (zuletzt verwendete) Steckfeldprofile Toggle activation of current patchbay profile Aktivierung des aktuellen Steckfeldprofils umschalten Acti&vate A&ktivieren Warning Warnung The patchbay definition has been changed: "%1" Do you want to save the changes? Die Steckfelddefinition wurde verändert: "%1" Wollen Sie die Änderungen speichern? %1 [modified] %1 [verändert] Untitled%1 Unbenannt%1 Error Fehler Could not load patchbay definition file: "%1" Konnte Steckfelddefinitionsdatei nicht laden: "%1" Could not save patchbay definition file: "%1" Konnte Steckfelddefinitionsdatei nicht speichern: "%1" New Patchbay definition Neue Steckfelddefinition Create patchbay definition as a snapshot of all actual client connections? Steckfelddefinitionsdatei als Schnappschuss der aktuell vorhandenen Verbindungen erstellen? Load Patchbay Definition Steckfelddefinition laden Patchbay Definition files Steckfelddefinitionsdateien Save Patchbay Definition Speichere Steckfelddefinition active aktiv qjackctlPatchbayView Add... Hinzufügen... Edit... Bearbeiten... Copy... Kopieren... Remove Entfernen Exclusive Exklusiv Forward Weiterleiten (None) (Keine) Move Up Nach oben Move Down Nach unten &Connect &Verbinden Alt+C Connect Alt+V &Disconnect &Trennen Alt+D Disconnect Alt+T Disconnect &All &Alle trennen Alt+A Disconnect All Alt+A &Refresh Auf&frischen Alt+R Refresh Alt+F qjackctlSessionForm Session Load session Sitzung laden &Load... &Laden... Recent session Letzte Sitzung &Recent &Zuletzt Save session Sitzung speichern &Versioning &Versionierung Re&fresh Au&ffrischen Infra-clients / commands Infra-client Infra-command Add infra-client &Add &Hinzufügen Edit infra-client &Edit &Bearbeiten Remove infra-client Re&move En&tfernen &Save... &Speichern... Update session Sitzung aktualisieren Session clients / connections Client / Ports Client/Eingänge UUID UUID Command Kommando &Save &Speichern Load Session Sitzung laden Session directory Sitzungsverzeichnis Save Session Sitzung speichern and Quit und beenden Template Vorlage &Clear &Löschen Warning Warnung A session could not be found in this folder: "%1" Eine Sitzung konnte in diesem Verzeichnis nicht gefunden werden: "%1" %1: loading session... %1: lade Sitzung... %1: load session %2. %1: lade Sitzung %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Es existiert bereits eine Sitzung in diesem Verzeichnis: "%1" Soll diese Sitzung überschrieben werden? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Dieses Verzeichnis existiert bereits und ist nicht leer: "%1" Soll das existierende Verzeichnis überschrieben werden? %1: saving session... %1: speichere Sitzung... %1: save session %2. %1: speichere Sitzung %2. New Client Neuer Client Save and &Quit... Speichern und &beenden... Save &Template... &Vorlage speichern... qjackctlSessionInfraClientItemEditor Infra-command qjackctlSessionSaveForm Session &Name: &Name: Session name &Directory: Session directory Sitzungsverzeichnis Browse for session directory ... ... Save session versioning Sitzungsversionierung speichern &Versioning &Versionierung Warning Warnung Session directory does not exist: "%1" Do you want to create it? Session Directory qjackctlSetupForm Settings Einstellungen Preset &Name: &Benennung: Settings preset name Benennung der Einstellung (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Save settings as current preset name Einstellungen mit aktueller Benennung speichern &Save &Speichern Delete current settings preset Aktuelle Einstellung löschen &Delete &Löschen jackd DO NOT TRANSLATE jackdmp DO NOT TRANSLATE jackstart DO NOT TRANSLATE Driv&er: Trei&ber: The audio backend driver interface to use Zu nutzender Audio-Schnittstellentreiber dummy DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 sun DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 oss DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 alsa DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 portaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 coreaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 firewire DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Parameters Parameter MIDI Driv&er: MIDI-&Treiber: The ALSA MIDI backend driver to use Zu nutzender ALSA-MIDI-Treiber none keiner raw DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 seq DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Time in seconds that client is delayed after server startup Zeitverzögerung für den Client nach Start des Servers Latency: Latenz: Output latency in milliseconds, calculated based on the period, rate and buffer settings Ausgangslatenz in Millisekunden. Berechnung basiert auf Perioden-, Abtastraten- und Puffereinstellungen Use realtime scheduling Echtzeitverarbeitung nutzen &Realtime Echt&zeit Do not attempt to lock memory, even if in realtime mode Keinen Arbeitsspeicher sperren, auch nicht im Echtzeitmodus No Memory Loc&k Spei&cher nicht sperren Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Arbeitsspeicher von gängigen Bibliotheken (GTK+, Qt, FLTK, Wine) entsperren &Unlock Memory S&peicher entsperren Ignore xruns reported by the backend driver Xruns des Schnittstellentreibers ignorieren So&ft Mode So&ft-Modus Provide output monitor ports Anschlüsse zur Ausgangsüberwachung anbieten &Monitor &Überwachung Force 16bit mode instead of failing over 32bit (default) 16-Bit-Modus erzwingen statt versuchsweiser Aktivierung des 32-Bit-Modus (voreingestellt) Force &16bit &16 Bit erzwingen Enable hardware metering on cards that support it Hardware-Messung bei Karten aktivieren, die diese unterstützen H/&W Meter H/W &Messung Ignore hardware period/buffer size Ignoriere Periode/Puffergröße der Hardware &Ignore H/W &Ignoriere H/W Whether to give verbose output on messages Ausführliche Meldungen anzeigen &Verbose messages Aus&führliche Meldungen &Output Device: A&usgabegerät: &Interface: S&chnittstelle: Maximum input audio hardware channels to allocate Maximum belegbarer Audio-Hardware-Eingänge &Audio: &Audio: Dit&her: External output latency (frames) Externe Ausgangslatenz (Frames) &Input Device: Eingangsger&ät: Provide either audio capture, playback or both Entweder Audio-Aufnahme, -Wiedergabe oder beides anbieten Duplex Duplex Capture Only Nur Aufnahme Playback Only Nur Wiedergabe The PCM device name to use Name des genutzten PCM-Gerätes hw:0 hw:0 plughw:0 plughw:0 /dev/audio /dev/audio /dev/dsp /dev/dsp > > Alternate input device for capture Alternativer Geräteeingang für Aufnahme Maximum output audio hardware channels to allocate Maximum der belegbaren Audio-Hardware-Ausgänge Alternate output device for playback Alternatives Ausgabegerät für Wiedergabe External input latency (frames) Externe Eingangslatenz (Frames) Set dither mode Dither-Modus festlegen None Keiner Rectangular Rechteck Shaped Hüllkurve Triangular Dreieck Number of periods in the hardware buffer Anzahl der Perioden im Hardware-Puffer Server &Prefix: Server &Präfix: Server path (command line prefix) Serverpfad (Kommandozeilen Präfix) Priorit&y: Priorit&ät: &Frames/Period: &Frames/Periode: Frames per period between process() calls Frames pro Periode zwischen process() Aufrufen 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Port Ma&ximum: Ma&ximaler Port: &Channels: &Kanäle: 21333 21333 Sample rate in frames per second Abtastrate in Frames pro Sekunde 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Scheduler priority when running realtime Priorität für die Echtzeitsteuerung &Word Length: Wortl&änge: Periods/&Buffer: Per&ioden/Puffer: Word length Wortlänge Maximum number of ports the JACK server can manage Maximum an Anschlüssen, die der JACK-Server verarbeiten kann &Wait (usec): &Warten (µs) Sample &Rate: Abtast&rate: Maximum number of audio channels to allocate Maximale Anzahl der belegbaren Audiokanäle festlegen &Timeout (msec): &Timeout (ms): Set client timeout limit in milliseconds Timeout-Limitierung für Clients festlegen; Angabe in Millisekunden 200 200 500 500 1000 1000 2000 2000 5000 5000 &Channels I/O: &Kanäle I/O: &Latency I/O: &Latenz I/O: Server Suffi&x: Server Suffi&x: Start De&lay: Startver&zögerung: secs s 0 msecs 0 ms Whether to restrict client self-connections Advanced Clear settings of current preset name Clea&r Cloc&k source: Clock source S&elf connect mode: Options Optionen Scripting Skript-Steuerung Whether to execute a custom shell script before starting up the JACK audio server. Festlegen, ob ein angepasstes Shell-Skript vor dem Start des JACK-Servers ausgeführt werden soll Execute script on Start&up: Skript &beim Start ausführen: Whether to execute a custom shell script after starting up the JACK audio server. Festlegen, ob ein angepasstes Shell-Skript nach dem Start des JACK-Servers ausgeführt werden soll. Execute script after &Startup: Skript &nach Start ausführen: Whether to execute a custom shell script before shuting down the JACK audio server. Festlegen, ob ein angepasstes Shell-Skript vor dem Herunterfahren des JACK-Servers ausgeführt werden soll Execute script on Shut&down: Skript beim &Herunterfahren ausführen: Command line to be executed before starting up the JACK audio server Vor dem Starten des JACK-Servers ausgeführte Kommandozeile Scripting argument meta-symbols Meta-Symbole der Skriptargumente Browse for script to be executed before starting up the JACK audio server Skript auswählen, das vor dem Starten des JACK-Servers ausgeführt wird ... ... Command line to be executed after starting up the JACK audio server Nach dem Starten des JACK-Servers ausgeführte Kommandozeile Browse for script to be executed after starting up the JACK audio server Skript auswählen, das nach dem Starten des JACK-Servers ausgeführt wird Browse for script to be executed before shutting down the JACK audio server Skript auswählen, das vor dem Herunterfahren des JACK-Servers ausgeführt wird Command line to be executed before shutting down the JACK audio server Vor dem Herunterfahren des JACK-Servers ausgeführte Kommandozeile Whether to execute a custom shell script after shuting down the JACK audio server. Festlegen, ob ein angepasstes Shell-Skript nach dem Herunterfahren des JACK-Servers ausgeführt werden soll. Execute script after Shu&tdown: Skript nach dem Herunter&fahren ausführen: Browse for script to be executed after shutting down the JACK audio server Skript auswählen, das nach dem Herunterfahren des JACK-Servers ausgeführt wird Command line to be executed after shutting down the JACK audio server Nach dem Herunterfahren des JACK-Servers ausgeführte Kommandozeile Statistics Statistik Whether to capture standard output (stdout/stderr) into messages window Standardausgabe (stdout/stderr) in Meldungsfenster umleiten &Capture standard output Standardausgabe &umleiten &XRUN detection regex: Regular expression used to detect XRUNs on server output messages Regulärer Ausdruck zur Erkennung von XRUNs in vom Server gesendeten Meldungen xrun of at least ([0-9|\.]+) msecs xrun mit mindestens ([0-9|\.]+) ms Connections Verbindungen KXStudio Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface Whether to replace Connections with Graph button on the main window Replace Connections with &Graph button 10 10 Patchbay definition file to be activated as connection persistence profile Steckfelddefinitionsdatei als beständiges Verbindungsprofil aktivieren Browse for a patchbay definition file to be activated Eine Steckfelddefinitionsdatei zum aktivieren wählen Whether to activate a patchbay definition for connection persistence profile. Ein beständiges Verbindungsprofil für das Steckfeld aktivieren. Activate &Patchbay persistence: Steck&feldkonfiguration hat Bestand: Logging Protokollierung Messages log file Protokolldatei für Meldungen Browse for the messages log file location Speicherort für Protokolldatei wählen Whether to activate a messages logging to file. Protokollierung der Meldungen in eine Datei festlegen. Setup Whether to use server synchronous mode &Use server synchronous mode Please do not touch these settings unless you know what you are doing. Extra driver options (command line suffix) Sonderoptionen für Treiber (Kommandozeilen Präfix) Whether to reset all connections when a patchbay definition is activated. Alle Verbindungen zurücksetzen, wenn eine Steckfeldkonfiguration aktiviert wird &Reset all connections on patchbay activation Alle &Verbindungen bei Steckfaktivierung zurücksetzen Whether to issue a warning on active patchbay port disconnections. Warnung anzeigen, wenn eine aktive Verbindung getrennt wird &Warn on active patchbay disconnections Beim &Trennen aktiver Verbindungen warnen &Messages log file: &Protokolldatei: Display Anzeige Time Display Zeitanzeige Transport &Time Code Transport &BBT (bar:beat.ticks) Elapsed time since last &Reset Seit dem letzten &Zurücksetzen verstrichene Zeit Elapsed time since last &XRUN Seit dem letzten &XRUN verstrichene Zeit Sample front panel normal display font Beispielhafte Darstellung der normalen Anzeige Sample big time display font Beispielhafte Darstellung der großen Anzeige Big Time display: Große Zeitanzeige: Select font for front panel normal display Schriftart für normale Anzeige wählen &Font... &Schriftart... Select font for big time display Schriftart für große Zeitanzeige wählen Normal display: Normale Anzeige: Whether to enable blinking (flashing) of the server mode (RT) indicator Realtime-Indikator (RT) für Servermodus blinkend darstellen Blin&k server mode indicator Ser&vermodus blinkend darstellen Custom &Color palette theme: Custom color palette theme Wonton Soup DO NOT TRANSLATE Manage custom color palette themes &Widget style theme: Custom widget style theme Messages Window Meldungsfenster Sample messages text font display Beispielhafte Darstellung des Textes im Meldungsfenster Select font for the messages text display Schriftart für Text im Meldungsfenster wählen Whether to keep a maximum number of lines in the messages window Maximale Anzahl der im Meldungsfenster angezeigten Zeilen festlegen &Messages limit: &Meldungsmaximum: The maximum number of message lines to keep in view Maximale Anzahl der Nachrichten im Meldungsfenster 100 100 250 250 2500 2500 Connections Window Verbindungsübersicht Sample connections view font Beispielhafte Darstellung der Schrift in der Verbindungsübersicht Select font for the connections view Schriftart für Verbindungsübersicht wählen &Icon size: &Symbolgröße: The icon size for each item of the connections view Größe der einzelnen Symbole in der Verbindungsübersicht 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 Whether to enable in-place client/port name editing (rename) Direktes Bearbeiten der Client/Anschluss-Alternativbezeichnung (Alias) erlauben Ena&ble client/port aliases editing (rename) Bearbeiten von &Deckbezeichnungen für Client/Anschlüsse Whether to enable client/port name aliases on the connections window Verwendung von Deckbezeichnungen (Alias) für Anschlüsse in der Verbindungsübersicht erlauben E&nable client/port aliases Dec&kbezeichnungen (Alias) für Client/Anschlüsse Misc Verschiedenes Other Weiteres Whether to start JACK audio server immediately on application startup JACK-Server unmittelbar bei Anwendungsstart starten &Start JACK audio server on application startup JACK-&Server bei Anwendungsstart starten Whether to ask for confirmation on application exit Vor dem Beenden des JACK-Servers nachfragen JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) &Confirm application close Beenden der An&wendung bestätigen Whether to ask for confirmation on JACK audio server shutdown and/or restart Confirm server sh&utdown and/or restart Whether to keep all child windows on top of the main window Alle Kindfenster oberhalb des Hauptfensters halten &Keep child windows always on top &Kindfenster immer oben belassen Whether to enable the system tray icon Anwendungssymbol im Benachrichtigungsfeld anzeigen &Enable system tray icon S&ymbol im Benachrichtigungsfeld anzeigen Whether to start minimized to system tray Anwendung minimiert als Symbol im Benachrichtigungsfeld starten Start minimi&zed to system tray Minimiert im &Benachrichtigungsfeld starten Whether to save the JACK server command-line configuration into a local file (auto-start) Kommandozeilenkonfiguration zum Starten des JACK-Servers in einer lokalen Datei speichern (auto-start) S&ave JACK audio server configuration to: Konfi&guration für JACK-Server speichern unter: The server configuration local file name (auto-start) Name der lokal gespeicherten Serverkonfigurationsdatei (auto-start) .jackdrc .jackdrc Whether to enable ALSA Sequencer (MIDI) support on startup Unterstützung für den ALSA Sequencer (MIDI) beim Programmstart aktivieren E&nable ALSA Sequencer support Unterstützung für ALSA-Se&quencer bereitstellen Buttons Schaltflächen Whether to hide the left button group on the main window Linke Schaltflächengruppe im Hauptfenster verbergen Hide main window &Left buttons &Linke Schaltflächen des Hauptfensters verbergen Whether to hide the right button group on the main window Rechte Schaltflächengruppe im Hauptfenster verbergen Hide main window &Right buttons &Rechte Schaltflächen des Hauptfensters verbergen Whether to hide the transport button group on the main window Schaltflächen der Transportsteuerung im Hauptfenster verbergen Hide main window &Transport buttons Schaltflächen für &Transportsteuerung verbergen Whether to hide the text labels on the main window buttons Beschriftung der Schaltflächen im Hauptfenster verbergen Hide main window &button text labels Besch&riftung der Schaltflächen verbergen System Cycle HPET Don't restrict self connect requests (default) Fail self connect requests to external ports only Ignore self connect requests to external ports only Fail all self connect requests Ignore all self connect requests Warning Warnung Some settings have been changed: "%1" Do you want to save the changes? Einige Einstellungen wurden verändert: "%1" Wollen Sie diese speichern? Delete preset: "%1" Are you sure? Voreinstellung löschen: "%1" Sind Sie sicher? msec ms n/a n/a &Preset Name Benennung der &Voreinstellung &Server Name &Servername &Server Path &Serverpfad &Driver Trei&ber &Interface Sc&hnittstelle Sample &Rate Abtast&rate &Frames/Period &Frames/Periode Periods/&Buffer Perioden/&Puffer Startup Script Start-Skript Post-Startup Script Nach-Start-Skript Shutdown Script Herunterfahr-Skript Post-Shutdown Script Nach-Herunterfahr-Skript Active Patchbay Definition Aktive Steckfelddefinition Patchbay Definition files Steckfelddefinitionsdateien Messages Log Meldungsprotokoll Log files Protokolldateien Information Information Some settings may be only effective next time you start this application. Some settings have been changed. Do you want to apply the changes? Einige Einstellungen wurden verändert. Wollen Sie diese übernehmen? &JACK client/port aliases: Deckbezeichnungen bei &JACK-Anschlüssen: JACK client/port aliases display mode Anzeigemodus für die JACK-Client/Anschlussbenennung Default Voreinstellung First Erster Second Zweiter Whether to show system tray message on main window close Nachrichten des Benachrichtigungsfelds beim Schließen des Hauptfensters anzeigen Sho&w system tray message on close &Nachrichten des Benachrichtigungsfelds beim Beenden anzeigen Whether to stop JACK audio server on application exit JACK Audio-Server bei Programmbeendung anhalten S&top JACK audio server on application exit JACK Audio-&Server bei Programmbeendung anhalten Defaults Voreinstellungen &Base font size: &Basisschriftgröße: Base application font size (pt.) Generelle Schriftgröße (pt.) für die Anwendung festlegen 6 6 7 7 8 8 9 9 11 11 12 12 net DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to enable D-Bus interface D-Bus-Schnittstelle aktivieren &Enable D-Bus interface D-Bus-S&chnittstelle aktivieren Number of microseconds to wait between engine processes (dummy) Wartezeit in Mikrosekunden zwischen Verarbeitungsprozessen (dummy) &Name: &Name: The JACK Audio Connection Kit sound server name Name des JACK Audio Connection Kit Soundservers netone DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to restrict to one single application instance (X11) Festlegen, ob nur eine Anwendungsinstanz (X11) gestartet werden darf Single application &instance Nur eine Anwendungsinstan&z zulassen qjackctlSocketForm Socket Anbindung &Socket &Anschluss &Name (alias): &Name (Alias): Socket name (an alias for client name) Anschlussbenennung (Alias für Name des Clients) Client name (regular expression) Name des Clients (Regulärer Ausdruck) Add plug to socket plug list Füge Anschluss zur Liste hinzu Add P&lug &Anschluss hinzufügen &Plug: A&nschluss: Port name (regular expression) Anschlussbezeichnung (Regulärer Ausdruck) Socket plug list Anschlussliste Socket Plugs / Ports Socket-Anschlüsse Edit currently selected plug Ausgewählten Anschluss bearbeiten &Edit &Bearbeiten Remove currently selected plug from socket plug list Ausgewählten Anschluss von der Liste entfernen &Remove En&tfernen &Client: &Client: Move down currently selected plug in socket plug list Ausgewählten Anschluss in Liste nach unten schieben &Down A&b Move up current selected plug in socket plug list Ausgewählten Anschluss in Liste nach oben schieben &Up Au&f Enforce only one exclusive cable connection Erzwinge eine singuläre Kabelverbindung E&xclusive E&xklusiv &Forward: &Weiterleiten: Forward (clone) all connections from this socket Alle Verbindungen dieses Anschlusses weiterleiten (klonen) Type Typ Audio socket type (JACK) JACK-Audio-Anbindung &Audio JACK-&Audio MIDI socket type (JACK) JACK-MIDI-Anbindung &MIDI JACK-&MIDI MIDI socket type (ALSA) ALSA-MIDI-Anbindung AL&SA AL&SA-MIDI Plugs / Ports Anschlüsse Error Fehler A socket named "%1" already exists. Socket mit dem Namen "%1" existiert bereits. Warning Warnung Some settings have been changed. Do you want to apply the changes? Einige Einstellungen wurden verändert. Wollen Sie diese übernehmen? Add Plug Anschluss hinzufügen Edit Bearbeiten Remove Entfernen Move Up Auf Move Down Ab (None) (Keiner) qjackctlSocketList Output Ausgang Input Eingang Socket Anbindung <New> - %1 <Neu> - %1 Warning Warnung %1 about to be removed: "%2" Are you sure? %1 soll entfernt werden: "%2" Sind Sie sicher? %1 <Copy> - %2 %1 <Kopieren> - %2 qjackctlSocketListView Output Sockets / Plugs Ausgangsanschlüsse Input Sockets / Plugs Eingangsanschlüsse qjackctl-1.0.6/src/translations/PaxHeaders/qjackctl_nl.ts0000644000000000000000000000013215174607203020542 xustar0030 mtime=1777536643.523914233 30 atime=1777536643.523914233 30 ctime=1777536643.523914233 qjackctl-1.0.6/src/translations/qjackctl_nl.ts0000644000175000001440000063321615174607203020545 0ustar00rncbcusers PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning Opgelet Audio hardware probing timed out. QObject (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Option -p requires an argument (preset). Optie -p vereist een argument (preset). Usage: %1 [options] [command-and-args] Gebruik: %1 [opties] [commandos-en-args] Options: Opties: Start JACK audio server immediately. Set default settings preset name. Set active patchbay definition file. Set default JACK audio server name. Show help about command line options. Show version information. Displays help on command-line options. Launch command with arguments. [command-and-args] Option -a requires an argument (path). Optie -a vereist een argument (pad). Option -n requires an argument (name). Optie -n vereist een argument (naam). %1 (%2 frames) Move Rename qjackctlAboutForm About About Qt Over Qt &Close &Sluiten Version Versie Debugging option enabled. Debug optie geactiveerd. System tray disabled. Systeem pictogram uitgeschakeld. Transport status control disabled. Transport status controle uitgeschakeld. Realtime status disabled. Realtime status uitgeschakeld. XRUN delay status disabled. XRUN delay status uitgeschakeld. Maximum delay status disabled. Maximum delay status uitgeschakeld. JACK Session support disabled. Jack Sessie ondersteuning uitgeschakeld. ALSA/MIDI sequencer support disabled. ALSA/MIDI sequencer ondersteuning uitgeschakeld. Using: Qt %1 JACK %1 Website Webstek This program is free software; you can redistribute it and/or modify it Dit programma is vrije software; je mag het doorgeven en/of aanpassen under the terms of the GNU General Public License version 2 or later. volgens de bepalingen in de GNU-General Public Licentie versie 2 of later. JACK MIDI support disabled. JACK MIDI ondersteuning uitgeschakeld. JACK Port aliases support disabled. JACK Poort alias ondersteuning uitgeschakeld. D-Bus interface support disabled. D-Bus interface ondersteuning uitgeschakeld. qjackctlClientListView &Connect &Verbinden Alt+C Connect Koppelen Alt+K &Disconnect Af&Koppelen Alt+D Disconnect Afkoppelen Alt+K Disconnect &All &Alles afkoppelen Alt+A Disconnect All Alles afkoppelen Alt+A Re&name Her&noemen Alt+N Rename Hernoemen Alt+N &Refresh Ve&rversen Alt+R Refresh Verversen Alt+R Readable Clients / Output Ports Leesbare clients / Uitgangspoorten Writable Clients / Input Ports Beschrijfbare clients / ingangspoorten qjackctlConnect Warning Opgelet This will suspend sound processing from all client applications. Are you sure? Dit zal het verwerken van geluid onderbreken voor alle client toepassingen. Bent u zeker? qjackctlConnectionsForm Audio Audio &Connect &Verbinden Connect currently selected ports Verbind geselecteerde poorten &Disconnect Af&Koppelen Disconnect currently selected ports Geselecteerde poorten loskoppelen Disconnect &All &Alles afkoppelen Disconnect all currently connected ports Alle verbonden poorten afkoppelen Connections Verbindingen Expand all client ports Toon alle client poorten E&xpand All &Toon alles &Refresh Ve&rversen Refresh current connections view Ververs huidig verbindingen venster MIDI MIDI ALSA ALSA qjackctlConnectorView &Connect &Verbinden Alt+C Connect Verbinden Alt+V &Disconnect Af&Koppelen Alt+D Disconnect Afkoppelen - Knippen Alt+K Disconnect &All &Alles afkoppelen Alt+A Disconnect All Alles afkoppelen Alt+A &Refresh &Verversen Alt+R Refresh Verversen Alt+V qjackctlGraphCanvas Connect Disconnect qjackctlGraphForm Graph &Graph &Edit B&ewerken &View &Zoom Co&lors S&ort &Help &Connect Connect Connect selected ports &Disconnect Disconnect Disconnect selected ports Ctrl+C T&humbview Ctrl+D Cl&ose Close Close this application window Select &All Select All Ctrl+A Select &None Select None Ctrl+Shift+A Select &Invert Select Invert Ctrl+I &Rename... Rename item Rename Item F2 &Find... Find Find nodes Ctrl+F &Menubar Menubar Show/hide the main program window menubar Ctrl+M &Toolbar Toolbar Show/hide main program window file toolbar &Statusbar Statusbar Show/hide the main program window statusbar &Top Left Top left Show the thumbnail overview on the top-left Top &Right Top right Show the thumbnail overview on the top-right Bottom &Left Bottom Left Bottom left Show the thumbnail overview on the bottom-left &Bottom Right Bottom right Show the thumbnail overview on the bottom-right &None None Geen Hide thumbview Hide the thumbnail overview Text Beside &Icons Text beside icons Show/hide text beside icons &Center Center Center view &Refresh Refresh Refresh view F5 Zoom &In Zoom In Ctrl++ Zoom &Out Zoom Out Ctrl+- Zoom &Fit Zoom Fit Ctrl+0 Zoom &Reset Zoom Reset Ctrl+1 &Zoom Range Zoom Range JACK &Audio... JACK Audio color JACK &MIDI... JACK MIDI JACK MIDI color ALSA M&IDI... ALSA MIDI ALSA MIDI color JACK &CV... JACK CV color JACK &OSC... JACK OSC JACK OSC color &Reset &Herstel Reset colors Port &Name Port name Sort by port name Port &Title Port title Sort by port title Port &Index Port index Sort by port index &Ascending Ascending Ascending sort order &Descending Descending Descending sort order Repel O&verlapping Nodes Repel nodes Repel overlapping nodes Connect Thro&ugh Nodes Connect Through Nodes Connect through nodes Whether to draw connectors through or around nodes &About... About... About Show information about this application program About &Qt... About Qt... About Qt Over Qt Show information about the Qt toolkit &Undo &Redo Undo last edit action Redo last edit action Zoom Ready Colors - %1 qjackctlMainForm &Quit &Sluiten Quit processing and exit Stop proces en sluit af &Start Sta&rt Start the JACK server Start de JACK server S&top S&top Stop the JACK server Stop de JACK server St&atus St&atus Ab&out... &over… Show information about this application Toon informatie over deze toepassing Show settings and options dialog Toon instellingen en opties venster &Messages &Berichten &Patchbay I don't know a translation to dutch for the word patchbay &Patchbay Show/hide the patchbay editor window Toon/verberg de patchbay editor &Connect &Verbindingen Set&up... &Instellingen… JACK server state JACK server status JACK server mode JACK server mode Sample rate No translation known to Dutch Sample rate Time display Tijd weergave Transport state Transport status Transport BPM Transport BPM Transport time Transport tijd Show/hide the session management window Toon/verberg het sessie management venster Show/hide the messages log/status window Toon/verberg het berichten log/status venster Show/hide the graph window Show/hide the connections window &Backward &Terug Backward transport Terugwaarts afspelen &Forward &Voorwaarts Forward transport Voorwaarts afspelen &Rewind Te&rugspoelen Rewind transport Terugspoelen Pa&use Pa&use Stop transport rolling Stop het afspelen &Play &Spelen Start transport rolling Start het afspelen Warning Opgelet successfully met succes with exit status=%1 met exit status=%1 Could not load preset "%1". Retrying with default. Kon de preset « %1 » niet laden. Opnieuw aan het proberen met standaard. Could not load default preset. Sorry. Kon de standaard preset niet inladen. Sorry. Startup script... Opstart script... Startup script terminated Opstart script beëindigd JACK is starting... JACK start op... Could not start JACK. Sorry. JACK kon niet opstarten. Sorry. JACK is stopping... JACK stopt... Shutdown script... Afsluit script... Don't ask this again Shutdown script terminated Afsluit script beëindigd Post-shutdown script... Na-afsluit script... Post-shutdown script terminated Na-afsluit script beëindigd JACK was stopped JACK is gestopt The preset aliases have been changed: "%1" Do you want to save the changes? De preset aliases zijn aangepast: « %1 » Wil u deze aanpassingen opslaan? Error Fout Transport time code Transport tijdscode Elapsed time since last reset Verlopen tijd sinds laatste reset Elapsed time since last XRUN Verlopen tijd sinds laatste XRUN Patchbay activated. Patchbay ingeschakeld. Patchbay deactivated. Patchbay uitgeschakeld. Statistics reset. Initialisatie van statistieken. msec ms XRUN callback (%1). Buffer size change (%1). Buffergrootte aanpassing (%1). Shutdown notification. Afluit melding. Freewheel started... Freewheel exited. checked this is correct if checked means "controlled to see if everything is OK", but if it means checked like in a check box, then the translation should be: "aangevinkt" nagekeken connected verbonden disconnected afgesloten failed mislukt Server configuration saved to "%1". Server configuratie opgeslagen in « %1 ». Client activated. Client geactiveerd. Post-startup script... Na-startup script... Post-startup script terminated Na-startup script beëindigd Command line argument... Command line argument started Client deactivated. Client gedeactiveerd. Transport rewind. Transport terugspoelen. Transport backward. Transport achterwaarts. Starting Startend Transport start. Stopping Stoppend Transport stop. Transport forward. Transport voorwaarts. Stopped Gestopt Yes Ja No Nee FW RT RT Rolling Looping XRUN callback (%1 skipped). XRUN callback (%1 overgeslagen). Started Gestart Active Actief Activating Activering Inactive Inactief &Hide Ver&hullen D-BUS: GetParameterConstraint('%1'): %2. (%3) Mi&nimize Verklei&nen S&how &Tonen Rest&ore &Herstellen &Stop &Stop &Reset &Herstel &Presets &Presets &Versioning Re&fresh &Connections &Verbindingen Patch&bay &Graph &Transport Server settings will be only effective after restarting the JACK audio server. Server instellingen worden toegepast na het herstarten van de JACK audio server. Information Informatie Some settings will be only effective the next time you start this program. Sommige instellingen worden pas toegepast nadat u dit programma opnieuw opstart. DSP Load DSP-Verbruik XRUN Count (notifications) XRUN Telling (meldingen) JACK connection graph change. JACK verbindingen tekening aangepast. ALSA connection graph change. ALSA verbindingen aangepast. JACK connection change. JACK verbindingen aangepast. ALSA connection change. ALSA verbindingen aangepast. JACK is currently running. Do you want to terminate the JACK audio server? JACK wordt momenteel gebruikt. Wil u de JACK audio server stoppen? D-BUS: Service is available (%1 aka jackdbus). DBUS : Service is beschikbaar (%1 ook gekend als jackdbus). D-BUS: Service not available (%1 aka jackdbus). DBUS : Service is niet beschikbaar (%1 ook gekend als jackdbus). The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Het programma zal in de systeem balk blijven lopen. Om het programma te stoppen, gelieve « Sluiten » te kiezen in het menu van het systeem balk icoon. Don't show this message again Could not start JACK. Maybe JACK audio server is already started. Kon JACK niet starten. Misschien is de JACK audio server al gestart. D-BUS: JACK server is starting... D-BUS : JACK server start op… D-BUS: JACK server could not be started. Sorry DBUS : JACK server kon niet worden gestart. Sorry Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Sommige client audio toepassingen zijn nog steeds actief en verbonden. Wil u de JACK audio server stoppen? %1 is about to terminate. Are you sure? D-BUS: JACK server is stopping... DBUS : JACK server is stoppende… D-BUS: JACK server could not be stopped. Sorry D-BUS : JACK server kon niet worden gestopt. Sorry JACK was started with PID=%1. JACK is gestart met PID=%1. D-BUS: JACK server was started (%1 aka jackdbus). DBUS : JACK server is gestart (%1 ook gekend als jackdbus). JACK is being forced... JACK wordt geforceerd… D-BUS: JACK server was stopped (%1 aka jackdbus). DBUS : JACK server werd gestopt (%1 soit jackdbus). Transport BBT (bar.beat.ticks) Patchbay reset. Could not load active patchbay definition. "%1" Disabled. JACK has crashed. JACK is ingestort. JACK timed out. JACK was te laat. JACK write error. JACK schrijffout. JACK read error. JACK leesfout. Unknown JACK error (%d). Onbekende JACK fout (%d). JACK property change. Overall operation failed. Gehele toepassing gefaald. Invalid or unsupported option. Ongeldige of niet-ondersteunde optie. Client name not unique. Client naam niet uniek. Server is started. Server is gestart. Unable to connect to server. Kan niet met de server verbinden. Server communication error. Server communicatie fout. Client does not exist. Client bestaat niet. Unable to load internal client. Kan interne client niet laden. Unable to initialize client. Kan client niet initializeren. Unable to access shared memory. Geen toegang tot gedeeld geheugen. Client protocol version mismatch. Client protocol versie ongeldig. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Kon niet verbinden als client met de JACK server. - %1 Gelieve het berichten venster te lezen voor meer info. %1 (%2%) %1 (%2%) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 frames %1 msec %1 ms S&ession S&essie &Load... &Laden... &Save... &Bewaren… Save and &Quit... Bewaren en af&sluiten… Save &Template... &Template bewaren… Do you want to restart the JACK audio server? D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS : SetParameterValue('%1', '%2') : %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS : ResetParameterValue('%1') : %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS : GetParameterValue('%1') : %2. (%3) Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Kon de ALSA sequencer niet als client openen. De ALSA MIDI patchbay zal niet beschikbaar zijn. JACK active patchbay scan JACK actieve patchbay scan ALSA active patchbay scan ALSA actieve patchbay scan A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Er is een patchbay definitie actief, die deze verbinding waarschijnlijk zal herstellen: %1 -> %2 Wil u de patchbay verbinding verwijderen? qjackctlMessagesStatusForm Messages / Status &Messages &Meldingen Messages log Meldingen logboek Messages output log Meldingen uitgang logboek &Status &Status Status information Status informatie Statistics since last server startup Statistiek sinds laatste server opstart Description Beschrijving Value Waarde Reset XRUN statistic values Initialiseer XRUN statistiek waarden Re&set Refresh XRUN statistic values Ververs XRUN statistiek waarden &Refresh &Ververs Server name Server naam Server state Server status DSP Load DSP lading Sample Rate Buffer Size Buffergrootte Realtime Mode Realtime Modus Transport state Transport status Transport Timecode Transport Tijdscode Transport BBT Transport BPM XRUN count since last server startup Aantal XRUNS sinds laatste server opstart XRUN last time detected Laatst opgemerkte XRUN XRUN last Laatste XRUN XRUN maximum XRUN minimum XRUN average XRUN gemiddelde XRUN total XRUN totaal Maximum scheduling delay Time of last reset Tijd sinds laatste reset Logging stopped --- %1 --- Loggen gestopt --- %1 --- Logging started --- %1 --- Loggen gestart --- %1 --- qjackctlPaletteForm Color Themes Name Current color palette name Save current color palette name Save Delete current color palette name Delete Palette Current color palette Generate: Base color to generate palette Reset all current palette colors Reset Import a custom color theme (palette) from file Import... Export a custom color theme (palette) to file Export... Show Details Import File - %1 Palette files (*.%1) Save Palette - %1 All files (*.*) Warning - %1 Could not import from file: %1 Sorry. Export File - %1 Some settings have been changed. Do you want to discard the changes? Some settings have been changed: "%1". Do you want to save the changes? qjackctlPaletteForm::PaletteModel Color Role Active Actief Inactive Inactief Disabled qjackctlPatchbay Warning Opgelet This will disconnect all sockets. Are you sure? Dit zal alle sockets ontkoppelen. Bent u zeker? qjackctlPatchbayForm &New &Nieuw Create a new patchbay profile Creëer een nieuw patchbay profiel &Load... &Laden… Load patchbay profile Laad patchbay profiel &Save... &Bewaren... Save current patchbay profile Bewaar huidig patchbay profiel Patchbay Expand all items Toon alle items E&xpand All &Toon alle Current (recent) patchbay profile(s) Huidig (recent) patchbay profiel(en) Acti&vate Acti&veer Toggle activation of current patchbay profile Schakel activatie van huidig patchbay profiel in/uit &Connect &Verbind Connect currently selected sockets Verbind huidige geselecteerde sockets &Disconnect &Ontkoppel Disconnect currently selected sockets Ontkoppel huidig geselecteerde sockets Disconnect &All Ontkoppel &alle Disconnect all currently connected sockets Ontkoppel alle huidige verbonden sockets &Refresh Ve&rvers Refresh current patchbay view Ververs huidig patchbay venster Down Omlaag Move currently selected output socket down one position Verplaats de geselecteerde uitgang socket één positie omlaag Add... Voeg toe… Create a new output socket Creëer een nieuwe uitgang socket Edit... Bewerk... Edit currently selected input socket properties Bewerk eigenschappen van geselecteerde ingang socket Up Omhoog Move currently selected output socket up one position Verplaats de geselecteerde uitgang socket één positie omhoog Remove Verwijder Remove currently selected output socket Verwijder de geselecteerde uitgang socket Copy... Kopieer… Duplicate (copy) currently selected output socket Dupliceer de geselecteerde uitgang socket Remove currently selected input socket Verwijder de geselecteerde uitgang socket Duplicate (copy) currently selected input socket Dupliceer de geselecteerde ingang socket Create a new input socket Creëer een nieuwe ingang socket Edit currently selected output socket properties Bewerk eigenschappen van geselecteerde uitgang socket Warning Opgelet Error Fout New Patchbay definition Nieuwe patchbay definitie Patchbay Definition files Patchbay definitie bestanden Load Patchbay Definition Laad Patchbay Definitie Save Patchbay Definition Bewaar Patchbay Definitie active actief The patchbay definition has been changed: "%1" Do you want to save the changes? De patchbay definitie is aangepast : « %1 » Wil u de veranderingen bewaren? %1 [modified] %1 [aangepast] Untitled%1 Ongetieteld%1 Could not load patchbay definition file: "%1" Kon patchbay definite bestand niet laden : « %1 » Could not save patchbay definition file: "%1" Kon patchbay definitie bestand niet bewaren : « %1 » Create patchbay definition as a snapshot of all actual client connections? Creëer patchbay definitie als een momentopname van alle huidige client verbindingen? qjackctlPatchbayView Add... Voeg toe… Edit... Bewerk… Copy... Kopieer… Remove Verwijder Exclusive Exclusief (None) (Geen) Forward Vooruit Move Up Omhoog Move Down Omlaag &Connect &Verbind Alt+C Connect Verbind Alt+V &Disconnect &Loskoppelen Alt+D Disconnect Loskoppelen Alt+L Disconnect &All &Alle loskoppelen Alt+A Disconnect All Alle loskoppelen Alt+A &Refresh Ve&rvers Alt+R Refresh Ververs Alt+R qjackctlSessionForm Session Load session Laad sessie &Load... &Laden… Recent session Vorige sessie &Recent Vo&rige Save session Bewaar sessie &Versioning Re&fresh Session clients / connections Infra-clients / commands Infra-client Infra-command Add infra-client &Add Edit infra-client &Edit B&ewerken Remove infra-client Re&move &Save... &Bewaar… Update session Sessie updaten Client / Ports Client / Poorten UUID UUID Command Opdracht &Save &Bewaren Load Session Laad sessie Session directory Sessie map Save Session Bewaar Sessie and Quit en Sluit Template Sjabloon &Clear &Wissen Warning Opgelet A session could not be found in this folder: "%1" Een sessie werd niet gevonden in deze map: « %1 » %1: loading session... %1 : sessie laden… %1: load session %2. %1: sessie laden %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Een sessie bestaat al in deze map: « %1 » Bent u zeker dat u deze bestaande sessie wil overschrijven ? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Deze map bestaat al en is niet leeg : « %1 » Bent u zeker dat u de bestaande map wil vervangen ? %1: saving session... %1 : sessie wordt bewaard… %1: save session %2. %1 : sessie wordt bewaard %2. New Client Save and &Quit... &Bewaren en afsluiten… Save &Template... Bewaar S&jabloon… qjackctlSessionInfraClientItemEditor Infra-command qjackctlSessionSaveForm Session &Name: &Naam: Session name &Directory: Session directory Sessie map Browse for session directory ... … Save session versioning &Versioning Warning Opgelet Session directory does not exist: "%1" Do you want to create it? Session Directory qjackctlSetupForm Settings Instellingen Preset &Name: Preset &Naam: (default) DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/38 Settings preset name Naam instellingen preset &Save &Bewaren Save settings as current preset name Bewaar instellingen als huidige preset naam &Delete &Wissen Delete current settings preset Huidige instellingen preset wissen jackd DO NOT TRANSLATE jackdmp DO NOT TRANSLATE jackstart DO NOT TRANSLATE Driv&er: Driv&er: dummy DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 sun DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 oss DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 alsa DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 portaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 coreaudio DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 firewire DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Parameters Parameters Number of periods in the hardware buffer Aantal periodes in hardware buffer Priorit&y: Pri&oriteit : &Frames/Period: &Frames/Periode: 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Frames per periode tussen process() calls Port Ma&ximum: Poorten ma&ximum : 21333 21333 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Sample rate in frames per second Sample rate in frames per seconde Scheduler priority when running realtime Scheduler prioriteit wanneer in realtime modus &Word Length: &Resolutie (bit) : Periods/&Buffer: Periodes/&Buffer : Word length Resolutie Maximum number of ports the JACK server can manage Maximum aantal poorten dat de JACK server aankan &Wait (usec): &Wacht (µsec): Sample &Rate: Sample &Rate (Hz): &Timeout (msec): &Timeout (in ms) : 200 200 500 500 1000 1000 2000 2000 5000 5000 Set client timeout limit in milliseconds Zet client timeout limiet in milisecondes &Realtime &Realtime Use realtime scheduling Gebruik realtime scheduling No Memory Loc&k Geen Memory Loc&k Do not attempt to lock memory, even if in realtime mode Probeer niet om geheugen te "locken", zelfs niet in realtime modus &Unlock Memory &Unlock Memory Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Deblokkeer geheugen van gemeenschappelijke toolkit libraries (GTK+, QT, FLTK, Wine) So&ft Mode So&ft Mode Ignore xruns reported by the backend driver Negeer xruns meldingen van de backend driver &Monitor &Monitor Provide output monitor ports Voorzie monitor uitgang poorten Force &16bit Forceer &16bit Force 16bit mode instead of failing over 32bit (default) Forceer 16bit in plaats van te falen bij 32bit (standaard) H/&W Meter H/&W Meter Enable hardware metering on cards that support it Schakel hardware meten in op kaarten die het ondersteunen &Ignore H/W &Negeer H/W Ignore hardware period/buffer size Negeer hardware period/buffer grootte &Output Device: &Output Apparaat: &Interface: &Interface : Maximum input audio hardware channels to allocate Maximum bruikbare input audio hardware kanalen &Audio: &Audio: Dit&her: Dit&her: External output latency (frames) Externe output vertraging (in frames) &Input Device: &Input Apparaat : Duplex Duplex Capture Only Enkel opnemen Playback Only Enkel afspelen Provide either audio capture, playback or both Voorzie audio opname, afspelen of beide hw:0 hw:0 The PCM device name to use De PCM apparaats naam te gebruiken > > &Name: &Naam: The JACK Audio Connection Kit sound server name De JACK Audio Connectie Kit geluid server naam /dev/dsp /dev/dsp Alternate input device for capture Alternatief input apparaat voor opname Maximum output audio hardware channels to allocate Maximum bruikbare output audio hardware kanalen Alternate output device for playback Alternatief output apparaat voor afspelen External input latency (frames) Externe input vertraging (in frames) None Geen Rectangular Blok Shaped Sinus Triangular Driehoek Set dither mode Kies dither modus Whether to give verbose output on messages Geef veel info bij berichten Time in seconds that client is delayed after server startup Tijd in secondes waarmee de client wordt vertraagd na opstarten van de server Latency: Vertraging: Output latency in milliseconds, calculated based on the period, rate and buffer settings Output vertraging in milliseconden, berekend vanuit periodes, rate en buffer instellingen Options Opties Scripting Scripts Execute script on Start&up: Script &uitvoeren voor opstarten: Whether to execute a custom shell script before starting up the JACK audio server. Custom shell script uitvoeren vóór het opstarten van de JACK audio server. Execute script after &Startup: &Script uitvoeren na opstarten: Whether to execute a custom shell script after starting up the JACK audio server. Custom shell script uitvoeren na het opstarten van de JACK audio server. Execute script on Shut&down: Script uitvoeren &bij afsluiten: Whether to execute a custom shell script before shuting down the JACK audio server. Custom shell script uitvoeren vóór het afsluiten van de JACK audio server. Command line to be executed before starting up the JACK audio server Commando om uit te voeren vóór het opstarten van de JACK audio server Scripting argument meta-symbols Script argument meta symbolen ... … Browse for script to be executed before starting up the JACK audio server Bladeren naar een script om uit te voeren vóór het starten van de JACK audio server Command line to be executed after starting up the JACK audio server Commando om uit te voeren na het opstarten van de JACK audio server Browse for script to be executed after starting up the JACK audio server Bladeren naar een script om uit te voeren na het starten van de JACK audio server Browse for script to be executed before shutting down the JACK audio server Bladeren naar een script om uit te voeren vóór het stoppen van de JACK audio server Command line to be executed before shutting down the JACK audio server Commando om uit te voeren vóór het stoppen van de JACK audio server Execute script after Shu&tdown: Script uitvoeren &na afsluiten: Whether to execute a custom shell script after shuting down the JACK audio server. Custom shell script uitvoeren na het afsluiten van de JACK audio server. Browse for script to be executed after shutting down the JACK audio server Bladeren naar een script om uit te voeren na het stoppen van de JACK audio server Command line to be executed after shutting down the JACK audio server Commando om uit te voeren na het stoppen van de JACK audio server Statistics Statistieken &Capture standard output Standaard &output weergeven Whether to capture standard output (stdout/stderr) into messages window Standaard output (stdout/stderr) weergeven in berichten venster &XRUN detection regex: regex voor &XRUN detectie: xrun of at least ([0-9|\.]+) msecs xrun van ten minste ([0-9|\.]+) ms Regular expression used to detect XRUNs on server output messages Expression régulière utilisée pour détecter les désynchronisations (XRUN) dans les messages de sortie du serveur Connections Verbindingen 10 10 Patchbay definition file to be activated as connection persistence profile Patchbay definitie bestand om verbindingen profiel te bewaren Browse for a patchbay definition file to be activated Bladeren naar een patchbay definitie bestand om te activeren Activate &Patchbay persistence: Activeer &Patchbay bewaring: Whether to activate a patchbay definition for connection persistence profile. Patchbay definitie bestand activeren om verbindingen profiel te bewaren. Display Weergave Time Display Tijdsweergave Server Suffi&x: Transport &Time Code Transport &Time Code Transport &BBT (bar:beat.ticks) Transport &BBT (bar:beat.ticks) Elapsed time since last &Reset Verlopen tijd sinds laatste &Reset Elapsed time since last &XRUN Verlopen tijd sinds laatste &XRUN Sample front panel normal display font Voorbeeld hoofdvenster normale weergave lettertype Sample big time display font Voorbeeld grote klok weergave lettertype Big Time display: Grote klok weergave: &Font... &Lettertype… Select font for front panel normal display Kies lettertype voor hoofdvenster normale weergave Select font for big time display Kies lettertype voor grote klok weergave Normal display: Normale weergave: Messages Window Berichten venster Sample messages text font display Voorbeeld lettertype voor berichten Select font for the messages text display Kies lettertype voor tekst in berichtenvenster &Messages limit: &Berichten limiet: Whether to keep a maximum number of lines in the messages window Een maximum aantal lijnen behouden in het berichten venster 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Het maximum aantal berichten om in beeld te houden Connections Window Verbindingen venster Sample connections view font Voorbeeld lettertype verbindingen venster Select font for the connections view Kies lettertype voor het verbindingen venster &Icon size: &Icoon grootte: 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 The icon size for each item of the connections view De grootte van het icoon voor elk element uit het verbindingen venster Ena&ble client/port aliases editing (rename) Client/poort &hernoemen mogelijk maken (aliases) Whether to enable in-place client/port name editing (rename) Bewerken van de naam van een client/poort toestaan E&nable client/port aliases Activeer client/p&ort aliasen Whether to enable client/port name aliases on the connections window Alternatieve naam (alias) van client/poort tonen in verbindingen venster Misc Meer Other Andere &Start JACK audio server on application startup &Start JACK audio server bij opstarten van QjackCtl Whether to start JACK audio server immediately on application startup JACK audio server onmiddelijk starten bij opstarten van de toepassing &Confirm application close &Bevestig sluiten van QjackCtl Whether to ask for confirmation on application exit Vragen om bevestiging wanneer de toepassing wordt beëindigd &Keep child windows always on top &Kind vensters steeds bovenaan houden Whether to keep all child windows on top of the main window Kind vensters al dan niet over het hoofdvenster laten verschijnen &Enable system tray icon Activ&eer systeem balk icoon Whether to enable the system tray icon Minimaliseren naar systeem balk icoon of niet S&ave JACK audio server configuration to: Bew&aar JACK audio server configuratie als: Whether to save the JACK server command-line configuration into a local file (auto-start) De JACK server commando configuratie in een lokaal bestand opslaan (auto start) .jackdrc .jackdrc The server configuration local file name (auto-start) Naam van het lokale server configuratie bestand (auto start) Buttons Knoppen Hide main window &Left buttons Verberg knoppen aan &linkerkant van hoofdvenster Whether to hide the left button group on the main window De knoppen groep aan de linkerkant van het hoofdvenster verbergen Hide main window &Right buttons Verberg knoppen aan &rechterkant van hoofdvenster Whether to hide the right button group on the main window De knoppen groep aan de rechterkant van het hoofdvenster verbergen Hide main window &Transport buttons Verberg hoofdvenster &Transport knoppen Whether to hide the transport button group on the main window De transport knoppengroep in het hoofdvenster al dan niet verbergen Hide main window &button text labels Verberg tekst bij &knoppen in hoofdvenster Whether to hide the text labels on the main window buttons Verberg de tekst labels onder knoppen in het hoofdvenster Warning Opgelet msec ms n/a n/a &Preset Name &Preset Naam &Server Name &Server Naam &Server Path &Server Pad &Driver &Driver &Interface &Interface Sample &Rate Sample &Rate &Frames/Period &Frames/Periode Periods/&Buffer Periodes/&Buffer Startup Script Opstart Script Post-Startup Script Na-opstart Script Shutdown Script Afsluit Script Post-Shutdown Script Na-afsluit Script Patchbay Definition files Patchbay Definitie bestanden Active Patchbay Definition Actieve Patchbay Definitie The audio backend driver interface to use De te gebruiken audio backend driver interface &Verbose messages Uit&voerige berichten MIDI Driv&er: MIDI Driv&er: none geen raw DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 seq DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 The ALSA MIDI backend driver to use De te gebruiken ALSA MIDI backend driver plughw:0 plughw:0 Some settings have been changed: "%1" Do you want to save the changes? Sommige instellingen zijn veranderd: « %1 » Wil u deze aanpassingen opslaan? Delete preset: "%1" Are you sure? Verwijder preset : « %1 » Bent u zeker? Information Informatie Some settings may be only effective next time you start this application. Some settings have been changed. Do you want to apply the changes? Sommige instellingen zijn veranderd. Wil u de veranderingen toepassen? Messages Log Berichten Log System Cycle HPET Don't restrict self connect requests (default) Fail self connect requests to external ports only Ignore self connect requests to external ports only Fail all self connect requests Ignore all self connect requests Log files Log bestanden netone DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 /dev/audio /dev/audio &Channels: &Sporen: Server path (command line prefix) Maximum number of audio channels to allocate Maximum aantal te gebruiken audio sporen &Channels I/O: &Latency I/O: Logging Loggen Messages log file Berichten log bestand Browse for the messages log file location Blader naar de berichten log bestand locatie Whether to activate a messages logging to file. Berichten opslaan in een bestand activeren. Server &Prefix: Extra driver options (command line suffix) Start De&lay: secs 0 msecs Please do not touch these settings unless you know what you are doing. &Messages log file: &Berichten log bestand: Whether to enable blinking (flashing) of the server mode (RT) indicator Activeer het knipperen van de server modus (RT) indicator Blin&k server mode indicator &Knipperende server modus indicator &JACK client/port aliases: &JACK client/poort aliassen: JACK client/port aliases display mode JACK client/poort aliassen weergave modus Default Standaard First Eerste Second Tweede Whether to start minimized to system tray Start met geminimaliseerd systeem balk icoon JACK client/port pretty-name (metadata) display mode Advanced Whether to reset all connections when a patchbay definition is activated. &Reset all connections on patchbay activation Whether to issue a warning on active patchbay port disconnections. &Warn on active patchbay disconnections Enable JA&CK client/port pretty-names (metadata) Whether to ask for confirmation on JACK audio server shutdown and/or restart Confirm server sh&utdown and/or restart Whether to show system tray message on main window close Sho&w system tray message on close Start minimi&zed to system tray Whether to restrict to one single application instance (X11) Beperken tot één enkele toepassings instantie (X11) Single application &instance Slechts één QjackCtl laten draa&ien Whether to enable ALSA Sequencer (MIDI) support on startup Activeer ALSA Sequencer (MIDI) ondersteuning bij opstarten Setup Whether to restrict client self-connections Whether to use server synchronous mode Clear settings of current preset name Clea&r &Use server synchronous mode Cloc&k source: Clock source S&elf connect mode: Custom &Color palette theme: Custom color palette theme Wonton Soup DO NOT TRANSLATE KXStudio DO NOT TRANSLATE Manage custom color palette themes &Widget style theme: Custom widget style theme E&nable ALSA Sequencer support Activeer &ALSA Sequencer ondersteuning Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface Whether to stop JACK audio server on application exit S&top JACK audio server on application exit Whether to replace Connections with Graph button on the main window Replace Connections with &Graph button Defaults Standaard &Base font size: &Basis lettertype grootte: Base application font size (pt.) Basis lettertype grootte voor toepassing (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net DO NOT TRANSLATE - https://github.com/rncbc/qjackctl/issues/54 Whether to enable D-Bus interface D-Bus activeren &Enable D-Bus interface &D-Bus interface activeren Number of microseconds to wait between engine processes (dummy) Aantal microseconden wachten tussen engine processen (dummie) qjackctlSocketForm &Socket &Socket &Name (alias): &Naam (alias): Socket name (an alias for client name) Socket naam (een alias voor client naam) Client name (regular expression) Client naam (reguliere expressie) Add P&lug Plug &toevoegen Add plug to socket plug list Plug toevoegen aan socket plug lijst &Plug: &Plug: Port name (regular expression) Poort naam (reguliere expressie) Socket Plugs / Ports Socket Plugs / Poorten Socket plug list Socket plug lijst &Edit B&ewerken &Remove &Verwijderen Remove currently selected plug from socket plug list Verwijder geselecteerde plug uit socket plug lijst Socket Socket &Client: &Client: &Down Om&laag &Up Om&hoog E&xclusive E&xclusief Enforce only one exclusive cable connection Sta slechts één enkele aansluiting toe &Forward: &Stuur door: Forward (clone) all connections from this socket Stuur alle verbindingen van deze socket door (clonen) Type Type &Audio &Audio Audio socket type (JACK) Audio socket type (JACK) &MIDI &MIDI MIDI socket type (ALSA) MIDI socket type (ALSA) Plugs / Ports Plugs / Poorten Add Plug Plug toevoegen Remove Verwijder Edit Bewerken Error Fout A socket named "%1" already exists. Een socket genaamd « %1 » bestaat al. Move Up Omhoog Move Down Omlaag (None) (Geen) Edit currently selected plug Bewerk de geselecteerde plug Move down currently selected plug in socket plug list Verplaats geselecteerde plug omlaag in socket plug lijst Move up current selected plug in socket plug list Verplaats geselecteerde plug omhoog in socket plug lijst Warning Opgelet Some settings have been changed. Do you want to apply the changes? Sommige instellingen zijn veranderd. Wil u de veranderingen toepassen? MIDI socket type (JACK) MIDI socket type (JACK) AL&SA AL&SA qjackctlSocketList Output Uitgang Input Ingang Socket Socket Warning Opgelet <New> - %1 <Nieuw> - %1 %1 about to be removed: "%2" Are you sure? %1 zal verwijderd worden: « %2 » Bent u zeker? %1 <Copy> - %2 %1 <Kopiëer> - %2 qjackctlSocketListView Output Sockets / Plugs Uitgang Sockets / Plugs Input Sockets / Plugs Ingang Sockets / Plugs qjackctl-1.0.6/src/PaxHeaders/qjackctlPatchbayFile.txt0000644000000000000000000000013215174607203017775 xustar0030 mtime=1777536643.514914298 30 atime=1777536643.514914298 30 ctime=1777536643.514914298 qjackctl-1.0.6/src/qjackctlPatchbayFile.txt0000644000175000001440000000263415174607203017772 0ustar00rncbcusersqjackctlPatchbayFile format specification ----------------------------------------- plug-name . . . . . . plug-name . . . . . . # # # . # . # . # . . . patchbay-name := string-literal patchbay-version := string-literal socket-name := string-literal socket-type := "audio" | "midi" | "jack-audio" | "jack-midi" | "alsa-midi" # slot-name := string-literal # slot-mode := "open" | "half" | "full" client-name := string-regexp (JACK/ALSA client name) plug-name := string-regexp (JACK/ALSA port name) exclusive-flag := "on" | "off" | "yes" | "no" | "1" | "0" qjackctl-1.0.6/src/PaxHeaders/qjackctlMainForm.ui0000644000000000000000000000013215174607203016750 xustar0030 mtime=1777536643.512914312 30 atime=1777536643.512914312 30 ctime=1777536643.512914312 qjackctl-1.0.6/src/qjackctlMainForm.ui0000644000175000001440000005673215174607203016755 0ustar00rncbcusers rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2025, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlMainForm 0 0 300 100 :/images/qjackctl.svg 4 4 0 0 28 28 Qt::TabFocus Start the JACK server &Start :/images/start1.png false Qt::ToolButtonTextBesideIcon 0 0 28 28 Qt::TabFocus Stop the JACK server S&top :/images/stop1.png Qt::ToolButtonTextBesideIcon 0 0 true QFrame::Panel QFrame::Sunken 2 0 50 0 8 JACK server state Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter false 2 20 0 8 JACK server mode Qt::AlignCenter false 40 0 8 DSP Load Qt::AlignCenter false 50 0 8 Sample rate Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 30 0 8 XRUN Count (notifications) Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter false 2 130 0 14 75 true Time display Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 50 0 8 Transport state Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter false 2 30 0 8 Transport BPM Qt::AlignCenter false 80 0 8 75 true Transport time Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 28 28 Qt::TabFocus Quit processing and exit &Quit :/images/quit1.png Qt::ToolButtonTextBesideIcon 0 0 28 28 Qt::TabFocus Show/hide the session management window S&ession :/images/session1.png true Qt::ToolButtonTextBesideIcon 0 0 28 28 Qt::TabFocus Show/hide the messages log/status window &Messages :/images/messagesstatus1.png true Qt::ToolButtonTextBesideIcon 0 0 28 28 Qt::TabFocus Show settings and options dialog Set&up... :/images/setup1.png true Qt::ToolButtonTextBesideIcon 0 0 28 28 Qt::TabFocus Show/hide the graph window &Graph :/images/graph1.png true Qt::ToolButtonTextBesideIcon 0 0 28 28 Qt::TabFocus Show/hide the connections window &Connect :/images/connections1.png true Qt::ToolButtonTextBesideIcon 0 0 28 28 Qt::TabFocus Show/hide the patchbay editor window &Patchbay :/images/patchbay1.png true Qt::ToolButtonTextBesideIcon 0 0 28 28 Qt::TabFocus Rewind transport &Rewind :/images/rewind1.png 0 0 28 28 Qt::TabFocus Backward transport &Backward :/images/backward1.png true 0 0 28 28 Qt::TabFocus Start transport rolling &Play :/images/play1.png true 0 0 28 28 Qt::TabFocus Stop transport rolling Pa&use :/images/pause1.png 0 0 28 28 Qt::TabFocus Forward transport &Forward :/images/forward1.png true 0 0 28 28 Qt::TabFocus Show information about this application Ab&out... :/images/about1.png Qt::ToolButtonTextBesideIcon StartToolButton StopToolButton QuitToolButton MessagesStatusToolButton SessionToolButton SetupToolButton GraphToolButton ConnectionsToolButton PatchbayToolButton RewindToolButton BackwardToolButton PlayToolButton PauseToolButton ForwardToolButton AboutToolButton qjackctl-1.0.6/src/PaxHeaders/qjackctlSetup.cpp0000644000000000000000000000013215174607203016505 xustar0030 mtime=1777536643.516914284 30 atime=1777536643.516914284 30 ctime=1777536643.516914284 qjackctl-1.0.6/src/qjackctlSetup.cpp0000644000175000001440000010426215174607203016502 0ustar00rncbcusers// qjackctlSetup.cpp // /**************************************************************************** Copyright (C) 2003-2026, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlSetup.h" #include #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0) #include #include #if defined(Q_OS_WINDOWS) #include #endif #endif #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) #include #endif #ifdef CONFIG_JACK_VERSION #include #endif // Default (translated) preset name. QString qjackctlSetup::g_sDefName; // Default (translated) preset name. (static) const QString& qjackctlSetup::defName (void) { if (g_sDefName.isEmpty()) g_sDefName = QObject::tr("(default)"); return g_sDefName; } // Constructor. qjackctlSetup::qjackctlSetup (void) : m_settings(QJACKCTL_DOMAIN, QJACKCTL_TITLE) { bStartJackCmd = false; loadSetup(); } // Destructor; qjackctlSetup::~qjackctlSetup (void) { // saveSetup(); } // Settings accessor. QSettings& qjackctlSetup::settings (void) { return m_settings; } // Explicit load method. void qjackctlSetup::loadSetup (void) { m_settings.beginGroup("/Presets"); sDefPreset = m_settings.value("/DefPreset", defName()).toString(); sOldPreset = m_settings.value("/OldPreset").toString(); QString sPrefix = "/Preset%1"; int i = 0; for (;;) { QString sItem = m_settings.value(sPrefix.arg(++i)).toString(); if (sItem.isEmpty()) break; presets.append(sItem); } m_settings.endGroup(); #ifdef __APPLE__ // alternative custom defaults, as the mac theme does not look good with our custom widgets sCustomColorTheme = "KXStudio"; sCustomStyleTheme = "Fusion"; #endif m_settings.beginGroup("/Options"); bSingleton = m_settings.value("/Singleton", true).toBool(); // sServerName = m_settings.value("/ServerName").toString(); bStartJack = m_settings.value("/StartJack", false).toBool(); // bStartJackCmd = m_settings.value("/StartJackCmd", false).toBool(); bStopJack = m_settings.value("/StopJack", true).toBool(); bStartupScript = m_settings.value("/StartupScript", false).toBool(); sStartupScriptShell = m_settings.value("/StartupScriptShell").toString(); bPostStartupScript = m_settings.value("/PostStartupScript", false).toBool(); sPostStartupScriptShell = m_settings.value("/PostStartupScriptShell").toString(); bShutdownScript = m_settings.value("/ShutdownScript", false).toBool(); sShutdownScriptShell = m_settings.value("/ShutdownScriptShell").toString(); bPostShutdownScript = m_settings.value("/PostShutdownScript", false).toBool(); sPostShutdownScriptShell = m_settings.value("/PostShutdownScriptShell").toString(); bStdoutCapture = m_settings.value("/StdoutCapture", true).toBool(); sXrunRegex = m_settings.value("/XrunRegex", "xrun of at least ([0-9|\\.]+) msecs").toString(); bActivePatchbay = m_settings.value("/ActivePatchbay", false).toBool(); sActivePatchbayPath = m_settings.value("/ActivePatchbayPath").toString(); bActivePatchbayReset = m_settings.value("/ActivePatchbayReset", false).toBool(); bQueryDisconnect = m_settings.value("/QueryDisconnect", true).toBool(); bMessagesLog = m_settings.value("/MessagesLog", false).toBool(); sMessagesLogPath = m_settings.value("/MessagesLogPath", "qjackctl.log").toString(); iTimeDisplay = m_settings.value("/TimeDisplay", 0).toInt(); sMessagesFont = m_settings.value("/MessagesFont").toString(); bMessagesLimit = m_settings.value("/MessagesLimit", true).toBool(); iMessagesLimitLines = m_settings.value("/MessagesLimitLines", 1000).toInt(); sDisplayFont1 = m_settings.value("/DisplayFont1").toString(); sDisplayFont2 = m_settings.value("/DisplayFont2").toString(); bDisplayEffect = m_settings.value("/DisplayEffect", true).toBool(); bDisplayBlink = m_settings.value("/DisplayBlink", true).toBool(); sCustomColorTheme = m_settings.value("/CustomColorTheme", sCustomColorTheme).toString(); sCustomStyleTheme = m_settings.value("/CustomStyleTheme", sCustomStyleTheme).toString(); iJackClientPortAlias = m_settings.value("/JackClientPortAlias", 0).toInt(); bJackClientPortMetadata = m_settings.value("/JackClientPortMetadata", false).toBool(); iConnectionsIconSize = m_settings.value("/ConnectionsIconSize", QJACKCTL_ICON_16X16).toInt(); sConnectionsFont = m_settings.value("/ConnectionsFont").toString(); bQueryClose = m_settings.value("/QueryClose", true).toBool(); bQueryShutdown = m_settings.value("/QueryShutdown", true).toBool(); bQueryRestart = m_settings.value("/QueryRestart", false).toBool(); bKeepOnTop = m_settings.value("/KeepOnTop", false).toBool(); bSystemTray = m_settings.value("/SystemTray", false).toBool(); bSystemTrayQueryClose = m_settings.value("/SystemTrayQueryClose", true).toBool(); bStartMinimized = m_settings.value("/StartMinimized", false).toBool(); bServerConfig = m_settings.value("/ServerConfig", true).toBool(); sServerConfigName = m_settings.value("/ServerConfigName", ".jackdrc").toString(); bAlsaSeqEnabled = m_settings.value("/AlsaSeqEnabled", true).toBool(); bDBusEnabled = m_settings.value("/DBusEnabled", false).toBool(); bJackDBusEnabled = m_settings.value("/JackDBusEnabled", false).toBool(); bAliasesEnabled = m_settings.value("/AliasesEnabled", false).toBool(); bAliasesEditing = m_settings.value("/AliasesEditing", false).toBool(); bLeftButtons = m_settings.value("/LeftButtons", true).toBool(); bRightButtons = m_settings.value("/RightButtons", true).toBool(); bTransportButtons = m_settings.value("/TransportButtons", true).toBool(); bTextLabels = m_settings.value("/TextLabels", true).toBool(); bGraphButton = m_settings.value("/GraphButton", true).toBool(); iBaseFontSize = m_settings.value("/BaseFontSize", 0).toInt(); m_settings.endGroup(); m_settings.beginGroup("/Defaults"); sPatchbayPath = m_settings.value("/PatchbayPath").toString(); iMessagesStatusTabPage = m_settings.value("/MessagesStatusTabPage", 0).toInt(); iConnectionsTabPage = m_settings.value("/ConnectionsTabPage", 0).toInt(); bSessionSaveVersion = m_settings.value("/SessionSaveVersion", true).toBool(); m_settings.endGroup(); // Load recent patchbay list... m_settings.beginGroup("/Patchbays"); sPrefix = "/Patchbay%1"; i = 0; for (;;) { QString sItem = m_settings.value(sPrefix.arg(++i)).toString(); if (sItem.isEmpty()) break; if (QFileInfo(sItem).exists()) patchbays.append(sItem); } m_settings.endGroup(); // Load recent session directory list... m_settings.beginGroup("/SessionDirs"); sPrefix = "/SessionDir%1"; i = 0; for (;;) { QString sItem = m_settings.value(sPrefix.arg(++i)).toString(); if (sItem.isEmpty()) break; if (QFileInfo(sItem).isDir()) sessionDirs.append(sItem); } m_settings.endGroup(); } // Explicit save method. void qjackctlSetup::saveSetup (void) { // Save all settings and options... m_settings.beginGroup("/Program"); m_settings.setValue("/Version", PROJECT_VERSION); m_settings.endGroup(); m_settings.beginGroup("/Presets"); m_settings.setValue("/DefPreset", sDefPreset); m_settings.setValue("/OldPreset", sOldPreset); // Save last preset list. QString sPrefix = "/Preset%1"; int i = 0; QStringListIterator iter(presets); while (iter.hasNext()) m_settings.setValue(sPrefix.arg(++i), iter.next()); // Cleanup old entries, if any... while (!m_settings.value(sPrefix.arg(++i)).toString().isEmpty()) m_settings.remove(sPrefix.arg(i)); m_settings.endGroup(); m_settings.beginGroup("/Options"); m_settings.setValue("/Singleton", bSingleton); // m_settings.setValue("/ServerName", sServerName); m_settings.setValue("/StartJack", bStartJack); // m_settings.setValue("/StartJackCmd", bStartJackCmd); m_settings.setValue("/StopJack", bStopJack); m_settings.setValue("/StartupScript", bStartupScript); m_settings.setValue("/StartupScriptShell", sStartupScriptShell); m_settings.setValue("/PostStartupScript", bPostStartupScript); m_settings.setValue("/PostStartupScriptShell", sPostStartupScriptShell); m_settings.setValue("/ShutdownScript", bShutdownScript); m_settings.setValue("/ShutdownScriptShell", sShutdownScriptShell); m_settings.setValue("/PostShutdownScript", bPostShutdownScript); m_settings.setValue("/PostShutdownScriptShell", sPostShutdownScriptShell); m_settings.setValue("/StdoutCapture", bStdoutCapture); m_settings.setValue("/XrunRegex", sXrunRegex); m_settings.setValue("/ActivePatchbay", bActivePatchbay); m_settings.setValue("/ActivePatchbayPath", sActivePatchbayPath); m_settings.setValue("/ActivePatchbayReset", bActivePatchbayReset); m_settings.setValue("/QueryDisconnect", bQueryDisconnect); m_settings.setValue("/MessagesLog", bMessagesLog); m_settings.setValue("/MessagesLogPath", sMessagesLogPath); m_settings.setValue("/TimeDisplay", iTimeDisplay); m_settings.setValue("/MessagesFont", sMessagesFont); m_settings.setValue("/MessagesLimit", bMessagesLimit); m_settings.setValue("/MessagesLimitLines", iMessagesLimitLines); m_settings.setValue("/DisplayFont1", sDisplayFont1); m_settings.setValue("/DisplayFont2", sDisplayFont2); m_settings.setValue("/DisplayEffect", bDisplayEffect); m_settings.setValue("/DisplayBlink", bDisplayBlink); m_settings.setValue("/CustomColorTheme", sCustomColorTheme); m_settings.setValue("/CustomStyleTheme", sCustomStyleTheme); m_settings.setValue("/JackClientPortAlias", iJackClientPortAlias); m_settings.setValue("/JackClientPortMetadata", bJackClientPortMetadata); m_settings.setValue("/ConnectionsIconSize", iConnectionsIconSize); m_settings.setValue("/ConnectionsFont", sConnectionsFont); m_settings.setValue("/QueryClose", bQueryClose); m_settings.setValue("/QueryShutdown", bQueryShutdown); m_settings.setValue("/QueryRestart", bQueryRestart); m_settings.setValue("/KeepOnTop", bKeepOnTop); m_settings.setValue("/SystemTray", bSystemTray); m_settings.setValue("/SystemTrayQueryClose", bSystemTrayQueryClose); m_settings.setValue("/StartMinimized", bStartMinimized); m_settings.setValue("/ServerConfig", bServerConfig); m_settings.setValue("/ServerConfigName", sServerConfigName); m_settings.setValue("/AlsaSeqEnabled", bAlsaSeqEnabled); m_settings.setValue("/DBusEnabled", bDBusEnabled); m_settings.setValue("/JackDBusEnabled", bJackDBusEnabled); m_settings.setValue("/AliasesEnabled", bAliasesEnabled); m_settings.setValue("/AliasesEditing", bAliasesEditing); m_settings.setValue("/LeftButtons", bLeftButtons); m_settings.setValue("/RightButtons", bRightButtons); m_settings.setValue("/TransportButtons", bTransportButtons); m_settings.setValue("/TextLabels", bTextLabels); m_settings.setValue("/GraphButton", bGraphButton); m_settings.setValue("/BaseFontSize", iBaseFontSize); m_settings.endGroup(); m_settings.beginGroup("/Defaults"); m_settings.setValue("/PatchbayPath", sPatchbayPath); m_settings.setValue("/MessagesStatusTabPage", iMessagesStatusTabPage); m_settings.setValue("/ConnectionsTabPage", iConnectionsTabPage); m_settings.setValue("/SessionSaveVersion", bSessionSaveVersion); m_settings.endGroup(); // Save patchbay list... m_settings.beginGroup("/Patchbays"); sPrefix = "/Patchbay%1"; i = 0; QStringListIterator iter2(patchbays); while (iter2.hasNext()) m_settings.setValue(sPrefix.arg(++i), iter2.next()); // Cleanup old entries, if any... while (!m_settings.value(sPrefix.arg(++i)).toString().isEmpty()) m_settings.remove(sPrefix.arg(i)); m_settings.endGroup(); // Save session directory list... m_settings.beginGroup("/SessionDirs"); sPrefix = "/SessionDir%1"; i = 0; QStringListIterator iter3(sessionDirs); while (iter3.hasNext()) m_settings.setValue(sPrefix.arg(++i), iter3.next()); // Cleanup old entries, if any... while (!m_settings.value(sPrefix.arg(++i)).toString().isEmpty()) m_settings.remove(sPrefix.arg(i)); m_settings.endGroup(); // Commit all changes to disk. m_settings.sync(); } //--------------------------------------------------------------------------- // Aliases preset management methods. bool qjackctlSetup::loadAliases (void) { QString sPreset = sDefPreset; QString sSuffix; if (sPreset != defName() && !sPreset.isEmpty()) { sSuffix = '/' + sPreset; // Check if on list. if (!presets.contains(sPreset)) return false; } // Load preset aliases... const QString sAliasesKey = "/Aliases" + sSuffix; m_settings.beginGroup(sAliasesKey); m_settings.beginGroup("/Jack"); // FIXME: Audio aliases.audioOutputs.loadSettings(m_settings, "/Outputs"); aliases.audioInputs.loadSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.beginGroup("/Midi"); aliases.midiOutputs.loadSettings(m_settings, "/Outputs"); aliases.midiInputs.loadSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.beginGroup("/Alsa"); aliases.alsaOutputs.loadSettings(m_settings, "/Outputs"); aliases.alsaInputs.loadSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.endGroup(); aliases.dirty = false; aliases.key = sPreset; return true; } bool qjackctlSetup::saveAliases (void) { const QString& sPreset = aliases.key; QString sSuffix; if (sPreset != defName() && !sPreset.isEmpty()) { sSuffix = "/" + sPreset; // Append to list if not already. if (!presets.contains(sPreset)) presets.prepend(sPreset); } // Save preset aliases... const QString sAliasesKey = "/Aliases" + sSuffix; // m_settings.remove(sAliasesKey); m_settings.beginGroup(sAliasesKey); m_settings.beginGroup("/Jack"); // FIXME: Audio aliases.audioOutputs.saveSettings(m_settings, "/Outputs"); aliases.audioInputs.saveSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.beginGroup("/Midi"); aliases.midiOutputs.saveSettings(m_settings, "/Outputs"); aliases.midiInputs.saveSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.beginGroup("/Alsa"); aliases.alsaOutputs.saveSettings(m_settings, "/Outputs"); aliases.alsaInputs.saveSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.endGroup(); aliases.dirty = false; return true; } //--------------------------------------------------------------------------- // Preset struct methods. void qjackctlPreset::clear (void) { sServerPrefix.clear(); sServerName .clear(); bRealtime = true; bSoftMode = false; bMonitor = false; bShorts = false; bNoMemLock = false; bUnlockMem = false; bHWMeter = false; bIgnoreHW = false; iPriority = 0; iFrames = 0; iSampleRate = 0; iPeriods = 0; iWordLength = 0; iWait = 0; iChan = 0; sDriver .clear(); sInterface .clear(); iAudio = 0; iDither = 0; iTimeout = 0; sInDevice .clear(); sOutDevice .clear(); iInChannels = 0; iOutChannels = 0; iInLatency = 0; iOutLatency = 0; iStartDelay = 2; bSync = false; bVerbose = false; iPortMax = 0; sMidiDriver .clear(); sServerSuffix.clear(); ucClockSource = 0; ucSelfConnectMode = 0; fixup(); } void qjackctlPreset::load ( QSettings& settings, const QString& sSuffix ) { settings.beginGroup("/Settings" + sSuffix); sServerPrefix = settings.value("/Server", sServerPrefix).toString(); sServerName = settings.value("/ServerName", sServerName).toString(); bRealtime = settings.value("/Realtime", bRealtime).toBool(); bSoftMode = settings.value("/SoftMode", bSoftMode).toBool(); bMonitor = settings.value("/Monitor", bMonitor).toBool(); bShorts = settings.value("/Shorts", bShorts).toBool(); bNoMemLock = settings.value("/NoMemLock", bNoMemLock).toBool(); bUnlockMem = settings.value("/UnlockMem", bUnlockMem).toBool(); bHWMeter = settings.value("/HWMeter", bHWMeter).toBool(); bIgnoreHW = settings.value("/IgnoreHW", bIgnoreHW).toBool(); iPriority = settings.value("/Priority", iPriority).toInt(); iFrames = settings.value("/Frames", iFrames).toInt(); iSampleRate = settings.value("/SampleRate", iSampleRate).toInt(); iPeriods = settings.value("/Periods", iPeriods).toInt(); iWordLength = settings.value("/WordLength", iWordLength).toInt(); iWait = settings.value("/Wait", iWait).toInt(); iChan = settings.value("/Chan", iChan).toInt(); sDriver = settings.value("/Driver", sDriver).toString(); sInterface = settings.value("/Interface", sInterface).toString(); iAudio = settings.value("/Audio", iAudio).toInt(); iDither = settings.value("/Dither", iDither).toInt(); iTimeout = settings.value("/Timeout", iTimeout).toInt(); sInDevice = settings.value("/InDevice", sInDevice).toString(); sOutDevice = settings.value("/OutDevice", sOutDevice).toString(); iInChannels = settings.value("/InChannels", iInChannels).toInt(); iOutChannels = settings.value("/OutChannels", iOutChannels).toInt(); iInLatency = settings.value("/InLatency", iInLatency).toInt(); iOutLatency = settings.value("/OutLatency", iOutLatency).toInt(); iStartDelay = settings.value("/StartDelay", iStartDelay).toInt(); bSync = settings.value("/Sync", bSync).toBool(); bVerbose = settings.value("/Verbose", bVerbose).toBool(); iPortMax = settings.value("/PortMax", iPortMax).toInt(); sMidiDriver = settings.value("/MidiDriver", sMidiDriver).toString(); sServerSuffix = settings.value("/ServerSuffix", sServerSuffix).toString(); ucClockSource = settings.value("/ClockSource", ucClockSource).value(); ucSelfConnectMode = settings.value("/SelfConnectMode", ucSelfConnectMode).value(); settings.endGroup(); fixup(); } void qjackctlPreset::save ( QSettings& settings, const QString& sSuffix ) { settings.beginGroup("/Settings" + sSuffix); settings.setValue("/Server", sServerPrefix); settings.setValue("/ServerName", sServerName); settings.setValue("/Realtime", bRealtime); settings.setValue("/SoftMode", bSoftMode); settings.setValue("/Monitor", bMonitor); settings.setValue("/Shorts", bShorts); settings.setValue("/NoMemLock", bNoMemLock); settings.setValue("/UnlockMem", bUnlockMem); settings.setValue("/HWMeter", bHWMeter); settings.setValue("/IgnoreHW", bIgnoreHW); settings.setValue("/Priority", iPriority); settings.setValue("/Frames", iFrames); settings.setValue("/SampleRate", iSampleRate); settings.setValue("/Periods", iPeriods); settings.setValue("/WordLength", iWordLength); settings.setValue("/Wait", iWait); settings.setValue("/Chan", iChan); settings.setValue("/Driver", sDriver); settings.setValue("/Interface", sInterface); settings.setValue("/Audio", iAudio); settings.setValue("/Dither", iDither); settings.setValue("/Timeout", iTimeout); settings.setValue("/InDevice", sInDevice); settings.setValue("/OutDevice", sOutDevice); settings.setValue("/InChannels", iInChannels); settings.setValue("/OutChannels", iOutChannels); settings.setValue("/InLatency", iInLatency); settings.setValue("/OutLatency", iOutLatency); settings.setValue("/StartDelay", iStartDelay); settings.setValue("/Sync", bSync); settings.setValue("/Verbose", bVerbose); settings.setValue("/PortMax", iPortMax); settings.setValue("/MidiDriver", sMidiDriver); settings.setValue("/ServerSuffix", sServerSuffix); settings.setValue("/ClockSource", ucClockSource); settings.setValue("/SelfConnectMode", ucSelfConnectMode); settings.endGroup(); } void qjackctlPreset::fixup (void) { if (sServerPrefix.isEmpty()) { sServerPrefix = "jackd"; #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) sServerPrefix += " -S -X winmme"; #endif } if (sDriver.isEmpty()) { #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) sDriver = "portaudio"; #elif defined(__APPLE__) sDriver = "coreaudio"; #elif defined(__FreeBSD__) sDriver = "oss"; #else sDriver = "alsa"; #endif } #ifdef CONFIG_JACK_MIDI if (!sMidiDriver.isEmpty() && sMidiDriver != "raw" && sMidiDriver != "seq") sMidiDriver.clear(); #endif } //--------------------------------------------------------------------------- // Preset management methods. bool qjackctlSetup::loadPreset ( qjackctlPreset& preset, const QString& sPreset ) { QString sSuffix; if (sPreset != defName() && !sPreset.isEmpty()) { sSuffix = '/' + sPreset; // Check if on list. if (!presets.contains(sPreset)) return false; } preset.load(m_settings, sSuffix); return true; } bool qjackctlSetup::savePreset ( qjackctlPreset& preset, const QString& sPreset ) { QString sSuffix; if (sPreset != defName() && !sPreset.isEmpty()) { sSuffix = '/' + sPreset; // Append to list if not already. if (!presets.contains(sPreset)) presets.prepend(sPreset); } preset.save(m_settings, sSuffix); return true; } bool qjackctlSetup::deletePreset ( const QString& sPreset ) { QString sSuffix; if (sPreset != defName() && !sPreset.isEmpty()) { sSuffix = '/' + sPreset; const int iPreset = presets.indexOf(sPreset); if (iPreset < 0) return false; presets.removeAt(iPreset); m_settings.remove("/Settings" + sSuffix); m_settings.remove("/Aliases" + sSuffix); } return true; } //------------------------------------------------------------------------- // Command-line argument stuff. // #if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0) void qjackctlSetup::show_error( const QString& msg ) { #if defined(Q_OS_WINDOWS) QMessageBox::information(nullptr, QApplication::applicationName(), msg); #else const QByteArray tmp = msg.toUtf8() + '\n'; ::fputs(tmp.constData(), stderr); #endif } #else // Help about command line options. void qjackctlSetup::print_usage ( const QString& arg0 ) { QTextStream out(stderr); const QString sEot = "\n\t"; const QString sEol = "\n\n"; out << QObject::tr("Usage: %1" " [options] [command-and-args]").arg(arg0) + sEol; out << QJACKCTL_TITLE " - " + QObject::tr(QJACKCTL_SUBTITLE) + sEol; out << QObject::tr("Options:") + sEol; out << " -s, --start" + sEot + QObject::tr("Start JACK audio server immediately.") + sEol; out << " -p, --preset