From 9273e1e3d7b80159588a79f8c6d372fead94dfcf Mon Sep 17 00:00:00 2001 From: Jonathan Harris Date: Fri, 11 Sep 2015 19:58:12 +0100 Subject: [PATCH] Add hotkey/shortcut support. --- EDMarketConnector.py | 35 +++- EDMarketConnector.wxs | 12 ++ L10n/en.template | 153 +++++++++-------- L10n/fr.strings | 32 +++- L10n/it.strings | 30 +++- L10n/pl.strings | 30 +++- README.md | 2 +- hotkey.py | 381 ++++++++++++++++++++++++++++++++++++++++++ prefs.py | 111 +++++++++++- setup.py | 7 +- snd_bad.wav | Bin 0 -> 97036 bytes snd_good.wav | Bin 0 -> 50310 bytes 12 files changed, 704 insertions(+), 89 deletions(-) create mode 100644 hotkey.py create mode 100644 snd_bad.wav create mode 100644 snd_good.wav diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 95f7aac7..a9f5491b 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -26,6 +26,7 @@ import coriolis import flightlog import prefs from config import appname, applongname, config +from hotkey import hotkeymgr l10n.Translations().install() @@ -98,7 +99,7 @@ class AppWindow: apple_menu.add_command(label=_("Check for Updates..."), command=lambda:self.updater.checkForUpdates()) menubar.add_cascade(menu=apple_menu) window_menu = tk.Menu(menubar, name='window') - menubar.add_cascade(menu=window_menu) + menubar.add_cascade(label=_('Window'), menu=window_menu) # Menu title on OSX # https://www.tcl.tk/man/tcl/TkCmd/tk_mac.htm self.w.call('set', 'tk::mac::useCompatibilityMetrics', '0') self.w.createcommand('tkAboutDialog', lambda:self.w.call('tk::mac::standardAboutPanel')) @@ -109,10 +110,10 @@ class AppWindow: else: file_menu = tk.Menu(menubar, tearoff=tk.FALSE) file_menu.add_command(label=_("Check for Updates..."), command=lambda:self.updater.checkForUpdates()) - file_menu.add_command(label=_("Settings"), command=lambda:prefs.PreferencesDialog(self.w, self.login)) # Menu item + file_menu.add_command(label=_("Settings"), command=lambda:prefs.PreferencesDialog(self.w, self.login)) # Item in the File menu on Windows file_menu.add_separator() - file_menu.add_command(label=_("Exit"), command=self.onexit) # Menu item - menubar.add_cascade(label=_("File"), menu=file_menu) # Top-level menu on Windows + file_menu.add_command(label=_("Exit"), command=self.onexit) # Item in the File menu on Windows + menubar.add_cascade(label=_("File"), menu=file_menu) # Menu title on Windows self.w.protocol("WM_DELETE_WINDOW", self.onexit) if platform == 'linux2': # Fix up menu to use same styling as everything else @@ -147,6 +148,10 @@ class AppWindow: self.updater = update.Updater(self.w) self.w.bind_all('<>', self.onexit) # user-generated + # Install hotkey monitoring + self.w.bind_all('<>', self.getandsend) # user-generated + print config.getint('hotkey_code'), config.getint('hotkey_mods') + hotkeymgr.register(self.w, config.getint('hotkey_code'), config.getint('hotkey_mods')) # call after credentials have changed def login(self): @@ -187,8 +192,13 @@ class AppWindow: def getandsend(self, event=None, retrying=False): + play_sound = event and event.type=='35' and not config.getint('hotkey_mute') + if not retrying: - if time() < self.holdofftime: return # Was invoked by Return key while in cooldown + if time() < self.holdofftime: # Was invoked by key while in cooldown + if play_sound and (self.holdofftime-time()) < companion.holdoff*0.75: + hotkeymgr.play_bad() # Don't play sound in first few seconds to prevent repeats + return self.cmdr['text'] = self.system['text'] = self.station['text'] = '' self.status['text'] = _('Fetching station data...') self.button['state'] = tk.DISABLED @@ -209,14 +219,17 @@ class AppWindow: # Validation if not data.get('commander') or not data['commander'].get('name','').strip(): self.status['text'] = _("Who are you?!") # Shouldn't happen + if play_sound: hotkeymgr.play_bad() elif not data.get('lastSystem') or not data['lastSystem'].get('name','').strip() or not data.get('lastStarport') or not data['lastStarport'].get('name','').strip(): self.status['text'] = _("Where are you?!") # Shouldn't happen + if play_sound: hotkeymgr.play_bad() elif not data.get('ship') or not data['ship'].get('modules') or not data['ship'].get('name','').strip(): self.status['text'] = _("What are you flying?!") # Shouldn't happen + if play_sound: hotkeymgr.play_bad() elif (config.getint('output') & config.OUT_EDDN) and data['commander'].get('docked') and not data['lastStarport'].get('ships') and not retrying: # API is flakey about shipyard info - retry if missing (<1s is usually sufficient - 5s for margin). - self.w.after(SHIPYARD_RETRY * 1000, lambda:self.getandsend(retrying=True)) + self.w.after(SHIPYARD_RETRY * 1000, lambda:self.getandsend(event, retrying=True)) # Stuff we can do while waiting for retry if config.getint('output') & config.OUT_LOG: @@ -246,9 +259,11 @@ class AppWindow: if not (config.getint('output') & (config.OUT_CSV|config.OUT_TD|config.OUT_BPC|config.OUT_EDDN)): # no further output requested self.status['text'] = strftime(_('Last updated at {HH}:{MM}:{SS}').format(HH='%H', MM='%M', SS='%S').encode('utf-8'), localtime(querytime)).decode('utf-8') + if play_sound: hotkeymgr.play_good() elif not data['commander'].get('docked'): self.status['text'] = _("You're not docked at a station!") + if play_sound: hotkeymgr.play_bad() else: if data['lastStarport'].get('commodities'): # Fixup anomalies in the commodity data @@ -267,12 +282,16 @@ class AppWindow: self.w.update_idletasks() eddn.export(data) self.status['text'] = strftime(_('Last updated at {HH}:{MM}:{SS}').format(HH='%H', MM='%M', SS='%S').encode('utf-8'), localtime(querytime)).decode('utf-8') + if play_sound: hotkeymgr.play_good() else: self.status['text'] = _("Station doesn't have anything!") + if play_sound: hotkeymgr.play_good() # not really an error elif not data['lastStarport'].get('commodities'): self.status['text'] = _("Station doesn't have a market!") + if play_sound: hotkeymgr.play_good() # not really an error else: self.status['text'] = strftime(_('Last updated at {HH}:{MM}:{SS}').format(HH='%H', MM='%M', SS='%S').encode('utf-8'), localtime(querytime)).decode('utf-8') + if play_sound: hotkeymgr.play_good() except companion.VerificationRequired: return prefs.AuthenticationDialog(self.w, self.verify) @@ -280,18 +299,22 @@ class AppWindow: # Companion API problem except companion.ServerError as e: self.status['text'] = str(e) + if play_sound: hotkeymgr.play_bad() except requests.exceptions.ConnectionError as e: if __debug__: print_exc() self.status['text'] = _("Error: Can't connect to EDDN") + if play_sound: hotkeymgr.play_bad() except requests.exceptions.Timeout as e: if __debug__: print_exc() self.status['text'] = _("Error: Connection to EDDN timed out") + if play_sound: hotkeymgr.play_bad() except Exception as e: if __debug__: print_exc() self.status['text'] = str(e) + if play_sound: hotkeymgr.play_bad() self.cooldown() diff --git a/EDMarketConnector.wxs b/EDMarketConnector.wxs index f1863f62..8405691b 100644 --- a/EDMarketConnector.wxs +++ b/EDMarketConnector.wxs @@ -98,6 +98,12 @@ + + + + + + @@ -107,6 +113,9 @@ + + + @@ -344,9 +353,12 @@ + + + diff --git a/L10n/en.template b/L10n/en.template index 4561c53c..fcb3d4c6 100644 --- a/L10n/en.template +++ b/L10n/en.template @@ -1,150 +1,171 @@ -/* Use same text as E:D Launcher's verification dialog. [prefs.py:208] */ +/* Use same text as E:D Launcher's verification dialog. [prefs.py:311] */ "A verification code has now been sent to the{CR}email address associated with your Elite account." = "A verification code has now been sent to the{CR}email address associated with your Elite account."; -/* App menu entry on OSX. [EDMarketConnector.py:97] */ +/* App menu entry on OSX. [EDMarketConnector.py:98] */ "About {APP}" = "About {APP}"; -/* Folder selection button on Windows. [prefs.py:101] */ +/* Folder selection button on Windows. [prefs.py:113] */ "Browse..." = "Browse..."; -/* Folder selection button on OSX. [prefs.py:100] */ +/* Folder selection button on OSX. [prefs.py:112] */ "Change..." = "Change..."; -/* [EDMarketConnector.py:98] */ +/* [EDMarketConnector.py:99] */ "Check for Updates..." = "Check for Updates..."; -/* Privacy setting. [prefs.py:114] */ +/* Privacy setting. [prefs.py:149] */ "Cmdr name" = "Cmdr name"; -/* Main window. [EDMarketConnector.py:71] */ +/* Main window. [EDMarketConnector.py:72] */ "Cmdr:" = "Cmdr:"; -/* Update button in main window. [EDMarketConnector.py:300] */ +/* Update button in main window. [EDMarketConnector.py:323] */ "cooldown {SS}s" = "cooldown {SS}s"; -/* Section heading in settings. [prefs.py:58] */ +/* Section heading in settings. [prefs.py:70] */ "Credentials" = "Credentials"; -/* [EDMarketConnector.py:286] */ +/* [EDMarketConnector.py:306] */ "Error: Can't connect to EDDN" = "Error: Can't connect to EDDN"; -/* [EDMarketConnector.py:290] */ +/* [EDMarketConnector.py:311] */ "Error: Connection to EDDN timed out" = "Error: Connection to EDDN timed out"; -/* [companion.py:107] */ +/* [companion.py:109] */ "Error: Invalid Credentials" = "Error: Invalid Credentials"; /* [companion.py:103] */ "Error: Server is down" = "Error: Server is down"; -/* Menu item. [EDMarketConnector.py:114] */ +/* Item in the File menu on Windows. [EDMarketConnector.py:115] */ "Exit" = "Exit"; -/* [EDMarketConnector.py:193] */ +/* [EDMarketConnector.py:203] */ "Fetching station data..." = "Fetching station data..."; -/* Top-level menu on Windows. [EDMarketConnector.py:115] */ +/* Menu title on Windows. [EDMarketConnector.py:116] */ "File" = "File"; -/* Output folder prompt on Windows. [prefs.py:99] */ +/* Output folder prompt on Windows. [prefs.py:111] */ "File location:" = "File location:"; -/* [prefs.py:96] */ +/* [prefs.py:108] */ "Flight log" = "Flight log"; -/* Shouldn't happen. [companion.py:176] */ -"General error" = "General error"; +/* Section heading in settings on Windows. [prefs.py:125] */ +"Hotkey" = "Hotkey"; -/* [prefs.py:113] */ +/* [prefs.py:148] */ "How do you want to be identified in the saved data" = "How do you want to be identified in the saved data"; -/* [EDMarketConnector.py:248] */ +/* Section heading in settings on OSX. [prefs.py:124] */ +"Keyboard shortcut" = "Keyboard shortcut"; + +/* [EDMarketConnector.py:261] */ "Last updated at {HH}:{MM}:{SS}" = "Last updated at {HH}:{MM}:{SS}"; -/* [EDMarketConnector.py:153] */ +/* [EDMarketConnector.py:158] */ "Logging in..." = "Logging in..."; -/* [prefs.py:90] */ +/* [prefs.py:102] */ "Market data in CSV format" = "Market data in CSV format"; -/* [prefs.py:86] */ +/* [prefs.py:98] */ "Market data in Slopey's BPC format" = "Market data in Slopey's BPC format"; -/* [prefs.py:88] */ +/* [prefs.py:100] */ "Market data in Trade Dangerous format" = "Market data in Trade Dangerous format"; -/* [prefs.py:124] */ +/* No hotkey/shortcut currently defined. [prefs.py:136] */ +"none" = "none"; + +/* [prefs.py:159] */ "OK" = "OK"; -/* Section heading in settings. [prefs.py:77] */ +/* Shortcut settings button on OSX. [prefs.py:133] */ +"Open System Preferences" = "Open System Preferences"; + +/* Section heading in settings. [prefs.py:89] */ "Output" = "Output"; -/* Use same text as E:D Launcher's login dialog. [prefs.py:64] */ +/* Use same text as E:D Launcher's login dialog. [prefs.py:76] */ "Password" = "Password"; -/* [prefs.py:82] */ -"Please choose what data to save" = "Please choose what data to save"; - -/* Use same text as E:D Launcher's verification dialog. [prefs.py:211] */ -"Please enter the code into the box below." = "Please enter the code into the box below."; - -/* Use same text as E:D Launcher's login dialog. [prefs.py:62] */ -"Please log in with your Elite: Dangerous account details" = "Please log in with your Elite: Dangerous account details"; - -/* [prefs.py:37] */ -"Preferences" = "Preferences"; - -/* Section heading in settings. [prefs.py:108] */ -"Privacy" = "Privacy"; - -/* Privacy setting. [prefs.py:115] */ -"Pseudo-anonymized ID" = "Pseudo-anonymized ID"; - -/* [prefs.py:84] */ -"Send station data to the Elite Dangerous Data Network" = "Send station data to the Elite Dangerous Data Network"; - -/* [EDMarketConnector.py:266] */ -"Sending data to EDDN..." = "Sending data to EDDN..."; - -/* Menu item. [EDMarketConnector.py:112] */ -"Settings" = "Settings"; +/* Hotkey/Shortcut setting. [prefs.py:140] */ +"Play sound" = "Play sound"; /* [prefs.py:94] */ +"Please choose what data to save" = "Please choose what data to save"; + +/* Use same text as E:D Launcher's verification dialog. [prefs.py:314] */ +"Please enter the code into the box below." = "Please enter the code into the box below."; + +/* Use same text as E:D Launcher's login dialog. [prefs.py:74] */ +"Please log in with your Elite: Dangerous account details" = "Please log in with your Elite: Dangerous account details"; + +/* [prefs.py:49] */ +"Preferences" = "Preferences"; + +/* Section heading in settings. [prefs.py:143] */ +"Privacy" = "Privacy"; + +/* Privacy setting. [prefs.py:150] */ +"Pseudo-anonymized ID" = "Pseudo-anonymized ID"; + +/* Shortcut settings prompt on OSX. [prefs.py:130] */ +"Re-start {APP} to use shortcuts" = "Re-start {APP} to use shortcuts"; + +/* [prefs.py:96] */ +"Send station data to the Elite Dangerous Data Network" = "Send station data to the Elite Dangerous Data Network"; + +/* [EDMarketConnector.py:281] */ +"Sending data to EDDN..." = "Sending data to EDDN..."; + +/* Item in the File menu on Windows. [EDMarketConnector.py:113] */ +"Settings" = "Settings"; + +/* [prefs.py:106] */ "Ship loadout in Coriolis format" = "Ship loadout in Coriolis format"; -/* [prefs.py:92] */ +/* [prefs.py:104] */ "Ship loadout in E:D Shipyard format" = "Ship loadout in E:D Shipyard format"; -/* [EDMarketConnector.py:273] */ +/* [EDMarketConnector.py:290] */ "Station doesn't have a market!" = "Station doesn't have a market!"; -/* [EDMarketConnector.py:271] */ +/* [EDMarketConnector.py:287] */ "Station doesn't have anything!" = "Station doesn't have anything!"; -/* Main window. [EDMarketConnector.py:73] */ +/* Main window. [EDMarketConnector.py:74] */ "Station:" = "Station:"; -/* Main window. [EDMarketConnector.py:72] */ +/* Main window. [EDMarketConnector.py:73] */ "System:" = "System:"; -/* Update button in main window. [EDMarketConnector.py:78] */ +/* Update button in main window. [EDMarketConnector.py:79] */ "Update" = "Update"; -/* Use same text as E:D Launcher's login dialog. [prefs.py:63] */ +/* Use same text as E:D Launcher's login dialog. [prefs.py:75] */ "Username (Email)" = "Username (Email)"; -/* Shouldn't happen. [EDMarketConnector.py:215] */ +/* Shouldn't happen. [EDMarketConnector.py:227] */ "What are you flying?!" = "What are you flying?!"; -/* Shouldn't happen. [EDMarketConnector.py:213] */ +/* Shouldn't happen. [EDMarketConnector.py:224] */ "Where are you?!" = "Where are you?!"; -/* Output folder prompt on OSX. [prefs.py:98] */ +/* Output folder prompt on OSX. [prefs.py:110] */ "Where:" = "Where:"; -/* Shouldn't happen. [EDMarketConnector.py:211] */ +/* Shouldn't happen. [EDMarketConnector.py:221] */ "Who are you?!" = "Who are you?!"; -/* [EDMarketConnector.py:251] */ +/* Menu title on OSX. [EDMarketConnector.py:102] */ +"Window" = "Window"; + +/* [EDMarketConnector.py:265] */ "You're not docked at a station!" = "You're not docked at a station!"; +/* Shortcut settings prompt on OSX. [prefs.py:132] */ +"{APP} needs permission to use shortcuts" = "{APP} needs permission to use shortcuts"; + diff --git a/L10n/fr.strings b/L10n/fr.strings index 56ee1351..28cb39e0 100644 --- a/L10n/fr.strings +++ b/L10n/fr.strings @@ -37,13 +37,13 @@ /* [companion.py:103] */ "Error: Server is down" = "Erreur : Le serveur est indisponible"; -/* Menu item. [EDMarketConnector.py:114] */ +/* Item in the File menu on Windows. [EDMarketConnector.py:115] */ "Exit" = "Quitter"; /* [EDMarketConnector.py:193] */ "Fetching station data..." = "Récupération des données de la station..."; -/* Top-level menu on Windows. [EDMarketConnector.py:115] */ +/* Menu title on Windows. [EDMarketConnector.py:116] */ "File" = "Fichier"; /* Output folder prompt on Windows. [prefs.py:99] */ @@ -103,7 +103,7 @@ /* [EDMarketConnector.py:266] */ "Sending data to EDDN..." = "Envoi des données à EDDN..."; -/* Menu item. [EDMarketConnector.py:112] */ +/* Item in the File menu on Windows. [EDMarketConnector.py:113] */ "Settings" = "Paramètres"; /* [prefs.py:94] */ @@ -143,4 +143,28 @@ "Who are you?!" = "Qui êtes-vous ?"; /* [EDMarketConnector.py:251] */ -"You're not docked at a station!" = "Vous n'êtes pas amarré à une station !"; \ No newline at end of file +"You're not docked at a station!" = "Vous n'êtes pas amarré à une station !"; + +/* Section heading in settings on Windows. [prefs.py:125] */ +"Hotkey" = ""; + +/* No hotkey/shortcut currently defined. [prefs.py:136] */ +"none" = "aucun"; + +/* Shortcut settings button on OSX. [prefs.py:133] */ +"Open System Preferences" = "Ouvrir Préférences Système"; + +/* Hotkey/Shortcut setting. [prefs.py:140] */ +"Play sound" = ""; + +/* Shortcut settings prompt on OSX. [prefs.py:130] */ +"Re-start {APP} to use shortcuts" = ""; + +/* Section heading in settings on OSX. [prefs.py:124] */ +"Keyboard shortcut" = "Raccourci clavier"; + +/* Menu title on OSX. [EDMarketConnector.py:102] */ +"Window" = "Fenêtre"; + +/* Shortcut settings prompt on OSX. [prefs.py:132] */ +"{APP} needs permission to use shortcuts" = ""; diff --git a/L10n/it.strings b/L10n/it.strings index 53e71dd3..d176d53f 100644 --- a/L10n/it.strings +++ b/L10n/it.strings @@ -37,13 +37,13 @@ /* [companion.py:103] */ "Error: Server is down" = "Errore: Il Server è offline"; -/* Menu item. [EDMarketConnector.py:114] */ +/* Item in the File menu on Windows. [EDMarketConnector.py:115] */ "Exit" = "Esci"; /* [EDMarketConnector.py:193] */ "Fetching station data..." = "Raccogliendo i dati della Stazione..."; -/* Top-level menu on Windows. [EDMarketConnector.py:115] */ +/* Menu title on Windows. [EDMarketConnector.py:116] */ "File" = "File"; /* Output folder prompt on Windows. [prefs.py:99] */ @@ -104,7 +104,7 @@ /* [EDMarketConnector.py:266] */ "Sending data to EDDN..." = "Sto inviando i dati a EDDN..."; -/* Menu item. [EDMarketConnector.py:112] */ +/* Item in the File menu on Windows. [EDMarketConnector.py:113] */ "Settings" = "Impostazioni"; /* [prefs.py:94] */ @@ -145,3 +145,27 @@ /* [EDMarketConnector.py:251] */ "You're not docked at a station!" = "Non sei parcheggiato in nessuna stazione !"; + +/* Section heading in settings on Windows. [prefs.py:125] */ +"Hotkey" = ""; + +/* No hotkey/shortcut currently defined. [prefs.py:136] */ +"none" = "nessuna"; + +/* Shortcut settings button on OSX. [prefs.py:133] */ +"Open System Preferences" = "Apri Preferenze di Systema"; + +/* Hotkey/Shortcut setting. [prefs.py:140] */ +"Play sound" = ""; + +/* Shortcut settings prompt on OSX. [prefs.py:130] */ +"Re-start {APP} to use shortcuts" = ""; + +/* Section heading in settings on OSX. [prefs.py:124] */ +"Keyboard shortcut" = "Abbreviazione da tastiera"; + +/* Menu title on OSX. [EDMarketConnector.py:102] */ +"Window" = "Finestra"; + +/* Shortcut settings prompt on OSX. [prefs.py:132] */ +"{APP} needs permission to use shortcuts" = ""; diff --git a/L10n/pl.strings b/L10n/pl.strings index d2270777..1ee123f3 100644 --- a/L10n/pl.strings +++ b/L10n/pl.strings @@ -37,13 +37,13 @@ /* [companion.py:103] */ "Error: Server is down" = "Błąd: Serwer padł"; -/* Menu item. [EDMarketConnector.py:114] */ +/* Item in the File menu on Windows. [EDMarketConnector.py:115] */ "Exit" = "Zakończ"; /* [EDMarketConnector.py:193] */ "Fetching station data..." = "Pobieranie danych o stacji..."; -/* Top-level menu on Windows. [EDMarketConnector.py:115] */ +/* Menu title on Windows. [EDMarketConnector.py:116] */ "File" = "Plik"; /* Output folder prompt on Windows. [prefs.py:99] */ @@ -103,7 +103,7 @@ /* [EDMarketConnector.py:266] */ "Sending data to EDDN..." = "Wysłanie danych do EDDN..."; -/* Menu item. [EDMarketConnector.py:112] */ +/* Item in the File menu on Windows. [EDMarketConnector.py:113] */ "Settings" = "Ustawienia"; /* [prefs.py:94] */ @@ -144,3 +144,27 @@ /* [EDMarketConnector.py:251] */ "You're not docked at a station!" = "Nie jesteś zadokowany do stacji!"; + +/* Section heading in settings on Windows. [prefs.py:125] */ +"Hotkey" = ""; + +/* No hotkey/shortcut currently defined. [prefs.py:136] */ +"none" = "brak"; + +/* Shortcut settings button on OSX. [prefs.py:133] */ +"Open System Preferences" = "Otwórz Preferencje systemowe"; + +/* Hotkey/Shortcut setting. [prefs.py:140] */ +"Play sound" = ""; + +/* Shortcut settings prompt on OSX. [prefs.py:130] */ +"Re-start {APP} to use shortcuts" = ""; + +/* Section heading in settings on OSX. [prefs.py:124] */ +"Keyboard shortcut" = "Skrót klawiaturowy"; + +/* Menu title on OSX. [EDMarketConnector.py:102] */ +"Window" = "Okno"; + +/* Shortcut settings prompt on OSX. [prefs.py:132] */ +"{APP} needs permission to use shortcuts" = ""; diff --git a/README.md b/README.md index e252314a..fdfca336 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Setup The first time that you run the app you are prompted for your username and password. This is the same username and password combination that you use to log into the Elite: Dangerous launcher, and is required so that the Frontier servers can send the app *your* data and the market data for the station that *you* are docked at. -You can also choose here what data to save (refer to the next section for details) and whether to attach your Cmdr name or a [pseudo-anonymized](http://en.wikipedia.org/wiki/Pseudonymity) ID to the data. +You can also choose here what data to save (refer to the next section for details), whether to set up a hotkey so you don't have to switch to the app in order to “Update”, and whether to attach your Cmdr name or a [pseudo-anonymized](http://en.wikipedia.org/wiki/Pseudonymity) ID to the data. You are next prompted to authenticate with a “verification code”, which you will shortly receive by email from Frontier. Note that each “verification code” is one-time only - if you enter the code incorrectly or quit the app before diff --git a/hotkey.py b/hotkey.py new file mode 100644 index 00000000..a3220b75 --- /dev/null +++ b/hotkey.py @@ -0,0 +1,381 @@ +# -*- coding: utf-8 -*- + +from os.path import dirname, join, normpath +import sys +from sys import platform + +if platform == 'darwin': + + import threading + import objc + + from AppKit import NSApplication, NSWorkspace, NSBeep, NSSound, NSEvent, NSKeyDown, NSKeyUp, NSFlagsChanged, NSKeyDownMask, NSFlagsChangedMask, NSShiftKeyMask, NSControlKeyMask, NSAlternateKeyMask, NSCommandKeyMask, NSNumericPadKeyMask, NSDeviceIndependentModifierFlagsMask, NSF1FunctionKey, NSF35FunctionKey, NSDeleteFunctionKey, NSClearLineFunctionKey + + class HotkeyMgr: + + MODIFIERMASK = NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask|NSNumericPadKeyMask + POLL = 250 + # https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/#//apple_ref/doc/constant_group/Function_Key_Unicodes + DISPLAY = { 0x03: u'⌅', 0x09: u'⇥', 0xd: u'↩', 0x19: u'⇤', 0x1b: u'esc', 0x20: u'⏘', 0x7f: u'⌫', + 0xf700: u'↑', 0xf701: u'↓', 0xf702: u'←', 0xf703: u'→', + 0xf727: u'Ins', + 0xf728: u'⌦', 0xf729: u'↖', 0xf72a: u'Fn', 0xf72b: u'↘', + 0xf72c: u'⇞', 0xf72d: u'⇟', 0xf72e: u'PrtScr', 0xf72f: u'ScrollLock', + 0xf730: u'Pause', 0xf731: u'SysReq', 0xf732: u'Break', 0xf733: u'Reset', + 0xf739: u'⌧', + } + (ACQUIRE_INACTIVE, ACQUIRE_ACTIVE, ACQUIRE_NEW) = range(3) + + def __init__(self): + self.root = None + + self.keycode = 0 + self.modifiers = 0 + self.activated = False + self.observer = None + + self.acquire_key = 0 + self.acquire_state = HotkeyMgr.ACQUIRE_INACTIVE + + self.tkProcessKeyEvent_old = None + + if getattr(sys, 'frozen', False): + respath = normpath(join(dirname(sys.executable), os.pardir, 'Resources')) + elif __file__: + respath = dirname(__file__) + else: + respath = '.' + self.snd_good = NSSound.alloc().initWithContentsOfFile_byReference_(join(respath, 'snd_good.wav'), False) + self.snd_bad = NSSound.alloc().initWithContentsOfFile_byReference_(join(respath, 'snd_bad.wav'), False) + + def register(self, root, keycode, modifiers): + self.root = root + self.keycode = keycode + self.modifiers = modifiers + self.activated = False + + if keycode: + if not self.observer: + self.root.after_idle(self._observe) + self.root.after(HotkeyMgr.POLL, self._poll) + + # Monkey-patch tk (tkMacOSXKeyEvent.c) + if not self.tkProcessKeyEvent_old: + sel = 'tkProcessKeyEvent:' + cls = NSApplication.sharedApplication().class__() + self.tkProcessKeyEvent_old = NSApplication.sharedApplication().methodForSelector_(sel) + newmethod = objc.selector(self.tkProcessKeyEvent, selector = self.tkProcessKeyEvent_old.selector, signature = self.tkProcessKeyEvent_old.signature) + objc.classAddMethod(cls, sel, newmethod) + + # Monkey-patch tk (tkMacOSXKeyEvent.c) to: + # - workaround crash on OSX 10.9 & 10.10 on seeing a composing character + # - notice when modifier key state changes + # - keep a copy of NSEvent.charactersIgnoringModifiers, which is what we need for the hotkey + # (Would like to use a decorator but need to ensure the application is created before this is installed) + def tkProcessKeyEvent(self, cls, theEvent): + if self.acquire_state: + if theEvent.type() == NSFlagsChanged: + self.acquire_key = theEvent.modifierFlags() & NSDeviceIndependentModifierFlagsMask + self.acquire_state = HotkeyMgr.ACQUIRE_NEW + # suppress the event by not chaining the old function + return theEvent + elif theEvent.type() in (NSKeyDown, NSKeyUp): + c = theEvent.charactersIgnoringModifiers() + self.acquire_key = (c and ord(c[0]) or 0) | (theEvent.modifierFlags() & NSDeviceIndependentModifierFlagsMask) + self.acquire_state = HotkeyMgr.ACQUIRE_NEW + # suppress the event by not chaining the old function + return theEvent + + # replace empty characters with charactersIgnoringModifiers to avoid crash + elif theEvent.type() in (NSKeyDown, NSKeyUp) and not theEvent.characters(): + theEvent = NSEvent.keyEventWithType_location_modifierFlags_timestamp_windowNumber_context_characters_charactersIgnoringModifiers_isARepeat_keyCode_(theEvent.type(), theEvent.locationInWindow(), theEvent.modifierFlags(), theEvent.timestamp(), theEvent.windowNumber(), theEvent.context(), theEvent.charactersIgnoringModifiers(), theEvent.charactersIgnoringModifiers(), theEvent.isARepeat(), theEvent.keyCode()) + return self.tkProcessKeyEvent_old(cls, theEvent) + + def _observe(self): + # Must be called after root.mainloop() so that the app's message loop has been created + self.observer = NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSKeyDownMask, self._handler) + + def _poll(self): + # No way of signalling to Tkinter from within the callback handler block that doesn't + # cause Python to crash, so poll. + if self.activated: + self.activated = False + self.root.event_generate('<>', when="tail") + if self.keycode or self.modifiers: + self.root.after(HotkeyMgr.POLL, self._poll) + + def unregister(self): + self.keycode = None + self.modifiers = None + + @objc.callbackFor(NSEvent.addGlobalMonitorForEventsMatchingMask_handler_) + def _handler(self, event): + # use event.charactersIgnoringModifiers to handle composing characters like Alt-e + if (event.modifierFlags() & HotkeyMgr.MODIFIERMASK) == self.modifiers and ord(event.charactersIgnoringModifiers()[0]) == self.keycode: + # Only trigger if game client is front process + active = [x for x in NSWorkspace.sharedWorkspace().runningApplications() if x.isActive()] + if active and active[0] and active[0].bundleIdentifier() == 'uk.co.frontier.EliteDangerous': + self.activated = True + + def acquire_start(self): + self.acquire_state = HotkeyMgr.ACQUIRE_ACTIVE + self.root.after_idle(self._acquire_poll) + + def acquire_stop(self): + self.acquire_state = HotkeyMgr.ACQUIRE_INACTIVE + + def _acquire_poll(self): + # No way of signalling to Tkinter from within the monkey-patched event handler that doesn't + # cause Python to crash, so poll. + if self.acquire_state: + if self.acquire_state == HotkeyMgr.ACQUIRE_NEW: + # Abuse tkEvent's keycode field to hold our acquired key & modifier + self.root.event_generate('', keycode = self.acquire_key) + self.acquire_state = HotkeyMgr.ACQUIRE_ACTIVE + self.root.after(50, self._acquire_poll) + + def fromevent(self, event): + # Return configuration (keycode, modifiers) or None=clear or False=retain previous + (keycode, modifiers) = (event.keycode & 0xffff, event.keycode & 0xffff0000) # Set by _acquire_poll() + if keycode and not (modifiers & (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask)): + if keycode == 0x1b: # Esc = retain previous + self.acquire_state = HotkeyMgr.ACQUIRE_INACTIVE + return False + elif keycode in [0x7f, NSDeleteFunctionKey, NSClearLineFunctionKey]: # BkSp, Del, Clear = clear hotkey + self.acquire_state = HotkeyMgr.ACQUIRE_INACTIVE + return None + elif keycode in [0x13, 0x20, 0x2d] or 0x61 <= keycode <= 0x7a: # don't allow keys needed for typing in System Map + NSBeep() + self.acquire_state = HotkeyMgr.ACQUIRE_INACTIVE + return None + return (keycode, modifiers) + + def display(self, keycode, modifiers): + # Return displayable form + text = '' + if modifiers & NSControlKeyMask: text += u'⌃' + if modifiers & NSAlternateKeyMask: text += u'⌥' + if modifiers & NSShiftKeyMask: text += u'⇧' + if modifiers & NSCommandKeyMask: text += u'⌘' + if (modifiers & NSNumericPadKeyMask) and keycode <= 0x7f: text += u'№' + if not keycode: + pass + elif NSF1FunctionKey <= keycode <= NSF35FunctionKey: + text += 'F%d' % (keycode + 1 - NSF1FunctionKey) + elif keycode in HotkeyMgr.DISPLAY: # specials + text += HotkeyMgr.DISPLAY[keycode] + elif keycode < 0x20: # control keys + text += unichr(keycode+0x40) + elif keycode < 0xf700: # key char + text += unichr(keycode).upper() + else: + text += u'⁈' + return text + + def play_good(self): + self.snd_good.play() + + def play_bad(self): + self.snd_bad.play() + + +elif platform == 'win32': + + import ctypes + from ctypes.wintypes import * + import threading + import winsound + + RegisterHotKey = ctypes.windll.user32.RegisterHotKey + UnregisterHotKey = ctypes.windll.user32.UnregisterHotKey + MOD_ALT = 0x0001 + MOD_CONTROL = 0x0002 + MOD_SHIFT = 0x0004 + MOD_WIN = 0x0008 + MOD_NOREPEAT = 0x4000 + + GetMessage = ctypes.windll.user32.GetMessageW + TranslateMessage = ctypes.windll.user32.TranslateMessage + DispatchMessage = ctypes.windll.user32.DispatchMessageW + PostThreadMessage = ctypes.windll.user32.PostThreadMessageW + WM_QUIT = 0x0012 + WM_HOTKEY = 0x0312 + WM_APP = 0x8000 + WM_SND_GOOD = WM_APP + 1 + WM_SND_BAD = WM_APP + 2 + + GetKeyState = ctypes.windll.user32.GetKeyState + MapVirtualKey = ctypes.windll.user32.MapVirtualKeyW + VK_BACK = 0x08 + VK_CLEAR = 0x0c + VK_RETURN = 0x0d + VK_SHIFT = 0x10 + VK_CONTROL = 0x11 + VK_MENU = 0x12 + VK_CAPITAL = 0x14 + VK_MODECHANGE= 0x1f + VK_ESCAPE = 0x1b + VK_SPACE = 0x20 + VK_DELETE = 0x2e + VK_LWIN = 0x5b + VK_RWIN = 0x5c + VK_NUMPAD0 = 0x60 + VK_DIVIDE = 0x6f + VK_F1 = 0x70 + VK_F24 = 0x87 + VK_OEM_MINUS = 0xbd + VK_NUMLOCK = 0x90 + VK_SCROLL = 0x91 + VK_PROCESSKEY= 0xe5 + VK_OEM_CLEAR = 0xfe + + GetForegroundWindow = ctypes.windll.user32.GetForegroundWindow + GetWindowText = ctypes.windll.user32.GetWindowTextW + GetWindowText.argtypes = [HWND, LPWSTR, ctypes.c_int] + GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW + + class HotkeyMgr: + + # https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx + # Limit ourselves to symbols in Windows 7 Segoe UI + DISPLAY = { 0x03: 'Break', 0x08: 'Bksp', 0x09: u'↹', 0x0c: 'Clear', 0x0d: u'↵', 0x13: 'Pause', + 0x14: u'Ⓐ', 0x1b: 'Esc', + 0x20: u'⏘', 0x21: 'PgUp', 0x22: 'PgDn', 0x23: 'End', 0x24: 'Home', + 0x25: u'←', 0x26: u'↑', 0x27: u'→', 0x28: u'↓', + 0x2c: 'PrtScn', 0x2d: 'Ins', 0x2e: 'Del', 0x2f: 'Help', + 0x5d: u'▤', 0x5f: u'☾', + 0x90: u'➀', 0x91: 'ScrLk', + 0xa6: u'⇦', 0xa7: u'⇨', 0xa9: u'⊗', 0xab: u'☆', 0xac: u'⌂', 0xb4: u'✉', + } + + def __init__(self): + self.root = None + self.thread = None + + if getattr(sys, 'frozen', False): + respath = dirname(sys.executable) + elif __file__: + respath = dirname(__file__) + else: + respath = '.' + self.snd_good = open(join(respath, 'snd_good.wav'), 'rb').read() + self.snd_bad = open(join(respath, 'snd_bad.wav'), 'rb').read() + + def register(self, root, keycode, modifiers): + self.root = root + if self.thread: + self.unregister() + if keycode or modifiers: + self.thread = threading.Thread(target = self.worker, name = 'Hotkey "%x:%x"' % (keycode,modifiers), args = (keycode,modifiers)) + self.thread.daemon = True + self.thread.start() + + def unregister(self): + if self.thread: + PostThreadMessage(self.thread.ident, WM_QUIT, 0, 0) + self.thread = None + + def worker(self, keycode, modifiers): + + # Hotkey must be registered by the thread that handles it + if not RegisterHotKey(None, 1, modifiers|MOD_NOREPEAT, keycode): + self.thread = None + return + + msg = MSG() + while GetMessage(ctypes.byref(msg), None, 0, 0) != 0: + if msg.message == WM_HOTKEY: + h = GetForegroundWindow() + if h: + l = GetWindowTextLength(h) + 1 + buf = ctypes.create_unicode_buffer(l) + if GetWindowText(h, buf, l) and buf.value.startswith('Elite - Dangerous'): + self.root.event_generate('<>', when="tail") + elif msg.message == WM_SND_GOOD: + winsound.PlaySound(self.snd_good, winsound.SND_MEMORY) # synchronous + elif msg.message == WM_SND_BAD: + winsound.PlaySound(self.snd_bad, winsound.SND_MEMORY) # synchronous + else: + TranslateMessage(ctypes.byref(msg)) + DispatchMessage(ctypes.byref(msg)) + + UnregisterHotKey(None, 1) + self.thread = None + + def acquire_start(self): + pass + + def acquire_stop(self): + pass + + def fromevent(self, event): + # event.state is a pain - it shows the state of the modifiers *before* a modifier key was pressed + modifiers = ((GetKeyState(VK_MENU) & 0x8000) and MOD_ALT) | ((GetKeyState(VK_CONTROL) & 0x8000) and MOD_CONTROL) | ((GetKeyState(VK_SHIFT) & 0x8000) and MOD_SHIFT) | ((GetKeyState(VK_LWIN) & 0x8000) and MOD_WIN) | ((GetKeyState(VK_RWIN) & 0x8000) and MOD_WIN) + keycode = event.keycode + + if keycode in [ VK_SHIFT, VK_CONTROL, VK_MENU, VK_LWIN, VK_RWIN ]: + return (0, modifiers) + if not modifiers: + if keycode == VK_ESCAPE: # Esc = retain previous + return False + elif keycode in [ VK_BACK, VK_DELETE, VK_CLEAR, VK_OEM_CLEAR ]: # BkSp, Del, Clear = clear hotkey + return None + elif keycode in [ VK_RETURN, VK_SPACE, VK_OEM_MINUS] or 0x41 <= keycode <= 0x5a: # don't allow keys needed for typing in System Map + winsound.MessageBeep() + return None + elif keycode in [ VK_NUMLOCK, VK_SCROLL, VK_PROCESSKEY ] or VK_CAPITAL <= keycode <= VK_MODECHANGE: # ignore unmodified mode switch keys + return (0, modifiers) + + # See if the keycode is usable and available + if RegisterHotKey(None, 2, modifiers|MOD_NOREPEAT, keycode): + UnregisterHotKey(None, 2) + return (keycode, modifiers) + else: + winsound.MessageBeep() + return None + + def display(self, keycode, modifiers): + text = '' + if modifiers & MOD_WIN: text += u'❖+' + if modifiers & MOD_CONTROL: text += u'Ctrl+' + if modifiers & MOD_ALT: text += u'Alt+' + if modifiers & MOD_SHIFT: text += u'⇧+' + if VK_NUMPAD0 <= keycode <= VK_DIVIDE: text += u'№' + + if not keycode: + pass + elif VK_F1 <= keycode <= VK_F24: + text += 'F%d' % (keycode + 1 - VK_F1) + elif keycode in HotkeyMgr.DISPLAY: # specials + text += HotkeyMgr.DISPLAY[keycode] + else: + c = MapVirtualKey(keycode, 2) # printable ? + if not c: # oops not printable + text += u'⁈' + elif c < 0x20: # control keys + text += unichr(c+0x40) + else: + text += unichr(c).upper() + return text + + def play_good(self): + if self.thread: + PostThreadMessage(self.thread.ident, WM_SND_GOOD, 0, 0) + + def play_bad(self): + if self.thread: + PostThreadMessage(self.thread.ident, WM_SND_BAD, 0, 0) + +else: # Linux + + class HotkeyMgr: + + def register(self, keycode, modifiers): + pass + + def unregister(self): + pass + + +# singleton +hotkeymgr = HotkeyMgr() diff --git a/prefs.py b/prefs.py index fa13d48a..0a4dbf21 100644 --- a/prefs.py +++ b/prefs.py @@ -8,10 +8,22 @@ import Tkinter as tk import ttk import tkFileDialog -from config import config +from config import applongname, config +from hotkey import hotkeymgr -if platform=='win32': +if platform == 'darwin': + import objc + try: + from ApplicationServices import AXIsProcessTrusted, AXIsProcessTrustedWithOptions, kAXTrustedCheckOptionPrompt + except: + HIServices = objc.loadBundle('HIServices', globals(), '/System/Library/Frameworks/ApplicationServices.framework/Frameworks/HIServices.framework') + objc.loadBundleFunctions(HIServices, globals(), [('AXIsProcessTrusted', 'B'), + ('AXIsProcessTrustedWithOptions', 'B@')]) + objc.loadBundleVariables(HIServices, globals(), [('kAXTrustedCheckOptionPrompt', '@^{__CFString=}')]) + was_accessible_at_launch = AXIsProcessTrusted() + +elif platform=='win32': # sigh tkFileDialog.askdirectory doesn't support unicode on Windows import ctypes from ctypes.wintypes import * @@ -100,11 +112,34 @@ class PreferencesDialog(tk.Toplevel): self.outbutton = ttk.Button(outframe, text=(platform=='darwin' and _('Change...') or # Folder selection button on OSX _('Browse...')), command=self.outbrowse) # Folder selection button on Windows self.outbutton.grid(row=8, column=1, padx=5, pady=(5,0), sticky=tk.NSEW) - self.outdir = ttk.Entry(outframe) + self.outdir = ttk.Entry(outframe, takefocus=False) self.outdir.insert(0, config.get('outdir')) self.outdir.grid(row=9, columnspan=2, padx=5, pady=5, sticky=tk.EW) self.outvarchanged() + if platform in ['darwin','win32']: + self.hotkey_code = config.getint('hotkey_code') + self.hotkey_mods = config.getint('hotkey_mods') + self.hotkey_play = tk.IntVar(value = not config.getint('hotkey_mute')) + hotkeyframe = ttk.LabelFrame(frame, text=platform == 'darwin' and _('Keyboard shortcut') or # Section heading in settings on OSX + _('Hotkey')) # Section heading in settings on Windows + hotkeyframe.grid(padx=10, pady=10, sticky=tk.NSEW) + hotkeyframe.columnconfigure(1, weight=1) + if platform == 'darwin' and not was_accessible_at_launch: + if AXIsProcessTrusted(): + ttk.Label(hotkeyframe, text = _('Re-start {APP} to use shortcuts').format(APP=applongname)).grid(row=0, padx=5, pady=5, sticky=tk.NSEW) # Shortcut settings prompt on OSX + else: + ttk.Label(hotkeyframe, text = _('{APP} needs permission to use shortcuts').format(APP=applongname)).grid(row=0, columnspan=2, padx=5, pady=5, sticky=tk.W) # Shortcut settings prompt on OSX + ttk.Button(hotkeyframe, text = _('Open System Preferences'), command = self.enableshortcuts).grid(row=1, column=1, padx=5, pady=(0,5), sticky=tk.E) # Shortcut settings button on OSX + else: + self.hotkey_text = ttk.Entry(hotkeyframe, width=30, justify=tk.CENTER) + self.hotkey_text.insert(0, self.hotkey_code and hotkeymgr.display(self.hotkey_code, self.hotkey_mods) or _('none')) # No hotkey/shortcut currently defined + self.hotkey_text.bind('', self.hotkeystart) + self.hotkey_text.bind('', self.hotkeyend) + self.hotkey_text.grid(row=0, padx=5, pady=5, sticky=tk.NSEW) + self.hotkey_play_btn = ttk.Checkbutton(hotkeyframe, text=_('Play sound'), variable=self.hotkey_play, state = self.hotkey_code and tk.NORMAL or tk.DISABLED) # Hotkey/Shortcut setting + self.hotkey_play_btn.grid(row=0, column=1, padx=(10,0), pady=5, sticky=tk.NSEW) + privacyframe = ttk.LabelFrame(frame, text=_('Privacy')) # Section heading in settings privacyframe.grid(padx=10, pady=10, sticky=tk.NSEW) privacyframe.columnconfigure(0, weight=1) @@ -122,6 +157,10 @@ class PreferencesDialog(tk.Toplevel): buttonframe.columnconfigure(0, weight=1) ttk.Label(buttonframe).grid(row=0, column=0) # spacer ttk.Button(buttonframe, text=_('OK'), command=self.apply).grid(row=0, column=1, sticky=tk.E) + self.protocol("WM_DELETE_WINDOW", self._destroy) + + # disable hotkey for the duration + hotkeymgr.unregister() # wait for window to appear on screen before calling grab_set self.wait_visibility() @@ -164,17 +203,81 @@ class PreferencesDialog(tk.Toplevel): self.outdir.insert(0, d.replace('/', sep)) self.outdir['state'] = 'readonly' + def hotkeystart(self, event): + event.widget.bind('', self.hotkeylisten) + event.widget.bind('', self.hotkeylisten) + event.widget.delete(0, tk.END) + hotkeymgr.acquire_start() + + def hotkeyend(self, event): + event.widget.unbind('') + event.widget.unbind('') + hotkeymgr.acquire_stop() # in case focus was lost while in the middle of acquiring + event.widget.delete(0, tk.END) + self.hotkey_text.insert(0, self.hotkey_code and hotkeymgr.display(self.hotkey_code, self.hotkey_mods) or _('none')) # No hotkey/shortcut currently defined + + def hotkeylisten(self, event): + good = hotkeymgr.fromevent(event) + if good: + (hotkey_code, hotkey_mods) = good + event.widget.delete(0, tk.END) + event.widget.insert(0, hotkeymgr.display(hotkey_code, hotkey_mods)) + if hotkey_code: + # done + (self.hotkey_code, self.hotkey_mods) = (hotkey_code, hotkey_mods) + self.hotkey_play_btn['state'] = tk.NORMAL + self.hotkey_play_btn.focus() # move to next widget - calls hotkeyend() implicitly + else: + if good is None: # clear + (self.hotkey_code, self.hotkey_mods) = (0, 0) + event.widget.delete(0, tk.END) + if self.hotkey_code: + event.widget.insert(0, hotkeymgr.display(self.hotkey_code, self.hotkey_mods)) + self.hotkey_play_btn['state'] = tk.NORMAL + else: + event.widget.insert(0, _('none')) # No hotkey/shortcut currently defined + self.hotkey_play_btn['state'] = tk.DISABLED + self.hotkey_play_btn.focus() # move to next widget - calls hotkeyend() implicitly + return('break') # stops further processing - insertion, Tab traversal etc + + def apply(self): credentials = (config.get('username'), config.get('password')) config.set('username', self.username.get().strip()) config.set('password', self.password.get().strip()) config.set('output', (self.out_eddn.get() and config.OUT_EDDN or 0) + (self.out_bpc.get() and config.OUT_BPC or 0) + (self.out_td.get() and config.OUT_TD or 0) + (self.out_csv.get() and config.OUT_CSV or 0) + (self.out_ship_eds.get() and config.OUT_SHIP_EDS or 0) + (self.out_log.get() and config.OUT_LOG or 0) + (self.out_ship_coriolis.get() and config.OUT_SHIP_CORIOLIS or 0)) config.set('outdir', self.outdir.get().strip()) + config.set('hotkey_code', self.hotkey_code) + config.set('hotkey_mods', self.hotkey_mods) + config.set('hotkey_mute', int(not self.hotkey_play.get())) config.set('anonymous', self.out_anon.get()) - self.destroy() + self._destroy() if credentials != (config.get('username'), config.get('password')) and self.callback: self.callback() + def _destroy(self): + # Re-enable hotkey monitoring before exit + hotkeymgr.register(self.parent, config.getint('hotkey_code'), config.getint('hotkey_mods')) + self.destroy() + + if platform == 'darwin': + def enableshortcuts(self): + self.apply() + # popup System Preferences dialog + try: + # http://stackoverflow.com/questions/6652598/cocoa-button-opens-a-system-preference-page/6658201 + from ScriptingBridge import SBApplication + sysprefs = 'com.apple.systempreferences' + prefs = SBApplication.applicationWithBundleIdentifier_(sysprefs) + pane = [x for x in prefs.panes() if x.id() == 'com.apple.preference.security'][0] + prefs.setCurrentPane_(pane) + anchor = [x for x in pane.anchors() if x.name() == 'Privacy_Accessibility'][0] + anchor.reveal() + prefs.activate() + except: + AXIsProcessTrustedWithOptions({kAXTrustedCheckOptionPrompt: True}) + self.parent.event_generate('<>', when="tail") + class AuthenticationDialog(tk.Toplevel): diff --git a/setup.py b/setup.py index a3eda7cc..90cae6ff 100755 --- a/setup.py +++ b/setup.py @@ -57,13 +57,14 @@ VERSION = re.search(r"^appversion\s*=\s*'(.+)'", file('config.py').read(), re.MU SHORTVERSION = ''.join(VERSION.split('.')[:3]) if sys.platform=='darwin': - OPTIONS = { 'py2app': - {'dist_dir': dist_dir, + OPTIONS = { 'py2app': + {'dist_dir': dist_dir, 'optimize': 2, 'packages': [ 'requests' ], 'frameworks': [ 'Sparkle.framework' ], 'excludes': [ 'PIL', 'simplejson' ], 'iconfile': '%s.icns' % APPNAME, + 'resources': ['snd_good.wav', 'snd_bad.wav'], 'semi_standalone': True, 'site_packages': False, 'plist': { @@ -98,6 +99,8 @@ elif sys.platform=='win32': DATA_FILES = [ ('', [requests.certs.where(), 'WinSparkle.dll', 'WinSparkle.pdb', # For debugging - don't include in package + 'snd_good.wav', + 'snd_bad.wav', '%s.VisualElementsManifest.xml' % APPNAME, '%s.ico' % APPNAME ] + [join('L10n',x) for x in os.listdir('L10n') if x.endswith('.strings')] ) ] diff --git a/snd_bad.wav b/snd_bad.wav new file mode 100644 index 0000000000000000000000000000000000000000..56818536be6a3b36c13749417e24e197db8e9b57 GIT binary patch literal 97036 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

9(CP;^?Be}~etgk?z#mrXC8IwJjc zxQL=i-GW-$`oII}g}OmKC-n%$g?}qujBCaqby3(35lVznz`AdQ)Qid~Ae>xsCR+^n zDu%1F)fH6cecR5BFJ zEFBNN|JUQs!GB)^t3sOsFaD+f8Iw9bR77d5bPm4{R16(d!ti;A^oNRHZ3ns5vaW4q zhV;A)jLV_q9Q4^92vncC`+jsG*j*N)hBBj> zXsQi5Ph=#&({;eBkRK>)v)m4N3b_(C!GDYmaD%k*d34DhWUPc8*>WN)>I!N0GB8KJ zLn1kwm}{rm^U+Yy<6@{Zq6_gA&tO_|=b1zB30cO@WZVKbL{q$-20^iSD%Cm~qff+O!l=P?Ub><^(;vRu4UsiB1Zb7M#wJv~)lBMwn z_lccm9R}|43)mSf1JBrQv$HcE96>S0AuYxjVDAC`=2dH+dC1!9=D`_o3sB8&xXUm} z@1)XDb2lqwWZKhfnQ|~eJwgK2k{!k+GPm$>;Aq{ZZZdD_Q@9!M7X=u@2JkfZgtliR0v%eUt z^}%LtH-OS1!CBim?>t8p>4K0Ym<*ewCU7D|F^8z*cm@{eAzT?DnXks4q;D|;`7)5T zOM{8+3B_>zLA}ld>K;Yzp=EX~`;dI(zHmyQ9aI$a8qWV_P9OIZI)ghBAFV!+VM%c= zxMiF%W?0W`4uSt}C$ZeVZLERw`xVeo8alkS**t7dBf_WwkfvKXG*N~e0KT~AWFfK& zy@NX}6cnDZ)tLrtS>d(E>n$%(>{+HQpXll2bp-`}f{lC|kLfusd}8accevfc9k_S@ zr3R5hs9nrBNS}^FLm>-&ALphj;C;?GD;iP*r_fDeyM5DW2|JtpKzw{|IG_?2HM2r` zCZAi3KVjo$LIYkG6tbriAevrZ3dHO!Sjbj;E zDCs>Ud;&FuqhxlFke^#dmPPAv17;iCw|?WvKq6~{x{x_=edm%<%;4-6#00`;7u80| zUN{}{Sdu%c(|W zc9t2*dVXssQ3w>tO?D4!12|xd(JQHEXo$PjJ%#7dAE|aoaGu-QP=D|ZWkRRydq9D> z3tYd4?i}l?als72ZZj74a0S)6YK-2>C;>W3$8d7^jGU+jlq}#}sT7P0_mdOl$ne_0 z-N3H!KS<;^m*Ya!LltFKe`zG>JHbodPz^#-`GKYC1GFFdTDutG!p^3Ip2x`U97Ru1 zoSW5d3EJ{|ycgcmm8@Zq@;HO0;s!(!yAb5po}#%JEW*|)y@q+sxj@u%3z-?glM-u< za_ZVSz^`)vl8LQ>=XwwP?G?jY<#Kw8u}E{J^Wikv($`oUOj*-aRljfdBE>{uRCp zz=XKT(Bf5ZnkRw(OXs4qvKIeLXv&H7Sn4vfhX2VgV`k$Hs0FYJ13;dsMy(}3Pz#w) z%u^~CdITF^17Bl1vd75FNFcK?&$z4nQ0_K;lIpW({ zxW~IUlFHCNx_?AX-#mXz^sS6}GLDHvzMWpfpA^+Q%I{w!#)?n9izALj)bsx1va_eS zZ(^J`mzaa?O-+IuXF2WyGno8G`~}iWLE0jB6JdLYz0_?8>HQz}TJwT=&{+rMg^DgD zN35;RUepl#i1XHe;I>6@u6;v(XTCYw&Ia0GEm}tL?g8R3^@=^swgAW3N@5-92Lj+M zY61|!I-)UDPkJxVsnadWfq4QIb!(f|^dw^;^cCE+HfppoPid-`HSg;_{d!iM_T_@(Dj8iof;ni^+x)ThfGLxscjAr~~j?rFBu zUZ?|%|GD>d^SgQmhyw%ct?nzJ5x3F8x@?~&27?29ie4Ew*!|sh&OhUyx?i1ZEVWnK z%i$*WOwOQvFj9;KaGSgyj0(?{hbWpOz15EF!_HjZ%<%svNa}Ar>++=i^ zXlAMETy>W55VpxR%^&J(^?)(a{%DUipJ?Z`p5|>Q3&A>^Im}S3zeHK`Hv&i>WM2M| z6_^xi7%JKIq~`Y64CY=M@dU(^b2EkdX;5Su@!y4|d^P40*%>C9c6=uInH>BZm!TusGE7hW$hqJw2ZF$SY7Z*wV7s4l zp2!7WwB`CVb&EF2jJBtnRUrpGP5o!Y+i_Mm{k1wkFKRz?55W2OOv$X~wtmA|>#>iU zTWu0`1wHx;y#WQmA>WN%%NC)2!neQ=TSx_ds_k4KdOY2qyCi((eegCe1Z=VFLJ;0C zU&)6!KfQ@N$R{vk(SP76&PlDN13={459yMNcrty1Eapx(XP8;sF1R=PVvW<1)r-b% zr@YHrkJL4=gP-Omp%(5Mvxo83jw5R^&#CPM;S?Z-)A#rge~)G`CP%Tw#LQw5m~%Ig zC)nn&)wwLp0M*>b#dt<~AM#05UMx}>xvD}MyN_IqN|FWG$9z0@fXwg4JF$?rgk%Ep z+YPP4L{F*$l^uvUOO0~&8{$2x2K0t|+J18Y5S&KC_kN{O#%fJGBv+Ez-DyU$ao0&E z-%_to9w!ZaxW(wLK+I2t=8qPX#f}00)dI3R{z9$h_jtOA*Wre6g?Y@67R&NisD)@S zsCl~~H|?Qs;{JFhm7RG)wsorNSG0HbJ$xH73%lTryN#HL6Wj*I5VeeoG)d27&vdSs z)6`hyD)5OiSl^U3p|(;lqX|r>%k{dMkED2Y3bZ9vF!%}&KE;#lM+6Q2#*1&YZReq9ef?E^6 zTp2y53Nf#!d#DZECg-!8`O;iXx;Xg4o(pF^?L`KfBsgX)w?xP*++wzqKS+&n_%%X5 zE``od?`GO_#n>PUnt${`PCHig^k)v(He}4tq0_`YxHWCU*{SSQJ+c9QhG2dYgIY2>aNx>>(k-_tdvXYy$g&ylgQcR-DcyP>XR5>I!>~ zdUCMvls!$iVo5Q#w~&Y6`!mOx6MQc3E$>`a`49M&WK zyLH+5ZVCD}Ws}+lh+0SNV#Xb%m$FPh30t-G>d^3%&{+AWmRql+$f3NUtx`d4q5eQE z2u^=BR9mU2jZh{B|D^6rza%ATpVTSgE9ny;>AGJXr9KUJ4onSP2#RH`?JW1T8fqq+(A&Lrep!f^E1D&?}<2-CvK>0(vQ{0;F}n%E?Md-(rn| z43J+9E1mUTRvr7iF;vZ@4mSq6ZSfc4r=^2y*#r_}YipEw*S-OrOoO2(h$m}0wagvp zCO?Z?4++(hs1(_VYR2?sbJJb$4Duc;3py8#dDvMF7v2aK)z$3^C(mi(8@zK{+WU;2 z=1QjpDvbWvAB=itJ?AGhB!%qWMk#Qz5$ri=1oaoP=0VseR5$k9VVLpw|IhMg zw+p#Toyq1{xRV?){(?*Qlh#rFqF=N{qLtg!$_B2#qGofqGZKjBRu@pS|Dqy5t}aW& zI`>?Ha@n0+6FLHSASHIQ*jlW>b|5E_UiO2KF2?h>=;hRWCcsrVWtrBhxlo|G!_4K7c2AFJfP9|#{FxIY^YanA=(A8m6Jk{z> zyui2MPOKOwteR*%m7DrX6n8lH4qm|=WBbwLaXFlm#(Z7jKejlz3QwU4KC|$PwZIWP zl3B#>6i6;NwH=aR_gI~e=KnzU;~#ngdBJ*I6nzx7rYX)Zx+Q(x$!Tmb3WE}q2u$W% z>QW7XLuw6?jEY+alp$I_rz*SyrJV|SA8+@fwp zyqR7}H^kF{U$)cfhWg=NL|Lo5KHHcN?Pdq9H(E_4q^#Gwn*9u{mX&TwnY0$>QJ{U5 zl|M;m)RyLYtBUbL`A^BA-?C2<>)nCYE8_s%U`~^j@I)ukT5aDax$Vs26V43%;iW14o}$m>)BvY4a~)!G;{>|@S&E4!9M&aAZ4A=6{<>d)}P zuq6|EKmDKlHP|mW0wzpaGYItMp~+d~o`Dp}-p;V5~sw%sVI|CIYkF^XWU0yQ7-uByrfC4%v{Lu#-zh7a(2t!iq!< z$^57&@Hv9!cUyEsbC@~<_LdFIyg;hoq^yvOs>k*3#x^}pt)R45zX8c~ndXuAha1Z) zG>`elIH}!M+NtTlz<2^~?>Hm72@EK*Ftrpv1p38nVEyl58v+CAB)nxkyeVAbuQN61 zI;<*W^5*eS{BL-lah^-Qy1uo-4knqd$|gWs=MLQj^1TX`i`&X=rk|o|;GMWn-J#c! zHHimKBEe8an8iTSdjU+(RnW{<4KH`M*&Utr=s5L-N`g1vM(|}`qKh!=$U($J;9gW> z=5zO0hZ;%lqwn&rSXVefhww7GqGx4CL4Ht`Oxd?Jpeh0XUlv zxJ>+D@0N(mUd&CS2eL1Oa-L5-V!n}>ZqKzBnsWkG7jisvsZC6O`aas=baghNw&1Ec z0o#R^keVz-7N*;fQ{DA;7GfOScZ<*?Q5N?!v77459tN7<4B{G+=!1M=p&%O~b+S3z zU0m+z!ux23vYC0}UT;CsVy4n-*dk&QIDzJY_bvl|N3DbG;t_&(9yyyZ&m5=2Xsi7Y z+Jwe|FMg~|>)(|8dbGXKxob_)zp6K&pKFjyI>0qkXzjb14tjSL>!*I+$m--p8PQbO zS1r;d*oAimHhzM&$1LI8hv&nO7Tb-iCXN?>CzqkI_Cm9#Jr$9VLD}!@g=}dJ^o^WN z9s>IBZL^r|cZa|p@S3_$5%j^?gOiw&!L; zMDw0eLOl?!6&@z1s2A14Qtx03Xg?|id)y1sfS?Snwu{PLb(CBv6c>CQw$%B?Lj9Q1 zQSPp$nvS#FeyRUed+Vvz1eb+$z+&*0OoTMtEqsJ{W0$nwyRon%?1ip?o+CPO=o?;v z8aofnETp<*gBSCvIQXtpA+TCj1((0)uDDSjW z+WMu9R&Q!sU=uLc%4?j^p6M;@%0voG^@E_t;kMm{@PGp)!h-ZS@sWyPI#b)xE&`Ls zn8{pQb`8~$>_$J~HVD)CHB2hClF24a_dFKsbA{xuKf^5^n?Qje%&)nSSS?rUiM4=*51lOb^feS$g6m7i(|N7Ob_m-7~|XI33I2IDQvvZ1?HZf zTof~i>A_>q0&x|$nvS7KZmu}qGZtLDZJ7n!74f)dr%;ZaMJKZf;$v@K?+3mIdypIF zsp)^^+b?F|GYJ#DC}M`cD){1l^W(ieB8Nl`@GlpmM6d63IKxZ7=J!* zH$KGFWM}g+;(LA|)0-?zexpZli`d=d8n+{~9MmIIaf(~R%51`91H2;5DP%ZGN3Eze z+L;4=2g@}_&kO#R6#JWgOBtn_@P6#!#6fm$s`kQ+1I|Z1dzC&@`(xyHSE0{tGuR3) zwu%xi+6|u9%6e%aRPb>7nXZjdx~ek`FQ{*~H0VK;9w=Fis>UK^O0Z2j6SCzA%8>Ae z^lqthQ!l0W3Aw?-sk?q>OdS%Am!m>!QWO3r{F|J;CXV1)h38}OMFgyyk|ayPw~wpe--N|F|-xAbfJ2KBsDNxG;0 zXW3Q*BNJqt46P|lecOy;YO-8i9Rw8V+(s8jOfQnN>9&!mca;61q|j{Hr=3!#Nd1GO zg8ig5s#p6hH4dH(3<)<;$Liy>Bl5ZMAE^^er0u~eS`5_1K2|*O4@ec+jRdm{F$^*)5w}Yw$37&;O z`b*#@)0y#JRGRX!?O1^_fn0EjxCxB9*4XD(bUG1x$S^en4|mF2z3phkP^(BD^@9xB zOEQ7kN1ws5#1PQ_=P~D@Cx^iS^p@()jpN(0Pskx~d#VfXkbHb2`Wud=UbEu_iysF> z*PdiE<^y;)GBSzeG7>XGxLVw0>Id|*+{1YQpTJO6iLoxiadaGWicE1YLN^DHwt!w- z4bFrr_7K8D*2j!n+o}oK$LWxl$N|)gvd#!pmv-slBn_#GBy^0f!QEgR(pShN+RJwm z4-0$PWIDi{6&`vsfdBb32d!V?YVUM!6=6S9k5Rdb9?siX*u=DhR7E%8g4l%5K+nSE z$YM-kZVTh$DTDyNpJU7gn#GfVVi`>=BTIlM<|}OR>$)lABB~LpZ|Aja@UdotR51ZJ z)11&+c%S-BZN}q)LH2{Z4}Av5sABjBj%Vicn|Pc4gL0#f&eMT2>`R`J+Q3++vL7YJP2)nHf4PJivlJ zZl59y(gLOq?16uXbgLrrFWb2VUU zZ3CLkIY>Gkr!V3=&Pj`K763VGpEK5Yp%&GbT0?>VR8AiO4(!H8Wvd9x2-T!cz+IZF zZ-qDUxA3g6M`@$?Gf3@;)F0kLKaC+)HDkR($tx9XG=w)-4)Cb*>MCQb{T(#D3R+d5 zZ5#kv**NRHepqh~H2b4&BIt-K^eomicLX8XOWSJahG?On3HV?YF|G#m1_k`=w4I}51|Kht+?{^YIKZP4kRX# zeFn;Rap=scPd|Zgu!7#W2`B@7f-M1Ag*(JSlt@42>chQzCuP%L`P$xb-s*zQlxGtK z!<*{s;mOHw;2Ma(d@+!TTE^vPO0iW0TdW|gWu{Pj=*GM$-V#nRMS#Nno_@nM<)9-J zT3v7B$Mg@{!99Vb_0?@d=B7K7haInZ5^k0+iDj;7wt|dHRbW!qa1WcKw3pg5nB;Rg zlc0@fvc{ONoCm}Upio4B3UL^A8S9;BuAl(+DA)vzu@60W5*T}GO&HCNNa3xctsjnWaBlO_hzQ+K9a2rieRWheA1 zP&v3CNMhZj3h593Jop8N>GGl9>i%X7EMG91l-j zBDIce&14qVibwe=FhkA5k@Q=}fituX(G}&UZ*j-?3Ty_d4SAA6OfxFYSq~ep+wK5( zmWmL0h@I|WcPHV;?T~Ks;OARJL^7|)OTfk-j#rSMK>r_2es#xKnVf034P@e~pykl4 zb3&}@sl!#rHK0L!0c^>W*cveTltF3CL@p;IK#pexzE0j{&+>)nZth*T2Xz5>#P300 z9BwbNm!V})o4yrjc?ZoR;Ib3lmOwl9SxcR)#1&{Gs%W%V-@Bbu%N%W%h6wIDg&f5^v?+sHRxY#5%xc77Cuka;SYE=c#82e>0i`H zHbvMYO56b&G#9Rdr>*z6kcs_8?`Ovf!+SIIak4SFH2k|gXV@^h28rnrH<2fcvC(W&et z@-y5CPIJ7cvF9G!3v}Oq&U2FFzOpXW7uqfx3m=8n+96yQX zb_rvS(FYiMnc=e=z=n{wW!H62f&X{Emd9)d&ikHrUgNoT-}vG5LJQsb<_x`zS!+uZ%fPW?*Aa)hjDE zAlJLgTmy-Wwo*~KH_$pu7#l&qtP%bum($LxvC{T{FYr3_L`l|Sl{29u!5=`D|DoMd zzJwA3V}h;a1MoJhptJxAVv4pJ*xTFGb@DDH(GX#>Nw%^YAN3=apLhwK>?O^2`gl-I zjzQ-QLC5P6||E~N&Tuk z(e{`VAaA!=DJUORUO}taG9z8Rsm#_oL(=??oeAdCmTFrghyBDV2)Bqz+6J?-D}s6~ zm}P)=Uys;<3K0|SbgL?{nkvTp_rEt6WWnc?OPJG)M2$ zZjUFq8{8R?k7&w_Az!#3;cR_EuA#1>E%p}ksr3eSMm>laJFD5rnn&b=)~r!P6Z@$3 z(#Zu~ext#&b)vDhe&A&v zL zJXx8_3CdW0K7wgQQq)eixtIs`C7qx@D;Gc1Q{6jOc)^^f&#{s)8K@F}*h7q;OA#C~ zi*SHhN7bfZvorWyoI@$VOqwN_03bpal9shh3cZLwXYM2fl?qE8nyU zDkp=^1|FMa%VShfzDOZevrm8rD%R+!9WeSj?ZKVlwdxxSjUv#qu-$3yWU_Vhh56Yk z?zFV~=xw3nvVxV(5v*S@>9A^%|~JC zAd$yjVRZts#W^Yr?Ig{uX3joj;St0-s|;+bOkyC}4cB$E+t2J6^q$N^W`J+mWv2@6 zPtT=ITmqUB1@ay9k-bkp#Xryj>I5eVFZsDJ^Fc10Uk=XfIec@NCJ&3Pe7S)lorfF1 z4Ho+Y3+0lS!2N`b=2mY3-%25sEn3bnR`i2gA-!|y_xL%#n|>fln)=r{uyG$mLsWr4e|JoH~5 z5&Ckq7=wux?s-~ya&ld$hV*#;w`VsfX#4pW>`88+=acW0cm}ea0#`x!0Iasm)NGtU zdYNY2JN5#&WFm=2_%eMNTAqQSYj%L`{4iuXtW_O$iZ6+ID6c!uENon`9ukmz~D5*BB13wJ&+A}$kO$#&Em)YE<9{sSV#6gCSTL=(|l@*-1@?E@a~7j6RX&2;AC zq5o_&YWcr^SuTS82)@`6?s|NU?hgM3&7CIpP&bICBMQ0^a%t0zhRzUIwoYpKVFO*? zm|_+))~hM1oWf!1ylw-weD$UpfUQaGtsSO z7c?lnzPaAn=ytI?=ns?(+6?gD7qALzG$hXrZJhbTm;>9xaq@j_wpq|ztokK4+)!-* zG{#J3Bk*YC1PXcqr@pyDJqowiFXl3vvuDBnJYbG=YCt>tI@q08G!M9kp%NryGY(x!0`<<_GJCTMi|=spew+h_Tf!>Ta_4>Z_sQ8UfAan?1_- z2Y%zl`bubK*`x>LV)6iRgqAYBdaUw7E)VaL+;&d*wtiQd>B)9Z;*)dM%nlu9bKKP! zNJDOSU`mxBJk$bkco5D_tFe0zKZcH*GR`Dxf@t)~do}aFCejEH(CMwT;rwXJUuzm`ima z#5;ANkH%voNQsoUpAe@JPkaY1Z+15gEhc-y#$$%95+xx2BSS-#3%;EV&{>zltRf#1 zwa^)A8`qo%q9A&KcF?W3MD{qaVMn@$U=Mj7`X8Wm%dX-6!Skqecxqdkx2#0s4W5Rw z0+ptQyaP_HSwC-C2H(x<3-K%_X0axwk* zZhQlv0hFTFLYilbIFk24uBSh|_ZVMw(Z@M#88N$mVg%`{B5dJ&g5;_06Fl{}3eff2 zR;cAk77j6)fdRFWeam0wI?_{dFG!~hVLvdRNSzo%yaRq>I^CMQ;&yZ11C{{77_{i!CNr`vh4(@x?i~e8Dz=(9(^FOOv8$Ngd>!u< z-+!Kb+(2mMn;?$x{t(A;Jzy78RjBKEB4lLCQhli|>`UI^)zf-b7B@F>^QpaHP<fs-v|s&TBDJav)1^lvGS*RSP&K>(gfh z4@ixag;Mq4>h$ix?Q%D5wz51F4Ac+*P>&fQt%m$DoLgyNytWd|4r(3gs`OO51?2X& z#y<6|`Ui3bFP$M)eZ8W#$}nvcp8W#)X!R;M7~cc^rXeJzs%xFh_I3kno3>u2l`Q%v z^QJjW%PeP>b@jEun4i_w(#r5Td6^ck|4?>@sqhUsld-_!%<<}Y`LYsc9I^_4BI1=R zDh-Wqwhk1t)7p2fkTud>>jtf2Msee;{RU+qv%+_8m$kq-h$P$qXse?v@<4)0!m5Ogl~7Fu~Ld2jILnN<29Fr!y_JfJ2tXZCW(!~vd-{4aVB zytVT3ys(;$0E*v0*oHplvvBd?JAZ{+Gc<3q1*zu*g)%`3eUNa4jiK&=^2fpi^_gym zF%aAqu{U9N+lVd?%GP{mHAPg)1JxvBf2~&0NAtC z`v@4@52;zqYJLvr<{3zd7=%UepkHPz+z!s9(r~+M#05fAVDuISo@j0qhLgeoa{3T^1nfWulDFJ{7Irk4m9jG}$d*JRahx0iy<;^P8LtGN zVGE&+C(P$(a?(558Db4@Q1}BRxZTh>yFswIf^=zI9J0G2o0Iv03xXf0EN)LNf&Q*V zR!g(5-H@0^EV0|`HPyWOHt68=TIp&=`MtbD%U~pE7Vz>8q=!Pi)Mok>#TQ;0>LxeT z-l&7ZbJI@;ddRu-NaM2BTB$1ik~pAQUe$*{o?!^w)_U6;%#~ViWu$TuXr(WWCNPWr z)2CWboILIT>!jLNZlkakUQb=!ZO)-~yMk+k>$5kU?0P*W$rfW0LbTq6Nq$q@ z;jSN^uZGCUg=5~PWcasOtEDBJHQJ@k)29iUl)qHw);0&2v&F5-dgZh@!Q5fgwx)eI7 zx#?*P@H}>H_S7^gSf#0{Iq$mYVLAdcuMBOEyECVQ<}%ZCp5^Nnb--vWr;#02Nn^dK ziU;LswjH)w(qVJ0_|-O_p395H^qdhG!il%e{;ln`jZ}l}phw<&J>2_UX3Lj*I~{0#o~+u|;sMtTUC|nHjS=%)Y}hB_LIb zvH|1lzmz6wAx;OR_5VPXQVRK&>UCtL>--HdHT8C}YFT?5HBQV23-wI(BkR{j{w_?H zrr3&cTK$JoPHG_+u}|?IFYrA7xdF{L=s$meaxsvQsyORKC6+BNSiW4M@3zACg~ z)uviY4nO?=|IufH~eyjv5y#&=6_C4F@NqVBNhzmA-F9qRc_{-Er? z9tl?xZSL3ZcS-T_34b^Id+Vz0J>zbYG@fjCJ(1v;tXq;;8X_rJ@JdT)l~*6VfIG;2J_SV)7{dpzH#jJpXzs){)YSQ z4Fdd9Yz!z4`?tY9ARukZt|`{|wXhwuJ@$(TY!o=e(M$P2<$e8tOeyaA7qH8=0*;Z? zYdrMZsqU3cr8NBwuE4z4rADKcI+LpDn$lHss5zSMv~A_<)QmMSMhQRV$I4e`PNt+L zY=bgX%`LC8>}D`$5`SQ44vW92{4Quq;n&{LMY%{P_=3z}7;K-W^b+%mo8=|8&h|W< zf;lQ)l{ec$$w$2r)_`NHshRD$)HY1PBWpQt~SP7jI%CH zgi6LWkK%c))wQ-;zxDZ^=I&4=@|#%&4Bpc{p8hLs#kay`qlETZli~H=ileQLMjP{{ z_*ZG8MoOQpib5$lJtxI}$WGrp0=YevI}Pk}>NvX)y6+OFEpCGY-*R`+y_}r}bUhJ0n{7BY2GOo+wvdDm;D|CzzP>&Kc|S)5;nh z^eFd+q!?nWXf00L>7J9+&{>R`jT_9DT5GyWhI_Ibzsz{1tG0AE_I@x@3LlZ&$=}L+pLanN`pB@IUJZxM4I8P*r(1Mg2Qw=h_0CH_agtp+j8 zb1RgSBt5k~o)KDa&bZYO1I?Y9pa)oWr5y5nv7)6JcR0z@NO~vTk}gTrm?cwC&L%As z2TEI%KJ*HzE>{sUS)YVdN^VNiWBTf^r|kY3{X$o0_|yS50r4FfjZb0Y3sza!A|4?n%nBy z_u4{0>$%jCwsQ8mw$4lg{V1hWsxq-Emtsm@sju==&0-5s<7H7skeOf^SZM>G0U-S;o# zC)=~xu8_UI=GaT-yuH#_8Kv6zgogCV-zEhrPNe`<3vt$avzawPs4Z?5R+vSMY~~j$ z4;^)W7-#9lmw~y4f30~YmDA=rVXNRJUtsCk&91@?siiE4yUf8v{Ts=6)D?>|r~aQ< zU#cSZqI%*!J%Lk*(>eFml%1_&4Q6`HGiFx~H+Iwaydl$RZ|bwPsoG4vESy|LZ;1P- zYpOfUQ`Hm5q`eEy!>%>%^6r(+jfuPd^+>#w)Xn)T$<8eHK<5TmS~_}`OiGn_CUJ`M z1(RXdIF}`*be?rJ@XYmebZ2*UVpi-bYO?Zqqundr*F2N7e)=WsUQTagt%)(-d}cJJ zMn6U?Vr1nkctQP}_dVUn<{P2LQ_am}zgHg3n@aoW>FJKe1}vpME2p=z`-3x&t1+jJ z8o3uZ^CmS*+T#@5Ax!2w=}hP9;9lr?>T$XMxxTnAxi{1Enn^CM#;*15Ixxho>0&?3 zos+CaAN`Kwg&ARQ79Foj=qzlZ)dLdV(Z)PVkgEWM>2}k7T zu%ON4j>;D01zGf2;tlbYbWjds&TYJqR%{`ylV8bKrIz9@8aDkRA2)%@$olc2J$dnbYj{-S&BQ$$o`1QLP*w9MO&rJj(bD zVy@#k|95`X{5tu)^wa&?`4x6lA)~g*uG>xf1N$p`N5@;oJ%`(V%63P+qV~p)eYaKS z9K|G6v`x1yv!%3!srl7f>TtE4dQPz^r{zTE2u3S=m5xefWtGxh^{B7a^6F0Isxq5X z#$9cKEm|#Ot78vw9CVCvWOAf(%ywk(tLPW+nC2MbFdc{eF8bO1KG?I^^U-N7!v4~> ziCzl5I>iWzU{xV(tD#=%BidPp1*o)WJdv|_F8 zLMw5o=n|F)*M&Y*el8Z%ig&4y885C81IPgDX0%z0*L`Hdd?3-KhuZd8=4Q?SRiO6J z<;|^K@QU6rPb1G*&jL>|PbXrPg03~L0QVW!CucY3TIU2;KlfSp2=@=BB4>5SyH|SF zds2Chb5cHow-s505W2mV_eN+h_5MaaV=q&u@9RnWDZPa5qJQ{V<0hHdxqNbIqoWaH zq%w~h8H~Gn8u~;0GBz55F;nl!OtL+CC+apDvJN|0k%`pHr1G@mQ#E%7Pis#;dW`k< zJoBXXzVS5k+;m@b7xZigbN@snSbdL`N%rY z`Y*BGS{;S+WX+DSR%=-;A8H#!ycEnNnY&DMxkOL$_EKYMrSwDkE1jj6-W}-iZF%w8RdjF^c+vmS-AVwG*A&>^q^KMdvWFUdj81&bHJ%#H&9n4?e@&IRV%4K->p`mk71C!wiA^P{$>iDc zUfHh9VDeo%yeC1zj-^dPCMWRt2;6WdWtQbswoyh(Zlg0+MJ;ukTG zlu;@qt&y_Jo#m!<6iy}Aln=>umCMRIY{Dt!vEo%k^`R1>EK)8gf$9LdIn=_oY_(mm zU9~N@<+mMI$8tWfzpALAiXnd@=jYFv&vM|0RP0(7DHyxDfl19B#f3;lGtQbf5$wWe z>n7qUac{!jB*XmPf)zLc@t#0oQN5?yPW_bEw4gR`UyED7jx;nVJxmLK|y3)8g34m`= z-6h=Z+*7a%N$?-lJe@uBJ)GtBhLCN)=?&28qQTd-9QttPu58w)>!ax{7q3?|${R`g zNqw*WRu3}r8Xxs-`hMLX34RFPiZWIkW2jl)q09PIt(ulq6X`-e&1?5AprSg#{lypTUM}eLP#YR5L1aZY60sqVW6Q{Rje+y z5jTig(Z0uGC9xctpy62955gN^hcFyFa+1zBG8Q4faFcgAWqsp&S}Z{)VU+NVF1qd6 zxu#Z0Y{d)u^NuhlF#{#WbeYAiseI;J>x-3I=r4Q_#*4YBb4W+Vr7qIDjv9_{^z95+ zo+4{OYCSblEo6(ZeY54ax3!1byVx7jrzPBe-tMyJa};xYgYma)C+L5&foop*?&+JI#q``T=2Y$Ec(_Y5U>&WEyAKiqj z`7iLl=kNB<7SJ)^TtK$K=7F68`vi^%>>pS+FneHHroaym+!uH$a9v=9z%v0M0aCy| z|Dyi${2YEUj@ynsj^2(yFk>G3DqEm!ff}eT0F$OeR|_jnc{_JkLzXy$F%I3N_YvoN zDq(f{A;0UTS5jWIub~`FC#M0d!ghHk>!C@^;sK@RME6f(g(fN|nWcFe|E;LK>CW+1 zy{4{E2dXXA(yCM0q4c0uQl|RIA%{wzIOEw;EGs4nBe0nh(XY+cGNu^rp!#d4k;Uk* zZ_zY*Vde6kXBxpVcPcs}|8^dA?sl$+pRDN2m2SJ;~e6g?0mq??INzb&Z=O* zvd(|b2d>HPZ|-8A{+{Wcah{HJq|N8)25Rf)J>fm#UE$q^SBmwn_GY1{>uAq^NaHk5 zUr!FtX&oA2xSk!+o>J z-wWBL57Gl>1q4e&r9=Gm0~=mku8tJsp%Q5oKBF14i6;^X9HIZiN@*r?kwH2`zPC1d z_)pj^v_!+6T6eI3tJ%5rW(sqw(bhNNmsXS!=7B!uVY(o>ud0Y5xT}~ zO_Q0wZ_UQmb*r=Ro;oERReaQ@kv;7h~xDlTnDZ#!zAZiJrFEjjH4p{OM*p1z*)v z|D*+L9lfhOMLdP^fV!uVx0|(J{O66#>oU27=0tXK>t!NaKzh#EdN2z z7f(}fZ94I+rf=5(S7p~J?9QvCU(5_Ml7gI-omrg+l7f;xCDuuro0KZ4OJcpmH;GHh z#6)5d`X?RWmCmGVNfAk>lIl21xw5#oxZk@=d-i!6Q}N^W1~Efnt@cAJ$|vX3gY@qB z;>BqAL*uY<&B%#Xp96~x1d}<;)Mh5rWIcXHi~S2QLFEs#+jscY^84+0;rQ*a9G@KH96w-Sn%Wx^6OJU~kV4g!V6}nz zhnVm$xc(!OT}NInWtR-GxYS=7AT^QdVfVgC_2p*h*B>dLd>Y2-gK|R&Q69pGZI@Tb zZRL{0*M*e?WhN_fQ9Y`@RI8xnY3-WrEXXq}p1-gCv8|--lNyH=J4cjzgKYj`Wq1dEqgp0+3d{3+HA&n;?TL;IIWlFp!%=5x1aY6tV1D9 zrFUFUZ*{uQ*7B;}ou0v-&BS~|nXTQ73geFSYl`vy_TKX@_fGO2@CL$VR?`Y<9l=)( z_1XFk{Q)R1)R+&)yi~uSmEhfTX_>YC-azj{PX|v+PkGNf_jq?5cLjGncVl;6_Y3B- zk9KW$#k=fuby@G)n2b1?D^5JR!}Zfu)Lqe?%^k-qXcs)kMR%h6yZf=*a5wP`_cZi; zaqn?Ia#!OdLyYG>dYZ+1%o_>=n1c>1P4z?M)-w{F7SMn5%pB@bo`F3hiLqN4>#@`& zji-2%%lZX8M{4~B=rx5tfG*a1iN1$}V5#=hqwyV;Zb z^*QBPLx@TCFrS4WalhDBdMgznI=Uj4Q8uur;n=>KvYQ@RoWYcTz&A&N($CY^aF$q9 z%tVy=Kv*Qy5q?_{RyXR@b6OA0_NJ5GWob;!SZcUA|6V~at5?%=FhgjMc1d$<>GWUP zBC>tmwPQ>m%fl4W9C{ZlOt3M`=!Vq^Gd>w(h$ZsS1$w_#SXd*x7XA`9)De%1bwE|3 z?1!yvOzhN5nU7~_jyC-u?&%~O*ws)_Z)4DzT{pWmX7(!*KbJNV?)`ZT1$qc_AN&d2kqtX=^+l1_wYFV3}; z7qg1_#ZgpJf0VAu1C^snq%xWH+M&Ex{MD>5H?Wv$7~duJ5ziG@7pm9MhPCPlw0W4? zS1n1U^ipN4GM&GwORe2Q`MA7`8P@gi9&M%XVzhVxW~81NMC?3XTqbrAv*WMF;}-@J zHQmBfe4xKd3%pQE<)HFQDGXC|M7>QuaV^O5GTq{b+SY&uzSug@(Qmrrv}31ZI{o8| zIz0C0_Q&?`_SBB@JpS58*?)qqoAc;q8*H0o+ibhdV~%g?m)c&f0g|t#+OR*(l&ngi z;^7nLd%X6a?HId9jn7EXM1G^P8>mRrxLRUc%+7a~$tiUr)(w+J#yb?YVaX9xp!{{-5`pH_m&*JBI(odma(tC6FsW=Pjy@(bj9n zwJ7GIT+*(=Uq0ohBib(5tXZzDMY%rEu`S7!+FjE<$i0a8)afoo6!^o_%Db4Unx?lV zzObfN6ibvw%cgbJPHUzXgzs`{qR!+kzKX(JWhO4pp_jqKz2$xu;Nxp+c{MVn+;djF zF3jmK?WDGv-)yBgXRe-yJB%lmtYdZtMK3Wqjcm>^d%$r#GP}WkbcSy#fxI!*0R*;; zTDsFj<^802V6EEl6K(nF9MR7YdPMw_5|GFJ#6tt{k(;C`QZ{KL^Xl@5#l+HL39%Hj z8e531VG`O1vw|`&%Jk({bpj*W$PWTjZlyp>b zq<8GG=cUqZhONHMO)rDe^pM-43`Pns@`;tlVby-XdOf92O(gOb%mjc? z>!>9NA;Mw76w<)wY!sFWcZ5Kq>R#d!F-EKb16PS_ekgn85akIqHJh0kwo*N<7ecN#4OkOe6Jw`Y0o{xz7B^9xle# zuQ5}>`MtDq&{yQTAc}v4S;7x%kX6;{O&>^?m0xHij3hI0K{zdJ5+=gclz?yfW$oqO zPnxxvkNuN}WEL`8lkJ{w_T`!3#y>p@3wZ{6ITX}UqXp#Bp;+3{`1XqQjTwT^ zD+e+Qz&7`Sf$@M-yMlD*Xq&VeOzg~JJjCZUWlc=&0PIM9tr+iiQ)`Cxp25{*#p85^ zkG`rc#V7vL_ZaES=4LpuUBi4!Plu95P2+)a(L8IF6rNZOx!Za0Snpt~n!}i86FR`S zu3~;h8>*8U2?D&{S8Ki1m@e#Bh!ERZmpM1Pfwdh6N4wP8$@#%P)^;<>C}0?RX;|W5 z^R}4}{$!OIVD2(H7@`rSf6{AEp?Al~%sM*FR@OF{l;^O#nXJe7y0yH=NUo%-b;imI z%hniHcDith8GQlb8}e$+gu%j9BrhNNyQ0Kb`^6Jz)CR${E?b|idT_nX;O@I2#Z9FX zoHr0TVK9eCc#ye(DEYkk$$SNezs!ixKeAI#=}*y?ekY0gcq5~E)U3*VoPu?ZW8z0) zvMSL;)TOw?c%}np5st#M{t<4$5zA2~XkIN5GL5Vx1$&a8(20{o%J0xZ6sC6Fkz*8fx9M zn(R~YGjH1qbA)e9iJ8hQqAvKmJ<5J1mQI$%=w+zjV*9yHXm*)t1YjsIGLJb*nlMBh`X=~?_rUevX1Y> zI8l z$Gs)dD>{+t)tStCi?}D+C~TfI8(C3SHQ|X6CSHS!Z%MbJ#lmF1t_XQW=1_?b*okTI z-&?JLR!_cWTMI$mhl%|o>Db&7bo3t0nxg-Q2Ru!@IDov!ZYD$Gjl4BI-Q4xvW8Afg z1Bbx5_Hi|LwRIgMv;UP$h{oj2UY?U+G@oOg(~y?2>6k<)9NLFW&&qj>QAJRi?lkIedKGB+!Yv8=;cy}JGo zJ)h2; z7B&BXSy!1~i5Qm?S*EaBSZ$fxI|a=c#3|dJFx}6rNRV?mD~)xA%y|zO?myNt&ePt9 zg&iQoS)-BOh1LNqLI`JG{4JaH2fa(rY8DdC3E9Oy;&rhW{6rjh=?mB`FZihqXWHk> zPwDS;UnvA`r28y+;yVzsnwrR^0N#t?f;dp7$+aM^a-C0mqjuB`xk=`ytsJ%akE zTj5Ms*t*!KIQsg{^n2uZOq4Z<8GMOMVEu+Sy&?}Go{ATHh=u85(+B>2l(+>fy%;ok zNEpb>zE;@%FyWZsAs?E6e~W^3N`n;M6DO0WR+PEuL}U2b7}ehvY-?rfXZsJJmON8Mhr0 zzZ+ZC2n}l~9u@+~<@%GES_$9OggGrw$)DdfV&UkX8wv1X>CEbMd1!3Dp!zW6)y;xgeg`&aujK- znq)67SpHc1GIakqh21S`B~cNXjq_t0jhUQiFKn)W`dClWSN~5wqlgwg!qNJ=$h7CpYrqi|HhSowW zg{*6w-)#uqyQ}r4Qv8DVowo*dy$n}T5TDu7$V8=#&rfzS))^m&{cf2}u>qxE>1NR7 z`?iph?qI2X6Td-sX<47u$mLnM&W*%SSEXnoz4=lr%<4)q3yXyw$VhW=cqt(rJ=fnc z@9vNF0%o(bRmRFscIFL8V}Mz~)QK}&vQ~jGN?SmeGW`Y?fuPHhNo@_PzHB5J>CN0& zwmfDrDjTMmQS=@zj;-kqPC0FPtqN3tZWChhdb#j){-Vfy@APCi3c!Ni#1kFH3l%2= zT23lXc4IPe*mI!^Cw*dIAVYa%5{@zrvw>BGeRgoN-IwQlfyXU|?3^$z5nKL2sxB}c zYKyUnuWeLR?BlvDqmQ{8|8y5$JR58@!zv5sU{A(?qpddVTUtDIQMv}Kvf`1u?Lv}J zlDuJeaRs$qS;z?FCs+1LT#k+<2nSi^;atsFVGHrKTfiN&+U3a0^x)AP6x;}p*^f-C zFJseGY%Ep~b92YF$g=rMeL>NcqD@utsMn$#=-6 z92LKFHKVOBuoFe`I5m-^*5q7w(qGvD&O4>w(p_Z8)1r52(f)!k`60$K`2JwHy(#2l z$MKi5kfhw8xHz!GF{Hbm*bbC*T(nUw&Z!TnA}2&9^O!_62tD9f;jziN$Jf#|X&>3@ z{8A)w%2QBZ3*iqozX3Ml709WtnabR2)HCAI(Fu6qB($ub7O3q7>6Y~t=A3LrZzXSL zZxq~+fp;tHsRysq)3Xvj=bh&Y%+7AlY0nA1zId8pD>`W(n8@yr=ZYlfzY_Lg1sbvv zi&hos^Vy|VR&!#HRM@kp=5aWR%5d!YnCh9EC+Cxs7-sEwcsP+IpbrUw^ERo+}Z8A~9a-mUGb|dt?7Fmobtma$6K|GQg4g8H}9zlY}FfHdXUgEBBT-XmX3`CailMO5? z2~sq2GeaChE@Tq2_eP8tpA#!Jq(jyZ;hu0&IK|_d@RIjzL}v0R_1UFiZ8m}?pMe-N zz<-Q`FBmCzgI{P119|`!y@b+>Q#R#6OI7h@qogt9L4t_iX3LZ1UUEfQ$7&76ij4!2 zwvz&-r%3L0{9JP)&x}a^N4(l&GM10H?(XEGGYfu#+meZP`Uvx=tr!RXtPcXM1eaA` zXo!BS=L&r})pFF&o)B{omwk}Z!}gb<<}V{W{x2fmN3i(krNcZPz~5Gc6B$buU?;hU z4Y2y1<1BW+E;kDXV_v{NW&wekOMz@lRQCFuuE$s zsT|*z5!YP6vYxRHvA=aJ!@LQzJ=2^_#D4(fzZ}NA4)*vj{-+_ig{(+b4S2Yz#tfq$ zR@<$=BtsC4rObst{9*>uv+I}ngbJP8@asWTV)Q0syofpPFR68N2tH&VikImsP>aa5 z{=%BLEITWnp8q`~p56#o7(s2t6ss@SSsq^JoH-TWE}MIdW=4RKK&12tKemDRWEN3g zU;N_`eBUZKxz#W~kV0hR2%&5I9A);*}TRW#hPpU)ai9Fj_sx z?7apFCxTS^8q@H7x5@du!yi6|vCTm zK?pkYo2WIrbpk0`MXu#9)#%xofZ7Mio5Zx8L)ed3RBt_|Uim*F+IF0pk0*-EguMTv zZe%o)8H`7rgj8R(UL*a-k<1~)(h>Y^6cq+nklB-Xq9@3BRs85iYM}1o_aB4yisC!- zi!X)o-0=-796Mbb6cUcb-pr)ht=xAf(03=UxFppJ;o!zn+*O=8msR@8XWS)+z6*Qn zHcm3%vH}$;FNrIkVE3Cc5w0Bf*H;J^c49Fy;mJpdXRu!Z$byqPs9NNCUr1%(sy4u8 z{-GAI867>lk-M)Cler(9O}9;~R~U5wy{QREFUR0FCz31n2j|`(gS3|%W@{uWP`r$m zloL`@OLLT%VV<>uud&u-YYTD4LOeievc`pzwe>ietPj+Z_Qo?;!XEDdQTXGliei(C zB1I#xwwuJ;;$I@wFZ9>=ApWFk%MeRqRj0z$`Rc>!V3`An#Xo};&V&9JQGZuPj3@rv zO3g*c zn8Sz2N+VWxopsK72(R&$82&8(3$r?K-DA-88Qj%2cJ>_>tP+|!7#lGXJKK?(!173J zbL>R`JnzJ0%TRH z;t{s?F;xIHkb{#*#y+@*+*s=bUiBYn=^EXe-Wdyx>FD<_BLlXe9@)a2=09SUX#Dth z!)BI%ZEB0J?t`z6CT}nU+g(s7iIq-4yfGPxYs-!`m9~PlpAikJCLvQax7r+imbwVWEF7AK2%idlT`;Mlw2{Vu{u93{7$NuDUhQRh=b?10ox zKq|`8&$^oMk$XwO`nHABYKza?iHuD}3;$r1zhIB|qldlFps{G-EA-S4JDn4xKNcTd z1N)bS>c1&WzCKFCng$n7ul{vwFt9!sgIr7K2F!3V5WK~U!hY;F^5Ze3!o zkzxv>u03e(Kk)Js7_HR8ajK1mqVY?RjDpr{@-QXL&&Cns6g7UaR9mit-#-MBsSdBW zQojcKk&S35fvi`eUWPnwtdW9xjbJJ^UXcsl3RC3(BMmVZ;nB8WW#60W$lB%u`=4X| z^YOYgWP8?8rI!jcUmuIn3>ojsI!r=hhgeO>E~cUDab0T`7V8L>ZaS~3gx#8hHF}I4 znuL8@Mg)?AIWs3kxFomYa8rbPCQ%)S+WvTBfNxHj>7Y; z2F1*m7P6m%@F&%!tkO4ZL2FT>a(XOWXD#-<4pu3R@D`03fo08P{iX8j5SAc>sz=Sx ziNyst&CIN;Zx2eF#qn=FSa+}41`S_}{SCt!@5dvpq8{Xsm;!{q2#ozxvd9r-qgE`0 zI*3p>k0Vrv#L0%7O{q%Gw+H-N6{VO`1ZF-xwTSPS`1XRYOXP=&!W+bc#CBsdL$Ul* zz-#@m7Z!3n7;ANjdY@w8heY)8o$Mk!X}pmXA%;Fh_E&JBjjA z5^?UrPI>TaH`%`tR)2J09Y1SU3DzQvI=O2?ypWo>thg8q6Pc2#=tIJCVUp03dd46S zO>QBNkV<&N{?{dXnSs@LikF>EwajdCM+d1>h&4WAkz(+&zu_@7xcOkS4SU&|+L@W= z8TRuHa(NpZww>tn0{=7NjayK z7AkW!DL}M74457(=c_|K4vUw~`pjo6B|7@gq$>%0eiKaG{74U!2{2Qd(HrNbWr>%`pDM5;QBXsn}1aNG$5AhO$XsX zr0FJ^qNT*9C&WFVn?m9f{<4aY2wsh$%FyR!ZiCjggCD|ST#BF}2f4Q9$oDWb=QZoG z6=qE|uc9%>S-Zk!N3L~*Ig)I~Eu!%z^mcs+qWsD}?LrgwVZqAct+SEgeI$B_oh`2F zH;hIJYWUMicd1)#3rFDd2){!+oWra)%!&d8zV3X(2n6WxfdECiA!MV4t4z+jrP=k^W=#(2se-0pS5NbH2iW-2yr7 z;6(HkG6;)d(1##3Wsutp_*xVDf055>$v$MU(!rM4xXYZ_t(4YJa9xDi(=1HB=MDX1 z&cK}+*%y{tE1N>+Sbn_tmO{jPgi&R)@Nwj?c z)SZ{Qf`hU})_ysakl(3HR@5KLZE9l9({o{&GL>qujnv0nO@3|%wN|;6=OC>xkW?9} zto-HAyw5-)^`D@!B}AMRVTYKKDA?e9`hry7b3F&pq)j{yfSPWh=P|@AmYEIo-Up9! ziR-HgM!v|Nr$#QiQfYYx{9OQ!qYH86O6jB&L*-TxqPOYtdam~&S6l*|*NYR&-NAXK zu~8LaRvS@e-WNWj8@c-oOuU##HenSObsLecirgPy)!P%%y~pGB#J}7GhfGDvyVIej z3o>3C+n$BUz62Us8x07-j;05#KLm@v0$=@RjqjlY+p!~$vAg+_^|l_~B*r++D~f}= z{t|zsrJmt86&(eL?V5m^nxn;T^Ac4aTUdkh$@_DdyjLYN9iA`)+*>(5F%y<*Inhc7 zV=%1T0g%f-KJg(|a|s#m!93rN7%+?&<~X)X27&olvm5x^)gYf0#x8!^L;SFVpN{i) z5*TO(vC&TMax`~S!)!&~=`L*SeYBwq{^BuyeH6LFF-AC2G={9656`v4E6xF>`QGIi z?-qfdT*{R#!h+64-Y&t37Ki1DU}s-ot1@DzLO>4-(flYdrY{Q4BUAuSE(Kj=#h1;3 z4?82C!~&h5pY2~U8#(5xM0L(&+cXiqFHJ49LKOZDEjc7CL}NN(PkZrb1MATU4QT*E zEr^x`!FFbXEeOE^E+bMnChSFr+Hoc(2eFJBo&1SadqS+T3)FrqnY|2$Ig8~4z%R~f zWW>S@;8ev%SdM6Lks#%e%19y7Flo887yf%K4EQ9ZZYcJ%D>2>(_=|B=Syh*Gkk?SU+A*$>l5!A3+M7QITDJ&6HLQ96b4c0WYiLoY{N>zqg})@C83~X0bRwzavj04pbGrxjo`VdF02UVpttD)u9@CjLYlmh#urRH)KcA^PP?I>!b;*BiW zmKH>fQ`nCr@Tj1meXwgG$DpD3^?|BFPz zU%>W9BH=^uCKH9TaOf$q_D?`%qlMm_Bw5CtKO}a4$Qq1Cwu11Bwb{QV{AL8ZS&!#B zfs$vjO5x~i9$4M`_{%u7;yp4wk-e$R*9d-gQy-BZihe)7&>u{nj+pQ+S@^mjsiR1H zedPPLRh3WjBj+A2F5ryRQ25OW{5uzxb1dj%2RVt?WCHH82M4H@nMzc?nP@u~wc@L( z5yxEm}`kBkHD?gl3&0c#PS!t_{#>=w$}s+ zXCj|}6A!U)X4lQVx=A6&$}Rm`(WGE$aAM;+1Sqi zZh|mQnS1fp5u7VrhP>RODk2>bVR`IGKlW!D7;z$2r$5nFFepEXS45(@t3Xs!z^{?X z?{W?e8AS*0ANY@*51yg1Pr)`=ZGAW+b}1gxU<28OcC4gwY%D&o zKeo1#lt&8S1e_{);H;wINe6+}{LqJZDq=EnVto{uFJBI95z+57bZ|a#$6|2`@?DFX zvs_|H@@wE zuv`c6#;LHj-#Ayg7Y2R?adT_-sUBW?Bn+gFLC%PMeo5p$1??LT5Auwd;y3TN8(FRd z&a{)mzK`~Wkej=Qcbxz_+yqk*YUDDmFwL7;v*f+g>xG!b8K~c<+HwR{U@fRW?5Krk zB{fBh_1>m3^SieY^^60wPE<7h<5a?4Y8*3ZGs#Rfg3}wMcVK>2E-Je^>kG&OWW~3P z<&z@NW{;5_zM+_z9VSMm$~X|58H%@Bf#eQC8)}-hh;sY!=!?b`<;>wQ^D8 zaY^v?Q<;lx?vD)m_T{gjBAFAA(Ujn}_TacSR7aMQvXBjykl>W$9!r2gYjc(;hopcP z?!t;}BG0=P3^on))e$>Sw;<5jbC}&L;JQfc_zL{kYOL%-G}j{-@Mj;0=8h$^01vU~ zb@2C7_}ff)gJ&SOcJRy9vF7)&Z#Ud9>wP z+v0I*aJ9bEmiy46R@9gMB$~gC zwXw+X=&*;0#Q6UB(suC5@l=nt<0_Yce|HddALOL>dHmW5(8*0S(C34S@!3UKp|oUO zzEV&5kgt1WZCBxC+ksVOF%}QDk{B1wDz98ewy*n^pK~0OkvY4V}z+%P^SB{#0Bp z!-L#mlHv#6<0SQXtFZkic!y^&MK5?RI{Bo_MtH4r;KU>|3mP4U#O{Yd@MVUaRz?s) zUGV=vF!xw?bu?&cGKgX}kdr!bquZS=b$b4oX%aol*RuK6QUbPHV zQ4|*33p4IOB9e%Ec3>&;!F(Nn9 z>jc??n|#VsY-IpU+%%#}JJl+s`AP{=dQA3QgjK2rcIyvPoB%RhOm^}z?8r_u&WGm` z(ftp?XY}|aD7X_|S%9~H3r>B_d++1!#}e}n!4A(u>lP6OjbxX{;Omzo(T|aIpJv`d zuHR$H{m{Rvpx@@K%s>#}P9oi^pwY8%#OLvWUGRDOsaK8mg|+sRZps1i>t(J7HSfd#D0IM!zzp4wL- zQ;k?9dvc`iA@+TmY!^3!ITwLue6^yP;IDph-?3OGJFI6aB=Z%z9fci;;WvTkV;y3P zGUO{O6Wh&&k-3a^&&ONZgfm!#a6H{&@^16_c`<7|o1Y`elV3o4R`To|zSdzst`ZB} z#HyUYPwvB$9_Ob${H_NUC@ayOK_r<4J;(>I=gW*=0`p!%YoEXYK14&$Bj=kyxf?;d z=lK6!boV{FdxhUzFt76JT|AEP?{zd?f&?&1lo`x3N)9%KCN0bcn44)HJiurDi{ zAAkHU8A0#E`-NjInxI*qsbyLOe=~*eKJB{?V{;nb?kLrC_lVBYz&Vw`FXks(l>u!{ z%THB^>FV>>y|6kf(Z_>a%OM-Kc?Ub@2Nv#t{DqwggQtlFapVLI=BEZyvEt2NW+K&;g+Lqa`HKO>Q~f~Eb3lkU!Ox|!E0eG; zJK-GOU~BV&4?82H&5(dHXi+)-ZHk}k3un6!&+rMxxfYDcYEB#MMHV-cEk8sq>IQu; z-f#xtG17d5ywq&ux)a{cPkKtl@S*Dr63Mn1eSOIL%kGg{uX!%rlju5iP zRe81$y7~niF`Y;-P<)Zhg$>|pv*79W$0m?bS%4qx z!@AUl?Qe{Q7{;SLulb1uScf!BKoX{t2bsm!e5}KGtng%hT8iwBM25S7pj+@gjMpy4 zE-yiD23a+*0uS)iVc^lO-2F$h9JYHpSKEkui~v`aiO8@%n0yrPxf&mO8q0kT8T8rj zI9R+i*#DaNwYu!u|5%f+SocdH@@>hUU?BJ227akAk0w0ogM*4$>8WaUqn(eE?aelH zc^uJpC6MwbsvGyiBX7nh@4y~Bpl^lCNCA@eA&=5T%ay3U>B34!pyeOUfAHlg(cluS zbO_P+6z+H%*ecdiS)C?uFLPlV_K_WX&(uAY>dd@ET%}+JYEYX|A9=2b)|TRoPg>E! zc0Y!px`Tg{!A#}Atv@o;F4nav?wal;=p-MY|m+M;51NCBwAt$ncz(PIY)5;EW8-j=?t&Diw8M@ z{n*C;SD{S@h;9$_cTrfCA85JJb3p725S z=-UzxlX#6+>>~ramN=j_cl(q0Vk2D6Xc*GPtj2OyXcQKq7QUe;X z?AsQL+7MR4SA&}c-Sc8=AH%AgFz<14BLf+|CRp2%Aca}@tv4X^%E%38Q8BBa0Dv2C9hZ|d8bMd4`g5+e382f4vgZiCxNW;QVnq%E4TuCn8*5o z?}|W6`;e>7XC}a+jHkXi6TQy7bT~-IL*WEZBL7Q8FQ~rcWRDvciOjCS&BnmUdN>nP z4nO3}a(6@$2Vy&R<9mLf@7dvZ8zO}Z@VYOs))GuhVb-G>Z2d5B>^$n7e2icNuE_)o z9pRd$p{G-lzmFvg+71g|8eYPe<@X@pF?eSm?i>Oy(;QwV1gle?8i619$OmL>eTcOb zKCuELntVc#B+<*&`^E@MA-@wEXHq=aJGlqQbxA`CjpUr+Ma{@Dr@*$1eJ~o^QO{d@NjD?4N^dMIxTS zMWmJzi=BaIlIXAXEE(H8;HqQTPalqb25*xV&S)mrc8hoZNi^`6(?6P!ma{s+^p>f~ zwdF)6Y-mVH^u0HD_6*TwJh}ctWLqjoh2h0>N@>W`T|&B-;xR(;=M}LM`M8r*XsC^^ zK(5k{xc4QJxSXo*%4qgqKK}|keH29th9h33;#0KBmFW`RXi|B(sL6 zh!n2i8P9@G?wRS?_XMjJcik8C+Zt)#h-OwNV!uQ02!AP&fA_%~9i=u}1fez|J6VS) z)Gj^Y%v}dCr$6VBUZT(Mx$~b`t;cYkr;++;NLyEUbOuVB;%;5{430>_-lM64&MD{(MoxIIQt>Z1Onn zdj*pDkhM_Quhhs^D!yl6@6)k+PNJP1#9r;l^5>@lA&w|*1u=Pr1G;s%*E&XQ1?tY)>%ZTJF!CR!5*`D&S#GV{A?wwBH#1zRRcsg z5q9A?dh?zvM;Z{@KqMsw?!cs)pg2CPE8NRs_?}B>$aeIg0~(Z#6-V)!?Ld`LMWnAaczUo>)ob?|W?*TD#{ zr~~*yPV_q!0T<95U#@5bk~WQ)aS_O69e4kjefA_HraXAl{P4rA_^gA(o{88F8xMc{ zXl8V^8O)I{i!l}NG#f;FnQGe1WWHJv%QYpZ6a;INTFOKWmz6j#HGG$s6Nop(Blz9* zoP(IdUye_X>V|{fJCPT!%$npOs>_6jRF7SVJ%(|l|M^nf^_7d z5*}kHsKK|I&#|3}RFfuRJ>OtSZ*wij_{|!;Nss?u-{Z(x4?fAKRUg^?bHr!|iNtn- zXjkAr#^I;h;{J_Li{dLosF*un2a6=}$26~}6KCKEOqq&k;9j{px$W349feHzGhGZG)g<2XM} zX9XL853;j*G6*;kX}k;r97ZNKHLS;OK5;Og+Y#?vk{Sce_yPxdkqrKRJoP;|nooE( zr{T}_2ZPE-g4J)LvjQ5D8m+JsjebKn?+^=S0Z$x&m2mS&;FJ9Eb^VdnLwK<3Xx&-x z(P6&dB4Ynv7W^xg^fesFJHEeR)isb>X0iZjKw#fl`D^^$eO}|{`MktvWx|ia&f*zWJxNEbDjfiJz;QhLydp=HS9J(=q2NrGuQe7SCZiN<%MDl&iz+WQKad!yIr^H1`l5K`J`N7_H-6zK)gf<)T`v)_+#t65inq{^ zIuBO)5;8ayscj23Ye0^v2l3QYEb>wG@GI8ZAG})#o(K#6Iq7BlotMJ6gj|P2)cP<1r0ObO<@R4=y`OWHOQc?h3J6}~-6pxG4*j(b@+hq8^lmEy}zkvp<{7QD^6W3b-OFRM@+>3S6=(yRE6fNr9|{lZYUJ z?;6?6zeG6q;Qy{+^_^5(ci|mZu**w%?=@WUMXZn}(ES>FFdDxU&iBz=OK-e#7czu1 z@o_tNtb&DX4c67MS?|E&8OiU|=bT9c%bRbI0 zj1~5v(;m*{*pb21U~LV5^nr(u)x8DUn$P|80oM$JRhR}lFd1vzhsQXy_6!JbIjdeM zxl*tMuiAiYAK;{$7ut**_#1-Z^tSez7Gofp>R0T#rEFn6O#`;njCNPKE^F(H``NK0L4 zfaL_EU4;eQ58t#MPk03hagedEg?_ifYE=X8I`I@2`AsabTUjLB$5Ky5f`-7BkHE7p z2h;AyP95YvcJtFocI+0P{t`QtK+{qc4Z+#NCUR52tP9bwr(72-IJPvnpoAQtmXuyc{#ReF1B?X z=x8kOHU(e59z1ms-{wIZ^RQw;?3@CI6xl_EHTumJe8ofmLi!lz1de*am0!j(`*7)b z5Z5LC{yK=`Tk_rqa4)6sD1DM+!QGsb^Wlrx=+97WZhtIHC{d5kGqgsly7BBZ_HY&U zX*XWjPNhkKV8t9=Z zk0!`SQ@mMyY+!zHMIt$ybJ)t&+-oGf(^al`H?hV9)~O$HKsZsy3Xt|p)}%MqV;H}? zjF-;<^H2?`X~OAPIFOE)u zRqc&EiXsoQ54+W!6|DtU2&Z5FVr*G4@gw^+-8YYhMK!&$Wmp6^ce!%y;a(QvRX@SPpY8-pKM4*Pk444qC6Fo787ELFef(4HVLuCLN% zEG$K3^rs_o_yD_+0p?OATOW&7c&&VVeq#_yKGrP}*$Mzjv_W!uf941J17& zE8CIZbWF~%=B8FzM)xz2$xKg;u);m1!i$yVwH49*bUY*D8!NL0TazRANYKg}?ASJB zCoZ`@vozAvglqNX>Ep}jW{?Be>(+>v=8~2&E8Hz{!eh#S+SnuKtacee0`WTWpYJHFcpbD{-YK? zBm|Gw1D*8w=XyLF3>Q)gUa<)BrQ)lTsJnVeJa?OY*@x86#jAy)>&@BAs_fAJb#*52 zTTbc!FDW536w!jnR7GH$wJp#?CO9F;mttgE5I1yAf*aM%hDTjcK7pC_+(+ zLiK;Y&*yvo55MpIdY9{3{MWg6^dHm|Q(tQpOu_VOVzcmf7_Ey!^;xOX%%H~?$j z5uDnQ`)pMr(r#RH2du;=a5v+A9jSEw2-c1v`VS*Bx(}QBD>!vB9;R&`4L3dsEI%9u zxG&LXe=OMN53k1VZpRL9!yB(7PV}ROa5?OuAIlZwz}K_=4!F!vmIuJVJJ9`heluC&iY3WH^ZvgjslwLdq_C8zcT5rPwzHDNs%QKU>Ieq=HjN9&or9TW(&4mTd z2VW<{E!cQdf z9E^n5Lu(6(S>F*~rxLOLO@DuntgfKp2dj=@g96uaQ48IQP{TVslk1fAIRI#6rV zw-O~UqJO``?vEwj?Lw4Y316CkZ0| zttEpqJ9`{kc@D`9!(#4*sb0rX*38YJ_obhEV>0jS=2pczTH+b=8UJ2`irw+Z_7*(#0b;-A2B7F8bb~ z$a4v5d1gBOvB)F9gWsXse#qoT+IlZGejob=;?M3qm?(D&HtwA9dwIVc3ptb5UpV?c zc#4A#L&;Zn zz-rbdcQuZ0ioA{kWlzT%_bPSPc1Y9T37A9+9-u#e!=wK}FYYghHURd1HLbOtd;_nm z@q=@T&ZiOY&jUmCRk83!+C3PHd<-nK4|f+f{ydmFom}d3v_Fx2<#RMR7Y^K->h2Qo zkJdz!;!=XTo9oVo{qS1#29gVJvHMyw!?Vv4}^J+5~)V5fUL^4{n7i`TuJXf5^W!XMe2tqu^hwkdl5VKz}kCbyT*~NxWjVX zfhj#8(lQ{ys#GDm@VO#PM+vS(%gt~mQ6HTK3NAw|TOBQ}fi-S`f9^-*I}_afGfee* zeCKhh0Mqd0dEkz0mXCBpr`7o13FvIVN`k%sHjQk&g!*5VS zc&*gNzoJ&Z2HDHLFtsyaDgDvw1NhfCn96*{bGmYmz4500g=as3ET5(|PnUkQppLc@ z^|NNpry%9K(AZhXb5}Bgb&*UfP-zmpRzEtCD7qt@Zj%!CI)F=yFIq^=Vh$PL3|eH( zV<1uQEUNbhGB&n1^Menku6R1UynoXO{cH4KG0@F9+H+^l=5H2BK87qEKYJX>T3vja^?T9LCB!zpWOvv?PpoW7 z>Sm*`;VZH5gXzOYpi^6d$UL4(ZC)^Qb!slXV64623BM(pU5mFo$ntM|{kl>o_jk{Z z<@^h{%1!viP%!LKqS*wje_3R;3)bfUQQ49#x*Ha@HWK_bZ03woWw;0ZTl1Vk1o)IV zF$eqkj(K1miE7&u+qNkc&2~hKO_+J;=3A`@EJ0B@J`UDNV z$MM&}__n5QFb;dZ0UYTE+6+RHk0P(zK-9kQrWL63y#q_SgRJKUETccOm`SiC^2(^3Ac6bzs{olkaq3CYHbdy%TcOjmh0z&&Z$Cc{t5cDk1y@N5G>xgF;W7U0_jdCzC z>>PA50Ly+7dvILnEqdz{q!U2%&){vdk!drKd~y6{8LqlK%W@#WY>s&u2KOZWd6{!Q z1T#P8es6#eFL9NrRMi%NH?u*VkFdk{>G9WWn+F4#UPfCSMIOtZsT}hiasOLb?uT6A zeU6_4zwJy^T%Tn<`m-*Jwd_=;y3@x^sr+nE@>AtV86obZzM8V6TKAgyAiuLx@a3a69xO0afd&a+T-r`iEHViy+Yeu;?oG zT?+zV#nGp6<{{Yn;b6(3AW9Ep?%2jE;A2nN&$?LGmt~yV%GmQ@=}06s7)d$GJqRfc z1cxt$5AVhpSWi4{cX-;_1yTNq6lL!Ba)zT~^O?`t4c%^A^lkKaIgooF&ilS_^@Hj6 z-hB2!B1aUQ*amBAj}^?o@?S;=H^GE10ONaer_2Xgo*3~dtouF?=VHdaP9(A&&b+My zc!td~Q9z9L{{SV~BGXgH89r%tsKL$H2+Iguky+>Wn9#>;ClW9_oPafw--S z`5O}Z#aW-ux)I-Yeund_Cx8PpsO8TgSN@hLF%y>Y8W{C&v@0(U`#Bkn^hK__p(i7C zb0UDg_#Ak13z&NaQS5xAbvC^BV(jd67_j{ABI4ITYA^Eehw$wLh522h+1YgtH2yuGR82SJ!1_!t#%X3HC+vhj6^scQ|r73~N5HTw^~xXm4Ko z^1ffO&)?9ZtwEa=@n%uUCuM&`9?poF1%`dY_tyA*E4*U?-{ig@Au;#Op!MUC;bUO^ z4KO%o`rW{C74kn9nVU5nQ%348gzucqmgA{P^oDC}My|9apSw^`+ml+_PDBrD&|AY$ z_5!I7g>jq?8+S(GK=Ar8YT?8267@A2 zI0`a@w$6sDe@(wcxo=qi0=a(zhJVVMPeZ(m2R_4n{==PKq?Y~;_j#kllc9LpeQbZ6 z{jYG``<(T0Id=+q{G?Kc{EBPNKrUkH%lPv!viuQT<=xWWw}=t{>I)NhhZZ_U?;{FN9jf))6a+;Ey0L31%bauFLQYr>`ajP`BE50Mx=BcPUg6+d z!uO9L1NsC0a6N4vL>wQ0cU%EOya>;}f~bBY+Xk`Ri1+*j9(z9g@kB7|U@UYyFw=T? zXEeJ2>HH5}{2OcQ2WtHm{;>zlV>9NRbR+*>hb(+us)ZZC);9soda%W;yc^$kCQm;J zM7RvQx*i<8mAp_ColZ3C$UWpIeetKWU_^f^Eai51-D^npBPvca;Uw?DSYAZhufe)s zfWJHhC+&|f9)?%#Mr7)Nh8Bk}I0pR^h-YSZKa%lR-L3-Be~%P@OQv!rcyu8a{-=UZ zeW@}38m#XPpX!5@&!=bqAco$9Y#+lO#~{i1XulKupcmM=9kI;lz8&km;J`a@_r4%O zKcqVl$%;WY@KUO`U?KOT`JteiGZ5}#&*iYj3+Uw;=)}zQ81P|NuH}fB%Z9wx!IRqI z_oBf(P{4RE%UA-u{Q-NN&$i|;ZATlM!4s_1eT$EM3ip{z|G#0xYFRjCYkcritYIwn zFdM6GkEB;F+-fm|HTG$ZF3&+;+R#uj}-elQFh{U;VA%u-z;1vmeVp5I4lzr+I0C85Ar2$997#0UhssTN zwB|Ey-xtgH4m35(a*T2T`fZCA*G8W!7xZcaqJ+zJMYnR?UfAw#TysBOj?g*=w;P(> zo5ih%&;#?UA5ueT#>mlXAk}&-Yf;f~?$gfH$qxqIj-pa`9+}Kt;E9a=BmC)W zH12$;uJmdPmR|VFuRw%7kkS!&M;|nH2yx%c+}WPJ;fLLkLkG^0hpvg7I)YSR;j8ap zPcLJE&lCIZ0jK(x=zR(}bTW579>hNgU)UdyIEg)%u>VT@C{?tZIb#S>AWsjzgV#-? zWj_+Degqw?Wvz{lwnA4{dwmX2-n{~gBPOk36~?(0uqZQ{ZUqNA6)X@Hx}mRi%eKx~ zRVQp}Mb29iv{{Vvmgh?AqS=j+!TPLeU7H~b@o`%)#1Wew+~2FZuLoD`%rzXXSqhD{ z8CO`57I){4nKvL7duP$< zaBTGK650L?(w+xj>w~52hqd?SbpW<^Ft*>jpqV2(wtp?!DSug=r87NS38^fLY~)_z z?0mfKo5H(fG@p?@j-jscUr^#sn8od&%OFtbPLRU+un(XSImpW#^CtNB7V-QIG(DQg zY+U{Z>#-uZ8WyxhxnsM6?Jbb(qS8-iMSlf5n!!Eg9xY35sXs4;-dZ)aXfDS%7CROj zdIlC_<;d#LV=Rwg8H2&H!EBRn4}-zI0xNopHcaNMSxB`R*J?{UI-_%cr$SHu1$MIn zdRh~`7>knsZi8%h1uJ$1Kej>38zOt7!=|kJpL{pr*q((YbU`!Aaov`n)G}PnYG+5@ zmo2ScKwp~E2m7w(H^eSuG23w6Ug)9+SK0!t?t#YofHj8}TsjcF?Za{qesv(M+@~w$ z+aieC-H!7*()!lKA9LmfNbL(^;b`-^%Wtr(bKoldK&|VE`!|j zpxAZn5x*`5uMXzyu1I@vBJyWg!8q*V1)_?v#w>g&cfXld`OAOD!}5HBZFl0{ro_AT z$U?VZbY=@8;s#(@H|mIMvbH7LwqrzZe^BmZxXq<7tD9MF<>hbLI`97tq+q3O0iHAm z2_rxz_C_5Ji1b=}q39!}~HZZ#auH-$!6WV%2}KsUfue0VH-m z67%&WM~)@#I}>FF7B&q_pM|zX3h_iM_yx8lZfsh#z8x~z3>(-8FWe2kJqb>9c40=R z^Z9#Npn3h(;D3K&=~c+{CPtC&rxJKCGQJshbt^9`Q;r>7O8mS4zc(+FU!6t_K9S|5 z60`QlzShIWt-p6IHs+IT{!&R>Btek{2`$9Wji(>d553l^(fjb-_xQ9*HH%}GrUxrv z!HbZozireC&uxpvw?MDci4Rk-yM;Wd&=qg!QE;z2_t^n!J_=@VBC+)hSlOAD8cU`S z>n78q@$~*(WH6rfi7=lp>9^K02OLZOmhl)ZOYi%UJzsIuXGm-+$NMtdo5q&uZ2tlo zf6n*uT=gv$@A)DppJl5kI*OjY$)0Divj1RtqTEyLe}~1aPYZn# zKXTT&Eqx!(`vIDBug8q$3g%O01drks4|D9J$m|K0VccUB$9_O79buY{rz}LTto{)0pje%>({*R1*fnkVSQ^q zkkT0n-v3u%)1KJNK5UiEh0pbcNrsUeOj~4>KEoIGwhlgFjQ7`;j4IBao?g(&=WZN> zf0zhzJ6IxnzYKi(J7{TU^hgtG-38aWmaXP=j!(v-{PjO8u~t~8V<+D?WiU%3NAX}y z`nNf9v)!8@0l9+JS4Sv&^3rp<^L;H|@&=jHa&Ql4ytP6b&awO+P9Uny!y0E}SCi58 zv$Xeqko;a2F-de4r|zZAM(F{JFJ8uIz@@zYO0NdfkEcMh;k+9otuknP?_m$IPBW*e z*sS%7h1j=@X_eyLvKm>f5o^|RvB6Oqbf@N5#EJE6&!^=zwdMt{#=7M(1IR?G(1Lh2jS)~#SiW(AIAx>&=s za%JtRH_>lrdSX?49asvFO(MmU zwD^&-JjVBjSlnhNX-}N9qoq0C@)~wC9^3a>-&aAL7s0kMVBMGafWL+J6-z9s6|MLM zn6hGNV^^$bV-|D&o_N7pMWX6Ko7ommQQAF`@`fDce*@UFJ;)@;>N*5KWo zM9#kpT5<&9m)ML~_!ZxKqeW+W`P#EA$}(?Z%bN5fl5mG{v4D=%MH}7f<=R^wSFX+``M`XN!o*?XZOI*jw<^xq!Qa zNzTPMlKc0CVV%I8&W2CPsLtlzN8u;_A1RrXzoYp}yvyoHOYGe0jf~d}>McC=88qfN z^2k$VVF{h3JZczR@xBa=7) zzqMYI+0*ig$Z%u)*lJ-HdS!0CB$_ji);_19ckS~{tjP@YZPv$vP*%!EvdF7Ov2|>T z(q9!>H!rc(j60E44Jak?bvo80Q=Eh)$>(JH@+Ix4Id@*Z;K7<;*LrAaeelXyB408t zI40^0HfOY16R~n=1hHo1te36@fgFQr2cvc-(LApHC9*S?%5R7Eo7;x$X-knD`fupC|UBHJKJClT4>(k*zPZ}MC&)UPG)5d&-~+j z^k7uJxYXv(CL*6$G;vUgf_q|1JFr;y+>l=QD-W%BzQP$wQ?aOc+CJJLn`=-lw3G z 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 L8)o32nSuWVs+DHI literal 0 HcmV?d00001