diff --git a/Installers/Drivers/SCP_Driver/DIFxAPI/amd64/DIFxAPI.dll b/Installers/Drivers/SCP_Driver/DIFxAPI/amd64/DIFxAPI.dll deleted file mode 100644 index 76ccfd2..0000000 Binary files a/Installers/Drivers/SCP_Driver/DIFxAPI/amd64/DIFxAPI.dll and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/ScpControl.dll b/Installers/Drivers/SCP_Driver/ScpControl.dll deleted file mode 100644 index af5cd7c..0000000 Binary files a/Installers/Drivers/SCP_Driver/ScpControl.dll and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/ScpControl.xml b/Installers/Drivers/SCP_Driver/ScpControl.xml deleted file mode 100644 index 7ed3fdf..0000000 --- a/Installers/Drivers/SCP_Driver/ScpControl.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - 600000 - False - False - False - False - False - False - False - False - 128 - 0 - 0 - False - \ No newline at end of file diff --git a/Installers/Drivers/SCP_Driver/ScpDriver.exe b/Installers/Drivers/SCP_Driver/ScpDriver.exe deleted file mode 100644 index 46db78a..0000000 Binary files a/Installers/Drivers/SCP_Driver/ScpDriver.exe and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/ScpMonitor.exe b/Installers/Drivers/SCP_Driver/ScpMonitor.exe deleted file mode 100644 index b254eca..0000000 Binary files a/Installers/Drivers/SCP_Driver/ScpMonitor.exe and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/ScpService.InstallLog b/Installers/Drivers/SCP_Driver/ScpService.InstallLog deleted file mode 100644 index 5892b2e..0000000 --- a/Installers/Drivers/SCP_Driver/ScpService.InstallLog +++ /dev/null @@ -1,56 +0,0 @@ -Installing assembly 'C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe'. -Affected parameters are: - assemblypath = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe - logfile = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.InstallLog -Installing service Ds3Service... -Service Ds3Service has been successfully installed. -Creating EventLog source Ds3Service in log Application... -See the contents of the log file for the C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe assembly's progress. -The file is located at C:\Users\Justin\Desktop\ScpServer\bin\ScpService.InstallLog. -Committing assembly 'C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe'. -Affected parameters are: - logtoconsole = - assemblypath = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe - logfile = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.InstallLog -Uninstalling assembly 'C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe'. -Affected parameters are: - assemblypath = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe - logfile = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.InstallLog -Removing EventLog source Ds3Service. -Service Ds3Service is being removed from the system... -Service Ds3Service was successfully removed from the system. -Installing assembly 'C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe'. -Affected parameters are: - assemblypath = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe - logfile = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.InstallLog -Installing service Ds3Service... -Service Ds3Service has been successfully installed. -Creating EventLog source Ds3Service in log Application... -See the contents of the log file for the C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe assembly's progress. -The file is located at C:\Users\Justin\Desktop\ScpServer\bin\ScpService.InstallLog. -Committing assembly 'C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe'. -Affected parameters are: - logtoconsole = - assemblypath = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe - logfile = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.InstallLog -Uninstalling assembly 'C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe'. -Affected parameters are: - assemblypath = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe - logfile = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.InstallLog -Removing EventLog source Ds3Service. -Service Ds3Service is being removed from the system... -Service Ds3Service was successfully removed from the system. -Installing assembly 'C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe'. -Affected parameters are: - assemblypath = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe - logfile = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.InstallLog -Installing service Ds3Service... -Service Ds3Service has been successfully installed. -Creating EventLog source Ds3Service in log Application... -See the contents of the log file for the C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe assembly's progress. -The file is located at C:\Users\Justin\Desktop\ScpServer\bin\ScpService.InstallLog. -Committing assembly 'C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe'. -Affected parameters are: - logtoconsole = - assemblypath = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.exe - logfile = C:\Users\Justin\Desktop\ScpServer\bin\ScpService.InstallLog diff --git a/Installers/Drivers/SCP_Driver/ScpService.InstallState b/Installers/Drivers/SCP_Driver/ScpService.InstallState deleted file mode 100644 index 16079ef..0000000 --- a/Installers/Drivers/SCP_Driver/ScpService.InstallState +++ /dev/null @@ -1 +0,0 @@ -0.7223_reserved_nestedSavedStates_reserved_lastInstallerAttempted0.72230.7247Account-1LocalSystem0.7247installedtrue00.7267alreadyRegisteredbaseInstalledAndPlatformOKlogExists-1falsetruetrue10 \ No newline at end of file diff --git a/Installers/Drivers/SCP_Driver/ScpService.exe b/Installers/Drivers/SCP_Driver/ScpService.exe deleted file mode 100644 index 8ae6d8e..0000000 Binary files a/Installers/Drivers/SCP_Driver/ScpService.exe and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/System/BthWinUsb.cat b/Installers/Drivers/SCP_Driver/System/BthWinUsb.cat deleted file mode 100644 index 169cb02..0000000 Binary files a/Installers/Drivers/SCP_Driver/System/BthWinUsb.cat and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/System/BthWinUsb.inf b/Installers/Drivers/SCP_Driver/System/BthWinUsb.inf deleted file mode 100644 index c390687..0000000 --- a/Installers/Drivers/SCP_Driver/System/BthWinUsb.inf +++ /dev/null @@ -1,227 +0,0 @@ -; ============================================================================= -; Copyright (c) Scarlet.Crush Productions 2012, 2013. All rights reserved. -; -; BthWinUsb.inf -; ============================================================================= - -[Version] -Signature = "$Windows NT$" -Class = UsbDevice -ClassGuid = {88BAE032-5A81-49f0-BC3D-A4FF138216D6} -Provider = %ProviderName% -DriverVer = 05/05/2013, 1.0.0.103 -CatalogFile = BthWinUsb.cat - -; ============================================================================= - -[ClassInstall32] -Addreg = SCPWinUsbClassReg - -[SCPWinUsbClassReg] -HKR,,,0,%ClassName% -HKR,,Icon,,-20 - -; ============================================================================= - -[DestinationDirs] -CoInstallers_CopyFiles = 11 - -[Manufacturer] -%ProviderName% = SCProductions, NTx86, NTamd64 - -[SourceDisksNames] -1 = %DISK_NAME%,,,\x86 -2 = %DISK_NAME%,,,\amd64 - -[SCProductions.NTx86] -%DeviceName% = USB_Install, USB\VID_03F0&PID_231D -%DeviceName% = USB_Install, USB\VID_044E&PID_3010 -%DeviceName% = USB_Install, USB\VID_045E&PID_3500 -%DeviceName% = USB_Install, USB\VID_0461&PID_4D75 -%DeviceName% = USB_Install, USB\VID_046D&PID_C709 -%DeviceName% = USB_Install, USB\VID_047D&PID_105E -%DeviceName% = USB_Install, USB\VID_0489&PID_E011 -%DeviceName% = USB_Install, USB\VID_0489&PID_E027 -%DeviceName% = USB_Install, USB\VID_0489&PID_E042 -%DeviceName% = USB_Install, USB\VID_0489&PID_E04D -%DeviceName% = USB_Install, USB\VID_0489&PID_E04E -%DeviceName% = USB_Install, USB\VID_04CA&PID_3006 -%DeviceName% = USB_Install, USB\VID_050D&PID_016A -%DeviceName% = USB_Install, USB\VID_050D&PID_065A -%DeviceName% = USB_Install, USB\VID_05AC&PID_8216 -%DeviceName% = USB_Install, USB\VID_05AC&PID_821A -%DeviceName% = USB_Install, USB\VID_05AC&PID_821D -%DeviceName% = USB_Install, USB\VID_05AC&PID_821F -%DeviceName% = USB_Install, USB\VID_05AC&PID_8286 -%DeviceName% = USB_Install, USB\VID_07D1&PID_F101 -%DeviceName% = USB_Install, USB\VID_0930&PID_0214 -%DeviceName% = USB_Install, USB\VID_0930&PID_0215 -%DeviceName% = USB_Install, USB\VID_0A12&PID_0001 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_200A -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2021 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2100 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2101 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2146 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2148 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2150 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2153 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2154 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_217D -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2190 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2198 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_21B4 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_21E1 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_21E3 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_21E8 -%DeviceName% = USB_Install, USB\VID_0B05&PID_1715 -%DeviceName% = USB_Install, USB\VID_0B05&PID_1783 -%DeviceName% = USB_Install, USB\VID_0B05&PID_1785 -%DeviceName% = USB_Install, USB\VID_0B05&PID_1788 -%DeviceName% = USB_Install, USB\VID_0B05&PID_179C -%DeviceName% = USB_Install, USB\VID_0B05&PID_17B5 -%DeviceName% = USB_Install, USB\VID_0B05&PID_B700 -%DeviceName% = USB_Install, USB\VID_0BDA&PID_0724 -%DeviceName% = USB_Install, USB\VID_0BDA&PID_8723 -%DeviceName% = USB_Install, USB\VID_0C10&PID_0000 -%DeviceName% = USB_Install, USB\VID_0CF3&PID_3002 -%DeviceName% = USB_Install, USB\VID_0CF3&PID_3004 -%DeviceName% = USB_Install, USB\VID_0CF3&PID_3005 -%DeviceName% = USB_Install, USB\VID_0DB0&PID_3801 -%DeviceName% = USB_Install, USB\VID_0DF6&PID_2200 -%DeviceName% = USB_Install, USB\VID_0E5E&PID_6622 -%DeviceName% = USB_Install, USB\VID_1131&PID_1001 -%DeviceName% = USB_Install, USB\VID_1131&PID_1004 -%DeviceName% = USB_Install, USB\VID_1286&PID_2044&MI_00 -%DeviceName% = USB_Install, USB\VID_13D3&PID_3304 -%DeviceName% = USB_Install, USB\VID_13D3&PID_3315 -%DeviceName% = USB_Install, USB\VID_413C&PID_8126 -%DeviceName% = USB_Install, USB\VID_413C&PID_8197 -%DeviceName% = USB_Install, USB\VID_8086&PID_0189 -%DeviceName% = USB_Install, USB\VID_8087&PID_07DA - -[SourceDisksFiles.x86] -WinUSBCoInstaller2.dll = 1 -WdfCoInstaller01009.dll = 1 - -[SCProductions.NTamd64] -%DeviceName% = USB_Install, USB\VID_03F0&PID_231D -%DeviceName% = USB_Install, USB\VID_044E&PID_3010 -%DeviceName% = USB_Install, USB\VID_045E&PID_3500 -%DeviceName% = USB_Install, USB\VID_0461&PID_4D75 -%DeviceName% = USB_Install, USB\VID_046D&PID_C709 -%DeviceName% = USB_Install, USB\VID_047D&PID_105E -%DeviceName% = USB_Install, USB\VID_0489&PID_E011 -%DeviceName% = USB_Install, USB\VID_0489&PID_E027 -%DeviceName% = USB_Install, USB\VID_0489&PID_E042 -%DeviceName% = USB_Install, USB\VID_0489&PID_E04D -%DeviceName% = USB_Install, USB\VID_0489&PID_E04E -%DeviceName% = USB_Install, USB\VID_04CA&PID_3006 -%DeviceName% = USB_Install, USB\VID_050D&PID_016A -%DeviceName% = USB_Install, USB\VID_050D&PID_065A -%DeviceName% = USB_Install, USB\VID_05AC&PID_8216 -%DeviceName% = USB_Install, USB\VID_05AC&PID_821A -%DeviceName% = USB_Install, USB\VID_05AC&PID_821D -%DeviceName% = USB_Install, USB\VID_05AC&PID_821F -%DeviceName% = USB_Install, USB\VID_05AC&PID_8286 -%DeviceName% = USB_Install, USB\VID_07D1&PID_F101 -%DeviceName% = USB_Install, USB\VID_0930&PID_0214 -%DeviceName% = USB_Install, USB\VID_0930&PID_0215 -%DeviceName% = USB_Install, USB\VID_0A12&PID_0001 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_200A -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2021 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2100 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2101 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2146 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2148 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2150 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2153 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2154 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_217D -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2190 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_2198 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_21B4 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_21E1 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_21E3 -%DeviceName% = USB_Install, USB\VID_0A5C&PID_21E8 -%DeviceName% = USB_Install, USB\VID_0B05&PID_1715 -%DeviceName% = USB_Install, USB\VID_0B05&PID_1783 -%DeviceName% = USB_Install, USB\VID_0B05&PID_1785 -%DeviceName% = USB_Install, USB\VID_0B05&PID_1788 -%DeviceName% = USB_Install, USB\VID_0B05&PID_179C -%DeviceName% = USB_Install, USB\VID_0B05&PID_17B5 -%DeviceName% = USB_Install, USB\VID_0B05&PID_B700 -%DeviceName% = USB_Install, USB\VID_0BDA&PID_0724 -%DeviceName% = USB_Install, USB\VID_0BDA&PID_8723 -%DeviceName% = USB_Install, USB\VID_0C10&PID_0000 -%DeviceName% = USB_Install, USB\VID_0CF3&PID_3002 -%DeviceName% = USB_Install, USB\VID_0CF3&PID_3004 -%DeviceName% = USB_Install, USB\VID_0CF3&PID_3005 -%DeviceName% = USB_Install, USB\VID_0DB0&PID_3801 -%DeviceName% = USB_Install, USB\VID_0DF6&PID_2200 -%DeviceName% = USB_Install, USB\VID_0E5E&PID_6622 -%DeviceName% = USB_Install, USB\VID_1131&PID_1001 -%DeviceName% = USB_Install, USB\VID_1131&PID_1004 -%DeviceName% = USB_Install, USB\VID_1286&PID_2044&MI_00 -%DeviceName% = USB_Install, USB\VID_13D3&PID_3304 -%DeviceName% = USB_Install, USB\VID_13D3&PID_3315 -%DeviceName% = USB_Install, USB\VID_413C&PID_8126 -%DeviceName% = USB_Install, USB\VID_413C&PID_8197 -%DeviceName% = USB_Install, USB\VID_8086&PID_0189 -%DeviceName% = USB_Install, USB\VID_8087&PID_07DA - -[SourceDisksFiles.amd64] -WinUSBCoInstaller2.dll = 2 -WdfCoInstaller01009.dll = 2 - -; ============================================================================= - -[USB_Install] -Include = WinUsb.inf -Needs = WINUSB.NT - -[USB_Install.Services] -Include = WinUsb.inf -AddService = WinUSB,0x00000002,WinUSB_ServiceInstall - -[WinUSB_ServiceInstall] -DisplayName = %WinUSB_SvcDesc% -ServiceType = 1 -StartType = 3 -ErrorControl = 1 -ServiceBinary = %12%\WinUSB.sys - -; ============================================================================= - -[USB_Install.Wdf] -KmdfService = WINUSB, WinUSB_Install - -[WinUSB_Install] -KmdfLibraryVersion = 1.9 - -[USB_Install.HW] -AddReg = Dev_AddReg - -[Dev_AddReg] -HKR,,DeviceInterfaceGUIDs,0x10000,"{2F87C733-60E0-4355-8515-95D6978418B2}" - -[USB_Install.CoInstallers] -AddReg = CoInstallers_AddReg -CopyFiles = CoInstallers_CopyFiles - -[CoInstallers_AddReg] -HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01009.dll,WdfCoInstaller","WinUSBCoInstaller2.dll" - -[CoInstallers_CopyFiles] -WinUSBCoInstaller2.dll -WdfCoInstaller01009.dll - -; ============================================================================= - -[Strings] -ProviderName = "Scarlet.Crush Productions" -DeviceName = "BTH DS3 Device" -WinUSB_SvcDesc = "BTH DS3 Driver" -DISK_NAME = "BTH DS3 WinUsb Installation Media" -ClassName = "Universal Serial Bus devices" - -; ============================================================================= diff --git a/Installers/Drivers/SCP_Driver/System/Ds3WinUsb.cat b/Installers/Drivers/SCP_Driver/System/Ds3WinUsb.cat deleted file mode 100644 index 3886960..0000000 Binary files a/Installers/Drivers/SCP_Driver/System/Ds3WinUsb.cat and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/System/Ds3WinUsb.inf b/Installers/Drivers/SCP_Driver/System/Ds3WinUsb.inf deleted file mode 100644 index c366625..0000000 --- a/Installers/Drivers/SCP_Driver/System/Ds3WinUsb.inf +++ /dev/null @@ -1,103 +0,0 @@ -; ============================================================================= -; Copyright (c) Scarlet.Crush Productions 2012, 2013. All rights reserved. -; -; Ds3WinUsb.inf -; ============================================================================= - -[Version] -Signature = "$Windows NT$" -Class = UsbDevice -ClassGuid = {88BAE032-5A81-49f0-BC3D-A4FF138216D6} -Provider = %ProviderName% -DriverVer = 05/05/2013, 1.0.0.103 -CatalogFile = Ds3WinUsb.cat - -; ============================================================================= - -[ClassInstall32] -Addreg = SCPWinUsbClassReg - -[SCPWinUsbClassReg] -HKR,,,0,%ClassName% -HKR,,Icon,,-20 - -; ============================================================================= - -[DestinationDirs] -CoInstallers_CopyFiles = 11 - -[Manufacturer] -%ProviderName% = SCProductions, NTx86, NTamd64 - -[SourceDisksNames] -1 = %DISK_NAME%,,,\x86 -2 = %DISK_NAME%,,,\amd64 - -[SCProductions.NTx86] -%DeviceName% = USB_Install, USB\VID_054C&PID_0268 -%DeviceName% = USB_Install, USB\VID_054C&PID_042F - -[SourceDisksFiles.x86] -WinUSBCoInstaller2.dll = 1 -WdfCoInstaller01009.dll = 1 - -[SCProductions.NTamd64] -%DeviceName% = USB_Install, USB\VID_054C&PID_0268 -%DeviceName% = USB_Install, USB\VID_054C&PID_042F - -[SourceDisksFiles.amd64] -WinUSBCoInstaller2.dll = 2 -WdfCoInstaller01009.dll = 2 - -; ============================================================================= - -[USB_Install] -Include = WinUsb.inf -Needs = WINUSB.NT - -[USB_Install.Services] -Include = WinUsb.inf -AddService = WinUSB,0x00000002,WinUSB_ServiceInstall - -[WinUSB_ServiceInstall] -DisplayName = %WinUSB_SvcDesc% -ServiceType = 1 -StartType = 3 -ErrorControl = 1 -ServiceBinary = %12%\WinUSB.sys - -; ============================================================================= - -[USB_Install.Wdf] -KmdfService = WINUSB, WinUSB_Install - -[WinUSB_Install] -KmdfLibraryVersion = 1.9 - -[USB_Install.HW] -AddReg = Dev_AddReg - -[Dev_AddReg] -HKR,,DeviceInterfaceGUIDs,0x10000,"{E2824A09-DBAA-4407-85CA-C8E8FF5F6FFA}" - -[USB_Install.CoInstallers] -AddReg = CoInstallers_AddReg -CopyFiles = CoInstallers_CopyFiles - -[CoInstallers_AddReg] -HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01009.dll,WdfCoInstaller","WinUSBCoInstaller2.dll" - -[CoInstallers_CopyFiles] -WinUSBCoInstaller2.dll -WdfCoInstaller01009.dll - -; ============================================================================= - -[Strings] -ProviderName = "Scarlet.Crush Productions" -DeviceName = "USB DS3 Device" -WinUSB_SvcDesc = "USB DS3 Driver" -DISK_NAME = "USB DS3 WinUsb Installation Media" -ClassName = "Universal Serial Bus devices" - -; ============================================================================= diff --git a/Installers/Drivers/SCP_Driver/System/ScpVBus.cat b/Installers/Drivers/SCP_Driver/System/ScpVBus.cat deleted file mode 100644 index 895bd16..0000000 Binary files a/Installers/Drivers/SCP_Driver/System/ScpVBus.cat and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/System/ScpVBus.inf b/Installers/Drivers/SCP_Driver/System/ScpVBus.inf deleted file mode 100644 index 18a4df4..0000000 --- a/Installers/Drivers/SCP_Driver/System/ScpVBus.inf +++ /dev/null @@ -1,71 +0,0 @@ -; ============================================================================= -; Copyright (c) Scarlet.Crush Productions. All rights reserved. -; -; ScpVBus.inf -; ============================================================================= - -[Version] -Provider = %SCProd% -Signature = "$Windows NT$" -Class = System -ClassGuid = {4D36E97D-E325-11CE-BFC1-08002BE10318} -DriverVer = 05/05/2013, 1.0.0.103 -CatalogFile = ScpVBus.cat - -; ============================================================================= - -[DestinationDirs] -DefaultDestDir = 12 - -[Manufacturer] -%SCProd% = SCProductions, NTx86, NTamd64 - -[SourceDisksNames] -1 = %MediaDescription% - -[SCProductions.NTx86] -%ScpVBus.DeviceDesc% = ScpVBus_Install, root\ScpVBus - -[SourceDisksFiles.x86] -ScpVBus.sys = 1, .\x86, - -[SCProductions.NTamd64] -%ScpVBus.DeviceDesc% = ScpVBus_Install, root\ScpVBus - -[SourceDisksFiles.amd64] -ScpVBus.sys = 1, .\amd64, - -; ============================================================================= - -[ScpVBus_Install.NT] -CopyFiles = ScpVBus_Install.NT.Copy - -[ScpVBus_Install.NT.hw] -AddReg = ScpVBus_Device_AddReg - -[ScpVBus_Install.NT.Copy] -ScpVBus.sys - -[ScpVBus_Device_AddReg] - -[ScpVBus_Install.NT.Services] -AddService = ScpVBus, %SPSVCINST_ASSOCSERVICE%, ScpVBus_Service_Inst - -[ScpVBus_Service_Inst] -DisplayName = %ScpVBus.SVCDESC% -ServiceType = 1 ; SERVICE_KERNEL_DRIVER -StartType = 3 ; SERVICE_DEMAND_START -ErrorControl = 1 ; SERVICE_ERROR_NORMAL -ServiceBinary = %12%\ScpVBus.sys -LoadOrderGroup = Extended Base - -; ============================================================================= - -[Strings] -SCProd = "Scarlet.Crush Productions" -MediaDescription = "Scp Virtual Bus Installation Media" -ScpVBus.DeviceDesc = "Scp Virtual Bus Driver" -ScpVBus.SVCDESC = "Scp Virtual Bus Driver" -SPSVCINST_ASSOCSERVICE = 0x00000002 - -; ============================================================================= diff --git a/Installers/Drivers/SCP_Driver/System/amd64/ScpVBus.sys b/Installers/Drivers/SCP_Driver/System/amd64/ScpVBus.sys deleted file mode 100644 index ae55f41..0000000 Binary files a/Installers/Drivers/SCP_Driver/System/amd64/ScpVBus.sys and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/System/amd64/WUDFUpdate_01009.dll b/Installers/Drivers/SCP_Driver/System/amd64/WUDFUpdate_01009.dll deleted file mode 100644 index 1424634..0000000 Binary files a/Installers/Drivers/SCP_Driver/System/amd64/WUDFUpdate_01009.dll and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/System/amd64/WdfCoInstaller01009.dll b/Installers/Drivers/SCP_Driver/System/amd64/WdfCoInstaller01009.dll deleted file mode 100644 index 1731b96..0000000 Binary files a/Installers/Drivers/SCP_Driver/System/amd64/WdfCoInstaller01009.dll and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/System/amd64/WinUsbCoInstaller2.dll b/Installers/Drivers/SCP_Driver/System/amd64/WinUsbCoInstaller2.dll deleted file mode 100644 index 30e5502..0000000 Binary files a/Installers/Drivers/SCP_Driver/System/amd64/WinUsbCoInstaller2.dll and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/Win32/LilyPad-Scp-r5350.dll b/Installers/Drivers/SCP_Driver/Win32/LilyPad-Scp-r5350.dll deleted file mode 100644 index 435f4ad..0000000 Binary files a/Installers/Drivers/SCP_Driver/Win32/LilyPad-Scp-r5350.dll and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/Win32/SCPUser.exe b/Installers/Drivers/SCP_Driver/Win32/SCPUser.exe deleted file mode 100644 index 414b66c..0000000 Binary files a/Installers/Drivers/SCP_Driver/Win32/SCPUser.exe and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/Win32/XInput1_3.dll b/Installers/Drivers/SCP_Driver/Win32/XInput1_3.dll deleted file mode 100644 index 89672c3..0000000 Binary files a/Installers/Drivers/SCP_Driver/Win32/XInput1_3.dll and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/Win64/SCPUser.exe b/Installers/Drivers/SCP_Driver/Win64/SCPUser.exe deleted file mode 100644 index 3ed00e5..0000000 Binary files a/Installers/Drivers/SCP_Driver/Win64/SCPUser.exe and /dev/null differ diff --git a/Installers/Drivers/SCP_Driver/Win64/XInput1_3.dll b/Installers/Drivers/SCP_Driver/Win64/XInput1_3.dll deleted file mode 100644 index c933882..0000000 Binary files a/Installers/Drivers/SCP_Driver/Win64/XInput1_3.dll and /dev/null differ diff --git a/Installers/Drivers/Xbox360_32Eng_7.exe b/Installers/Drivers/Xbox360_32Eng_7.exe deleted file mode 100644 index c8e0e83..0000000 Binary files a/Installers/Drivers/Xbox360_32Eng_7.exe and /dev/null differ diff --git a/Installers/Drivers/Xbox360_32Eng_Vista.exe b/Installers/Drivers/Xbox360_32Eng_Vista.exe deleted file mode 100644 index c8e0e83..0000000 Binary files a/Installers/Drivers/Xbox360_32Eng_Vista.exe and /dev/null differ diff --git a/Installers/Drivers/Xbox360_32Eng_XPSP2.exe b/Installers/Drivers/Xbox360_32Eng_XPSP2.exe deleted file mode 100644 index c8e0e83..0000000 Binary files a/Installers/Drivers/Xbox360_32Eng_XPSP2.exe and /dev/null differ diff --git a/Installers/Drivers/Xbox360_64Eng_7.exe b/Installers/Drivers/Xbox360_64Eng_7.exe deleted file mode 100644 index 71c3a98..0000000 Binary files a/Installers/Drivers/Xbox360_64Eng_7.exe and /dev/null differ diff --git a/Installers/Drivers/Xbox360_64Eng_Vista.exe b/Installers/Drivers/Xbox360_64Eng_Vista.exe deleted file mode 100644 index 71c3a98..0000000 Binary files a/Installers/Drivers/Xbox360_64Eng_Vista.exe and /dev/null differ diff --git a/Installers/Drivers/Xbox360_64Eng_XP.exe b/Installers/Drivers/Xbox360_64Eng_XP.exe deleted file mode 100644 index c1bce6d..0000000 Binary files a/Installers/Drivers/Xbox360_64Eng_XP.exe and /dev/null differ diff --git a/Installers/wiinusoft_installer.iss b/Installers/wiinusoft_installer.iss deleted file mode 100644 index 923b326..0000000 --- a/Installers/wiinusoft_installer.iss +++ /dev/null @@ -1,285 +0,0 @@ -#define MyAppName "WiinUSoft" -#define MyAppVersion "3.0" -#define MyAppPublisher "Justin Keys" -#define MyAppURL "http://www.wiinupro.com/" -#define MyAppExeName "WiinUSoft.exe" - -[Setup] -; NOTE: The value of AppId uniquely identifies this application. -; Do not use the same AppId value in installers for other applications. -; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) -AppId={{1BFC4F9F-BB85-4CE3-AC22-0CBFF78D5EE4} -AppName={#MyAppName} -AppVersion={#MyAppVersion} -;AppVerName={#MyAppName} {#MyAppVersion} -AppPublisher={#MyAppPublisher} -AppPublisherURL={#MyAppURL} -AppSupportURL={#MyAppURL} -AppUpdatesURL={#MyAppURL} -DefaultDirName={pf}\{#MyAppName} -DefaultGroupName={#MyAppName} -AllowNoIcons=yes -OutputDir=.\ -OutputBaseFilename=wiinusoft_setup -Compression=lzma -SolidCompression=yes -ArchitecturesInstallIn64BitMode=x64 - -[Languages] -Name: "english"; MessagesFile: "compiler:Default.isl" -;Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" -;Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl" -;Name: "corsican"; MessagesFile: "compiler:Languages\Corsican.isl" -;Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl" -;Name: "danish"; MessagesFile: "compiler:Languages\Danish.isl" -;Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" -;Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl" -;Name: "french"; MessagesFile: "compiler:Languages\French.isl" -;Name: "german"; MessagesFile: "compiler:Languages\German.isl" -;Name: "greek"; MessagesFile: "compiler:Languages\Greek.isl" -;Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl" -;Name: "hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl" -;Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl" -;Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl" -;Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl" -;Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl" -;Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl" -;Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" -;Name: "scottishgaelic"; MessagesFile: "compiler:Languages\ScottishGaelic.isl" -;Name: "serbiancyrillic"; MessagesFile: "compiler:Languages\SerbianCyrillic.isl" -;Name: "serbianlatin"; MessagesFile: "compiler:Languages\SerbianLatin.isl" -;Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl" -;Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" -;Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl" -;Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl" - -[Types] -Name: "full"; Description: "Install Everything"; -Name: "custom"; Description: "Pick and Choose"; Flags: iscustom - -[Components] -Name: "main"; Description: "WiinUSoft"; Types: full custom; Flags: fixed; -Name: "scp"; Description: "Scarlet Crush Production Driver"; Types: full -Name: "xbox"; Description: "Xbox 360 Controller Driver (Required on Windows XP, Vista, and 7)"; Types: full - -[Tasks] -Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked -Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1 - -[Files] -Source: "..\WiinUSoft\bin\Release\WiinUSoft.exe"; DestDir: "{app}"; Components: main; Flags: ignoreversion -Source: "..\WiinUSoft\bin\Release\Nintroller.dll"; DestDir: "{app}"; Components: main; Flags: ignoreversion -Source: "..\WiinUSoft\bin\Release\RestSharp.dll"; DestDir: "{app}"; Components: main; Flags: ignoreversion -Source: "..\WiinUSoft\bin\Release\ScpControl.dll"; DestDir: "{app}"; Components: main; Flags: ignoreversion -Source: "..\WiinUSoft\bin\Release\Hardcodet.Wpf.TaskbarNotification.dll"; Components: main; DestDir: "{app}"; Flags: ignoreversion -Source: "..\WiinUSoft\ReadMe.txt"; DestDir: "{app}"; Components: main; Flags: ignoreversion isreadme -Source: "Drivers\SCP_Driver\*"; DestDir: "{app}\SCP_Driver"; Components: scp; Flags: ignoreversion recursesubdirs createallsubdirs -Source: "Drivers\Xbox360_32Eng_7.exe"; DestDir: "{app}"; DestName: "Xbox360Driver.exe"; Components: xbox; Check: IsWindows7OrAbove and not Is64BitInstallMode; Flags: ignoreversion -Source: "Drivers\Xbox360_64Eng_7.exe"; DestDir: "{app}"; DestName: "Xbox360Driver.exe"; Components: xbox; Check: IsWindows7OrAbove and Is64BitInstallMode; Flags: ignoreversion -Source: "Drivers\Xbox360_32Eng_Vista.exe"; DestDir: "{app}"; DestName: "Xbox360Driver.exe"; Components: xbox; Check: IsWindowsVista and not Is64BitInstallMode; Flags: ignoreversion -Source: "Drivers\Xbox360_64Eng_Vista.exe"; DestDir: "{app}"; DestName: "Xbox360Driver.exe"; Components: xbox; Check: IsWindowsVista and Is64BitInstallMode; Flags: ignoreversion -Source: "Drivers\Xbox360_32Eng_XPSP2.exe"; DestDir: "{app}"; DestName: "Xbox360Driver.exe"; Components: xbox; Check: IsWindowsXpSp2 and not Is64BitInstallMode; Flags: ignoreversion -Source: "Drivers\Xbox360_64Eng_XP.exe"; DestDir: "{app}"; DestName: "Xbox360Driver.exe"; Components: xbox; Check: IsWindowsXp and Is64BitInstallMode; Flags: ignoreversion - -[Icons] -Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" -Name: "{group}\ReadMe"; Filename: "{app}\ReadMe.txt" -Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" -Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon -Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon - -[Run] -Filename: "{app}\SCP_Driver\ScpDriver.exe"; Components: scp -Filename: "{app}\Xbox360Driver.exe"; Components: xbox; -Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent - -[UninstallRun] -Filename: "{app}\SCP_Driver\ScpDriver.exe"; Components: scp - -[Code] -///////////////////////////////////////////////////////////////////// -function GetUninstallString(): String; -var - sUnInstPath: String; - sUnInstallString: String; -begin - sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1'); - sUnInstallString := ''; - if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then - RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); - Result := sUnInstallString; -end; - -procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); -var - FileName: String; -begin - if CurUninstallStep = usPostUninstall then - begin - FileName := ExpandConstant('{userappdata}') + '\WiinUSoft_prefs.config'; - if FileExists(FileName) then - begin - if (GetUninstallString() = '') then - begin - if MsgBox('Do you want to delete your saved WiinUSoft preferences ?', - mbConfirmation, MB_YESNO) = IDYES - then - DeleteFile(FileName); - end - else - DeleteFile(FileName); - end - end; -end; - -function IsWindowsXp: Boolean; -var - Version: TWindowsVersion; -begin - GetWindowsVersionEx(Version); - - if Version.NTPlatform and - (Version.Major = 5) and - (Version.Minor > 0) then - begin - Result := True; - Exit; - end - - Result := False; -end; - -function IsWindowsXpSp2: Boolean; -var - Version: TWindowsVersion; -begin - GetWindowsVersionEx(Version); - - if Version.NTPlatform and - (Version.Major = 5) and - (Version.Minor > 0) and - (Version.ServicePackMajor > 1) then - begin - Result := True; - Exit; - end - - Result := False; -end; - -function IsWindowsVista: Boolean; -var - Version: TWindowsVersion; -begin - GetWindowsVersionEx(Version); - - if Version.NTPlatform and - (Version.Major = 6) and - (Version.Minor = 0) then - begin - Result := True; - Exit; - end - - Result := False; -end; - -function IsWindows7OrAbove: Boolean; -var - Version: TWindowsVersion; -begin - GetWindowsVersionEx(Version); - - // Windows 7 - if Version.NTPlatform and - (Version.Major = 6) and - (Version.Minor = 1) then - begin - Result := True; - Exit; - end - - // Windows 8 - if Version.NTPlatform and - (Version.Major = 6) and - (Version.Minor = 2) then - begin - Result := True; - Exit; - end - - // Windows 8.1 - if Version.NTPlatform and - (Version.Major = 6) and - (Version.Minor = 3) then - begin - Result := True; - Exit; - end - - // Windows 10 - if Version.NTPlatform and - (Version.Major = 10) then - begin - Result := True; - Exit; - end - - Result := False; -end; - -// code for uninstalling the previous version - - - -///////////////////////////////////////////////////////////////////// -function IsUpgrade(): Boolean; -begin - Result := False; - if (GetUninstallString() <> '') then - begin - if MsgBox('There is another version of WiinUSoft installed. Uninstall it?', - mbConfirmation, MB_YESNO) = IDYES - then - Result := True; - end -end; - - -///////////////////////////////////////////////////////////////////// -function UnInstallOldVersion(): Integer; -var - sUnInstallString: String; - iResultCode: Integer; -begin -// Return Values: -// 1 - uninstall string is empty -// 2 - error executing the UnInstallString -// 3 - successfully executed the UnInstallString - - // default return value - Result := 0; - - // get the uninstall string of the old app - sUnInstallString := GetUninstallString(); - if sUnInstallString <> '' then begin - sUnInstallString := RemoveQuotes(sUnInstallString); - if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then - Result := 3 - else - Result := 2; - end else - Result := 1; -end; - -///////////////////////////////////////////////////////////////////// -procedure CurStepChanged(CurStep: TSetupStep); -begin - if (CurStep=ssInstall) then - begin - if (IsUpgrade()) then - begin - UnInstallOldVersion(); - end; - end; -end; \ No newline at end of file diff --git a/Nintroller/Calibrations.cs b/Nintroller/Calibrations.cs index d5cbac8..fb76e88 100644 --- a/Nintroller/Calibrations.cs +++ b/Nintroller/Calibrations.cs @@ -604,7 +604,7 @@ public class Default } }; - public WiiGuitar WiiGuitarDefault = new WiiGuitar() + public Guitar GuitarDefault = new Guitar() { Joy = new Joystick() { diff --git a/Nintroller/ControllerStructs.cs b/Nintroller/ControllerStructs.cs deleted file mode 100644 index 33a2fb7..0000000 --- a/Nintroller/ControllerStructs.cs +++ /dev/null @@ -1,1786 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows; -using System.Windows.Forms; - -namespace NintrollerLib -{ - public struct Wiimote : INintrollerState - { -#if DEBUG - private bool _debugViewActive; - public bool DebugViewActive - { - get - { - return _debugViewActive; - } - set - { - _debugViewActive = value; - } - } -#endif - - public CoreButtons buttons; - public Accelerometer accelerometer; - public IR irSensor; - //INintrollerState extension; - - public Wiimote(byte[] rawData) - { - buttons = new CoreButtons(); - accelerometer = new Accelerometer(); - irSensor = new IR(); - //extension = null; - -#if DEBUG - _debugViewActive = false; -#endif - - Update(rawData); - } - - public void Update(byte[] data) - { - buttons.Parse(data, 1); - accelerometer.Parse(data, 3); - irSensor.Parse(data, 3); - - accelerometer.Normalize(); - } - - public float GetValue(string input) - { - throw new NotImplementedException(); - } - - public void SetCalibration(Calibrations.CalibrationPreset preset) - { - switch (preset) - { - case Calibrations.CalibrationPreset.Default: - //accelerometer.Calibrate(Calibrations.Defaults.WiimoteDefault.accelerometer); - SetCalibration(Calibrations.Defaults.WiimoteDefault); - break; - - case Calibrations.CalibrationPreset.Modest: - SetCalibration(Calibrations.Moderate.WiimoteModest); - break; - - case Calibrations.CalibrationPreset.Extra: - SetCalibration(Calibrations.Extras.WiimoteExtra); - break; - - case Calibrations.CalibrationPreset.Minimum: - SetCalibration(Calibrations.Minimum.WiimoteMinimal); - break; - - case Calibrations.CalibrationPreset.None: - SetCalibration(Calibrations.None.WiimoteRaw); - break; - } - } - - public void SetCalibration(INintrollerState from) - { - if (from.CalibrationEmpty) - { - // don't apply empty calibrations - return; - } - - if (from.GetType() == typeof(Wiimote)) - { - accelerometer.Calibrate(((Wiimote)from).accelerometer); - irSensor.boundingArea = ((Wiimote)from).irSensor.boundingArea; - } - else if (from.GetType() == typeof(Nunchuk)) - { - accelerometer.Calibrate(((Nunchuk)from).wiimote.accelerometer); - irSensor.boundingArea = ((Nunchuk)from).wiimote.irSensor.boundingArea; - } - else if (from.GetType() == typeof(ClassicController)) - { - accelerometer.Calibrate(((ClassicController)from).wiimote.accelerometer); - irSensor.boundingArea = ((ClassicController)from).wiimote.irSensor.boundingArea; - } - else if (from.GetType() == typeof(ClassicControllerPro)) - { - accelerometer.Calibrate(((ClassicControllerPro)from).wiimote.accelerometer); - irSensor.boundingArea = ((ClassicControllerPro)from).wiimote.irSensor.boundingArea; - } - } - - public void SetCalibration(string calibrationString) - { - if (calibrationString.Count(c => c == '0') > 5) - { - // don't set empty calibrations - return; - } - - string[] components = calibrationString.Split(new char[] {':'}); - - foreach (string component in components) - { - if (component.StartsWith("acc")) - { - string[] accConfig = component.Split(new char[] { '|' }); - - for (int a = 1; a < accConfig.Length; a++) - { - int value = 0; - if (int.TryParse(accConfig[a], out value)) - { - switch (a) - { - case 1: accelerometer.centerX = value; break; - case 2: accelerometer.minX = value; break; - case 3: accelerometer.maxX = value; break; - case 4: accelerometer.deadX = value; break; - case 5: accelerometer.centerY = value; break; - case 6: accelerometer.minY = value; break; - case 7: accelerometer.maxY = value; break; - case 8: accelerometer.deadY = value; break; - case 9: accelerometer.centerZ = value; break; - case 10: accelerometer.minZ = value; break; - case 11: accelerometer.maxZ = value; break; - case 12: accelerometer.deadZ = value; break; - } - } - } - } - else if (component.StartsWith("irSqr")) - { - SquareBoundry sBoundry = new SquareBoundry(); - string[] sqrConfig = component.Split(new char[] { '|' }); - - for (int s = 1; s < sqrConfig.Length; s++) - { - int value = 0; - if (int.TryParse(sqrConfig[s], out value)) - { - switch (s) - { - case 1: sBoundry.center_x = value; break; - case 2: sBoundry.center_y = value; break; - case 3: sBoundry.width = value; break; - case 4: sBoundry.height = value; break; - } - } - } - - irSensor.boundingArea = sBoundry; - } - else if (component.StartsWith("irCir")) - { - CircularBoundry sBoundry = new CircularBoundry(); - string[] cirConfig = component.Split(new char[] { '|' }); - - for (int c = 1; c < cirConfig.Length; c++) - { - int value = 0; - if (int.TryParse(cirConfig[c], out value)) - { - switch (c) - { - case 1: sBoundry.center_x = value; break; - case 2: sBoundry.center_y = value; break; - case 3: sBoundry.radius = value; break; - } - } - } - - irSensor.boundingArea = sBoundry; - } - } - } - - /// - /// Creates a string containing the calibration settings for the Wiimote. - /// String is in the following format - /// -wm:acc|centerX|minX|minY|deadX|centerY|[...]:ir - /// - /// String representing the Wiimote's calibration settings. - public string GetCalibrationString() - { - StringBuilder sb = new StringBuilder(); - sb.Append("-wm"); - sb.Append(":acc"); - sb.Append("|"); sb.Append(accelerometer.centerX); - sb.Append("|"); sb.Append(accelerometer.minX); - sb.Append("|"); sb.Append(accelerometer.maxX); - sb.Append("|"); sb.Append(accelerometer.deadX); - - sb.Append("|"); sb.Append(accelerometer.centerY); - sb.Append("|"); sb.Append(accelerometer.minY); - sb.Append("|"); sb.Append(accelerometer.maxY); - sb.Append("|"); sb.Append(accelerometer.deadY); - - sb.Append("|"); sb.Append(accelerometer.centerZ); - sb.Append("|"); sb.Append(accelerometer.minZ); - sb.Append("|"); sb.Append(accelerometer.maxZ); - sb.Append("|"); sb.Append(accelerometer.deadZ); - - if (irSensor.boundingArea != null) - { - if (irSensor.boundingArea is SquareBoundry) - { - SquareBoundry sqr = (SquareBoundry)irSensor.boundingArea; - sb.Append(":irSqr"); - sb.Append("|"); sb.Append(sqr.center_x); - sb.Append("|"); sb.Append(sqr.center_y); - sb.Append("|"); sb.Append(sqr.width); - sb.Append("|"); sb.Append(sqr.height); - } - else if (irSensor.boundingArea is CircularBoundry) - { - CircularBoundry cir = (CircularBoundry)irSensor.boundingArea; - sb.Append(":irCir"); - sb.Append("|"); sb.Append(cir.center_x); - sb.Append("|"); sb.Append(cir.center_y); - sb.Append("|"); sb.Append(cir.radius); - } - } - - return sb.ToString(); - } - - public bool CalibrationEmpty - { - get - { - if (accelerometer.maxX == 0 && accelerometer.maxY == 0 && accelerometer.maxZ == 0) - { - return true; - } - else - { - return false; - } - } - } - - public IEnumerator> GetEnumerator() - { - // Buttons - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.PLUS, buttons.Plus ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.MINUS, buttons.Minus ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.HOME, buttons.Home ? 1.0f : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.A, buttons.A ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.B, buttons.B ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.ONE, buttons.One ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.TWO, buttons.Two ? 1.0f : 0.0f); - - // D-Pad - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.UP, buttons.Up ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.DOWN, buttons.Down ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.LEFT, buttons.Left ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.RIGHT, buttons.Right ? 1.0f : 0.0f); - - // IR Sensor - irSensor.Normalize(); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.IR_X, irSensor.X); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.IR_Y, irSensor.Y); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.IR_UP, irSensor.Y > 0 ? irSensor.Y : 0); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.IR_DOWN, irSensor.Y > 0 ? -irSensor.Y : 0); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.IR_LEFT, irSensor.X < 0 ? -irSensor.X : 0); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.IR_RIGHT, irSensor.X > 0 ? irSensor.X : 0); - - // Accelerometer - accelerometer.Normalize(); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.ACC_X, accelerometer.X); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.ACC_Y, accelerometer.Y); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.ACC_Z, accelerometer.Z); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.TILT_LEFT, accelerometer.X < 0 ? -accelerometer.X : 0); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.TILT_RIGHT, accelerometer.X > 0 ? accelerometer.X : 0); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.TILT_UP, accelerometer.Y > 0 ? accelerometer.Y : 0); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.TILT_DOWN, accelerometer.Y < 0 ? -accelerometer.Y : 0); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.FACE_UP, accelerometer.Z > 0 ? accelerometer.Z : 0); - yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.FACE_DOWN, accelerometer.Z < 0 ? -accelerometer.Z : 0); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } - - public struct Nunchuk : INintrollerState - { -#if DEBUG - private bool _debugViewActive; - public bool DebugViewActive - { - get - { - return _debugViewActive; - } - set - { - _debugViewActive = value; - } - } -#endif - - public Wiimote wiimote; - public Accelerometer accelerometer; - public Joystick joystick; - public bool C, Z; - - public Nunchuk(Wiimote wm) - { - this = new Nunchuk(); - wiimote = wm; - } - - public Nunchuk(byte[] rawData) - { - wiimote = new Wiimote(rawData); - accelerometer = new Accelerometer(); - joystick = new Joystick(); - - C = Z = false; - -#if DEBUG - _debugViewActive = false; -#endif - - Update(rawData); - } - - public void Update(byte[] data) - { - int offset = 0; - switch((InputReport)data[0]) - { - case InputReport.BtnsExt: - case InputReport.BtnsExtB: - offset = 3; - break; - case InputReport.BtnsAccExt: - offset = 6; - break; - case InputReport.BtnsIRExt: - offset = 13; - break; - case InputReport.BtnsAccIRExt: - offset = 16; - break; - case InputReport.ExtOnly: - offset = 1; - break; - case InputReport.Status: - offset = -1; - break; - default: - return; - } - - if (offset > 0) - { - // Buttons - C = (data[offset + 5] & 0x02) == 0; - Z = (data[offset + 5] & 0x01) == 0; - - // Joystick - joystick.rawX = data[offset]; - joystick.rawY = data[offset + 1]; - - // Accelerometer - accelerometer.Parse(data, offset + 2); - - // Normalize - joystick.Normalize(); - accelerometer.Normalize(); - } - - wiimote.Update(data); - } - - public float GetValue(string input) - { - throw new NotImplementedException(); - } - - public void SetCalibration(Calibrations.CalibrationPreset preset) - { - wiimote.SetCalibration(preset); - - switch (preset) - { - case Calibrations.CalibrationPreset.Default: - SetCalibration(Calibrations.Defaults.NunchukDefault); - break; - - case Calibrations.CalibrationPreset.Modest: - SetCalibration(Calibrations.Moderate.NunchukModest); - break; - - case Calibrations.CalibrationPreset.Extra: - SetCalibration(Calibrations.Extras.NunchukExtra); - break; - - case Calibrations.CalibrationPreset.Minimum: - SetCalibration(Calibrations.Minimum.NunchukMinimal); - break; - - case Calibrations.CalibrationPreset.None: - SetCalibration(Calibrations.None.NunchukRaw); - break; - } - } - - public void SetCalibration(INintrollerState from) - { - if (from.CalibrationEmpty) - { - // don't apply empty calibrations - return; - } - - if (from.GetType() == typeof(Nunchuk)) - { - accelerometer.Calibrate(((Nunchuk)from).accelerometer); - joystick.Calibrate(((Nunchuk)from).joystick); - } - else if (from.GetType() == typeof(Wiimote)) - { - wiimote.SetCalibration(from); - } - } - - public void SetCalibration(string calibrationString) - { - if (calibrationString.Count(c => c == '0') > 5) - { - // don't set empty calibrations - return; - } - - string[] components = calibrationString.Split(new char[] { ':' }); - - foreach (string component in components) - { - if (component.StartsWith("joy")) - { - string[] joyConfig = component.Split(new char[] { '|' }); - - for (int j = 1; j < joyConfig.Length; j++) - { - int value = 0; - if (int.TryParse(joyConfig[j], out value)) - { - switch (j) - { - case 1: joystick.centerX = value; break; - case 2: joystick.minX = value; break; - case 3: joystick.maxX = value; break; - case 4: joystick.deadX = value; break; - case 5: joystick.centerY = value; break; - case 6: joystick.minY = value; break; - case 7: joystick.maxY = value; break; - case 8: joystick.deadY = value; break; - default: break; - } - } - } - } - else if (component.StartsWith("acc")) - { - string[] accConfig = component.Split(new char[] { '|' }); - - for (int a = 1; a < accConfig.Length; a++) - { - int value = 0; - if (int.TryParse(accConfig[a], out value)) - { - switch (a) - { - case 1: accelerometer.centerX = value; break; - case 2: accelerometer.minX = value; break; - case 3: accelerometer.maxX = value; break; - case 4: accelerometer.deadX = value; break; - case 5: accelerometer.centerY = value; break; - case 6: accelerometer.minY = value; break; - case 7: accelerometer.maxY = value; break; - case 8: accelerometer.deadY = value; break; - case 9: accelerometer.centerZ = value; break; - case 10: accelerometer.minZ = value; break; - case 11: accelerometer.maxZ = value; break; - case 12: accelerometer.deadZ = value; break; - default: break; - } - } - } - } - } - } - - public string GetCalibrationString() - { - StringBuilder sb = new StringBuilder(); - sb.Append("-nun"); - sb.Append(":joy"); - sb.Append("|"); sb.Append(joystick.centerX); - sb.Append("|"); sb.Append(joystick.minX); - sb.Append("|"); sb.Append(joystick.maxX); - sb.Append("|"); sb.Append(joystick.deadX); - - sb.Append("|"); sb.Append(joystick.centerY); - sb.Append("|"); sb.Append(joystick.minY); - sb.Append("|"); sb.Append(joystick.maxY); - sb.Append("|"); sb.Append(joystick.deadY); - sb.Append(":acc"); - sb.Append("|"); sb.Append(accelerometer.centerX); - sb.Append("|"); sb.Append(accelerometer.minX); - sb.Append("|"); sb.Append(accelerometer.maxX); - sb.Append("|"); sb.Append(accelerometer.deadX); - - sb.Append("|"); sb.Append(accelerometer.centerY); - sb.Append("|"); sb.Append(accelerometer.minY); - sb.Append("|"); sb.Append(accelerometer.maxY); - sb.Append("|"); sb.Append(accelerometer.deadY); - - sb.Append("|"); sb.Append(accelerometer.centerZ); - sb.Append("|"); sb.Append(accelerometer.minZ); - sb.Append("|"); sb.Append(accelerometer.maxZ); - sb.Append("|"); sb.Append(accelerometer.deadZ); - - return sb.ToString(); - } - - public bool CalibrationEmpty - { - get - { - if (accelerometer.maxX == 0 && accelerometer.maxY == 0 && accelerometer.maxZ == 0) - { - return true; - } - else if (joystick.maxX == 0 && joystick.maxY == 0) - { - return true; - } - else - { - return false; - } - } - } - - public IEnumerator> GetEnumerator() - { - // Wiimote - foreach (var input in wiimote) - { - yield return input; - } - - // Buttons - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.C, C ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.Z, Z ? 1.0f : 0.0f); - - // Joystick - joystick.Normalize(); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.JOY_X, joystick.X); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.JOY_Y, joystick.Y); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.UP, joystick.Y > 0 ? joystick.Y : 0); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.DOWN, joystick.Y > 0 ? 0 : -joystick.Y); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.LEFT, joystick.X > 0 ? 0 : -joystick.X); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.RIGHT, joystick.X > 0 ? joystick.X : 0); - - // Accelerometer - accelerometer.Normalize(); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.ACC_X, accelerometer.X); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.ACC_Y, accelerometer.Y); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.ACC_Z, accelerometer.Z); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.TILT_LEFT, accelerometer.X > 0 ? 0 : -accelerometer.X); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.TILT_RIGHT, accelerometer.X > 0 ? accelerometer.X : 0); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.TILT_UP, accelerometer.Y > 0 ? accelerometer.Y : 0); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.TILT_DOWN, accelerometer.Y > 0 ? 0 : -accelerometer.Y); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.FACE_UP, accelerometer.Z > 0 ? accelerometer.Z : 0); - yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.FACE_DOWN, accelerometer.Z > 0 ? 0 : -accelerometer.Z); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } - - public struct ClassicController : INintrollerState - { -#if DEBUG - private bool _debugViewActive; - public bool DebugViewActive - { - get - { - return _debugViewActive; - } - set - { - _debugViewActive = value; - } - } -#endif - - public Wiimote wiimote; - public Joystick LJoy, RJoy; - public Trigger L, R; - public bool A, B, X, Y; - public bool Up, Down, Left, Right; - public bool ZL, ZR, LFull, RFull; - public bool Plus, Minus, Home; - - public ClassicController(Wiimote wm) - { - this = new ClassicController(); - wiimote = wm; - } - - public bool Start - { - get { return Plus; } - set { Plus = value; } - } - - public bool Select - { - get { return Minus; } - set { Minus = value; } - } - - public void Update(byte[] data) - { - int offset = 0; - switch ((InputReport)data[0]) - { - case InputReport.BtnsExt: - case InputReport.BtnsExtB: - offset = 3; - break; - case InputReport.BtnsAccExt: - offset = 6; - break; - case InputReport.BtnsIRExt: - offset = 13; - break; - case InputReport.BtnsAccIRExt: - offset = 16; - break; - case InputReport.ExtOnly: - offset = 1; - break; - default: - return; - } - - if (offset > 0) - { - // Buttons - A = (data[offset + 5] & 0x10) == 0; - B = (data[offset + 5] & 0x40) == 0; - X = (data[offset + 5] & 0x08) == 0; - Y = (data[offset + 5] & 0x20) == 0; - LFull = (data[offset + 4] & 0x20) == 0; // Until the Click - RFull = (data[offset + 4] & 0x02) == 0; // Until the Click - ZL = (data[offset + 5] & 0x80) == 0; - ZR = (data[offset + 5] & 0x04) == 0; - Plus = (data[offset + 4] & 0x04) == 0; - Minus = (data[offset + 4] & 0x10) == 0; - Home = (data[offset + 4] & 0x08) == 0; - - // Dpad - Up = (data[offset + 5] & 0x01) == 0; - Down = (data[offset + 4] & 0x40) == 0; - Left = (data[offset + 5] & 0x02) == 0; - Right = (data[offset + 4] & 0x80) == 0; - - // Joysticks - LJoy.rawX = (byte)(data[offset] & 0x3F); - LJoy.rawY = (byte)(data[offset + 1] & 0x03F); - RJoy.rawX = (byte)(data[offset + 2] >> 7 | (data[offset + 1] & 0xC0) >> 5 | (data[offset] & 0xC0) >> 3); - RJoy.rawY = (byte)(data[offset + 2] & 0x1F); - - // Triggers - L.rawValue = (byte)(((data[offset + 2] & 0x60) >> 2) | (data[offset + 3] >> 5)); - R.rawValue = (byte)(data[offset + 3] & 0x1F); - L.full = LFull; - R.full = RFull; - - // Normalize - LJoy.Normalize(); - RJoy.Normalize(); - L.Normalize(); - R.Normalize(); - } - - wiimote.Update(data); - } - - public float GetValue(string input) - { - throw new NotImplementedException(); - } - - public void SetCalibration(Calibrations.CalibrationPreset preset) - { - wiimote.SetCalibration(preset); - - switch (preset) - { - case Calibrations.CalibrationPreset.Default: - //LJoy.Calibrate(Calibrations.Defaults.ClassicControllerDefault.LJoy); - //RJoy.Calibrate(Calibrations.Defaults.ClassicControllerDefault.RJoy); - //L.Calibrate(Calibrations.Defaults.ClassicControllerDefault.L); - //R.Calibrate(Calibrations.Defaults.ClassicControllerDefault.R); - SetCalibration(Calibrations.Defaults.ClassicControllerDefault); - break; - - case Calibrations.CalibrationPreset.Modest: - SetCalibration(Calibrations.Moderate.ClassicControllerModest); - break; - - case Calibrations.CalibrationPreset.Extra: - SetCalibration(Calibrations.Extras.ClassicControllerExtra); - break; - - case Calibrations.CalibrationPreset.Minimum: - SetCalibration(Calibrations.Minimum.ClassicControllerMinimal); - break; - - case Calibrations.CalibrationPreset.None: - SetCalibration(Calibrations.None.ClassicControllerRaw); - break; - } - } - - public void SetCalibration(INintrollerState from) - { - if (from.CalibrationEmpty) - { - // don't apply empty calibrations - return; - } - - if (from.GetType() == typeof(ClassicController)) - { - LJoy.Calibrate(((ClassicController)from).LJoy); - RJoy.Calibrate(((ClassicController)from).RJoy); - L.Calibrate(((ClassicController)from).L); - R.Calibrate(((ClassicController)from).R); - } - else if (from.GetType() == typeof(Wiimote)) - { - wiimote.SetCalibration(from); - } - } - - public void SetCalibration(string calibrationString) - { - if (calibrationString.Count(c => c == '0') > 5) - { - // don't set empty calibrations - return; - } - - string[] components = calibrationString.Split(new char[] { ':' }); - - foreach (string component in components) - { - if (component.StartsWith("joyL")) - { - string[] joyLConfig = component.Split(new char[] { '|' }); - - for (int jL = 1; jL < joyLConfig.Length; jL++) - { - int value = 0; - if (int.TryParse(joyLConfig[jL], out value)) - { - switch (jL) - { - case 1: LJoy.centerX = value; break; - case 2: LJoy.minX = value; break; - case 3: LJoy.maxX = value; break; - case 4: LJoy.deadX = value; break; - case 5: LJoy.centerY = value; break; - case 6: LJoy.minY = value; break; - case 7: LJoy.maxY = value; break; - case 8: LJoy.deadY = value; break; - default: break; - } - } - } - } - else if (component.StartsWith("joyR")) - { - string[] joyRConfig = component.Split(new char[] { '|' }); - - for (int jR = 1; jR < joyRConfig.Length; jR++) - { - int value = 0; - if (int.TryParse(joyRConfig[jR], out value)) - { - switch (jR) - { - case 1: RJoy.centerX = value; break; - case 2: RJoy.minX = value; break; - case 3: RJoy.maxX = value; break; - case 4: RJoy.deadX = value; break; - case 5: RJoy.centerY = value; break; - case 6: RJoy.minY = value; break; - case 7: RJoy.maxY = value; break; - case 8: RJoy.deadY = value; break; - default: break; - } - } - } - } - else if (component.StartsWith("tl")) - { - string[] triggerLConfig = component.Split(new char[] { '|' }); - - for (int tl = 1; tl < triggerLConfig.Length; tl++) - { - int value = 0; - if (int.TryParse(triggerLConfig[tl], out value)) - { - switch (tl) - { - case 1: L.min = value; break; - case 2: L.max = value; break; - default: break; - } - } - } - } - else if (component.StartsWith("tr")) - { - string[] triggerRConfig = component.Split(new char[] { '|' }); - - for (int tr = 1; tr < triggerRConfig.Length; tr++) - { - int value = 0; - if (int.TryParse(triggerRConfig[tr], out value)) - { - switch (tr) - { - case 1: R.min = value; break; - case 2: R.max = value; break; - default: break; - } - } - } - } - } - } - - public string GetCalibrationString() - { - StringBuilder sb = new StringBuilder(); - sb.Append("-cla"); - sb.Append(":joyL"); - sb.Append("|"); sb.Append(LJoy.centerX); - sb.Append("|"); sb.Append(LJoy.minX); - sb.Append("|"); sb.Append(LJoy.maxX); - sb.Append("|"); sb.Append(LJoy.deadX); - sb.Append("|"); sb.Append(LJoy.centerY); - sb.Append("|"); sb.Append(LJoy.minY); - sb.Append("|"); sb.Append(LJoy.maxY); - sb.Append("|"); sb.Append(LJoy.deadY); - sb.Append(":joyR"); - sb.Append("|"); sb.Append(RJoy.centerX); - sb.Append("|"); sb.Append(RJoy.minX); - sb.Append("|"); sb.Append(RJoy.maxX); - sb.Append("|"); sb.Append(RJoy.deadX); - sb.Append("|"); sb.Append(RJoy.centerY); - sb.Append("|"); sb.Append(RJoy.minY); - sb.Append("|"); sb.Append(RJoy.maxY); - sb.Append("|"); sb.Append(RJoy.deadY); - sb.Append(":tl"); - sb.Append("|"); sb.Append(L.min); - sb.Append("|"); sb.Append(L.max); - sb.Append(":tr"); - sb.Append("|"); sb.Append(R.min); - sb.Append("|"); sb.Append(R.max); - - return sb.ToString(); - } - - public bool CalibrationEmpty - { - get - { - if (LJoy.maxX == 0 && LJoy.maxY == 0 && RJoy.maxX == 0 && RJoy.maxY == 0) - { - return true; - } - else - { - return false; - } - } - } - - public IEnumerator> GetEnumerator() - { - // Wiimote - foreach (var input in wiimote) - { - yield return input; - } - - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.A, A ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.B, B ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.X, X ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.Y, Y ? 1.0f : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.L, L.value > 0 ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.R, R.value > 0 ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.ZL, ZL ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.ZR, ZR ? 1.0f : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.UP, Up ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.DOWN, Down ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LEFT, Left ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RIGHT, Right ? 1.0f : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.START, Start ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.SELECT, Select ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.HOME, Home ? 1.0f : 0.0f); - - L.Normalize(); - R.Normalize(); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LFULL, L.full ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RFULL, R.full ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LT, L.value); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RT, R.value); - - LJoy.Normalize(); - RJoy.Normalize(); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LX, LJoy.X); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LY, LJoy.Y); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RX, RJoy.X); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RY, RJoy.X); - - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LUP, LJoy.Y > 0f ? LJoy.Y : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LDOWN, LJoy.Y > 0f ? 0.0f : -LJoy.Y); // These are inverted - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LLEFT, LJoy.X > 0f ? 0.0f : -LJoy.X); // because they - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LRIGHT, LJoy.X > 0f ? LJoy.X : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RUP, RJoy.Y > 0f ? RJoy.Y : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RDOWN, RJoy.Y > 0f ? 0.0f : -RJoy.Y); // represents how far the - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RLEFT, RJoy.X > 0f ? 0.0f : -RJoy.X); // input is left or down - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RRIGHT, RJoy.X > 0f ? RJoy.X : 0.0f); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } - - public struct ClassicControllerPro : INintrollerState - { -#if DEBUG - private bool _debugViewActive; - public bool DebugViewActive - { - get - { - return _debugViewActive; - } - set - { - _debugViewActive = value; - } - } -#endif - - public Wiimote wiimote; - public Joystick LJoy, RJoy; - public bool A, B, X, Y; - public bool Up, Down, Left, Right; - public bool L, R, ZL, ZR; - public bool Plus, Minus, Home; - - public ClassicControllerPro(Wiimote wm) - { - this = new ClassicControllerPro(); - wiimote = wm; - } - - public bool Start - { - get { return Plus; } - set { Plus = value; } - } - - public bool Select - { - get { return Minus; } - set { Minus = value; } - } - - public void Update(byte[] data) - { - int offset = 0; - switch ((InputReport)data[0]) - { - case InputReport.BtnsExt: - case InputReport.BtnsExtB: - offset = 3; - break; - case InputReport.BtnsAccExt: - offset = 6; - break; - case InputReport.BtnsIRExt: - offset = 13; - break; - case InputReport.BtnsAccIRExt: - offset = 16; - break; - case InputReport.ExtOnly: - offset = 1; - break; - default: - return; - } - - if (offset > 0) - { - // Buttons - A = (data[offset + 5] & 0x10) == 0; - B = (data[offset + 5] & 0x40) == 0; - X = (data[offset + 5] & 0x08) == 0; - Y = (data[offset + 5] & 0x20) == 0; - L = (data[offset + 4] & 0x20) == 0; - R = (data[offset + 4] & 0x02) == 0; - ZL = (data[offset + 5] & 0x80) == 0; - ZR = (data[offset + 5] & 0x04) == 0; - Plus = (data[offset + 4] & 0x04) == 0; - Minus = (data[offset + 4] & 0x10) == 0; - Home = (data[offset + 4] & 0x08) == 0; - - // Dpad - Up = (data[offset + 5] & 0x01) == 0; - Down = (data[offset + 4] & 0x40) == 0; - Left = (data[offset + 5] & 0x02) == 0; - Right = (data[offset + 4] & 0x80) == 0; - - // Joysticks - LJoy.rawX = (byte)(data[offset] & 0x3F); - LJoy.rawY = (byte)(data[offset + 1] & 0x03F); - RJoy.rawX = (byte)(data[offset + 2] >> 7 | (data[offset + 1] & 0xC0) >> 5 | (data[offset] & 0xC0) >> 3); - RJoy.rawY = (byte)(data[offset + 2] & 0x1F); - - // Normalize - LJoy.Normalize(); - RJoy.Normalize(); - } - - wiimote.Update(data); - } - - public float GetValue(string input) - { - throw new NotImplementedException(); - } - - public void SetCalibration(Calibrations.CalibrationPreset preset) - { - wiimote.SetCalibration(preset); - - switch (preset) - { - case Calibrations.CalibrationPreset.Default: - //LJoy.Calibrate(Calibrations.Defaults.ClassicControllerProDefault.LJoy); - //RJoy.Calibrate(Calibrations.Defaults.ClassicControllerProDefault.RJoy); - SetCalibration(Calibrations.Defaults.ClassicControllerProDefault); - break; - - case Calibrations.CalibrationPreset.Modest: - SetCalibration(Calibrations.Moderate.ClassicControllerProModest); - break; - - case Calibrations.CalibrationPreset.Extra: - SetCalibration(Calibrations.Extras.ClassicControllerProExtra); - break; - - case Calibrations.CalibrationPreset.Minimum: - SetCalibration(Calibrations.Minimum.ClassicControllerProMinimal); - break; - - case Calibrations.CalibrationPreset.None: - SetCalibration(Calibrations.None.ClassicControllerProRaw); - break; - } - } - - public void SetCalibration(INintrollerState from) - { - if (from.CalibrationEmpty) - { - // don't apply empty calibrations - return; - } - - if (from.GetType() == typeof(ClassicControllerPro)) - { - LJoy.Calibrate(((ClassicControllerPro)from).LJoy); - RJoy.Calibrate(((ClassicControllerPro)from).RJoy); - } - else if (from.GetType() == typeof(Wiimote)) - { - wiimote.SetCalibration(from); - } - } - - public void SetCalibration(string calibrationString) - { - if (calibrationString.Count(c => c == '0') > 5) - { - // don't set empty calibrations - return; - } - - string[] components = calibrationString.Split(new char[] { ':' }); - - foreach (string component in components) - { - if (component.StartsWith("joyL")) - { - string[] joyLConfig = component.Split(new char[] { '|' }); - - for (int jL = 1; jL < joyLConfig.Length; jL++) - { - int value = 0; - if (int.TryParse(joyLConfig[jL], out value)) - { - switch (jL) - { - case 1: LJoy.centerX = value; break; - case 2: LJoy.minX = value; break; - case 3: LJoy.maxX = value; break; - case 4: LJoy.deadX = value; break; - case 5: LJoy.centerY = value; break; - case 6: LJoy.minY = value; break; - case 7: LJoy.maxY = value; break; - case 8: LJoy.deadY = value; break; - default: break; - } - } - } - } - else if (component.StartsWith("joyR")) - { - string[] joyRConfig = component.Split(new char[] { '|' }); - - for (int jR = 1; jR < joyRConfig.Length; jR++) - { - int value = 0; - if (int.TryParse(joyRConfig[jR], out value)) - { - switch (jR) - { - case 1: RJoy.centerX = value; break; - case 2: RJoy.minX = value; break; - case 3: RJoy.maxX = value; break; - case 4: RJoy.deadX = value; break; - case 5: RJoy.centerY = value; break; - case 6: RJoy.minY = value; break; - case 7: RJoy.maxY = value; break; - case 8: RJoy.deadY = value; break; - default: break; - } - } - } - } - } - } - - public string GetCalibrationString() - { - StringBuilder sb = new StringBuilder(); - sb.Append("-ccp"); - sb.Append(":joyL"); - sb.Append("|"); sb.Append(LJoy.centerX); - sb.Append("|"); sb.Append(LJoy.minX); - sb.Append("|"); sb.Append(LJoy.maxX); - sb.Append("|"); sb.Append(LJoy.deadX); - sb.Append("|"); sb.Append(LJoy.centerY); - sb.Append("|"); sb.Append(LJoy.minY); - sb.Append("|"); sb.Append(LJoy.maxY); - sb.Append("|"); sb.Append(LJoy.deadY); - sb.Append(":joyR"); - sb.Append("|"); sb.Append(RJoy.centerX); - sb.Append("|"); sb.Append(RJoy.minX); - sb.Append("|"); sb.Append(RJoy.maxX); - sb.Append("|"); sb.Append(RJoy.deadX); - sb.Append("|"); sb.Append(RJoy.centerY); - sb.Append("|"); sb.Append(RJoy.minY); - sb.Append("|"); sb.Append(RJoy.maxY); - sb.Append("|"); sb.Append(RJoy.deadY); - - return sb.ToString(); - } - - public bool CalibrationEmpty - { - get - { - if (LJoy.maxX == 0 && LJoy.maxY == 0 && RJoy.maxX == 0 && RJoy.maxY == 0) - { - return true; - } - else - { - return false; - } - } - } - - public IEnumerator> GetEnumerator() - { - foreach (var input in wiimote) - { - yield return input; - } - - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.A, A ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.B, B ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.X, X ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.Y, Y ? 1.0f : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.L, L ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.R, R ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.ZL, ZL ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.ZR, ZR ? 1.0f : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.UP, Up ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.DOWN, Down ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LEFT, Left ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RIGHT, Right ? 1.0f : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.START, Start ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.SELECT, Select ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.HOME, Home ? 1.0f : 0.0f); - - LJoy.Normalize(); - RJoy.Normalize(); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LX, LJoy.X); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LY, LJoy.Y); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RX, RJoy.X); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RY, RJoy.X); - - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LUP, LJoy.Y > 0f ? LJoy.Y : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LDOWN, LJoy.Y > 0f ? 0.0f : -LJoy.Y); // These are inverted - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LLEFT, LJoy.X > 0f ? 0.0f : -LJoy.X); // because they - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LRIGHT, LJoy.X > 0f ? LJoy.X : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RUP, RJoy.Y > 0f ? RJoy.Y : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RDOWN, RJoy.Y > 0f ? 0.0f : -RJoy.Y); // represents how far the - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RLEFT, RJoy.X > 0f ? 0.0f : -RJoy.X); // input is left or down - yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RRIGHT, RJoy.X > 0f ? RJoy.X : 0.0f); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } - - public struct ProController : INintrollerState - { -#if DEBUG - private bool _debugViewActive; - public bool DebugViewActive - { - get - { - return _debugViewActive; - } - set - { - _debugViewActive = value; - } - } -#endif - - public Joystick LJoy, RJoy; - public bool A, B, X, Y; - public bool Up, Down, Left, Right; - public bool L, R, ZL, ZR; - public bool Plus, Minus, Home; - public bool LStick, RStick; - public bool charging, usbConnected; - - public bool Start - { - get { return Plus; } - set { Plus = value; } - } - - public bool Select - { - get { return Minus; } - set { Minus = value; } - } - - public void Update(byte[] data) - { - int offset = 0; - - switch ((InputReport)data[0]) - { - case InputReport.ExtOnly: - offset = 1; - break; - case InputReport.BtnsExt: - case InputReport.BtnsExtB: - offset = 3; - break; - case InputReport.BtnsAccExt: - offset = 6; - break; - case InputReport.BtnsIRExt: - offset = 13; - break; - case InputReport.BtnsAccIRExt: - offset = 16; - break; - case InputReport.Status: - Plus = (data[1] & 0x04) == 0; - Home = (data[1] & 0x08) == 0; - Minus = (data[1] & 0x10) == 0; - Down = (data[1] & 0x40) == 0; - Right = (data[1] & 0x80) == 0; - Up = (data[2] & 0x01) == 0; - Left = (data[2] & 0x02) == 0; - A = (data[2] & 0x10) == 0; - B = (data[2] & 0x40) == 0; - return; - default: - return; - } - - // Buttons - A = (data[offset + 9] & 0x10) == 0; - B = (data[offset + 9] & 0x40) == 0; - X = (data[offset + 9] & 0x08) == 0; - Y = (data[offset + 9] & 0x20) == 0; - L = (data[offset + 8] & 0x20) == 0; - R = (data[offset + 8] & 0x02) == 0; - ZL = (data[offset + 9] & 0x80) == 0; - ZR = (data[offset + 9] & 0x04) == 0; - Plus = (data[offset + 8] & 0x04) == 0; - Minus = (data[offset + 8] & 0x10) == 0; - Home = (data[offset + 8] & 0x08) == 0; - LStick = (data[offset + 10] & 0x02) == 0; - RStick = (data[offset + 10] & 0x01) == 0; - - // DPad - Up = (data[offset + 9] & 0x01) == 0; - Down = (data[offset + 8] & 0x40) == 0; - Left = (data[offset + 9] & 0x02) == 0; - Right = (data[offset + 8] & 0x80) == 0; - - // Joysticks - LJoy.rawX = BitConverter.ToInt16(data, offset); - LJoy.rawY = BitConverter.ToInt16(data, offset + 4); - RJoy.rawX = BitConverter.ToInt16(data, offset + 2); - RJoy.rawY = BitConverter.ToInt16(data, offset + 6); - - // Other - charging = (data[offset + 10] & 0x04) == 0; - usbConnected = (data[offset + 10] & 0x08) == 0; - - // Normalize - LJoy.Normalize(); - RJoy.Normalize(); - } - - public float GetValue(string input) - { - throw new NotImplementedException(); - } - - public void SetCalibration(Calibrations.CalibrationPreset preset) - { - switch (preset) - { - case Calibrations.CalibrationPreset.Default: - //LJoy.Calibrate(Calibrations.Defaults.ProControllerDefault.LJoy); - //RJoy.Calibrate(Calibrations.Defaults.ProControllerDefault.RJoy); - SetCalibration(Calibrations.Defaults.ProControllerDefault); - break; - - case Calibrations.CalibrationPreset.Modest: - SetCalibration(Calibrations.Moderate.ProControllerModest); - break; - - case Calibrations.CalibrationPreset.Extra: - SetCalibration(Calibrations.Extras.ProControllerExtra); - break; - - case Calibrations.CalibrationPreset.Minimum: - SetCalibration(Calibrations.Minimum.ProControllerMinimal); - break; - - case Calibrations.CalibrationPreset.None: - SetCalibration(Calibrations.None.ProControllerRaw); - break; - } - } - - public void SetCalibration(INintrollerState from) - { - if (from.CalibrationEmpty) - { - // don't apply empty calibrations - return; - } - - if (from.GetType() == typeof(ProController)) - { - LJoy.Calibrate(((ProController)from).LJoy); - RJoy.Calibrate(((ProController)from).RJoy); - } - } - - public void SetCalibration(string calibrationString) - { - if (calibrationString.Count(c => c == '0') > 5) - { - // don't set empty calibrations - return; - } - - string[] components = calibrationString.Split(new char[] { ':' }); - - foreach (string component in components) - { - if (component.StartsWith("joyL")) - { - string[] joyLConfig = component.Split(new char[] { '|' }); - - for (int jL = 1; jL < joyLConfig.Length; jL++) - { - int value = 0; - if (int.TryParse(joyLConfig[jL], out value)) - { - switch (jL) - { - case 1: LJoy.centerX = value; break; - case 2: LJoy.minX = value; break; - case 3: LJoy.maxX = value; break; - case 4: LJoy.deadX = value; break; - case 5: LJoy.centerY = value; break; - case 6: LJoy.minY = value; break; - case 7: LJoy.maxY = value; break; - case 8: LJoy.deadY = value; break; - default: break; - } - } - } - } - else if (component.StartsWith("joyR")) - { - string[] joyRConfig = component.Split(new char[] { '|' }); - - for (int jR = 1; jR < joyRConfig.Length; jR++) - { - int value = 0; - if (int.TryParse(joyRConfig[jR], out value)) - { - switch (jR) - { - case 1: RJoy.centerX = value; break; - case 2: RJoy.minX = value; break; - case 3: RJoy.maxX = value; break; - case 4: RJoy.deadX = value; break; - case 5: RJoy.centerY = value; break; - case 6: RJoy.minY = value; break; - case 7: RJoy.maxY = value; break; - case 8: RJoy.deadY = value; break; - default: break; - } - } - } - } - } - } - - public string GetCalibrationString() - { - StringBuilder sb = new StringBuilder(); - sb.Append("-pro"); - sb.Append(":joyL"); - sb.Append("|"); sb.Append(LJoy.centerX); - sb.Append("|"); sb.Append(LJoy.minX); - sb.Append("|"); sb.Append(LJoy.maxX); - sb.Append("|"); sb.Append(LJoy.deadX); - sb.Append("|"); sb.Append(LJoy.centerY); - sb.Append("|"); sb.Append(LJoy.minY); - sb.Append("|"); sb.Append(LJoy.maxY); - sb.Append("|"); sb.Append(LJoy.deadY); - sb.Append(":joyR"); - sb.Append("|"); sb.Append(RJoy.centerX); - sb.Append("|"); sb.Append(RJoy.minX); - sb.Append("|"); sb.Append(RJoy.maxX); - sb.Append("|"); sb.Append(RJoy.deadX); - sb.Append("|"); sb.Append(RJoy.centerY); - sb.Append("|"); sb.Append(RJoy.minY); - sb.Append("|"); sb.Append(RJoy.maxY); - sb.Append("|"); sb.Append(RJoy.deadY); - - return sb.ToString(); - } - - public bool CalibrationEmpty - { - get - { - if (LJoy.maxX == 0 && LJoy.maxY == 0 && RJoy.maxX == 0 && RJoy.maxY == 0) - { - return true; - } - else - { - return false; - } - } - } - - public IEnumerator> GetEnumerator() - { - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.A, A ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.B, B ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.X, X ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.Y, Y ? 1.0f : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.L, L ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.R, R ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.ZL, ZL ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.ZR, ZR ? 1.0f : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.UP, Up ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.DOWN, Down ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LEFT, Left ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RIGHT, Right ? 1.0f : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.START, Start ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.SELECT, Select ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.HOME, Home ? 1.0f : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LS, LStick ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RS, RStick ? 1.0f : 0.0f); - - LJoy.Normalize(); - RJoy.Normalize(); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LX, LJoy.X); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LY, LJoy.Y); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RX, RJoy.X); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RY, RJoy.X); - - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LUP, LJoy.Y > 0f ? LJoy.Y : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LDOWN, LJoy.Y > 0f ? 0.0f : -LJoy.Y); // These are inverted - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LLEFT, LJoy.X > 0f ? 0.0f : -LJoy.X); // because they - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LRIGHT, LJoy.X > 0f ? LJoy.X : 0.0f); - - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RUP, RJoy.Y > 0f ? RJoy.Y : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RDOWN, RJoy.Y > 0f ? 0.0f : -RJoy.Y); // represents how far the - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RLEFT, RJoy.X > 0f ? 0.0f : -RJoy.X); // input is left or down - yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RRIGHT, RJoy.X > 0f ? RJoy.X : 0.0f); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } - - public struct BalanceBoard : INintrollerState - { -#if DEBUG - private bool _debugViewActive; - public bool DebugViewActive - { - get - { - return _debugViewActive; - } - set - { - _debugViewActive = value; - } - } -#endif - - public void Update(byte[] data) - { - throw new NotImplementedException(); - } - - public float GetValue(string input) - { - throw new NotImplementedException(); - } - - // TODO: Calibration - Balance Board Calibration - public void SetCalibration(Calibrations.CalibrationPreset preset) - { - switch (preset) - { - case Calibrations.CalibrationPreset.Default: - break; - - case Calibrations.CalibrationPreset.Modest: - break; - - case Calibrations.CalibrationPreset.Extra: - break; - - case Calibrations.CalibrationPreset.Minimum: - break; - - case Calibrations.CalibrationPreset.None: - break; - } - } - - public void SetCalibration(INintrollerState from) - { - if (from.GetType() == typeof(BalanceBoard)) - { - - } - } - - public void SetCalibration(string calibrationString) - { - - } - - public string GetCalibrationString() - { - return ""; - } - - - public bool CalibrationEmpty - { - get { return false; } - } - - public IEnumerator> GetEnumerator() - { - yield return new KeyValuePair("bb", 0); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } - - public struct WiimotePlus : INintrollerState - { -#if DEBUG - private bool _debugViewActive; - public bool DebugViewActive - { - get - { - return _debugViewActive; - } - set - { - _debugViewActive = value; - } - } -#endif - - Wiimote wiimote; - //gyro - - public void Update(byte[] data) - { - throw new NotImplementedException(); - } - - public float GetValue(string input) - { - throw new NotImplementedException(); - } - - // TODO: Calibration - Balance Board Calibration - public void SetCalibration(Calibrations.CalibrationPreset preset) - { - switch (preset) - { - case Calibrations.CalibrationPreset.Default: - break; - - case Calibrations.CalibrationPreset.Modest: - break; - - case Calibrations.CalibrationPreset.Extra: - break; - - case Calibrations.CalibrationPreset.Minimum: - break; - - case Calibrations.CalibrationPreset.None: - break; - } - } - - public void SetCalibration(INintrollerState from) - { - if (from.GetType() == typeof(WiimotePlus)) - { - - } - } - - public void SetCalibration(string calibrationString) - { - - } - - public string GetCalibrationString() - { - return ""; - } - - public bool CalibrationEmpty - { - get { return false; } - } - - public IEnumerator> GetEnumerator() - { - foreach (var input in wiimote) - { - yield return input; - } - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - - } - - -} diff --git a/Nintroller/Controllers/BalanceBoard.cs b/Nintroller/Controllers/BalanceBoard.cs new file mode 100644 index 0000000..6b2db80 --- /dev/null +++ b/Nintroller/Controllers/BalanceBoard.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NintrollerLib +{ + public struct BalanceBoard : INintrollerState + { +#if DEBUG + private bool _debugViewActive; + public bool DebugViewActive + { + get + { + return _debugViewActive; + } + set + { + _debugViewActive = value; + } + } +#endif + + public void Update(byte[] data) + { + throw new NotImplementedException(); + } + + public float GetValue(string input) + { + throw new NotImplementedException(); + } + + // TODO: Calibration - Balance Board Calibration + public void SetCalibration(Calibrations.CalibrationPreset preset) + { + switch (preset) + { + case Calibrations.CalibrationPreset.Default: + break; + + case Calibrations.CalibrationPreset.Modest: + break; + + case Calibrations.CalibrationPreset.Extra: + break; + + case Calibrations.CalibrationPreset.Minimum: + break; + + case Calibrations.CalibrationPreset.None: + break; + } + } + + public void SetCalibration(INintrollerState from) + { + if (from.GetType() == typeof(BalanceBoard)) + { + + } + } + + public void SetCalibration(string calibrationString) + { + + } + + public string GetCalibrationString() + { + return ""; + } + + + public bool CalibrationEmpty + { + get { return false; } + } + + public IEnumerator> GetEnumerator() + { + yield return new KeyValuePair("bb", 0); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/Nintroller/Controllers/ClassicController.cs b/Nintroller/Controllers/ClassicController.cs new file mode 100644 index 0000000..b700985 --- /dev/null +++ b/Nintroller/Controllers/ClassicController.cs @@ -0,0 +1,381 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NintrollerLib +{ + public struct ClassicController : INintrollerState + { +#if DEBUG + private bool _debugViewActive; + public bool DebugViewActive + { + get + { + return _debugViewActive; + } + set + { + _debugViewActive = value; + } + } +#endif + + public Wiimote wiimote; + public Joystick LJoy, RJoy; + public Trigger L, R; + public bool A, B, X, Y; + public bool Up, Down, Left, Right; + public bool ZL, ZR, LFull, RFull; + public bool Plus, Minus, Home; + + public ClassicController(Wiimote wm) + { + this = new ClassicController(); + wiimote = wm; + } + + public bool Start + { + get { return Plus; } + set { Plus = value; } + } + + public bool Select + { + get { return Minus; } + set { Minus = value; } + } + + public void Update(byte[] data) + { + int offset = 0; + switch ((InputReport)data[0]) + { + case InputReport.BtnsExt: + case InputReport.BtnsExtB: + offset = 3; + break; + case InputReport.BtnsAccExt: + offset = 6; + break; + case InputReport.BtnsIRExt: + offset = 13; + break; + case InputReport.BtnsAccIRExt: + offset = 16; + break; + case InputReport.ExtOnly: + offset = 1; + break; + default: + return; + } + + if (offset > 0) + { + // Buttons + A = (data[offset + 5] & 0x10) == 0; + B = (data[offset + 5] & 0x40) == 0; + X = (data[offset + 5] & 0x08) == 0; + Y = (data[offset + 5] & 0x20) == 0; + LFull = (data[offset + 4] & 0x20) == 0; // Until the Click + RFull = (data[offset + 4] & 0x02) == 0; // Until the Click + ZL = (data[offset + 5] & 0x80) == 0; + ZR = (data[offset + 5] & 0x04) == 0; + Plus = (data[offset + 4] & 0x04) == 0; + Minus = (data[offset + 4] & 0x10) == 0; + Home = (data[offset + 4] & 0x08) == 0; + + // Dpad + Up = (data[offset + 5] & 0x01) == 0; + Down = (data[offset + 4] & 0x40) == 0; + Left = (data[offset + 5] & 0x02) == 0; + Right = (data[offset + 4] & 0x80) == 0; + + // Joysticks + LJoy.rawX = (byte)(data[offset] & 0x3F); + LJoy.rawY = (byte)(data[offset + 1] & 0x03F); + RJoy.rawX = (byte)(data[offset + 2] >> 7 | (data[offset + 1] & 0xC0) >> 5 | (data[offset] & 0xC0) >> 3); + RJoy.rawY = (byte)(data[offset + 2] & 0x1F); + + // Triggers + L.rawValue = (byte)(((data[offset + 2] & 0x60) >> 2) | (data[offset + 3] >> 5)); + R.rawValue = (byte)(data[offset + 3] & 0x1F); + L.full = LFull; + R.full = RFull; + + // Normalize + LJoy.Normalize(); + RJoy.Normalize(); + L.Normalize(); + R.Normalize(); + } + + wiimote.Update(data); + } + + public float GetValue(string input) + { + throw new NotImplementedException(); + } + + public void SetCalibration(Calibrations.CalibrationPreset preset) + { + wiimote.SetCalibration(preset); + + switch (preset) + { + case Calibrations.CalibrationPreset.Default: + //LJoy.Calibrate(Calibrations.Defaults.ClassicControllerDefault.LJoy); + //RJoy.Calibrate(Calibrations.Defaults.ClassicControllerDefault.RJoy); + //L.Calibrate(Calibrations.Defaults.ClassicControllerDefault.L); + //R.Calibrate(Calibrations.Defaults.ClassicControllerDefault.R); + SetCalibration(Calibrations.Defaults.ClassicControllerDefault); + break; + + case Calibrations.CalibrationPreset.Modest: + SetCalibration(Calibrations.Moderate.ClassicControllerModest); + break; + + case Calibrations.CalibrationPreset.Extra: + SetCalibration(Calibrations.Extras.ClassicControllerExtra); + break; + + case Calibrations.CalibrationPreset.Minimum: + SetCalibration(Calibrations.Minimum.ClassicControllerMinimal); + break; + + case Calibrations.CalibrationPreset.None: + SetCalibration(Calibrations.None.ClassicControllerRaw); + break; + } + } + + public void SetCalibration(INintrollerState from) + { + if (from.CalibrationEmpty) + { + // don't apply empty calibrations + return; + } + + if (from.GetType() == typeof(ClassicController)) + { + LJoy.Calibrate(((ClassicController)from).LJoy); + RJoy.Calibrate(((ClassicController)from).RJoy); + L.Calibrate(((ClassicController)from).L); + R.Calibrate(((ClassicController)from).R); + } + else if (from.GetType() == typeof(Wiimote)) + { + wiimote.SetCalibration(from); + } + } + + public void SetCalibration(string calibrationString) + { + if (calibrationString.Count(c => c == '0') > 5) + { + // don't set empty calibrations + return; + } + + string[] components = calibrationString.Split(new char[] { ':' }); + + foreach (string component in components) + { + if (component.StartsWith("joyL")) + { + string[] joyLConfig = component.Split(new char[] { '|' }); + + for (int jL = 1; jL < joyLConfig.Length; jL++) + { + int value = 0; + if (int.TryParse(joyLConfig[jL], out value)) + { + switch (jL) + { + case 1: LJoy.centerX = value; break; + case 2: LJoy.minX = value; break; + case 3: LJoy.maxX = value; break; + case 4: LJoy.deadX = value; break; + case 5: LJoy.centerY = value; break; + case 6: LJoy.minY = value; break; + case 7: LJoy.maxY = value; break; + case 8: LJoy.deadY = value; break; + default: break; + } + } + } + } + else if (component.StartsWith("joyR")) + { + string[] joyRConfig = component.Split(new char[] { '|' }); + + for (int jR = 1; jR < joyRConfig.Length; jR++) + { + int value = 0; + if (int.TryParse(joyRConfig[jR], out value)) + { + switch (jR) + { + case 1: RJoy.centerX = value; break; + case 2: RJoy.minX = value; break; + case 3: RJoy.maxX = value; break; + case 4: RJoy.deadX = value; break; + case 5: RJoy.centerY = value; break; + case 6: RJoy.minY = value; break; + case 7: RJoy.maxY = value; break; + case 8: RJoy.deadY = value; break; + default: break; + } + } + } + } + else if (component.StartsWith("tl")) + { + string[] triggerLConfig = component.Split(new char[] { '|' }); + + for (int tl = 1; tl < triggerLConfig.Length; tl++) + { + int value = 0; + if (int.TryParse(triggerLConfig[tl], out value)) + { + switch (tl) + { + case 1: L.min = value; break; + case 2: L.max = value; break; + default: break; + } + } + } + } + else if (component.StartsWith("tr")) + { + string[] triggerRConfig = component.Split(new char[] { '|' }); + + for (int tr = 1; tr < triggerRConfig.Length; tr++) + { + int value = 0; + if (int.TryParse(triggerRConfig[tr], out value)) + { + switch (tr) + { + case 1: R.min = value; break; + case 2: R.max = value; break; + default: break; + } + } + } + } + } + } + + public string GetCalibrationString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("-cla"); + sb.Append(":joyL"); + sb.Append("|"); sb.Append(LJoy.centerX); + sb.Append("|"); sb.Append(LJoy.minX); + sb.Append("|"); sb.Append(LJoy.maxX); + sb.Append("|"); sb.Append(LJoy.deadX); + sb.Append("|"); sb.Append(LJoy.centerY); + sb.Append("|"); sb.Append(LJoy.minY); + sb.Append("|"); sb.Append(LJoy.maxY); + sb.Append("|"); sb.Append(LJoy.deadY); + sb.Append(":joyR"); + sb.Append("|"); sb.Append(RJoy.centerX); + sb.Append("|"); sb.Append(RJoy.minX); + sb.Append("|"); sb.Append(RJoy.maxX); + sb.Append("|"); sb.Append(RJoy.deadX); + sb.Append("|"); sb.Append(RJoy.centerY); + sb.Append("|"); sb.Append(RJoy.minY); + sb.Append("|"); sb.Append(RJoy.maxY); + sb.Append("|"); sb.Append(RJoy.deadY); + sb.Append(":tl"); + sb.Append("|"); sb.Append(L.min); + sb.Append("|"); sb.Append(L.max); + sb.Append(":tr"); + sb.Append("|"); sb.Append(R.min); + sb.Append("|"); sb.Append(R.max); + + return sb.ToString(); + } + + public bool CalibrationEmpty + { + get + { + if (LJoy.maxX == 0 && LJoy.maxY == 0 && RJoy.maxX == 0 && RJoy.maxY == 0) + { + return true; + } + else + { + return false; + } + } + } + + public IEnumerator> GetEnumerator() + { + // Wiimote + foreach (var input in wiimote) + { + yield return input; + } + + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.A, A ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.B, B ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.X, X ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.Y, Y ? 1.0f : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.L, L.value > 0 ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.R, R.value > 0 ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.ZL, ZL ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.ZR, ZR ? 1.0f : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.UP, Up ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.DOWN, Down ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LEFT, Left ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RIGHT, Right ? 1.0f : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.START, Start ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.SELECT, Select ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.HOME, Home ? 1.0f : 0.0f); + + L.Normalize(); + R.Normalize(); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LFULL, L.full ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RFULL, R.full ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LT, L.value); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RT, R.value); + + LJoy.Normalize(); + RJoy.Normalize(); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LX, LJoy.X); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LY, LJoy.Y); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RX, RJoy.X); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RY, RJoy.X); + + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LUP, LJoy.Y > 0f ? LJoy.Y : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LDOWN, LJoy.Y > 0f ? 0.0f : -LJoy.Y); // These are inverted + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LLEFT, LJoy.X > 0f ? 0.0f : -LJoy.X); // because they + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.LRIGHT, LJoy.X > 0f ? LJoy.X : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RUP, RJoy.Y > 0f ? RJoy.Y : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RDOWN, RJoy.Y > 0f ? 0.0f : -RJoy.Y); // represents how far the + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RLEFT, RJoy.X > 0f ? 0.0f : -RJoy.X); // input is left or down + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER.RRIGHT, RJoy.X > 0f ? RJoy.X : 0.0f); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/Nintroller/Controllers/ClassicControllerPro.cs b/Nintroller/Controllers/ClassicControllerPro.cs new file mode 100644 index 0000000..a1769ea --- /dev/null +++ b/Nintroller/Controllers/ClassicControllerPro.cs @@ -0,0 +1,318 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NintrollerLib +{ + public struct ClassicControllerPro : INintrollerState + { +#if DEBUG + private bool _debugViewActive; + public bool DebugViewActive + { + get + { + return _debugViewActive; + } + set + { + _debugViewActive = value; + } + } +#endif + + public Wiimote wiimote; + public Joystick LJoy, RJoy; + public bool A, B, X, Y; + public bool Up, Down, Left, Right; + public bool L, R, ZL, ZR; + public bool Plus, Minus, Home; + + public ClassicControllerPro(Wiimote wm) + { + this = new ClassicControllerPro(); + wiimote = wm; + } + + public bool Start + { + get { return Plus; } + set { Plus = value; } + } + + public bool Select + { + get { return Minus; } + set { Minus = value; } + } + + public void Update(byte[] data) + { + int offset = 0; + switch ((InputReport)data[0]) + { + case InputReport.BtnsExt: + case InputReport.BtnsExtB: + offset = 3; + break; + case InputReport.BtnsAccExt: + offset = 6; + break; + case InputReport.BtnsIRExt: + offset = 13; + break; + case InputReport.BtnsAccIRExt: + offset = 16; + break; + case InputReport.ExtOnly: + offset = 1; + break; + default: + return; + } + + if (offset > 0) + { + // Buttons + A = (data[offset + 5] & 0x10) == 0; + B = (data[offset + 5] & 0x40) == 0; + X = (data[offset + 5] & 0x08) == 0; + Y = (data[offset + 5] & 0x20) == 0; + L = (data[offset + 4] & 0x20) == 0; + R = (data[offset + 4] & 0x02) == 0; + ZL = (data[offset + 5] & 0x80) == 0; + ZR = (data[offset + 5] & 0x04) == 0; + Plus = (data[offset + 4] & 0x04) == 0; + Minus = (data[offset + 4] & 0x10) == 0; + Home = (data[offset + 4] & 0x08) == 0; + + // Dpad + Up = (data[offset + 5] & 0x01) == 0; + Down = (data[offset + 4] & 0x40) == 0; + Left = (data[offset + 5] & 0x02) == 0; + Right = (data[offset + 4] & 0x80) == 0; + + // Joysticks + LJoy.rawX = (byte)(data[offset] & 0x3F); + LJoy.rawY = (byte)(data[offset + 1] & 0x03F); + RJoy.rawX = (byte)(data[offset + 2] >> 7 | (data[offset + 1] & 0xC0) >> 5 | (data[offset] & 0xC0) >> 3); + RJoy.rawY = (byte)(data[offset + 2] & 0x1F); + + // Normalize + LJoy.Normalize(); + RJoy.Normalize(); + } + + wiimote.Update(data); + } + + public float GetValue(string input) + { + throw new NotImplementedException(); + } + + public void SetCalibration(Calibrations.CalibrationPreset preset) + { + wiimote.SetCalibration(preset); + + switch (preset) + { + case Calibrations.CalibrationPreset.Default: + //LJoy.Calibrate(Calibrations.Defaults.ClassicControllerProDefault.LJoy); + //RJoy.Calibrate(Calibrations.Defaults.ClassicControllerProDefault.RJoy); + SetCalibration(Calibrations.Defaults.ClassicControllerProDefault); + break; + + case Calibrations.CalibrationPreset.Modest: + SetCalibration(Calibrations.Moderate.ClassicControllerProModest); + break; + + case Calibrations.CalibrationPreset.Extra: + SetCalibration(Calibrations.Extras.ClassicControllerProExtra); + break; + + case Calibrations.CalibrationPreset.Minimum: + SetCalibration(Calibrations.Minimum.ClassicControllerProMinimal); + break; + + case Calibrations.CalibrationPreset.None: + SetCalibration(Calibrations.None.ClassicControllerProRaw); + break; + } + } + + public void SetCalibration(INintrollerState from) + { + if (from.CalibrationEmpty) + { + // don't apply empty calibrations + return; + } + + if (from.GetType() == typeof(ClassicControllerPro)) + { + LJoy.Calibrate(((ClassicControllerPro)from).LJoy); + RJoy.Calibrate(((ClassicControllerPro)from).RJoy); + } + else if (from.GetType() == typeof(Wiimote)) + { + wiimote.SetCalibration(from); + } + } + + public void SetCalibration(string calibrationString) + { + if (calibrationString.Count(c => c == '0') > 5) + { + // don't set empty calibrations + return; + } + + string[] components = calibrationString.Split(new char[] { ':' }); + + foreach (string component in components) + { + if (component.StartsWith("joyL")) + { + string[] joyLConfig = component.Split(new char[] { '|' }); + + for (int jL = 1; jL < joyLConfig.Length; jL++) + { + int value = 0; + if (int.TryParse(joyLConfig[jL], out value)) + { + switch (jL) + { + case 1: LJoy.centerX = value; break; + case 2: LJoy.minX = value; break; + case 3: LJoy.maxX = value; break; + case 4: LJoy.deadX = value; break; + case 5: LJoy.centerY = value; break; + case 6: LJoy.minY = value; break; + case 7: LJoy.maxY = value; break; + case 8: LJoy.deadY = value; break; + default: break; + } + } + } + } + else if (component.StartsWith("joyR")) + { + string[] joyRConfig = component.Split(new char[] { '|' }); + + for (int jR = 1; jR < joyRConfig.Length; jR++) + { + int value = 0; + if (int.TryParse(joyRConfig[jR], out value)) + { + switch (jR) + { + case 1: RJoy.centerX = value; break; + case 2: RJoy.minX = value; break; + case 3: RJoy.maxX = value; break; + case 4: RJoy.deadX = value; break; + case 5: RJoy.centerY = value; break; + case 6: RJoy.minY = value; break; + case 7: RJoy.maxY = value; break; + case 8: RJoy.deadY = value; break; + default: break; + } + } + } + } + } + } + + public string GetCalibrationString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("-ccp"); + sb.Append(":joyL"); + sb.Append("|"); sb.Append(LJoy.centerX); + sb.Append("|"); sb.Append(LJoy.minX); + sb.Append("|"); sb.Append(LJoy.maxX); + sb.Append("|"); sb.Append(LJoy.deadX); + sb.Append("|"); sb.Append(LJoy.centerY); + sb.Append("|"); sb.Append(LJoy.minY); + sb.Append("|"); sb.Append(LJoy.maxY); + sb.Append("|"); sb.Append(LJoy.deadY); + sb.Append(":joyR"); + sb.Append("|"); sb.Append(RJoy.centerX); + sb.Append("|"); sb.Append(RJoy.minX); + sb.Append("|"); sb.Append(RJoy.maxX); + sb.Append("|"); sb.Append(RJoy.deadX); + sb.Append("|"); sb.Append(RJoy.centerY); + sb.Append("|"); sb.Append(RJoy.minY); + sb.Append("|"); sb.Append(RJoy.maxY); + sb.Append("|"); sb.Append(RJoy.deadY); + + return sb.ToString(); + } + + public bool CalibrationEmpty + { + get + { + if (LJoy.maxX == 0 && LJoy.maxY == 0 && RJoy.maxX == 0 && RJoy.maxY == 0) + { + return true; + } + else + { + return false; + } + } + } + + public IEnumerator> GetEnumerator() + { + foreach (var input in wiimote) + { + yield return input; + } + + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.A, A ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.B, B ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.X, X ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.Y, Y ? 1.0f : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.L, L ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.R, R ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.ZL, ZL ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.ZR, ZR ? 1.0f : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.UP, Up ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.DOWN, Down ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LEFT, Left ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RIGHT, Right ? 1.0f : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.START, Start ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.SELECT, Select ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.HOME, Home ? 1.0f : 0.0f); + + LJoy.Normalize(); + RJoy.Normalize(); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LX, LJoy.X); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LY, LJoy.Y); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RX, RJoy.X); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RY, RJoy.X); + + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LUP, LJoy.Y > 0f ? LJoy.Y : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LDOWN, LJoy.Y > 0f ? 0.0f : -LJoy.Y); // These are inverted + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LLEFT, LJoy.X > 0f ? 0.0f : -LJoy.X); // because they + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.LRIGHT, LJoy.X > 0f ? LJoy.X : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RUP, RJoy.Y > 0f ? RJoy.Y : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RDOWN, RJoy.Y > 0f ? 0.0f : -RJoy.Y); // represents how far the + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RLEFT, RJoy.X > 0f ? 0.0f : -RJoy.X); // input is left or down + yield return new KeyValuePair(INPUT_NAMES.CLASSIC_CONTROLLER_PRO.RRIGHT, RJoy.X > 0f ? RJoy.X : 0.0f); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/Nintroller/WiiDrums.cs b/Nintroller/Controllers/Drums.cs similarity index 94% rename from Nintroller/WiiDrums.cs rename to Nintroller/Controllers/Drums.cs index deed067..dfd59ec 100644 --- a/Nintroller/WiiDrums.cs +++ b/Nintroller/Controllers/Drums.cs @@ -9,7 +9,7 @@ namespace NintrollerLib { //Source of mapping info: https://wiibrew.org/wiki/Wiimote/Extension_Controllers/Guitar_Hero_World_Tour_(Wii)_Drums - public struct WiiDrums : INintrollerState + public struct Drums : INintrollerState { private bool SpecialButtonSelect => wiimote.buttons.A; private bool SpecialButtonTiltCalibMin => wiimote.buttons.One; @@ -47,16 +47,16 @@ public bool DebugViewActive private bool DebugButton_Dump; #endif - public WiiDrums(Wiimote wm) + public Drums(Wiimote wm) { - this = new WiiDrums(); + this = new Drums(); wiimote = wm; #if DEBUG DebugLastData = new byte[] { 0 }; #endif - Joy.Calibrate(Calibrations.Defaults.WiiGuitarDefault.Joy); + Joy.Calibrate(Calibrations.Defaults.GuitarDefault.Joy); } public bool Start @@ -71,7 +71,7 @@ public bool Select set { Minus = value; } } - private const float WGT_JOY_DIGITAL_THRESH = 0.5f; + private const float GTR_JOY_DIGITAL_THRESH = 0.5f; private static float _MapRange(float s, float a1, float a2, float b1, float b2) { @@ -185,7 +185,7 @@ public void Update(byte[] data) Joy.Normalize(); - bool isJoyPressed = (((Joy.X * Joy.X) + (Joy.Y * Joy.Y)) >= (WGT_JOY_DIGITAL_THRESH * WGT_JOY_DIGITAL_THRESH)); + bool isJoyPressed = (((Joy.X * Joy.X) + (Joy.Y * Joy.Y)) >= (GTR_JOY_DIGITAL_THRESH * GTR_JOY_DIGITAL_THRESH)); double joyDirection = (int)((Math.Atan2(Joy.Y, Joy.X) + (Math.PI / 2)) / (Math.PI / 8)); int joyDirStep = (int)(Math.Abs(joyDirection)); @@ -368,7 +368,7 @@ public void SetCalibration(Calibrations.CalibrationPreset preset) - Joy.Calibrate(Calibrations.Defaults.WiiGuitarDefault.Joy); + Joy.Calibrate(Calibrations.Defaults.GuitarDefault.Joy); //SetCalibration(Calibrations.Defaults.ClassicControllerProDefault); } @@ -381,9 +381,9 @@ public void SetCalibration(INintrollerState from) // return; //} - //if (from.GetType() == typeof(WiiGuitar)) + //if (from.GetType() == typeof(Guitar)) //{ - // Joy.Calibrate(((WiiGuitar)from).Joy); + // Joy.Calibrate(((Guitar)from).Joy); //} //else if (from.GetType() == typeof(ClassicControllerPro)) //{ @@ -437,7 +437,7 @@ public void SetCalibration(string calibrationString) public string GetCalibrationString() { StringBuilder sb = new StringBuilder(); - sb.Append("-wdr"); + sb.Append("-drm"); sb.Append(":joy"); sb.Append("|"); sb.Append(Joy.centerX); sb.Append("|"); sb.Append(Joy.minX); @@ -473,20 +473,20 @@ public IEnumerator> GetEnumerator() yield return input; } - yield return new KeyValuePair(INPUT_NAMES.WII_DRUMS.G, G ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_DRUMS.R, R ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_DRUMS.Y, Y ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_DRUMS.B, B ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_DRUMS.O, O ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_DRUMS.BASS, Bass ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.DRUMS.G, G ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.DRUMS.R, R ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.DRUMS.Y, Y ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.DRUMS.B, B ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.DRUMS.O, O ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.DRUMS.BASS, Bass ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_DRUMS.UP, (Up ? 1.0f : 0.0f)); - yield return new KeyValuePair(INPUT_NAMES.WII_DRUMS.DOWN, (Down ? 1.0f : 0.0f)); - yield return new KeyValuePair(INPUT_NAMES.WII_DRUMS.LEFT, (Left ? 1.0f : 0.0f)); - yield return new KeyValuePair(INPUT_NAMES.WII_DRUMS.RIGHT, (Right ? 1.0f : 0.0f)); + yield return new KeyValuePair(INPUT_NAMES.DRUMS.UP, (Up ? 1.0f : 0.0f)); + yield return new KeyValuePair(INPUT_NAMES.DRUMS.DOWN, (Down ? 1.0f : 0.0f)); + yield return new KeyValuePair(INPUT_NAMES.DRUMS.LEFT, (Left ? 1.0f : 0.0f)); + yield return new KeyValuePair(INPUT_NAMES.DRUMS.RIGHT, (Right ? 1.0f : 0.0f)); - yield return new KeyValuePair(INPUT_NAMES.WII_DRUMS.START, Start ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_DRUMS.SELECT, Select ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.DRUMS.START, Start ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.DRUMS.SELECT, Select ? 1.0f : 0.0f); } IEnumerator IEnumerable.GetEnumerator() diff --git a/Nintroller/WiiGuitar.cs b/Nintroller/Controllers/Guitar.cs similarity index 81% rename from Nintroller/WiiGuitar.cs rename to Nintroller/Controllers/Guitar.cs index aec65a9..181cc34 100644 --- a/Nintroller/WiiGuitar.cs +++ b/Nintroller/Controllers/Guitar.cs @@ -8,7 +8,7 @@ namespace NintrollerLib { - public struct WiiGuitar : INintrollerState + public struct Guitar : INintrollerState { private bool SpecialButtonSelect => wiimote.buttons.A; private bool SpecialButtonTiltCalibMin => wiimote.buttons.One; @@ -60,9 +60,9 @@ public bool DebugViewActive private byte CALIB_Whammy_Min; private byte CALIB_Whammy_Max; - public WiiGuitar(Wiimote wm) + public Guitar(Wiimote wm) { - this = new WiiGuitar(); + this = new Guitar(); wiimote = wm; CALIB_Whammy_Min = 0xFF; @@ -70,7 +70,7 @@ public WiiGuitar(Wiimote wm) CALIB_Enable_TouchStrip = false; - oldTouchStripValue = WGT_TOUCH_STRIP_None; + oldTouchStripValue = GTR_TOUCH_STRIP_None; IsGH3SetYet = false; IsGH3 = false; @@ -82,7 +82,7 @@ public WiiGuitar(Wiimote wm) DebugLastData = new byte[] { 0 }; #endif - Joy.Calibrate(Calibrations.Defaults.WiiGuitarDefault.Joy); + Joy.Calibrate(Calibrations.Defaults.GuitarDefault.Joy); } public bool Start @@ -103,40 +103,40 @@ public bool Select public float CALIB_Tilt_TiltedREEEE; public float CALIB_Tilt_StartingZ; - private const byte WGT_TOUCH_STRIP_None = 0x0F; - private const byte WGT_TOUCH_STRIP_Green = 0x04; - private const byte WGT_TOUCH_STRIP_Green2 = 0x05; - private const byte WGT_TOUCH_STRIP_GreenToRed = 0x06; - private const byte WGT_TOUCH_STRIP_GreenToRed2 = 0x07; - private const byte WGT_TOUCH_STRIP_GreenToRed3 = 0x08; - private const byte WGT_TOUCH_STRIP_GreenToRed4 = 0x09; - private const byte WGT_TOUCH_STRIP_Red = 0x0A; - private const byte WGT_TOUCH_STRIP_Red2 = 0x0B; - private const byte WGT_TOUCH_STRIP_Red3 = 0x0C; - private const byte WGT_TOUCH_STRIP_RedToYellow = 0x0D; - private const byte WGT_TOUCH_STRIP_RedToYellow2 = 0x0E; - //private const byte WGT_TOUCH_STRIP_RedToYellow3 = 0x0F; //conflicts with None - private const byte WGT_TOUCH_STRIP_RedToYellow4 = 0x10; - private const byte WGT_TOUCH_STRIP_RedToYellow5 = 0x11; - private const byte WGT_TOUCH_STRIP_Yellow = 0x12; - private const byte WGT_TOUCH_STRIP_Yellow2 = 0x13; - private const byte WGT_TOUCH_STRIP_YellowToBlue = 0x14; - private const byte WGT_TOUCH_STRIP_YellowToBlue2 = 0x15; - private const byte WGT_TOUCH_STRIP_YellowToBlue3 = 0x16; - private const byte WGT_TOUCH_STRIP_Blue = 0x17; - private const byte WGT_TOUCH_STRIP_Blue2 = 0x18; - private const byte WGT_TOUCH_STRIP_Blue3 = 0x19; - private const byte WGT_TOUCH_STRIP_BlueToOrange = 0x1A; - private const byte WGT_TOUCH_STRIP_BlueToOrange2 = 0x1B; - private const byte WGT_TOUCH_STRIP_BlueToOrange3 = 0x1C; - private const byte WGT_TOUCH_STRIP_BlueToOrange4 = 0x1D; - private const byte WGT_TOUCH_STRIP_BlueToOrange5 = 0x1E; - private const byte WGT_TOUCH_STRIP_Orange = 0x1F; - - private const float WGT_JOY_DIGITAL_THRESH = 0.5f; - - //private const byte WGT_WHAMMY_MIN = 0x10; - //private const byte WGT_WHAMMY_MAX = 0x1B; + private const byte GTR_TOUCH_STRIP_None = 0x0F; + private const byte GTR_TOUCH_STRIP_Green = 0x04; + private const byte GTR_TOUCH_STRIP_Green2 = 0x05; + private const byte GTR_TOUCH_STRIP_GreenToRed = 0x06; + private const byte GTR_TOUCH_STRIP_GreenToRed2 = 0x07; + private const byte GTR_TOUCH_STRIP_GreenToRed3 = 0x08; + private const byte GTR_TOUCH_STRIP_GreenToRed4 = 0x09; + private const byte GTR_TOUCH_STRIP_Red = 0x0A; + private const byte GTR_TOUCH_STRIP_Red2 = 0x0B; + private const byte GTR_TOUCH_STRIP_Red3 = 0x0C; + private const byte GTR_TOUCH_STRIP_RedToYellow = 0x0D; + private const byte GTR_TOUCH_STRIP_RedToYellow2 = 0x0E; + //private const byte GTR_TOUCH_STRIP_RedToYellow3 = 0x0F; //conflicts with None + private const byte GTR_TOUCH_STRIP_RedToYellow4 = 0x10; + private const byte GTR_TOUCH_STRIP_RedToYellow5 = 0x11; + private const byte GTR_TOUCH_STRIP_Yellow = 0x12; + private const byte GTR_TOUCH_STRIP_Yellow2 = 0x13; + private const byte GTR_TOUCH_STRIP_YellowToBlue = 0x14; + private const byte GTR_TOUCH_STRIP_YellowToBlue2 = 0x15; + private const byte GTR_TOUCH_STRIP_YellowToBlue3 = 0x16; + private const byte GTR_TOUCH_STRIP_Blue = 0x17; + private const byte GTR_TOUCH_STRIP_Blue2 = 0x18; + private const byte GTR_TOUCH_STRIP_Blue3 = 0x19; + private const byte GTR_TOUCH_STRIP_BlueToOrange = 0x1A; + private const byte GTR_TOUCH_STRIP_BlueToOrange2 = 0x1B; + private const byte GTR_TOUCH_STRIP_BlueToOrange3 = 0x1C; + private const byte GTR_TOUCH_STRIP_BlueToOrange4 = 0x1D; + private const byte GTR_TOUCH_STRIP_BlueToOrange5 = 0x1E; + private const byte GTR_TOUCH_STRIP_Orange = 0x1F; + + private const float GTR_JOY_DIGITAL_THRESH = 0.5f; + + //private const byte GTR_WHAMMY_MIN = 0x10; + //private const byte GTR_WHAMMY_MAX = 0x1B; private static float _MapRange(float s, float a1, float a2, float b1, float b2) { @@ -237,7 +237,7 @@ public void Update(byte[] data) Joy.Normalize(); - bool isJoyPressed = (((Joy.X * Joy.X) + (Joy.Y * Joy.Y)) >= (WGT_JOY_DIGITAL_THRESH * WGT_JOY_DIGITAL_THRESH)); + bool isJoyPressed = (((Joy.X * Joy.X) + (Joy.Y * Joy.Y)) >= (GTR_JOY_DIGITAL_THRESH * GTR_JOY_DIGITAL_THRESH)); double joyDirection = (int)((Math.Atan2(Joy.Y, Joy.X) + (Math.PI / 2)) / (Math.PI / 8)); int joyDirStep = (int)(Math.Abs(joyDirection)); @@ -327,7 +327,7 @@ public void Update(byte[] data) { if (G || R || Y || B || O) { - if (data[offset + 2] != WGT_TOUCH_STRIP_None && oldTouchStripValue == WGT_TOUCH_STRIP_None) + if (data[offset + 2] != GTR_TOUCH_STRIP_None && oldTouchStripValue == GTR_TOUCH_STRIP_None) { Down = true; } @@ -336,54 +336,54 @@ public void Update(byte[] data) { switch (data[offset + 2] & 0x1F) { - case WGT_TOUCH_STRIP_Green: - case WGT_TOUCH_STRIP_Green2: + case GTR_TOUCH_STRIP_Green: + case GTR_TOUCH_STRIP_Green2: G = true; break; - case WGT_TOUCH_STRIP_GreenToRed: - case WGT_TOUCH_STRIP_GreenToRed2: - case WGT_TOUCH_STRIP_GreenToRed3: - case WGT_TOUCH_STRIP_GreenToRed4: + case GTR_TOUCH_STRIP_GreenToRed: + case GTR_TOUCH_STRIP_GreenToRed2: + case GTR_TOUCH_STRIP_GreenToRed3: + case GTR_TOUCH_STRIP_GreenToRed4: G = true; R = true; break; - case WGT_TOUCH_STRIP_Red: - case WGT_TOUCH_STRIP_Red2: - case WGT_TOUCH_STRIP_Red3: + case GTR_TOUCH_STRIP_Red: + case GTR_TOUCH_STRIP_Red2: + case GTR_TOUCH_STRIP_Red3: R = true; break; - case WGT_TOUCH_STRIP_RedToYellow: - case WGT_TOUCH_STRIP_RedToYellow2: - //case WGT_TOUCH_STRIP_RedToYellow3: //conflicts with None - case WGT_TOUCH_STRIP_RedToYellow4: - case WGT_TOUCH_STRIP_RedToYellow5: + case GTR_TOUCH_STRIP_RedToYellow: + case GTR_TOUCH_STRIP_RedToYellow2: + //case GTR_TOUCH_STRIP_RedToYellow3: //conflicts with None + case GTR_TOUCH_STRIP_RedToYellow4: + case GTR_TOUCH_STRIP_RedToYellow5: R = true; Y = true; break; - case WGT_TOUCH_STRIP_Yellow: - case WGT_TOUCH_STRIP_Yellow2: + case GTR_TOUCH_STRIP_Yellow: + case GTR_TOUCH_STRIP_Yellow2: Y = true; break; - case WGT_TOUCH_STRIP_YellowToBlue: - case WGT_TOUCH_STRIP_YellowToBlue2: - case WGT_TOUCH_STRIP_YellowToBlue3: + case GTR_TOUCH_STRIP_YellowToBlue: + case GTR_TOUCH_STRIP_YellowToBlue2: + case GTR_TOUCH_STRIP_YellowToBlue3: Y = true; B = true; break; - case WGT_TOUCH_STRIP_Blue: - case WGT_TOUCH_STRIP_Blue2: - case WGT_TOUCH_STRIP_Blue3: + case GTR_TOUCH_STRIP_Blue: + case GTR_TOUCH_STRIP_Blue2: + case GTR_TOUCH_STRIP_Blue3: B = true; break; - case WGT_TOUCH_STRIP_BlueToOrange: - case WGT_TOUCH_STRIP_BlueToOrange2: - case WGT_TOUCH_STRIP_BlueToOrange3: - case WGT_TOUCH_STRIP_BlueToOrange4: - case WGT_TOUCH_STRIP_BlueToOrange5: + case GTR_TOUCH_STRIP_BlueToOrange: + case GTR_TOUCH_STRIP_BlueToOrange2: + case GTR_TOUCH_STRIP_BlueToOrange3: + case GTR_TOUCH_STRIP_BlueToOrange4: + case GTR_TOUCH_STRIP_BlueToOrange5: B = true; O = true; break; - case WGT_TOUCH_STRIP_Orange: + case GTR_TOUCH_STRIP_Orange: O = true; break; } @@ -575,7 +575,7 @@ public void SetCalibration(Calibrations.CalibrationPreset preset) - Joy.Calibrate(Calibrations.Defaults.WiiGuitarDefault.Joy); + Joy.Calibrate(Calibrations.Defaults.GuitarDefault.Joy); //SetCalibration(Calibrations.Defaults.ClassicControllerProDefault); } @@ -588,9 +588,9 @@ public void SetCalibration(INintrollerState from) // return; //} - //if (from.GetType() == typeof(WiiGuitar)) + //if (from.GetType() == typeof(Guitar)) //{ - // Joy.Calibrate(((WiiGuitar)from).Joy); + // Joy.Calibrate(((Guitar)from).Joy); //} //else if (from.GetType() == typeof(ClassicControllerPro)) //{ @@ -644,7 +644,7 @@ public void SetCalibration(string calibrationString) public string GetCalibrationString() { StringBuilder sb = new StringBuilder(); - sb.Append("-wgt"); + sb.Append("-gtr"); sb.Append(":joy"); sb.Append("|"); sb.Append(Joy.centerX); sb.Append("|"); sb.Append(Joy.minX); @@ -680,25 +680,25 @@ public IEnumerator> GetEnumerator() yield return input; } - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.G, G ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.R, R ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.Y, Y ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.B, B ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.O, O ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.G, G ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.R, R ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.Y, Y ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.B, B ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.O, O ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.UP, (Up ? 1.0f : 0.0f)); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.DOWN, (Down ? 1.0f : 0.0f)); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.LEFT, (Left ? 1.0f : 0.0f)); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.RIGHT, (Right ? 1.0f : 0.0f)); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.UP, (Up ? 1.0f : 0.0f)); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.DOWN, (Down ? 1.0f : 0.0f)); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.LEFT, (Left ? 1.0f : 0.0f)); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.RIGHT, (Right ? 1.0f : 0.0f)); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.START, Start ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.SELECT, Select ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.START, Start ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.SELECT, Select ? 1.0f : 0.0f); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.WHAMMYHIGH, WhammyHigh); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.WHAMMYLOW, WhammyLow); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.WHAMMYHIGH, WhammyHigh); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.WHAMMYLOW, WhammyLow); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.TILTHIGH, TiltHigh); - yield return new KeyValuePair(INPUT_NAMES.WII_GUITAR.TILTLOW, TiltLow); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.TILTHIGH, TiltHigh); + yield return new KeyValuePair(INPUT_NAMES.GUITAR.TILTLOW, TiltLow); } IEnumerator IEnumerable.GetEnumerator() diff --git a/Nintroller/Controllers/Nunchuk.cs b/Nintroller/Controllers/Nunchuk.cs new file mode 100644 index 0000000..72f0a62 --- /dev/null +++ b/Nintroller/Controllers/Nunchuk.cs @@ -0,0 +1,311 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NintrollerLib +{ + public struct Nunchuk : INintrollerState + { +#if DEBUG + private bool _debugViewActive; + public bool DebugViewActive + { + get + { + return _debugViewActive; + } + set + { + _debugViewActive = value; + } + } +#endif + + public Wiimote wiimote; + public Accelerometer accelerometer; + public Joystick joystick; + public bool C, Z; + + public Nunchuk(Wiimote wm) + { + this = new Nunchuk(); + wiimote = wm; + } + + public Nunchuk(byte[] rawData) + { + wiimote = new Wiimote(rawData); + accelerometer = new Accelerometer(); + joystick = new Joystick(); + + C = Z = false; + +#if DEBUG + _debugViewActive = false; +#endif + + Update(rawData); + } + + public void Update(byte[] data) + { + int offset = 0; + switch((InputReport)data[0]) + { + case InputReport.BtnsExt: + case InputReport.BtnsExtB: + offset = 3; + break; + case InputReport.BtnsAccExt: + offset = 6; + break; + case InputReport.BtnsIRExt: + offset = 13; + break; + case InputReport.BtnsAccIRExt: + offset = 16; + break; + case InputReport.ExtOnly: + offset = 1; + break; + case InputReport.Status: + offset = -1; + break; + default: + return; + } + + if (offset > 0) + { + // Buttons + C = (data[offset + 5] & 0x02) == 0; + Z = (data[offset + 5] & 0x01) == 0; + + // Joystick + joystick.rawX = data[offset]; + joystick.rawY = data[offset + 1]; + + // Accelerometer + accelerometer.Parse(data, offset + 2); + + // Normalize + joystick.Normalize(); + accelerometer.Normalize(); + } + + wiimote.Update(data); + } + + public float GetValue(string input) + { + throw new NotImplementedException(); + } + + public void SetCalibration(Calibrations.CalibrationPreset preset) + { + wiimote.SetCalibration(preset); + + switch (preset) + { + case Calibrations.CalibrationPreset.Default: + SetCalibration(Calibrations.Defaults.NunchukDefault); + break; + + case Calibrations.CalibrationPreset.Modest: + SetCalibration(Calibrations.Moderate.NunchukModest); + break; + + case Calibrations.CalibrationPreset.Extra: + SetCalibration(Calibrations.Extras.NunchukExtra); + break; + + case Calibrations.CalibrationPreset.Minimum: + SetCalibration(Calibrations.Minimum.NunchukMinimal); + break; + + case Calibrations.CalibrationPreset.None: + SetCalibration(Calibrations.None.NunchukRaw); + break; + } + } + + public void SetCalibration(INintrollerState from) + { + if (from.CalibrationEmpty) + { + // don't apply empty calibrations + return; + } + + if (from.GetType() == typeof(Nunchuk)) + { + accelerometer.Calibrate(((Nunchuk)from).accelerometer); + joystick.Calibrate(((Nunchuk)from).joystick); + } + else if (from.GetType() == typeof(Wiimote)) + { + wiimote.SetCalibration(from); + } + } + + public void SetCalibration(string calibrationString) + { + if (calibrationString.Count(c => c == '0') > 5) + { + // don't set empty calibrations + return; + } + + string[] components = calibrationString.Split(new char[] { ':' }); + + foreach (string component in components) + { + if (component.StartsWith("joy")) + { + string[] joyConfig = component.Split(new char[] { '|' }); + + for (int j = 1; j < joyConfig.Length; j++) + { + int value = 0; + if (int.TryParse(joyConfig[j], out value)) + { + switch (j) + { + case 1: joystick.centerX = value; break; + case 2: joystick.minX = value; break; + case 3: joystick.maxX = value; break; + case 4: joystick.deadX = value; break; + case 5: joystick.centerY = value; break; + case 6: joystick.minY = value; break; + case 7: joystick.maxY = value; break; + case 8: joystick.deadY = value; break; + default: break; + } + } + } + } + else if (component.StartsWith("acc")) + { + string[] accConfig = component.Split(new char[] { '|' }); + + for (int a = 1; a < accConfig.Length; a++) + { + int value = 0; + if (int.TryParse(accConfig[a], out value)) + { + switch (a) + { + case 1: accelerometer.centerX = value; break; + case 2: accelerometer.minX = value; break; + case 3: accelerometer.maxX = value; break; + case 4: accelerometer.deadX = value; break; + case 5: accelerometer.centerY = value; break; + case 6: accelerometer.minY = value; break; + case 7: accelerometer.maxY = value; break; + case 8: accelerometer.deadY = value; break; + case 9: accelerometer.centerZ = value; break; + case 10: accelerometer.minZ = value; break; + case 11: accelerometer.maxZ = value; break; + case 12: accelerometer.deadZ = value; break; + default: break; + } + } + } + } + } + } + + public string GetCalibrationString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("-nun"); + sb.Append(":joy"); + sb.Append("|"); sb.Append(joystick.centerX); + sb.Append("|"); sb.Append(joystick.minX); + sb.Append("|"); sb.Append(joystick.maxX); + sb.Append("|"); sb.Append(joystick.deadX); + + sb.Append("|"); sb.Append(joystick.centerY); + sb.Append("|"); sb.Append(joystick.minY); + sb.Append("|"); sb.Append(joystick.maxY); + sb.Append("|"); sb.Append(joystick.deadY); + sb.Append(":acc"); + sb.Append("|"); sb.Append(accelerometer.centerX); + sb.Append("|"); sb.Append(accelerometer.minX); + sb.Append("|"); sb.Append(accelerometer.maxX); + sb.Append("|"); sb.Append(accelerometer.deadX); + + sb.Append("|"); sb.Append(accelerometer.centerY); + sb.Append("|"); sb.Append(accelerometer.minY); + sb.Append("|"); sb.Append(accelerometer.maxY); + sb.Append("|"); sb.Append(accelerometer.deadY); + + sb.Append("|"); sb.Append(accelerometer.centerZ); + sb.Append("|"); sb.Append(accelerometer.minZ); + sb.Append("|"); sb.Append(accelerometer.maxZ); + sb.Append("|"); sb.Append(accelerometer.deadZ); + + return sb.ToString(); + } + + public bool CalibrationEmpty + { + get + { + if (accelerometer.maxX == 0 && accelerometer.maxY == 0 && accelerometer.maxZ == 0) + { + return true; + } + else if (joystick.maxX == 0 && joystick.maxY == 0) + { + return true; + } + else + { + return false; + } + } + } + + public IEnumerator> GetEnumerator() + { + // Wiimote + foreach (var input in wiimote) + { + yield return input; + } + + // Buttons + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.C, C ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.Z, Z ? 1.0f : 0.0f); + + // Joystick + joystick.Normalize(); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.JOY_X, joystick.X); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.JOY_Y, joystick.Y); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.UP, joystick.Y > 0 ? joystick.Y : 0); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.DOWN, joystick.Y > 0 ? 0 : -joystick.Y); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.LEFT, joystick.X > 0 ? 0 : -joystick.X); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.RIGHT, joystick.X > 0 ? joystick.X : 0); + + // Accelerometer + accelerometer.Normalize(); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.ACC_X, accelerometer.X); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.ACC_Y, accelerometer.Y); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.ACC_Z, accelerometer.Z); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.TILT_LEFT, accelerometer.X > 0 ? 0 : -accelerometer.X); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.TILT_RIGHT, accelerometer.X > 0 ? accelerometer.X : 0); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.TILT_UP, accelerometer.Y > 0 ? accelerometer.Y : 0); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.TILT_DOWN, accelerometer.Y > 0 ? 0 : -accelerometer.Y); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.FACE_UP, accelerometer.Z > 0 ? accelerometer.Z : 0); + yield return new KeyValuePair(INPUT_NAMES.NUNCHUK.FACE_DOWN, accelerometer.Z > 0 ? 0 : -accelerometer.Z); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/Nintroller/Controllers/ProController.cs b/Nintroller/Controllers/ProController.cs new file mode 100644 index 0000000..027f371 --- /dev/null +++ b/Nintroller/Controllers/ProController.cs @@ -0,0 +1,318 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NintrollerLib +{ + public struct ProController : INintrollerState + { +#if DEBUG + private bool _debugViewActive; + public bool DebugViewActive + { + get + { + return _debugViewActive; + } + set + { + _debugViewActive = value; + } + } +#endif + + public Joystick LJoy, RJoy; + public bool A, B, X, Y; + public bool Up, Down, Left, Right; + public bool L, R, ZL, ZR; + public bool Plus, Minus, Home; + public bool LStick, RStick; + public bool charging, usbConnected; + + public bool Start + { + get { return Plus; } + set { Plus = value; } + } + + public bool Select + { + get { return Minus; } + set { Minus = value; } + } + + public void Update(byte[] data) + { + int offset = 0; + + switch ((InputReport)data[0]) + { + case InputReport.ExtOnly: + offset = 1; + break; + case InputReport.BtnsExt: + case InputReport.BtnsExtB: + offset = 3; + break; + case InputReport.BtnsAccExt: + offset = 6; + break; + case InputReport.BtnsIRExt: + offset = 13; + break; + case InputReport.BtnsAccIRExt: + offset = 16; + break; + case InputReport.Status: + Plus = (data[1] & 0x04) == 0; + Home = (data[1] & 0x08) == 0; + Minus = (data[1] & 0x10) == 0; + Down = (data[1] & 0x40) == 0; + Right = (data[1] & 0x80) == 0; + Up = (data[2] & 0x01) == 0; + Left = (data[2] & 0x02) == 0; + A = (data[2] & 0x10) == 0; + B = (data[2] & 0x40) == 0; + return; + default: + return; + } + + // Buttons + A = (data[offset + 9] & 0x10) == 0; + B = (data[offset + 9] & 0x40) == 0; + X = (data[offset + 9] & 0x08) == 0; + Y = (data[offset + 9] & 0x20) == 0; + L = (data[offset + 8] & 0x20) == 0; + R = (data[offset + 8] & 0x02) == 0; + ZL = (data[offset + 9] & 0x80) == 0; + ZR = (data[offset + 9] & 0x04) == 0; + Plus = (data[offset + 8] & 0x04) == 0; + Minus = (data[offset + 8] & 0x10) == 0; + Home = (data[offset + 8] & 0x08) == 0; + LStick = (data[offset + 10] & 0x02) == 0; + RStick = (data[offset + 10] & 0x01) == 0; + + // DPad + Up = (data[offset + 9] & 0x01) == 0; + Down = (data[offset + 8] & 0x40) == 0; + Left = (data[offset + 9] & 0x02) == 0; + Right = (data[offset + 8] & 0x80) == 0; + + // Joysticks + LJoy.rawX = BitConverter.ToInt16(data, offset); + LJoy.rawY = BitConverter.ToInt16(data, offset + 4); + RJoy.rawX = BitConverter.ToInt16(data, offset + 2); + RJoy.rawY = BitConverter.ToInt16(data, offset + 6); + + // Other + charging = (data[offset + 10] & 0x04) == 0; + usbConnected = (data[offset + 10] & 0x08) == 0; + + // Normalize + LJoy.Normalize(); + RJoy.Normalize(); + } + + public float GetValue(string input) + { + throw new NotImplementedException(); + } + + public void SetCalibration(Calibrations.CalibrationPreset preset) + { + switch (preset) + { + case Calibrations.CalibrationPreset.Default: + //LJoy.Calibrate(Calibrations.Defaults.ProControllerDefault.LJoy); + //RJoy.Calibrate(Calibrations.Defaults.ProControllerDefault.RJoy); + SetCalibration(Calibrations.Defaults.ProControllerDefault); + break; + + case Calibrations.CalibrationPreset.Modest: + SetCalibration(Calibrations.Moderate.ProControllerModest); + break; + + case Calibrations.CalibrationPreset.Extra: + SetCalibration(Calibrations.Extras.ProControllerExtra); + break; + + case Calibrations.CalibrationPreset.Minimum: + SetCalibration(Calibrations.Minimum.ProControllerMinimal); + break; + + case Calibrations.CalibrationPreset.None: + SetCalibration(Calibrations.None.ProControllerRaw); + break; + } + } + + public void SetCalibration(INintrollerState from) + { + if (from.CalibrationEmpty) + { + // don't apply empty calibrations + return; + } + + if (from.GetType() == typeof(ProController)) + { + LJoy.Calibrate(((ProController)from).LJoy); + RJoy.Calibrate(((ProController)from).RJoy); + } + } + + public void SetCalibration(string calibrationString) + { + if (calibrationString.Count(c => c == '0') > 5) + { + // don't set empty calibrations + return; + } + + string[] components = calibrationString.Split(new char[] { ':' }); + + foreach (string component in components) + { + if (component.StartsWith("joyL")) + { + string[] joyLConfig = component.Split(new char[] { '|' }); + + for (int jL = 1; jL < joyLConfig.Length; jL++) + { + int value = 0; + if (int.TryParse(joyLConfig[jL], out value)) + { + switch (jL) + { + case 1: LJoy.centerX = value; break; + case 2: LJoy.minX = value; break; + case 3: LJoy.maxX = value; break; + case 4: LJoy.deadX = value; break; + case 5: LJoy.centerY = value; break; + case 6: LJoy.minY = value; break; + case 7: LJoy.maxY = value; break; + case 8: LJoy.deadY = value; break; + default: break; + } + } + } + } + else if (component.StartsWith("joyR")) + { + string[] joyRConfig = component.Split(new char[] { '|' }); + + for (int jR = 1; jR < joyRConfig.Length; jR++) + { + int value = 0; + if (int.TryParse(joyRConfig[jR], out value)) + { + switch (jR) + { + case 1: RJoy.centerX = value; break; + case 2: RJoy.minX = value; break; + case 3: RJoy.maxX = value; break; + case 4: RJoy.deadX = value; break; + case 5: RJoy.centerY = value; break; + case 6: RJoy.minY = value; break; + case 7: RJoy.maxY = value; break; + case 8: RJoy.deadY = value; break; + default: break; + } + } + } + } + } + } + + public string GetCalibrationString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("-pro"); + sb.Append(":joyL"); + sb.Append("|"); sb.Append(LJoy.centerX); + sb.Append("|"); sb.Append(LJoy.minX); + sb.Append("|"); sb.Append(LJoy.maxX); + sb.Append("|"); sb.Append(LJoy.deadX); + sb.Append("|"); sb.Append(LJoy.centerY); + sb.Append("|"); sb.Append(LJoy.minY); + sb.Append("|"); sb.Append(LJoy.maxY); + sb.Append("|"); sb.Append(LJoy.deadY); + sb.Append(":joyR"); + sb.Append("|"); sb.Append(RJoy.centerX); + sb.Append("|"); sb.Append(RJoy.minX); + sb.Append("|"); sb.Append(RJoy.maxX); + sb.Append("|"); sb.Append(RJoy.deadX); + sb.Append("|"); sb.Append(RJoy.centerY); + sb.Append("|"); sb.Append(RJoy.minY); + sb.Append("|"); sb.Append(RJoy.maxY); + sb.Append("|"); sb.Append(RJoy.deadY); + + return sb.ToString(); + } + + public bool CalibrationEmpty + { + get + { + if (LJoy.maxX == 0 && LJoy.maxY == 0 && RJoy.maxX == 0 && RJoy.maxY == 0) + { + return true; + } + else + { + return false; + } + } + } + + public IEnumerator> GetEnumerator() + { + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.A, A ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.B, B ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.X, X ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.Y, Y ? 1.0f : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.L, L ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.R, R ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.ZL, ZL ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.ZR, ZR ? 1.0f : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.UP, Up ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.DOWN, Down ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LEFT, Left ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RIGHT, Right ? 1.0f : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.START, Start ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.SELECT, Select ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.HOME, Home ? 1.0f : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LS, LStick ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RS, RStick ? 1.0f : 0.0f); + + LJoy.Normalize(); + RJoy.Normalize(); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LX, LJoy.X); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LY, LJoy.Y); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RX, RJoy.X); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RY, RJoy.X); + + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LUP, LJoy.Y > 0f ? LJoy.Y : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LDOWN, LJoy.Y > 0f ? 0.0f : -LJoy.Y); // These are inverted + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LLEFT, LJoy.X > 0f ? 0.0f : -LJoy.X); // because they + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.LRIGHT, LJoy.X > 0f ? LJoy.X : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RUP, RJoy.Y > 0f ? RJoy.Y : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RDOWN, RJoy.Y > 0f ? 0.0f : -RJoy.Y); // represents how far the + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RLEFT, RJoy.X > 0f ? 0.0f : -RJoy.X); // input is left or down + yield return new KeyValuePair(INPUT_NAMES.PRO_CONTROLLER.RRIGHT, RJoy.X > 0f ? RJoy.X : 0.0f); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/Nintroller/Controllers/Wiimote.cs b/Nintroller/Controllers/Wiimote.cs new file mode 100644 index 0000000..e3b7bb0 --- /dev/null +++ b/Nintroller/Controllers/Wiimote.cs @@ -0,0 +1,311 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NintrollerLib +{ + public struct Wiimote : INintrollerState + { +#if DEBUG + private bool _debugViewActive; + public bool DebugViewActive + { + get + { + return _debugViewActive; + } + set + { + _debugViewActive = value; + } + } +#endif + + public CoreButtons buttons; + public Accelerometer accelerometer; + public IR irSensor; + //INintrollerState extension; + + public Wiimote(byte[] rawData) + { + buttons = new CoreButtons(); + accelerometer = new Accelerometer(); + irSensor = new IR(); + //extension = null; + +#if DEBUG + _debugViewActive = false; +#endif + + Update(rawData); + } + + public void Update(byte[] data) + { + buttons.Parse(data, 1); + accelerometer.Parse(data, 3); + irSensor.Parse(data, 3); + + accelerometer.Normalize(); + } + + public float GetValue(string input) + { + throw new NotImplementedException(); + } + + public void SetCalibration(Calibrations.CalibrationPreset preset) + { + switch (preset) + { + case Calibrations.CalibrationPreset.Default: + //accelerometer.Calibrate(Calibrations.Defaults.WiimoteDefault.accelerometer); + SetCalibration(Calibrations.Defaults.WiimoteDefault); + break; + + case Calibrations.CalibrationPreset.Modest: + SetCalibration(Calibrations.Moderate.WiimoteModest); + break; + + case Calibrations.CalibrationPreset.Extra: + SetCalibration(Calibrations.Extras.WiimoteExtra); + break; + + case Calibrations.CalibrationPreset.Minimum: + SetCalibration(Calibrations.Minimum.WiimoteMinimal); + break; + + case Calibrations.CalibrationPreset.None: + SetCalibration(Calibrations.None.WiimoteRaw); + break; + } + } + + public void SetCalibration(INintrollerState from) + { + if (from.CalibrationEmpty) + { + // don't apply empty calibrations + return; + } + + if (from.GetType() == typeof(Wiimote)) + { + accelerometer.Calibrate(((Wiimote)from).accelerometer); + irSensor.boundingArea = ((Wiimote)from).irSensor.boundingArea; + } + else if (from.GetType() == typeof(Nunchuk)) + { + accelerometer.Calibrate(((Nunchuk)from).wiimote.accelerometer); + irSensor.boundingArea = ((Nunchuk)from).wiimote.irSensor.boundingArea; + } + else if (from.GetType() == typeof(ClassicController)) + { + accelerometer.Calibrate(((ClassicController)from).wiimote.accelerometer); + irSensor.boundingArea = ((ClassicController)from).wiimote.irSensor.boundingArea; + } + else if (from.GetType() == typeof(ClassicControllerPro)) + { + accelerometer.Calibrate(((ClassicControllerPro)from).wiimote.accelerometer); + irSensor.boundingArea = ((ClassicControllerPro)from).wiimote.irSensor.boundingArea; + } + } + + public void SetCalibration(string calibrationString) + { + if (calibrationString.Count(c => c == '0') > 5) + { + // don't set empty calibrations + return; + } + + string[] components = calibrationString.Split(new char[] {':'}); + + foreach (string component in components) + { + if (component.StartsWith("acc")) + { + string[] accConfig = component.Split(new char[] { '|' }); + + for (int a = 1; a < accConfig.Length; a++) + { + int value = 0; + if (int.TryParse(accConfig[a], out value)) + { + switch (a) + { + case 1: accelerometer.centerX = value; break; + case 2: accelerometer.minX = value; break; + case 3: accelerometer.maxX = value; break; + case 4: accelerometer.deadX = value; break; + case 5: accelerometer.centerY = value; break; + case 6: accelerometer.minY = value; break; + case 7: accelerometer.maxY = value; break; + case 8: accelerometer.deadY = value; break; + case 9: accelerometer.centerZ = value; break; + case 10: accelerometer.minZ = value; break; + case 11: accelerometer.maxZ = value; break; + case 12: accelerometer.deadZ = value; break; + } + } + } + } + else if (component.StartsWith("irSqr")) + { + SquareBoundry sBoundry = new SquareBoundry(); + string[] sqrConfig = component.Split(new char[] { '|' }); + + for (int s = 1; s < sqrConfig.Length; s++) + { + int value = 0; + if (int.TryParse(sqrConfig[s], out value)) + { + switch (s) + { + case 1: sBoundry.center_x = value; break; + case 2: sBoundry.center_y = value; break; + case 3: sBoundry.width = value; break; + case 4: sBoundry.height = value; break; + } + } + } + + irSensor.boundingArea = sBoundry; + } + else if (component.StartsWith("irCir")) + { + CircularBoundry sBoundry = new CircularBoundry(); + string[] cirConfig = component.Split(new char[] { '|' }); + + for (int c = 1; c < cirConfig.Length; c++) + { + int value = 0; + if (int.TryParse(cirConfig[c], out value)) + { + switch (c) + { + case 1: sBoundry.center_x = value; break; + case 2: sBoundry.center_y = value; break; + case 3: sBoundry.radius = value; break; + } + } + } + + irSensor.boundingArea = sBoundry; + } + } + } + + /// + /// Creates a string containing the calibration settings for the Wiimote. + /// String is in the following format + /// -wm:acc|centerX|minX|minY|deadX|centerY|[...]:ir + /// + /// String representing the Wiimote's calibration settings. + public string GetCalibrationString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("-wm"); + sb.Append(":acc"); + sb.Append("|"); sb.Append(accelerometer.centerX); + sb.Append("|"); sb.Append(accelerometer.minX); + sb.Append("|"); sb.Append(accelerometer.maxX); + sb.Append("|"); sb.Append(accelerometer.deadX); + + sb.Append("|"); sb.Append(accelerometer.centerY); + sb.Append("|"); sb.Append(accelerometer.minY); + sb.Append("|"); sb.Append(accelerometer.maxY); + sb.Append("|"); sb.Append(accelerometer.deadY); + + sb.Append("|"); sb.Append(accelerometer.centerZ); + sb.Append("|"); sb.Append(accelerometer.minZ); + sb.Append("|"); sb.Append(accelerometer.maxZ); + sb.Append("|"); sb.Append(accelerometer.deadZ); + + if (irSensor.boundingArea != null) + { + if (irSensor.boundingArea is SquareBoundry) + { + SquareBoundry sqr = (SquareBoundry)irSensor.boundingArea; + sb.Append(":irSqr"); + sb.Append("|"); sb.Append(sqr.center_x); + sb.Append("|"); sb.Append(sqr.center_y); + sb.Append("|"); sb.Append(sqr.width); + sb.Append("|"); sb.Append(sqr.height); + } + else if (irSensor.boundingArea is CircularBoundry) + { + CircularBoundry cir = (CircularBoundry)irSensor.boundingArea; + sb.Append(":irCir"); + sb.Append("|"); sb.Append(cir.center_x); + sb.Append("|"); sb.Append(cir.center_y); + sb.Append("|"); sb.Append(cir.radius); + } + } + + return sb.ToString(); + } + + public bool CalibrationEmpty + { + get + { + if (accelerometer.maxX == 0 && accelerometer.maxY == 0 && accelerometer.maxZ == 0) + { + return true; + } + else + { + return false; + } + } + } + + public IEnumerator> GetEnumerator() + { + // Buttons + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.PLUS, buttons.Plus ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.MINUS, buttons.Minus ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.HOME, buttons.Home ? 1.0f : 0.0f); + + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.A, buttons.A ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.B, buttons.B ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.ONE, buttons.One ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.TWO, buttons.Two ? 1.0f : 0.0f); + + // D-Pad + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.UP, buttons.Up ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.DOWN, buttons.Down ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.LEFT, buttons.Left ? 1.0f : 0.0f); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.RIGHT, buttons.Right ? 1.0f : 0.0f); + + // IR Sensor + irSensor.Normalize(); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.IR_X, irSensor.X); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.IR_Y, irSensor.Y); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.IR_UP, irSensor.Y > 0 ? irSensor.Y : 0); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.IR_DOWN, irSensor.Y > 0 ? -irSensor.Y : 0); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.IR_LEFT, irSensor.X < 0 ? -irSensor.X : 0); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.IR_RIGHT, irSensor.X > 0 ? irSensor.X : 0); + + // Accelerometer + accelerometer.Normalize(); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.ACC_X, accelerometer.X); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.ACC_Y, accelerometer.Y); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.ACC_Z, accelerometer.Z); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.TILT_LEFT, accelerometer.X < 0 ? -accelerometer.X : 0); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.TILT_RIGHT, accelerometer.X > 0 ? accelerometer.X : 0); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.TILT_UP, accelerometer.Y > 0 ? accelerometer.Y : 0); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.TILT_DOWN, accelerometer.Y < 0 ? -accelerometer.Y : 0); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.FACE_UP, accelerometer.Z > 0 ? accelerometer.Z : 0); + yield return new KeyValuePair(INPUT_NAMES.WIIMOTE.FACE_DOWN, accelerometer.Z < 0 ? -accelerometer.Z : 0); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/Nintroller/Controllers/WiimotePlus.cs b/Nintroller/Controllers/WiimotePlus.cs new file mode 100644 index 0000000..f4528fe --- /dev/null +++ b/Nintroller/Controllers/WiimotePlus.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NintrollerLib +{ + public struct WiimotePlus : INintrollerState + { +#if DEBUG + private bool _debugViewActive; + public bool DebugViewActive + { + get + { + return _debugViewActive; + } + set + { + _debugViewActive = value; + } + } +#endif + + Wiimote wiimote; + //gyro + + public void Update(byte[] data) + { + throw new NotImplementedException(); + } + + public float GetValue(string input) + { + throw new NotImplementedException(); + } + + // TODO: Calibration - Balance Board Calibration + public void SetCalibration(Calibrations.CalibrationPreset preset) + { + switch (preset) + { + case Calibrations.CalibrationPreset.Default: + break; + + case Calibrations.CalibrationPreset.Modest: + break; + + case Calibrations.CalibrationPreset.Extra: + break; + + case Calibrations.CalibrationPreset.Minimum: + break; + + case Calibrations.CalibrationPreset.None: + break; + } + } + + public void SetCalibration(INintrollerState from) + { + if (from.GetType() == typeof(WiimotePlus)) + { + + } + } + + public void SetCalibration(string calibrationString) + { + + } + + public string GetCalibrationString() + { + return ""; + } + + public bool CalibrationEmpty + { + get { return false; } + } + + public IEnumerator> GetEnumerator() + { + foreach (var input in wiimote) + { + yield return input; + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/Nintroller/INPUT_NAMES.cs b/Nintroller/INPUT_NAMES.cs index 76838b5..715704f 100644 --- a/Nintroller/INPUT_NAMES.cs +++ b/Nintroller/INPUT_NAMES.cs @@ -144,47 +144,47 @@ public static class CLASSIC_CONTROLLER_PRO public const string HOME = "ccpHOME"; } - public static class WII_GUITAR + public static class GUITAR { - public const string G = "wgtG"; - public const string R = "wgtR"; - public const string Y = "wgtY"; - public const string B = "wgtB"; - public const string O = "wgtO"; - - public const string UP = "wgtUP"; - public const string DOWN = "wgtDOWN"; - public const string LEFT = "wgtLEFT"; - public const string RIGHT = "wgtRIGHT"; - - public const string WHAMMYLOW = "wgtWHAMMYLOW"; - public const string WHAMMYHIGH = "wgtWHAMMYHIGH"; - - public const string TILTLOW = "wgtTILTLOW"; - public const string TILTHIGH = "wgtTILTHIGH"; - - public const string SELECT = "wgtSELECT"; - public const string START = "wgtSTART"; - public const string HOME = "wgtHOME"; + public const string G = "gtrG"; + public const string R = "gtrR"; + public const string Y = "gtrY"; + public const string B = "gtrB"; + public const string O = "gtrO"; + + public const string UP = "gtrUP"; + public const string DOWN = "gtrDOWN"; + public const string LEFT = "gtrLEFT"; + public const string RIGHT = "gtrRIGHT"; + + public const string WHAMMYLOW = "gtrWHAMMYLOW"; + public const string WHAMMYHIGH = "gtrWHAMMYHIGH"; + + public const string TILTLOW = "gtrTILTLOW"; + public const string TILTHIGH = "gtrTILTHIGH"; + + public const string SELECT = "gtrSELECT"; + public const string START = "gtrSTART"; + public const string HOME = "gtrHOME"; } - public static class WII_DRUMS + public static class DRUMS { - public const string G = "wdrG"; - public const string R = "wdrR"; - public const string Y = "wdrY"; - public const string B = "wdrB"; - public const string O = "wdrO"; - public const string BASS = "wdrBASS"; - - public const string UP = "wdrUP"; - public const string DOWN = "wdrDOWN"; - public const string LEFT = "wdrLEFT"; - public const string RIGHT = "wdrRIGHT"; - - public const string SELECT = "wdrSELECT"; - public const string START = "wdrSTART"; - public const string HOME = "wdrHOME"; + public const string G = "drmG"; + public const string R = "drmR"; + public const string Y = "drmY"; + public const string B = "drmB"; + public const string O = "drmO"; + public const string BASS = "drmBASS"; + + public const string UP = "drmUP"; + public const string DOWN = "drmDOWN"; + public const string LEFT = "drmLEFT"; + public const string RIGHT = "drmRIGHT"; + + public const string SELECT = "drmSELECT"; + public const string START = "drmSTART"; + public const string HOME = "drmHOME"; } public static class PRO_CONTROLLER diff --git a/Nintroller/Nintroller.cs b/Nintroller/Nintroller.cs index 3f9a5e9..2b1fa53 100644 --- a/Nintroller/Nintroller.cs +++ b/Nintroller/Nintroller.cs @@ -879,7 +879,7 @@ private void ParseReport(byte[] report) break; case ControllerType.Guitar: - _state = new WiiGuitar(_calibrations.WiimoteCalibration); + _state = new Guitar(_calibrations.WiimoteCalibration); if (_calibrations.ClassicProCalibration.CalibrationEmpty) { @@ -918,7 +918,7 @@ private void ParseReport(byte[] report) //break; case ControllerType.Drums: - _state = new WiiDrums(_calibrations.WiimoteCalibration); + _state = new Drums(_calibrations.WiimoteCalibration); if (_calibrations.ClassicProCalibration.CalibrationEmpty) { _state.SetCalibration(Calibrations.CalibrationPreset.None); diff --git a/Nintroller/Nintroller.csproj b/Nintroller/Nintroller.csproj index 122a5e3..5e0aac4 100644 --- a/Nintroller/Nintroller.csproj +++ b/Nintroller/Nintroller.csproj @@ -58,18 +58,24 @@ + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - False - - \ No newline at end of file diff --git a/Scp/ScpControl/BthDongle.Designer.cs b/Scp/ScpControl/BthDongle.Designer.cs deleted file mode 100644 index 6489e84..0000000 --- a/Scp/ScpControl/BthDongle.Designer.cs +++ /dev/null @@ -1,49 +0,0 @@ -namespace ScpControl -{ - partial class BthDongle - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.HCI_Worker = new System.ComponentModel.BackgroundWorker(); - this.L2CAP_Worker = new System.ComponentModel.BackgroundWorker(); - // - // HCI_Worker - // - this.HCI_Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.HCI_Worker_Thread); - // - // L2CAP_Worker - // - this.L2CAP_Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.L2CAP_Worker_Thread); - - } - - #endregion - - private System.ComponentModel.BackgroundWorker HCI_Worker; - private System.ComponentModel.BackgroundWorker L2CAP_Worker; - } -} diff --git a/Scp/ScpControl/BthDongle.cs b/Scp/ScpControl/BthDongle.cs deleted file mode 100644 index 90c0d50..0000000 --- a/Scp/ScpControl/BthDongle.cs +++ /dev/null @@ -1,1443 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Text; -using System.Threading; - -namespace ScpControl -{ - public partial class BthDongle : ScpDevice, IBthDevice - { - public const String BTH_CLASS_GUID = "{2F87C733-60E0-4355-8515-95D6978418B2}"; - - protected Byte m_Id = 0x01; - - protected class ConnectionList : SortedDictionary { } - protected ConnectionList m_Connected = new ConnectionList(); - - protected Byte[] m_Local = new Byte[6] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - protected String m_HCI_Version = String.Empty; - protected String m_LMP_Version = String.Empty; - - public virtual String Local - { - get { return String.Format("{0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}", m_Local[5], m_Local[4], m_Local[3], m_Local[2], m_Local[1], m_Local[0]); } - } - public virtual String HCI_Version - { - get { return m_HCI_Version; } - set { m_HCI_Version = value; } - } - public virtual String LMP_Version - { - get { return m_LMP_Version; } - set { m_LMP_Version = value; } - } - - public event EventHandler Debug = null; - public event EventHandler Arrival = null; - public event EventHandler Report = null; - - protected DsState m_State = DsState.Disconnected; - public DsState State - { - get { return m_State; } - } - - protected Boolean m_bInitialised = false; - public Boolean Initialised - { - get { return m_bInitialised; } - } - - - protected void LogDebug(String Data) - { - DebugEventArgs args = new DebugEventArgs(Data); - - if (Debug != null) - { - Debug(this, args); - } - } - - protected Boolean LogArrival(IDsDevice Arrived) - { - ArrivalEventArgs args = new ArrivalEventArgs(Arrived); - - if (Arrival != null) - { - Arrival(this, args); - } - - return args.Handled; - } - - - public BthDongle() : base(BTH_CLASS_GUID) - { - InitializeComponent(); - } - - public BthDongle(IContainer container) : base(BTH_CLASS_GUID) - { - container.Add(this); - - InitializeComponent(); - } - - - public override Boolean Open(int Instance = 0) - { - if (base.Open(Instance)) - { - m_State = DsState.Reserved; - } - - return State == DsState.Reserved; - } - - public override Boolean Open(String Path) - { - if (base.Open(Path)) - { - m_State = DsState.Reserved; - } - - return State == DsState.Reserved; - } - - - public override Boolean Start() - { - if (IsActive) - { - m_State = DsState.Connected; - - HCI_Worker.RunWorkerAsync(); - L2CAP_Worker.RunWorkerAsync(); - } - - return State == DsState.Connected; - } - - public override Boolean Stop() - { - if (IsActive) - { - m_State = DsState.Reserved; - - foreach (BthDevice Device in m_Connected.Values) - { - Device.Disconnect(); - Device.Stop(); - } - - Thread.Sleep(500); HCI_Reset(); Thread.Sleep(500); - - m_Connected.Clear(); - } - - return base.Stop(); - } - - public override Boolean Close() - { - Boolean Closed = base.Close(); - - m_State = DsState.Disconnected; - - return Closed; - } - - - public override String ToString() - { - switch (State) - { - case DsState.Reserved: - if (m_bInitialised) - { - return String.Format("Host Address : {0}\n\nHCI Version : {1}\n\nLMP Version : {2}\n\nReserved", - Local, - m_HCI_Version, - m_LMP_Version - ); - } - else - { - return String.Format("Host Address : "); - } - - case DsState.Connected: - if (m_bInitialised) - { - return String.Format("Host Address : {0}\n\nHCI Version : {1}\n\nLMP Version : {2}", - Local, - m_HCI_Version, - m_LMP_Version - ); - } - else - { - return String.Format("Host Address : "); - } - } - - return "Host Address : Disconnected"; - - } - - - protected virtual BthDevice Add(Byte Lsb, Byte Msb, String Name) - { - BthDevice Connection = null; - - if (m_Connected.Count < 4) - { - if (Name == "Wireless Controller") - Connection = new BthDs4(this, m_Local, Lsb, Msb); - else - Connection = new BthDs3(this, m_Local, Lsb, Msb); - - Connection.Debug +=new EventHandler(On_Debug); - - m_Connected[Connection.HCI_Handle] = Connection; - } - - return Connection; - } - - protected virtual BthDevice Get(Byte Lsb, Byte Msb) - { - return m_Connected[new BthHandle(Lsb, Msb)]; - } - - - protected virtual void Remove(Byte Lsb, Byte Msb) - { - BthHandle Connection = new BthHandle(Lsb, Msb); - - m_Connected[Connection].Stop(); - m_Connected.Remove(Connection); - } - - protected virtual void OnInitialised(BthDevice Connection) - { - if (LogArrival(Connection)) - { - Connection.Report += new EventHandler(On_Report); - Connection.Start(); - } - } - - protected virtual void OnCompletedCount(Byte Lsb, Byte Msb, UInt16 Count) - { - if (Count > 0) m_Connected[new BthHandle(Lsb, Msb)].Completed(); - } - - - protected void On_Debug(object sender, DebugEventArgs e) - { - if (Debug != null) - { - Debug(this, e); - } - } - - protected void On_Report(object sender, ReportEventArgs e) - { - if (Report != null) Report(sender, e); - } - - #region Worker Threads - protected virtual void L2CAP_DS4(BthDevice Connection, Byte[] Buffer, Int32 Transfered) - { - Byte[] L2_DCID, L2_SCID; - - L2CAP.Code Event = L2CAP.Code.L2CAP_Reserved; - - if (Buffer[6] == 0x01 && Buffer[7] == 0x00) // Control Channel - { - if (Enum.IsDefined(typeof(L2CAP.Code), Buffer[8])) - { - Event = (L2CAP.Code) Buffer[8]; - - switch (Event) - { - case L2CAP.Code.L2CAP_Command_Reject: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - break; - - case L2CAP.Code.L2CAP_Connection_Request: - - LogDebug(String.Format(">> {0} [{1:X2}] PSM [{2:X2}]", Event, Buffer[8], Buffer[12])); - - L2_SCID = new Byte[2] { Buffer[14], Buffer[15] }; - L2_DCID = Connection.Set((L2CAP.PSM) Buffer[12], L2_SCID); - - if (L2CAP.PSM.HID_Interrupt == (L2CAP.PSM) Buffer[12]) Connection.Started = true; - - L2CAP_Connection_Response(Connection.HCI_Handle.Bytes, Buffer[9], L2_SCID, L2_DCID, 0x00); - LogDebug(String.Format("<< {0} [{1:X2}]", L2CAP.Code.L2CAP_Connection_Response, (Byte) L2CAP.Code.L2CAP_Connection_Response)); - - L2CAP_Configuration_Request(Connection.HCI_Handle.Bytes, m_Id++, L2_SCID); - LogDebug(String.Format("<< {0} [{1:X2}]", L2CAP.Code.L2CAP_Configuration_Request, (Byte) L2CAP.Code.L2CAP_Configuration_Request)); - break; - - case L2CAP.Code.L2CAP_Connection_Response: - - LogDebug(String.Format(">> {0} [{1:X2}] [{2:X2}]", Event, Buffer[8], Buffer[16])); - break; - - case L2CAP.Code.L2CAP_Configuration_Request: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - - L2_SCID = Connection.Get_SCID(Buffer[12], Buffer[13]); - - L2CAP_Configuration_Response(Connection.HCI_Handle.Bytes, Buffer[9], L2_SCID); - LogDebug(String.Format("<< {0} [{1:X2}]", L2CAP.Code.L2CAP_Configuration_Response, (Byte) L2CAP.Code.L2CAP_Configuration_Response)); - - if (Connection.SvcStarted) - { - Connection.CanStartHid = true; - } - break; - - case L2CAP.Code.L2CAP_Configuration_Response: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - - if (Connection.Started) - { - OnInitialised(Connection); - } - break; - - case L2CAP.Code.L2CAP_Disconnection_Request: - - LogDebug(String.Format(">> {0} [{1:X2}] Handle [{2:X2}{3:X2}]", Event, Buffer[8], Buffer[15], Buffer[14])); - - L2_SCID = new Byte[2] { Buffer[14], Buffer[15] }; - - L2CAP_Disconnection_Response(Connection.HCI_Handle.Bytes, Buffer[9], L2_SCID, L2_SCID); - LogDebug(String.Format("<< {0} [{1:X2}]", L2CAP.Code.L2CAP_Disconnection_Response, (Byte) L2CAP.Code.L2CAP_Disconnection_Response)); - break; - - case L2CAP.Code.L2CAP_Disconnection_Response: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - break; - - case L2CAP.Code.L2CAP_Echo_Request: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - break; - - case L2CAP.Code.L2CAP_Echo_Response: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - break; - - case L2CAP.Code.L2CAP_Information_Request: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - break; - - case L2CAP.Code.L2CAP_Information_Response: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - break; - - default: - break; - } - } - } - else if (Buffer[8] == 0xA1 && Buffer[9] == 0x11) Connection.Parse(Buffer); - else if (Connection.InitReport(Buffer)) - { - Connection.CanStartHid = true; - } - } - - protected virtual void L2CAP_Worker_Thread(object sender, DoWorkEventArgs e) - { - Thread.Sleep(1); - - StringBuilder debug = new StringBuilder(); - - Byte[] Buffer = new Byte[512]; - Byte[] L2_DCID, L2_SCID; - - Int32 Transfered = 0; - L2CAP.Code Event = L2CAP.Code.L2CAP_Reserved; - - LogDebug(String.Format("-- Bluetooth : L2CAP_Worker_Thread Starting [{0:X2},{1:X2}]", m_BulkIn, m_BulkOut)); - - while (IsActive) - { - try - { - if (ReadBulkPipe(Buffer, Buffer.Length, ref Transfered) && Transfered > 0) - { - BthDevice Connection = Get(Buffer[0], Buffer[1]); - - if (Connection.Model == DsModel.DS4) - { - L2CAP_DS4(Connection, Buffer, Transfered); - } - else if (Buffer[6] == 0x01 && Buffer[7] == 0x00) // Control Channel - { - if (Enum.IsDefined(typeof(L2CAP.Code), Buffer[8])) - { - Event = (L2CAP.Code) Buffer[8]; - - switch (Event) - { - case L2CAP.Code.L2CAP_Command_Reject: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - break; - - case L2CAP.Code.L2CAP_Connection_Request: - - LogDebug(String.Format(">> {0} [{1:X2}] PSM [{2:X2}]", Event, Buffer[8], Buffer[12])); - - L2_SCID = new Byte[2] { Buffer[14], Buffer[15] }; - L2_DCID = Connection.Set((L2CAP.PSM) Buffer[12], L2_SCID); - - L2CAP_Connection_Response(Connection.HCI_Handle.Bytes, Buffer[9], L2_SCID, L2_DCID, 0x00); - LogDebug(String.Format("<< {0} [{1:X2}]", L2CAP.Code.L2CAP_Connection_Response, (Byte) L2CAP.Code.L2CAP_Connection_Response)); - - L2CAP_Configuration_Request(Connection.HCI_Handle.Bytes, m_Id++, L2_SCID); - LogDebug(String.Format("<< {0} [{1:X2}]", L2CAP.Code.L2CAP_Configuration_Request, (Byte) L2CAP.Code.L2CAP_Configuration_Request)); - break; - - case L2CAP.Code.L2CAP_Connection_Response: - - LogDebug(String.Format(">> {0} [{1:X2}] [{2:X2}]", Event, Buffer[8], Buffer[16])); - - if (Buffer[16] == 0) // Success - { - L2_SCID = new Byte[2] { Buffer[12], Buffer[13] }; - L2_DCID = new Byte[2] { Buffer[14], Buffer[15] }; - - UInt16 DCID = (UInt16)(Buffer[15] << 8 | Buffer[14]); - - Connection.Set(L2CAP.PSM.HID_Service, L2_SCID[0], L2_SCID[1], DCID); - - L2CAP_Configuration_Request(Connection.HCI_Handle.Bytes, m_Id++, L2_SCID); - LogDebug(String.Format("<< {0} [{1:X2}]", L2CAP.Code.L2CAP_Configuration_Request, (Byte) L2CAP.Code.L2CAP_Configuration_Request)); - } - break; - - case L2CAP.Code.L2CAP_Configuration_Request: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - - L2_SCID = Connection.Get_SCID(Buffer[12], Buffer[13]); - - L2CAP_Configuration_Response(Connection.HCI_Handle.Bytes, Buffer[9], L2_SCID); - LogDebug(String.Format("<< {0} [{1:X2}]", L2CAP.Code.L2CAP_Configuration_Response, (Byte) L2CAP.Code.L2CAP_Configuration_Response)); - - if (Connection.SvcStarted) - { - Connection.CanStartHid = true; - Connection.InitReport(Buffer); - } - break; - - case L2CAP.Code.L2CAP_Configuration_Response: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - - if (Connection.CanStartSvc) - { - if (Connection.ServiceByPass) - { - LogDebug(String.Format(">> ServiceByPass [{0} - {1}]", Connection.Local, Connection.Remote_Name)); - - Connection.CanStartSvc = false; - OnInitialised(Connection); - } - else - { - UInt16 DCID = BthConnection.DCID++; - L2_DCID = new Byte[2] { (Byte)((DCID >> 0) & 0xFF), (Byte)((DCID >> 8) & 0xFF) }; - - L2CAP_Connection_Request(Connection.HCI_Handle.Bytes, m_Id++, L2_DCID, L2CAP.PSM.HID_Service); - LogDebug(String.Format("<< {0} [{1:X2}] PSM [{2:X2}]", L2CAP.Code.L2CAP_Connection_Request, (Byte) L2CAP.Code.L2CAP_Connection_Request, (Byte) L2CAP.PSM.HID_Service)); - } - } - break; - - case L2CAP.Code.L2CAP_Disconnection_Request: - - LogDebug(String.Format(">> {0} [{1:X2}] Handle [{2:X2}{3:X2}]", Event, Buffer[8], Buffer[15], Buffer[14])); - - L2_SCID = new Byte[2] { Buffer[14], Buffer[15] }; - - L2CAP_Disconnection_Response(Connection.HCI_Handle.Bytes, Buffer[9], L2_SCID, L2_SCID); - LogDebug(String.Format("<< {0} [{1:X2}]", L2CAP.Code.L2CAP_Disconnection_Response, (Byte) L2CAP.Code.L2CAP_Disconnection_Response)); - break; - - case L2CAP.Code.L2CAP_Disconnection_Response: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - - if (Connection.CanStartHid) - { - Connection.SvcStarted = false; - OnInitialised(Connection); - } - break; - - case L2CAP.Code.L2CAP_Echo_Request: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - break; - - case L2CAP.Code.L2CAP_Echo_Response: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - break; - - case L2CAP.Code.L2CAP_Information_Request: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - break; - - case L2CAP.Code.L2CAP_Information_Response: - - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[8])); - break; - - default: - break; - } - } - } - else if (Buffer[8] == 0xA1 && Buffer[9] == 0x01 && Transfered == 58) Connection.Parse(Buffer); - else if (Connection.InitReport(Buffer)) - { - Connection.CanStartHid = true; - - L2_DCID = Connection.Get_DCID(L2CAP.PSM.HID_Service); - L2_SCID = Connection.Get_SCID(L2CAP.PSM.HID_Service); - - L2CAP_Disconnection_Request(Connection.HCI_Handle.Bytes, m_Id++, L2_SCID, L2_DCID); - LogDebug(String.Format("<< {0} [{1:X2}]", L2CAP.Code.L2CAP_Disconnection_Request, (Byte) L2CAP.Code.L2CAP_Disconnection_Request)); - } - } - } - catch { } - } - - LogDebug("-- Bluetooth : L2CAP_Worker_Thread Exiting"); - } - - protected virtual void HCI_Worker_Thread(object sender, DoWorkEventArgs e) - { - Thread.Sleep(1); - - SortedDictionary NameList = new SortedDictionary(); - StringBuilder nm = new StringBuilder(), debug = new StringBuilder(); - - Boolean bStarted = false; - String bd = String.Empty; - - Byte[] Buffer = new Byte[512]; - Byte[] BD_Addr = new Byte[6]; - Byte[] BD_Link = new Byte[16]; - - Int32 Transfered = 0; - HCI.Event Event; - HCI.Command Command = HCI.Command.HCI_Null; - BthConnection Connection = new BthConnection(); - - LogDebug(String.Format("-- Bluetooth : HCI_Worker_Thread Starting [{0:X2}]", m_IntIn)); - - HCI_Reset(); - - while (IsActive) - { - try - { - if (ReadIntPipe(Buffer, Buffer.Length, ref Transfered) && Transfered > 0) - { - if (Enum.IsDefined(typeof(HCI.Event), Buffer[0])) - { - Event = (HCI.Event) Buffer[0]; - - switch (Event) - { - case HCI.Event.HCI_Command_Complete_EV: - - Command = (HCI.Command)(UInt16)(Buffer[3] | Buffer[4] << 8); - LogDebug(String.Format(">> {0} [{1:X2}] [{2:X2}] [{3}]", Event, Buffer[0], Buffer[5], Command)); - break; - - case HCI.Event.HCI_Command_Status_EV: - - Command = (HCI.Command)(UInt16)(Buffer[4] | Buffer[5] << 8); - LogDebug(String.Format(">> {0} [{1:X2}] [{2:X2}] [{3}]", Event, Buffer[0], Buffer[2], Command)); - - if (Buffer[2] != 0) - { - switch (Command) - { - case HCI.Command.HCI_Write_Simple_Pairing_Mode : - case HCI.Command.HCI_Write_Authentication_Enable : - case HCI.Command.HCI_Set_Event_Mask : - - Global.DisableSSP = true; LogDebug("-- Simple Pairing not supported on this device. [SSP Disabled]"); - Transfered = HCI_Write_Scan_Enable(); - break; - } - } - break; - - case HCI.Event.HCI_Number_Of_Completed_Packets_EV: - break; - - default: - LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[0])); - break; - } - - switch (Event) - { - case HCI.Event.HCI_Command_Complete_EV: - - if (Command == HCI.Command.HCI_Reset && Buffer[5] == 0 && !bStarted) - { - bStarted = true; Thread.Sleep(250); - - Transfered = HCI_Read_BD_Addr(); - } - - if (Command == HCI.Command.HCI_Read_BD_ADDR && Buffer[5] == 0) - { - m_Local = new Byte[] { Buffer[6], Buffer[7], Buffer[8], Buffer[9], Buffer[10], Buffer[11] }; - - Transfered = HCI_Read_Buffer_Size(); - } - - if (Command == HCI.Command.HCI_Read_Buffer_Size && Buffer[5] == 0) - { - LogDebug(String.Format("-- {0:X2}{1:X2}, {2:X2}, {3:X2}{4:X2}, {5:X2}{6:X2}", Buffer[7], Buffer[6], Buffer[8], Buffer[10], Buffer[9], Buffer[12], Buffer[11])); - - Transfered = HCI_Read_Local_Version_Info(); - } - - if (Command == HCI.Command.HCI_Read_Local_Version_Info && Buffer[5] == 0) - { - HCI_Version = String.Format("{0}.{1:X4}", Buffer[6], Buffer[ 8] << 8 | Buffer[ 7]); - LMP_Version = String.Format("{0}.{1:X4}", Buffer[9], Buffer[13] << 8 | Buffer[12]); - - LogDebug(String.Format("-- Master {0}, HCI_Version {1}, LMP_Version {2}", Local, HCI_Version, LMP_Version)); - - if (Global.DisableSSP) - { - Transfered = HCI_Write_Scan_Enable(); - } - else - { - Transfered = HCI_Write_Simple_Pairing_Mode(); - } - } - - if (Command == HCI.Command.HCI_Write_Simple_Pairing_Mode) - { - if (Buffer[5] == 0) - { - Transfered = HCI_Write_Simple_Pairing_Debug_Mode(); - } - else - { - Global.DisableSSP = true; LogDebug("-- Simple Pairing not supported on this device. [SSP Disabled]"); - - Transfered = HCI_Write_Scan_Enable(); - } - } - - if (Command == HCI.Command.HCI_Write_Simple_Pairing_Debug_Mode) - { - Transfered = HCI_Write_Authentication_Enable(); - } - - if (Command == HCI.Command.HCI_Write_Authentication_Enable) - { - if (Buffer[5] == 0) - { - Transfered = HCI_Set_Event_Mask(); - } - else - { - Global.DisableSSP = true; LogDebug("-- Simple Pairing not supported on this device. [SSP Disabled]"); - - Transfered = HCI_Write_Scan_Enable(); - } - } - - if (Command == HCI.Command.HCI_Set_Event_Mask) - { - if (Buffer[5] == 0) - { - Transfered = HCI_Write_Page_Timeout(); - } - else - { - Global.DisableSSP = true; LogDebug("-- Simple Pairing not supported on this device. [SSP Disabled]"); - - Transfered = HCI_Write_Scan_Enable(); - } - } - - if (Command == HCI.Command.HCI_Write_Page_Timeout && Buffer[5] == 0) - { - Transfered = HCI_Write_Page_Scan_Activity(); - } - - if (Command == HCI.Command.HCI_Write_Page_Scan_Activity && Buffer[5] == 0) - { - Transfered = HCI_Write_Page_Scan_Type(); - } - - if (Command == HCI.Command.HCI_Write_Page_Scan_Type && Buffer[5] == 0) - { - Transfered = HCI_Write_Inquiry_Scan_Activity(); - } - - if (Command == HCI.Command.HCI_Write_Inquiry_Scan_Activity && Buffer[5] == 0) - { - Transfered = HCI_Write_Inquiry_Scan_Type(); - } - - if (Command == HCI.Command.HCI_Write_Inquiry_Scan_Type && Buffer[5] == 0) - { - Transfered = HCI_Write_Inquiry_Mode(); - } - - if (Command == HCI.Command.HCI_Write_Inquiry_Mode && Buffer[5] == 0) - { - Transfered = HCI_Write_Class_of_Device(); - } - - if (Command == HCI.Command.HCI_Write_Class_of_Device && Buffer[5] == 0) - { - Transfered = HCI_Write_Extended_Inquiry_Response(); - } - - if (Command == HCI.Command.HCI_Write_Extended_Inquiry_Response && Buffer[5] == 0) - { - Transfered = HCI_Write_Local_Name(); - } - - if (Command == HCI.Command.HCI_Write_Local_Name && Buffer[5] == 0) - { - Transfered = HCI_Write_Scan_Enable(); - } - - if (Command == HCI.Command.HCI_Write_Scan_Enable && Buffer[5] == 0) - { - m_bInitialised = true; - } - break; - - case HCI.Event.HCI_Connection_Request_EV: - - for (int i = 0; i < 6; i++) BD_Addr[i] = Buffer[i + 2]; - - Transfered = HCI_Delete_Stored_Link_Key(BD_Addr); - Transfered = HCI_Remote_Name_Request(BD_Addr); - break; - - case HCI.Event.HCI_Connection_Complete_EV: - - bd = String.Format("{0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}", Buffer[10], Buffer[9], Buffer[8], Buffer[7], Buffer[6], Buffer[5]); - - Connection = Add(Buffer[3], (Byte)(Buffer[4] | 0x20), NameList[bd]); - - if (NameList[bd].Contains("-ghic") || bd.StartsWith("00:26:5C") || bd.StartsWith("00:16:FE:71")) Connection.ServiceByPass = true; - - Connection.Remote_Name = NameList[bd]; NameList.Remove(bd); - Connection.BD_Address = new Byte[] { Buffer[10], Buffer[9], Buffer[8], Buffer[7], Buffer[6], Buffer[5] }; - break; - - case HCI.Event.HCI_Disconnection_Complete_EV: - - Remove(Buffer[3], (Byte)(Buffer[4] | 0x20)); - break; - - case HCI.Event.HCI_Number_Of_Completed_Packets_EV: - - for (Byte Index = 0, Ptr = 3; Index < Buffer[2]; Index++, Ptr += 4) - { - OnCompletedCount(Buffer[Ptr], (Byte)(Buffer[Ptr + 1] | 0x20), (UInt16)(Buffer[Ptr + 2] | Buffer[Ptr + 3] << 8)); - } - break; - - case HCI.Event.HCI_Remote_Name_Request_Complete_EV: - - bd = String.Format("{0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}", Buffer[8], Buffer[7], Buffer[6], Buffer[5], Buffer[4], Buffer[3]); - nm = new StringBuilder(); - - for (int Index = 9; Index < Buffer.Length; Index++) - { - if (Buffer[Index] > 0) nm.Append((Char) Buffer[Index]); - else break; - } - - String Name = nm.ToString(); - - LogDebug(String.Format("-- Remote Name : {0} - {1}", bd, Name)); - - for (int i = 0; i < 6; i++) BD_Addr[i] = Buffer[i + 3]; - - if (Name.StartsWith("PLAYSTATION(R)3") || Name == "Navigation Controller" || Name == "Wireless Controller") - { - NameList.Add(bd, nm.ToString()); - - Transfered = HCI_Accept_Connection_Request(BD_Addr, 0x00); - } - else - { - Transfered = HCI_Reject_Connection_Request(BD_Addr, 0x0F); - } - break; - - case HCI.Event.HCI_Link_Key_Request_EV: - - for (int i = 0; i < 6; i++) BD_Addr[i] = Buffer[i + 2]; - - Transfered = HCI_Link_Key_Request_Reply(BD_Addr); - Transfered = HCI_Set_Connection_Encryption(Connection.HCI_Handle); - break; - - case HCI.Event.HCI_PIN_Code_Request_EV: - - for (int i = 0; i < 6; i++) BD_Addr[i] = Buffer[i + 2]; - - Transfered = HCI_PIN_Code_Request_Negative_Reply(BD_Addr); - break; - - case HCI.Event.HCI_IO_Capability_Request_EV: - - Transfered = HCI_IO_Capability_Request_Reply(BD_Addr); - break; - - case HCI.Event.HCI_User_Confirmation_Request_EV: - - Transfered = HCI_User_Confirmation_Request_Reply(BD_Addr); - break; - - case HCI.Event.HCI_Link_Key_Notification_EV: - - for (Int32 Index = 0; Index < 6; Index++) BD_Addr[Index] = Buffer[Index + 2]; - for (Int32 Index = 0; Index < 16; Index++) BD_Link[Index] = Buffer[Index + 8]; - - Transfered = HCI_Set_Connection_Encryption(Connection.HCI_Handle); - break; - - default: - break; - } - } - } - } - catch (Exception Ex) { Console.WriteLine(Ex.ToString()); } - } - - LogDebug("-- Bluetooth : HCI_Worker_Thread Exiting"); - } - #endregion - - #region HCI Commands - protected virtual Int32 HCI_Command(HCI.Command Command, Byte[] Buffer) - { - Int32 Transfered = 0; - - Buffer[0] = (Byte)(((UInt32) Command >> 0) & 0xFF); - Buffer[1] = (Byte)(((UInt32) Command >> 8) & 0xFF); - Buffer[2] = (Byte)(Buffer.Length - 3); - - SendTransfer(0x20, 0x00, 0x0000, Buffer, ref Transfered); - - LogDebug(String.Format("<< {0} [{1:X4}]", Command, (UInt16) Command)); - return Transfered; - } - - protected virtual Int32 HCI_Accept_Connection_Request(Byte[] BD_Addr, Byte Role) - { - Byte[] Buffer = new Byte[10]; - - Buffer[3] = BD_Addr[0]; - Buffer[4] = BD_Addr[1]; - Buffer[5] = BD_Addr[2]; - Buffer[6] = BD_Addr[3]; - Buffer[7] = BD_Addr[4]; - Buffer[8] = BD_Addr[5]; - Buffer[9] = Role; - - return HCI_Command(HCI.Command.HCI_Accept_Connection_Request, Buffer); - } - - protected virtual Int32 HCI_Reject_Connection_Request(Byte[] BD_Addr, Byte Reason) - { - Byte[] Buffer = new Byte[10]; - - Buffer[3] = BD_Addr[0]; - Buffer[4] = BD_Addr[1]; - Buffer[5] = BD_Addr[2]; - Buffer[6] = BD_Addr[3]; - Buffer[7] = BD_Addr[4]; - Buffer[8] = BD_Addr[5]; - Buffer[9] = Reason; - - return HCI_Command(HCI.Command.HCI_Reject_Connection_Request, Buffer); - } - - protected virtual Int32 HCI_Remote_Name_Request(Byte[] BD_Addr) - { - Byte[] Buffer = new Byte[13]; - - Buffer[ 3] = BD_Addr[0]; - Buffer[ 4] = BD_Addr[1]; - Buffer[ 5] = BD_Addr[2]; - Buffer[ 6] = BD_Addr[3]; - Buffer[ 7] = BD_Addr[4]; - Buffer[ 8] = BD_Addr[5]; - Buffer[ 9] = 0x01; - Buffer[10] = 0x00; - Buffer[11] = 0x00; - Buffer[12] = 0x00; - - return HCI_Command(HCI.Command.HCI_Remote_Name_Request, Buffer); - } - - protected virtual Int32 HCI_Reset() - { - Byte[] Buffer = new Byte[3]; - - return HCI_Command(HCI.Command.HCI_Reset, Buffer); - } - - protected virtual Int32 HCI_Write_Scan_Enable() - { - Byte[] Buffer = new Byte[4]; - - Buffer[3] = 0x02; - - return HCI_Command(HCI.Command.HCI_Write_Scan_Enable, Buffer); - } - - protected virtual Int32 HCI_Read_Local_Version_Info() - { - Byte[] Buffer = new Byte[3]; - - return HCI_Command(HCI.Command.HCI_Read_Local_Version_Info, Buffer); - } - - protected virtual Int32 HCI_Read_BD_Addr() - { - Byte[] Buffer = new Byte[3]; - - return HCI_Command(HCI.Command.HCI_Read_BD_ADDR, Buffer); - } - - protected virtual Int32 HCI_Read_Buffer_Size() - { - Byte[] Buffer = new Byte[3]; - - return HCI_Command(HCI.Command.HCI_Read_Buffer_Size, Buffer); - } - - - protected virtual Int32 HCI_Link_Key_Request_Reply(Byte[] BD_Addr) - { - Byte[] Buffer = new Byte[25]; - - Buffer[ 3] = BD_Addr[0]; - Buffer[ 4] = BD_Addr[1]; - Buffer[ 5] = BD_Addr[2]; - Buffer[ 6] = BD_Addr[3]; - Buffer[ 7] = BD_Addr[4]; - Buffer[ 8] = BD_Addr[5]; - - for (Int32 Index = 0; Index < Global.BD_Link.Length; Index++) Buffer[Index + 9] = Global.BD_Link[Index]; - - return HCI_Command(HCI.Command.HCI_Link_Key_Request_Reply, Buffer); - } - - protected virtual Int32 HCI_Link_Key_Request_Negative_Reply(Byte[] BD_Addr) - { - Byte[] Buffer = new Byte[9]; - - Buffer[3] = BD_Addr[0]; - Buffer[4] = BD_Addr[1]; - Buffer[5] = BD_Addr[2]; - Buffer[6] = BD_Addr[3]; - Buffer[7] = BD_Addr[4]; - Buffer[8] = BD_Addr[5]; - - return HCI_Command(HCI.Command.HCI_Link_Key_Request_Negative_Reply, Buffer); - } - - protected virtual Int32 HCI_PIN_Code_Request_Negative_Reply(Byte[] BD_Addr) - { - Byte[] Buffer = new Byte[16]; - - Buffer[3] = BD_Addr[0]; - Buffer[4] = BD_Addr[1]; - Buffer[5] = BD_Addr[2]; - Buffer[6] = BD_Addr[3]; - Buffer[7] = BD_Addr[4]; - Buffer[8] = BD_Addr[5]; - - return HCI_Command(HCI.Command.HCI_Link_Key_Request_Negative_Reply, Buffer); - } - - protected virtual Int32 HCI_Set_Connection_Encryption(BthHandle Handle) - { - Byte[] Buffer = new Byte[6]; - - Buffer[3] = Handle.Bytes[0]; - Buffer[4] = (Byte)(Handle.Bytes[1] ^ 0x20); - Buffer[5] = 0x01; - - return HCI_Command(HCI.Command.HCI_Set_Connection_Encryption, Buffer); - } - - protected virtual Int32 HCI_User_Confirmation_Request_Reply(Byte[] BD_Addr) - { - Byte[] Buffer = new Byte[9]; - - Buffer[3] = BD_Addr[0]; - Buffer[4] = BD_Addr[1]; - Buffer[5] = BD_Addr[2]; - Buffer[6] = BD_Addr[3]; - Buffer[7] = BD_Addr[4]; - Buffer[8] = BD_Addr[5]; - - return HCI_Command(HCI.Command.HCI_User_Confirmation_Request_Reply, Buffer); - } - - protected virtual Int32 HCI_IO_Capability_Request_Reply(Byte[] BD_Addr) - { - Byte[] Buffer = new Byte[12]; - - Buffer[ 3] = BD_Addr[0]; - Buffer[ 4] = BD_Addr[1]; - Buffer[ 5] = BD_Addr[2]; - Buffer[ 6] = BD_Addr[3]; - Buffer[ 7] = BD_Addr[4]; - Buffer[ 8] = BD_Addr[5]; - Buffer[ 9] = 0x01; - Buffer[10] = 0x00; - Buffer[11] = 0x05; - - return HCI_Command(HCI.Command.HCI_IO_Capability_Request_Reply, Buffer); - } - - protected virtual Int32 HCI_Create_Connection(Byte[] BD_Addr, Byte[] Offset) - { - Byte[] Buffer = new Byte[16]; - - Buffer[ 3] = BD_Addr[0]; - Buffer[ 4] = BD_Addr[1]; - Buffer[ 5] = BD_Addr[2]; - Buffer[ 6] = BD_Addr[3]; - Buffer[ 7] = BD_Addr[4]; - Buffer[ 8] = BD_Addr[5]; - Buffer[ 9] = 0x18; - Buffer[10] = 0xCC; - Buffer[11] = 0x01; - Buffer[12] = 0x00; - Buffer[13] = Offset[0]; - Buffer[14] = (Byte)(Offset[1] | 0x80); - Buffer[15] = 0x01; - - return HCI_Command(HCI.Command.HCI_Create_Connection, Buffer); - } - - protected virtual Int32 HCI_Set_Event_Mask() - { - Byte[] Buffer = new Byte[11]; - // 00 25 5F FF FF FF FF FF - Buffer[ 3] = 0xFF; - Buffer[ 4] = 0xFF; - Buffer[ 5] = 0xFF; - Buffer[ 6] = 0xFF; - Buffer[ 7] = 0xFF; - Buffer[ 8] = 0x5F; // 0xFF; - Buffer[ 9] = 0x25; // 0xBF; - Buffer[10] = 0x00; // 0x3D; - - return HCI_Command(HCI.Command.HCI_Set_Event_Mask, Buffer); - } - - protected virtual Int32 HCI_Write_Local_Name() - { - Byte[] Buffer = new Byte[251]; - - Buffer[3] = 0x45; - Buffer[4] = 0x4E; - Buffer[5] = 0x54; - Buffer[6] = 0x52; - Buffer[7] = 0x4F; - Buffer[8] = 0x50; - Buffer[9] = 0x59; - - return HCI_Command(HCI.Command.HCI_Write_Local_Name, Buffer); - } - - protected virtual Int32 HCI_Write_Extended_Inquiry_Response() - { - Byte[] Buffer = new Byte[244]; - - Buffer[ 3] = 0x00; - Buffer[ 4] = 0x08; - Buffer[ 5] = 0x09; - Buffer[ 6] = 0x45; - Buffer[ 7] = 0x4E; - Buffer[ 8] = 0x54; - Buffer[ 9] = 0x52; - Buffer[10] = 0x4F; - Buffer[11] = 0x50; - Buffer[12] = 0x59; - Buffer[13] = 0x02; - Buffer[14] = 0x0A; - - return HCI_Command(HCI.Command.HCI_Write_Extended_Inquiry_Response, Buffer); - } - - protected virtual Int32 HCI_Write_Class_of_Device() - { - Byte[] Buffer = new Byte[6]; - - Buffer[3] = 0x04; - Buffer[4] = 0x02; - Buffer[5] = 0x3E; - - return HCI_Command(HCI.Command.HCI_Write_Class_of_Device, Buffer); - } - - protected virtual Int32 HCI_Write_Inquiry_Scan_Type() - { - Byte[] Buffer = new Byte[4]; - - Buffer[3] = 0x01; - - return HCI_Command(HCI.Command.HCI_Write_Inquiry_Scan_Type, Buffer); - } - - protected virtual Int32 HCI_Write_Inquiry_Scan_Activity() - { - Byte[] Buffer = new Byte[7]; - - Buffer[3] = 0x00; - Buffer[4] = 0x08; - Buffer[5] = 0x12; - Buffer[6] = 0x00; - - return HCI_Command(HCI.Command.HCI_Write_Inquiry_Scan_Activity, Buffer); - } - - protected virtual Int32 HCI_Write_Page_Scan_Type() - { - Byte[] Buffer = new Byte[4]; - - Buffer[3] = 0x01; - - return HCI_Command(HCI.Command.HCI_Write_Page_Scan_Type, Buffer); - } - - protected virtual Int32 HCI_Write_Page_Scan_Activity() - { - Byte[] Buffer = new Byte[7]; - - Buffer[3] = 0x00; - Buffer[4] = 0x04; - Buffer[5] = 0x12; - Buffer[6] = 0x00; - - return HCI_Command(HCI.Command.HCI_Write_Page_Scan_Activity, Buffer); - } - - protected virtual Int32 HCI_Write_Page_Timeout() - { - Byte[] Buffer = new Byte[5]; - - Buffer[3] = 0x00; - Buffer[4] = 0x20; - - return HCI_Command(HCI.Command.HCI_Write_Page_Timeout, Buffer); - } - - protected virtual Int32 HCI_Write_Authentication_Enable() - { - Byte[] Buffer = new Byte[4]; - - Buffer[3] = 0x00; - - return HCI_Command(HCI.Command.HCI_Write_Authentication_Enable, Buffer); - } - - protected virtual Int32 HCI_Write_Simple_Pairing_Mode() - { - Byte[] Buffer = new Byte[4]; - - Buffer[3] = 0x01; - - return HCI_Command(HCI.Command.HCI_Write_Simple_Pairing_Mode, Buffer); - } - - protected virtual Int32 HCI_Write_Simple_Pairing_Debug_Mode() - { - Byte[] Buffer = new Byte[4]; - - Buffer[3] = 0x00; - - return HCI_Command(HCI.Command.HCI_Write_Simple_Pairing_Debug_Mode, Buffer); - } - - protected virtual Int32 HCI_Write_Inquiry_Mode() - { - Byte[] Buffer = new Byte[4]; - - Buffer[3] = 0x02; - - return HCI_Command(HCI.Command.HCI_Write_Inquiry_Mode, Buffer); - } - - protected virtual Int32 HCI_Write_Inquiry_Transmit_Power_Level() - { - Byte[] Buffer = new Byte[4]; - - Buffer[3] = 0x00; - - return HCI_Command(HCI.Command.HCI_Write_Inquiry_Transmit_Power_Level, Buffer); - } - - protected virtual Int32 HCI_Inquiry() - { - Byte[] Buffer = new Byte[8]; - - Buffer[3] = 0x33; - Buffer[4] = 0x8B; - Buffer[5] = 0x9E; - Buffer[6] = 0x18; - Buffer[7] = 0x00; - - return HCI_Command(HCI.Command.HCI_Inquiry, Buffer); - } - - protected virtual Int32 HCI_Inquiry_Cancel() - { - Byte[] Buffer = new Byte[3]; - - return HCI_Command(HCI.Command.HCI_Inquiry_Cancel, Buffer); - } - - protected virtual Int32 HCI_Delete_Stored_Link_Key(Byte[] BD_Addr) - { - Byte[] Buffer = new Byte[10]; - - for (Int32 Index = 0; Index < 6; Index++) Buffer[Index + 3] = BD_Addr[Index]; - Buffer[9] = 0x00; - - return HCI_Command(HCI.Command.HCI_Delete_Stored_Link_Key, Buffer); - } - - protected virtual Int32 HCI_Write_Stored_Link_Key(Byte[] BD_Addr, Byte[] BD_Link) - { - Byte[] Buffer = new Byte[26]; - - Buffer[3] = 0x01; - for (Int32 Index = 0; Index < 6; Index++) Buffer[Index + 4] = BD_Addr[Index]; - for (Int32 Index = 0; Index < 16; Index++) Buffer[Index + 10] = BD_Link[Index]; - - return HCI_Command(HCI.Command.HCI_Write_Stored_Link_Key, Buffer); - } - - protected virtual Int32 HCI_Read_Stored_Link_Key(Byte[] BD_Addr) - { - Byte[] Buffer = new Byte[10]; - - for (Int32 Index = 0; Index < 6; Index++) Buffer[Index + 3] = BD_Addr[Index]; - Buffer[9] = 0x00; - - return HCI_Command(HCI.Command.HCI_Read_Stored_Link_Key, Buffer); - } - - public virtual Int32 HCI_Disconnect(BthHandle Handle) - { - Byte[] Buffer = new Byte[6]; - - Buffer[3] = (Byte)(Handle.Bytes[0]); - Buffer[4] = (Byte)(Handle.Bytes[1] ^ 0x20); - Buffer[5] = 0x13; - - return HCI_Command(HCI.Command.HCI_Disconnect, Buffer); - } - #endregion - - #region L2CAP Commands - protected virtual Int32 L2CAP_Command(Byte[] Handle, Byte[] Data) - { - Int32 Transfered = 0; - Byte[] Buffer = new Byte[64]; - - Buffer[0] = Handle[0]; - Buffer[1] = (Byte)(Handle[1] | 0x20); - Buffer[2] = (Byte)(Data.Length + 4); - Buffer[3] = 0x00; - Buffer[4] = (Byte)(Data.Length); - Buffer[5] = 0x00; - Buffer[6] = 0x01; - Buffer[7] = 0x00; - - for (int i = 0; i < Data.Length; i++) Buffer[i + 8] = Data[i]; - - WriteBulkPipe(Buffer, Data.Length + 8, ref Transfered); - return Transfered; - } - - protected virtual Int32 L2CAP_Connection_Request(Byte[] Handle, Byte Id, Byte[] DCID, L2CAP.PSM Psm) - { - Byte[] Buffer = new Byte[8]; - - Buffer[0] = 0x02; - Buffer[1] = Id; - Buffer[2] = 0x04; - Buffer[3] = 0x00; - Buffer[4] = (Byte) Psm; - Buffer[5] = 0x00; - Buffer[6] = DCID[0]; - Buffer[7] = DCID[1]; - - return L2CAP_Command(Handle, Buffer); - } - - protected virtual Int32 L2CAP_Connection_Response(Byte[] Handle, Byte Id, Byte[] DCID, Byte[] SCID, Byte Result) - { - Byte[] Buffer = new Byte[12]; - - Buffer[ 0] = 0x03; - Buffer[ 1] = Id; - Buffer[ 2] = 0x08; - Buffer[ 3] = 0x00; - Buffer[ 4] = SCID[0]; - Buffer[ 5] = SCID[1]; - Buffer[ 6] = DCID[0]; - Buffer[ 7] = DCID[1]; - Buffer[ 8] = Result; - Buffer[ 9] = 0x00; - Buffer[10] = 0x00; - Buffer[11] = 0x00; - - return L2CAP_Command(Handle, Buffer); - } - - protected virtual Int32 L2CAP_Configuration_Request(Byte[] Handle, Byte Id, Byte[] DCID, Boolean MTU = true) - { - Byte[] Buffer = new Byte[MTU ? 12 : 8]; - - Buffer[0] = 0x04; - Buffer[1] = Id; - Buffer[2] = (Byte)(MTU ? 0x08 : 0x04); - Buffer[3] = 0x00; - Buffer[4] = DCID[0]; - Buffer[5] = DCID[1]; - Buffer[6] = 0x00; - Buffer[7] = 0x00; - - if (MTU) - { - Buffer[ 8] = 0x01; - Buffer[ 9] = 0x02; - Buffer[10] = 0x96; - Buffer[11] = 0x00; - } - - return L2CAP_Command(Handle, Buffer); - } - - protected virtual Int32 L2CAP_Configuration_Response(Byte[] Handle, Byte Id, Byte[] SCID) - { - Byte[] Buffer = new Byte[10]; - - Buffer[0] = 0x05; - Buffer[1] = Id; - Buffer[2] = 0x06; - Buffer[3] = 0x00; - Buffer[4] = SCID[0]; - Buffer[5] = SCID[1]; - Buffer[6] = 0x00; - Buffer[7] = 0x00; - Buffer[8] = 0x00; - Buffer[9] = 0x00; - - return L2CAP_Command(Handle, Buffer); - } - - protected virtual Int32 L2CAP_Disconnection_Request(Byte[] Handle, Byte Id, Byte[] DCID, Byte[] SCID) - { - Byte[] Buffer = new Byte[8]; - - Buffer[0] = 0x06; - Buffer[1] = Id; - Buffer[2] = 0x04; - Buffer[3] = 0x00; - Buffer[4] = DCID[0]; - Buffer[5] = DCID[1]; - Buffer[6] = SCID[0]; - Buffer[7] = SCID[1]; - - return L2CAP_Command(Handle, Buffer); - } - - protected virtual Int32 L2CAP_Disconnection_Response(Byte[] Handle, Byte Id, Byte[] DCID, Byte[] SCID) - { - Byte[] Buffer = new Byte[8]; - - Buffer[0] = 0x07; - Buffer[1] = Id; - Buffer[2] = 0x04; - Buffer[3] = 0x00; - Buffer[4] = DCID[0]; - Buffer[5] = DCID[1]; - Buffer[6] = SCID[0]; - Buffer[7] = SCID[1]; - - return L2CAP_Command(Handle, Buffer); - } - #endregion - - #region HIDP Commands - public virtual Int32 HID_Command(Byte[] Handle, Byte[] Channel, Byte[] Data) - { - Int32 Transfered = 0; - Byte[] Buffer = new Byte[Data.Length + 8]; - - Buffer[0] = Handle[0]; - Buffer[1] = Handle[1]; - Buffer[2] = (Byte)((Data.Length + 4) % 256); - Buffer[3] = (Byte)((Data.Length + 4) / 256); - Buffer[4] = (Byte)(Data.Length % 256); - Buffer[5] = (Byte)(Data.Length / 256); - Buffer[6] = Channel[0]; - Buffer[7] = Channel[1]; - - for (int i = 0; i < Data.Length; i++) Buffer[i + 8] = Data[i]; - - WriteBulkPipe(Buffer, Data.Length + 8, ref Transfered); - return Transfered; - } - #endregion - } -} diff --git a/Scp/ScpControl/BthDongle.resx b/Scp/ScpControl/BthDongle.resx deleted file mode 100644 index 952d257..0000000 --- a/Scp/ScpControl/BthDongle.resx +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 149, 17 - - - 17, 17 - - - False - - \ No newline at end of file diff --git a/Scp/ScpControl/BthDs3.Designer.cs b/Scp/ScpControl/BthDs3.Designer.cs deleted file mode 100644 index 721d0b0..0000000 --- a/Scp/ScpControl/BthDs3.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace ScpControl -{ - partial class BthDs3 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - } - - #endregion - } -} diff --git a/Scp/ScpControl/BthDs3.cs b/Scp/ScpControl/BthDs3.cs deleted file mode 100644 index 3095d85..0000000 --- a/Scp/ScpControl/BthDs3.cs +++ /dev/null @@ -1,250 +0,0 @@ -using System; -using System.ComponentModel; - -namespace ScpControl -{ - public partial class BthDs3 : BthDevice - { - protected Byte[] m_Report = new Byte[] - { - 0x52, 0x01, - 0x00, 0xFF, 0x00, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0x27, 0x10, 0x00, 0x32, - 0xFF, 0x27, 0x10, 0x00, 0x32, - 0xFF, 0x27, 0x10, 0x00, 0x32, - 0xFF, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, - }; - - protected Byte[][] m_InitReport = new Byte[][] - { - new Byte[] { 0x02, 0x00, 0x0F, 0x00, 0x08, 0x35, 0x03, 0x19, 0x12, 0x00, 0x00, 0x03, 0x00 }, - new Byte[] { 0x04, 0x00, 0x10, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x35, 0x06, 0x09, 0x02, 0x01, 0x09, 0x02, 0x02, 0x00 }, - new Byte[] { 0x06, 0x00, 0x11, 0x00, 0x0D, 0x35, 0x03, 0x19, 0x11, 0x24, 0x01, 0x90, 0x35, 0x03, 0x09, 0x02, 0x06, 0x00 }, - new Byte[] { 0x06, 0x00, 0x12, 0x00, 0x0F, 0x35, 0x03, 0x19, 0x11, 0x24, 0x01, 0x90, 0x35, 0x03, 0x09, 0x02, 0x06, 0x02, 0x00, 0x7F }, - new Byte[] { 0x06, 0x00, 0x13, 0x00, 0x0F, 0x35, 0x03, 0x19, 0x11, 0x24, 0x01, 0x90, 0x35, 0x03, 0x09, 0x02, 0x06, 0x02, 0x00, 0x59 }, - new Byte[] { 0x06, 0x00, 0x14, 0x00, 0x0F, 0x35, 0x03, 0x19, 0x11, 0x24, 0x01, 0x80, 0x35, 0x03, 0x09, 0x02, 0x06, 0x02, 0x00, 0x33 }, - new Byte[] { 0x06, 0x00, 0x15, 0x00, 0x0F, 0x35, 0x03, 0x19, 0x11, 0x24, 0x01, 0x90, 0x35, 0x03, 0x09, 0x02, 0x06, 0x02, 0x00, 0x0D }, - }; - - protected Byte[] m_Leds = { 0x02, 0x04, 0x08, 0x10, }; - protected Byte[] m_Enable = { 0x53, 0xF4, 0x42, 0x03, 0x00, 0x00, }; - - public override DsPadId PadId - { - get { return (DsPadId) m_ControllerId; } - set - { - m_ControllerId = (Byte) value; - m_ReportArgs.Pad = PadId; - - m_Report[11] = m_Leds[m_ControllerId]; - } - } - - - public BthDs3() - { - InitializeComponent(); - } - - public BthDs3(IContainer container) - { - container.Add(this); - - InitializeComponent(); - } - - public BthDs3(IBthDevice Device, Byte[] Master, Byte Lsb, Byte Msb) : base(Device, Master, Lsb, Msb) - { - } - - - public override Boolean Start() - { - CanStartHid = false; - m_State = DsState.Connected; - - if (Local.StartsWith("00:26:5C")) // Fix up for Fake DS3 - { - m_Enable[0] = 0xA3; - - m_Report[0] = 0xA2; - m_Report[3] = 0x00; - m_Report[5] = 0x00; - } - - if (Remote_Name.EndsWith("-ghic")) // Fix up for Fake DS3 - { - m_Report[3] = 0x00; - m_Report[5] = 0x00; - } - - m_Queued = 1; m_Blocked = true; m_Last = DateTime.Now; - m_Device.HID_Command(HCI_Handle.Bytes, Get_SCID(L2CAP.PSM.HID_Command), m_Enable); - - return base.Start(); - } - - - public override void Parse(Byte[] Report) - { - if (Report[10] == 0xFF) return; - - m_PlugStatus = Report[38]; - m_BatteryStatus = Report[39]; - m_CableStatus = Report[40]; - - if (m_Packet == 0) Rumble(0, 0); m_Packet++; - - m_ReportArgs.Report[2] = m_BatteryStatus; - - m_ReportArgs.Report[4] = (Byte)(m_Packet >> 0 & 0xFF); - m_ReportArgs.Report[5] = (Byte)(m_Packet >> 8 & 0xFF); - m_ReportArgs.Report[6] = (Byte)(m_Packet >> 16 & 0xFF); - m_ReportArgs.Report[7] = (Byte)(m_Packet >> 24 & 0xFF); - - Ds3Button Buttons = (Ds3Button)((Report[11] << 0) | (Report[12] << 8) | (Report[13] << 16) | (Report[14] << 24)); - Boolean Trigger = false, Active = false; - - // Quick Disconnect - if ((Buttons & Ds3Button.L1) == Ds3Button.L1 - && (Buttons & Ds3Button.R1) == Ds3Button.R1 - && (Buttons & Ds3Button.PS) == Ds3Button.PS - ) - { - Trigger = true; Report[13] ^= 0x1; - } - - for (Int32 Index = 8; Index < 57; Index++) - { - m_ReportArgs.Report[Index] = Report[Index + 1]; - } - - // Buttons - for (Int32 Index = 11; Index < 15 && !Active; Index++) - { - if (Report[Index] != 0) Active = true; - } - - // Axis - for (Int32 Index = 15; Index < 19 && !Active; Index++) - { - if (Report[Index] < 117 || Report[Index] > 137) Active = true; - } - - // Triggers & Pressure - for (Int32 Index = 23; Index < 35 && !Active; Index++) - { - if (Report[Index] != 0) Active = true; - } - - if (Active) - { - m_IsIdle = false; - } - else if (!m_IsIdle) - { - m_IsIdle = true; m_Idle = DateTime.Now; - } - - if (Trigger && !m_IsDisconnect) - { - m_IsDisconnect = true; m_Disconnect = DateTime.Now; - } - else if (!Trigger && m_IsDisconnect) - { - m_IsDisconnect = false; - } - - Publish(); - } - - public override Boolean Rumble(Byte Large, Byte Small) - { - lock (this) - { - if (Global.DisableRumble) - { - m_Report[4] = 0; - m_Report[6] = 0; - } - else - { - m_Report[4] = (Byte)(Small > 0 ? 0x01 : 0x00); - m_Report[6] = Large; - } - - if (!m_Blocked && Global.Latency == 0) - { - m_Last = DateTime.Now; m_Blocked = true; - - m_Device.HID_Command(HCI_Handle.Bytes, Get_SCID(L2CAP.PSM.HID_Command), m_Report); - } - else - { - m_Queued = 1; - } - } - return true; - } - - public override Boolean InitReport(Byte[] Report) - { - Boolean retVal = false; - - if (m_Init < m_InitReport.Length) - { - m_Device.HID_Command(HCI_Handle.Bytes, Get_SCID(L2CAP.PSM.HID_Service), m_InitReport[m_Init++]); - } - else if (m_Init == m_InitReport.Length) - { - m_Init++; retVal = true; - } - - return retVal; - } - - - protected override void Process(DateTime Now) - { - lock (this) - { - if (m_State == DsState.Connected) - { - if ((Now - m_Tick).TotalMilliseconds >= 500 && m_Packet > 0) - { - m_Tick = Now; - - if (m_Queued == 0) m_Queued = 1; - - if (Battery < DsBattery.Medium) - { - m_Report[11] ^= m_Leds[m_ControllerId]; - } - else - { - m_Report[11] |= m_Leds[m_ControllerId]; - } - } - - if (Global.DisableLED) m_Report[11] = 0; - - if (!m_Blocked && m_Queued > 0) - { - if ((Now - m_Last).TotalMilliseconds >= Global.Latency) - { - m_Last = Now; m_Blocked = true; m_Queued--; - - m_Device.HID_Command(HCI_Handle.Bytes, Get_SCID(L2CAP.PSM.HID_Command), m_Report); - } - } - } - } - } - } -} diff --git a/Scp/ScpControl/BthDs4.Designer.cs b/Scp/ScpControl/BthDs4.Designer.cs deleted file mode 100644 index e1c9854..0000000 --- a/Scp/ScpControl/BthDs4.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace ScpControl -{ - partial class BthDs4 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - } - - #endregion - } -} diff --git a/Scp/ScpControl/BthDs4.cs b/Scp/ScpControl/BthDs4.cs deleted file mode 100644 index 55a7e77..0000000 --- a/Scp/ScpControl/BthDs4.cs +++ /dev/null @@ -1,316 +0,0 @@ -using System; -using System.ComponentModel; - -namespace ScpControl -{ - public partial class BthDs4 : BthDevice - { - protected Boolean m_DisableLightBar = false, m_Flash = false; - protected Byte m_Brightness = Global.Brightness; - - protected static Int32 R = 9, G = 10, B = 11; // Led Offsets - - protected Byte[] m_Report = - { - 0x52, 0x11, - 0xB0, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; - - protected Byte[][] m_InitReport = new Byte[][] - { - new Byte[] { 0x07, 0x00, 0x01, 0x02, 0x9B, 0x02, 0x90, 0x36, 0x06, 0x51, 0x35, 0x98, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x10, 0x00, 0x09, 0x00, 0x04, 0x35, 0x0D, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x00, 0x01, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65, 0x6E, 0x09, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x25, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x44, 0x69, 0x73, 0x63, 0x6F, 0x76, 0x65, 0x72, 0x79, 0x00, 0x09, 0x01, 0x01, 0x25, 0x25, 0x50, 0x75, 0x62, 0x6C, 0x69, 0x73, 0x68, 0x65, 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x74, 0x6F, 0x20, 0x72, 0x65, 0x6D, 0x6F, 0x74, 0x65, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x00, 0x09, 0x01, 0x02, 0x25, 0x0A, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x00, 0x09, 0x02, 0x00, 0x35, 0x03, 0x09, 0x01, 0x00, 0x09, 0x02, 0x01, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x35, 0x95, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x00, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x12, 0x00, 0x09, 0x00, 0x04, 0x35, 0x0D, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x00, 0x01, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65, 0x6E, 0x09, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x25, 0x18, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x49, 0x44, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x09, 0x01, 0x01, 0x25, 0x18, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x49, 0x44, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x09, 0x02, 0x00, 0x09, 0x01, 0x03, 0x09, 0x02, 0x01, 0x09, 0x00, 0x06, 0x09, 0x02, 0x02, 0x09, 0x00, 0x01, 0x09, 0x02, 0x03, 0x09, 0x08, 0x00, 0x09, 0x02, 0x04, 0x28, 0x01, 0x09, 0x02, 0x05, 0x09, 0x00, 0x01, 0x35, 0x9D, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x01, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x11, 0x15, 0x09, 0x00, 0x04, 0x35, 0x1B, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x0F, 0x35, 0x11, 0x19, 0x00, 0x0F, 0x09, 0x01, 0x00, 0x35, 0x09, 0x09, 0x08, 0x00, 0x09, 0x86, 0xDD, 0x09, 0x08, 0x06, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65, 0x6E, 0x09, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x15, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x25, 0x1D, 0x50, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x41, 0x64, 0x20, 0x48, 0x6F, 0x63, 0x20, 0x55, 0x73, 0x65, 0x72, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x00, 0x09, 0x01, 0x01, 0x25, 0x1D, 0x50, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x41, 0x64, 0x20, 0x48, 0x6F, 0x63, 0x20, 0x55, 0x73, 0x65, 0x72, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x00, 0x09, 0x03, 0x0A, 0x09, 0x00, 0x00, 0x35, 0x5A, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x02, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x11, 0x0A, 0x09, 0x00, 0x04, 0x35, 0x10, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x19, 0x35, 0x06, 0x19, 0x00, 0x19, 0x09, 0x01, 0x00, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65, 0x6E, 0x09, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x0D, 0x09, 0x01, 0x02, 0x09, 0x01, 0x00, 0x25, 0x0D, 0x41, 0x75, 0x64, 0x69, 0x6F, 0x20, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x00, 0x35, 0x40, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x03, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x11, 0x0C, 0x09, 0x00, 0x04, 0x35, 0x10, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x17, 0x35, 0x06, 0x19, 0x00, 0x17, 0x09, 0x01, 0x02, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x0E, 0x09, 0x01, 0x03, 0x09, 0x03, 0x11, 0x09, 0x00, 0x01, 0x35, 0x73, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x05, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x11, 0x05, 0x09, 0x00, 0x04, 0x35, 0x11, 0x35, 0x03, 0x19, 0x01, 0x00, 0x35, 0x05, 0x19, 0x08, 0xA0, 0x8B, 0x95, 0x08, 0x80, 0xFA, 0xFF, 0xFF, }, - new Byte[] { 0x07, 0x00, 0x02, 0x02, 0x9B, 0x02, 0x90, 0x00, 0x03, 0x08, 0x01, 0x35, 0x03, 0x19, 0x00, 0x08, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65, 0x6E, 0x09, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x05, 0x09, 0x01, 0x02, 0x09, 0x01, 0x00, 0x25, 0x12, 0x50, 0x49, 0x4D, 0x20, 0x49, 0x74, 0x65, 0x6D, 0x20, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x65, 0x72, 0x00, 0x09, 0x02, 0x00, 0x09, 0xD6, 0xE1, 0x09, 0x03, 0x03, 0x35, 0x08, 0x08, 0x01, 0x08, 0x02, 0x08, 0x04, 0x08, 0xFF, 0x35, 0x62, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x06, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x11, 0x06, 0x09, 0x00, 0x04, 0x35, 0x11, 0x35, 0x03, 0x19, 0x01, 0x00, 0x35, 0x05, 0x19, 0x00, 0x03, 0x08, 0x02, 0x35, 0x03, 0x19, 0x00, 0x08, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65, 0x6E, 0x09, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x06, 0x09, 0x01, 0x02, 0x09, 0x01, 0x00, 0x25, 0x0E, 0x46, 0x69, 0x6C, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x65, 0x72, 0x00, 0x09, 0x02, 0x00, 0x09, 0xD6, 0xE3, 0x35, 0x46, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x07, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x11, 0x0E, 0x09, 0x00, 0x04, 0x35, 0x10, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x17, 0x35, 0x06, 0x19, 0x00, 0x17, 0x09, 0x01, 0x03, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x0E, 0x09, 0x01, 0x03, 0x09, 0x01, 0x00, 0x25, 0x01, 0x00, 0x09, 0x03, 0x11, 0x09, 0x00, 0x01, 0x35, 0x5A, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x08, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x11, 0x0B, 0x09, 0x00, 0x04, 0x35, 0x10, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x19, 0x35, 0x06, 0x19, 0x00, 0x19, 0x09, 0x01, 0x00, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65, 0x6E, 0x09, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x0D, 0x09, 0x01, 0x02, 0x09, 0x01, 0x00, 0x25, 0x0D, 0x53, 0x74, 0x65, 0x72, 0x65, 0x6F, 0x20, 0x41, 0x75, 0x64, 0x69, 0x6F, 0x00, 0x35, 0x6F, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x09, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x11, 0x2F, 0x09, 0x00, 0x04, 0x35, 0x11, 0x35, 0x03, 0x19, 0x01, 0x00, 0x35, 0x05, 0x19, 0x00, 0x03, 0x08, 0x03, 0x35, 0x03, 0x19, 0x00, 0x08, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65, 0x6E, 0x09, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x30, 0x09, 0x01, 0x01, 0x09, 0x01, 0x00, 0x25, 0x1C, 0x42, 0x6C, 0x75, 0x65, 0x74, 0x6F, 0x6F, 0x74, 0x68, 0x20, 0x50, 0x68, 0x6F, 0x6E, 0x65, 0x20, 0x42, 0x6F, 0x6F, 0x6B, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x00, 0x09, 0x03, 0x14, 0x08, 0x01, 0x36, 0x01, 0x4B, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x0A, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x11, 0x24, 0x09, 0x00, 0x04, 0x35, 0x0D, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x11, 0x35, 0x03, 0x19, 0x00, 0x11, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65, 0x6E, 0x09, 0x00, 0x6A, 0x09, 0x01, 0x00, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x24, 0x09, 0x01, 0x00, 0x09, 0x00, 0x0D, 0x35, 0x0F, 0x35, 0x0D, 0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x13, 0x35, 0x03, 0x19, 0x00, 0x11, 0x09, 0x01, 0x00, 0x25, 0x0B, 0x48, 0x49, 0x44, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x00, 0x09, 0x02, 0x00, 0x09, 0x01, 0x40, 0x09, 0x02, 0x01, 0x09, 0x01, 0x11, 0x09, 0x02, 0x02, 0x08, 0x40, 0x09, 0x02, 0x03, 0x08, 0x21, 0x09, 0x02, 0x04, 0x28, 0x00, 0x09, 0x02, 0x05, 0x28, 0x01, 0x09, 0x02, 0x06, 0x35, 0x9B, 0x35, 0x99, 0x08, 0x22, 0x25, 0x95, 0x05, 0x01, 0x09, 0x06, 0xA1, 0x01, 0x05, 0x07, 0x85, 0x01, 0x19, 0xE0, 0x29, 0xE7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x01, 0x95, 0x05, 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x05, 0x91, 0x02, 0x08, 0xA0, 0x8B, 0x95, 0x08, 0x80, 0xFA, 0xFF, 0xFF, }, - new Byte[] { 0x07, 0x00, 0x03, 0x01, 0x37, 0x01, 0x34, 0x95, 0x01, 0x75, 0x03, 0x91, 0x01, 0x95, 0x06, 0x75, 0x08, 0x15, 0x00, 0x26, 0xA4, 0x00, 0x05, 0x07, 0x19, 0x00, 0x29, 0xA4, 0x81, 0x00, 0xC0, 0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00, 0x85, 0x02, 0x05, 0x09, 0x19, 0x01, 0x29, 0x03, 0x15, 0x00, 0x25, 0x01, 0x95, 0x03, 0x75, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x05, 0x81, 0x03, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31, 0x09, 0x38, 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08, 0x95, 0x03, 0x81, 0x06, 0xC0, 0xC0, 0x05, 0x0C, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x7F, 0x06, 0x00, 0xFF, 0x75, 0x08, 0x95, 0x03, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x1A, 0x00, 0xFC, 0x2A, 0x02, 0xFC, 0xB1, 0x02, 0xC0, 0x09, 0x02, 0x07, 0x35, 0x08, 0x35, 0x06, 0x09, 0x03, 0x09, 0x09, 0x01, 0x00, 0x09, 0x02, 0x08, 0x28, 0x00, 0x09, 0x02, 0x0B, 0x09, 0x01, 0x00, 0x09, 0x02, 0x0D, 0x28, 0x00, 0x09, 0x02, 0x0E, 0x28, 0x00, 0x35, 0x4C, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x0B, 0x09, 0x00, 0x01, 0x35, 0x06, 0x19, 0x11, 0x12, 0x19, 0x12, 0x03, 0x09, 0x00, 0x04, 0x35, 0x0C, 0x35, 0x03, 0x19, 0x01, 0x00, 0x35, 0x05, 0x19, 0x00, 0x03, 0x08, 0x04, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x08, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x25, 0x0E, 0x41, 0x75, 0x64, 0x69, 0x6F, 0x20, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x00, 0x35, 0x57, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x0C, 0x09, 0x00, 0x01, 0x35, 0x06, 0x19, 0x11, 0x1F, 0x19, 0x12, 0x03, 0x09, 0x00, 0x04, 0x35, 0x0C, 0x35, 0x03, 0x19, 0x01, 0x00, 0x35, 0x05, 0x19, 0x00, 0x03, 0x08, 0x05, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x1E, 0x09, 0x01, 0x06, 0x09, 0x01, 0x00, 0x25, 0x0E, 0x41, 0x75, 0x64, 0x69, 0x6F, 0x20, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x00, 0x09, 0x03, 0x01, 0x08, 0x01, 0x09, 0x03, 0x11, 0x09, 0x00, 0x29, 0x00, }, - }; - - public override DsPadId PadId - { - get { return (DsPadId) m_ControllerId; } - set - { - m_ControllerId = (Byte) value; - m_ReportArgs.Pad = PadId; - - switch (value) - { - case DsPadId.One: // Blue - m_Report[R] = 0x00; - m_Report[G] = 0x00; - m_Report[B] = m_Brightness; - break; - case DsPadId.Two: // Green - m_Report[R] = 0x00; - m_Report[G] = m_Brightness; - m_Report[B] = 0x00; - break; - case DsPadId.Three: // Yellow - m_Report[R] = m_Brightness; - m_Report[G] = m_Brightness; - m_Report[B] = 0x00; - break; - case DsPadId.Four: // Cyan - m_Report[R] = 0x00; - m_Report[G] = m_Brightness; - m_Report[B] = m_Brightness; - break; - case DsPadId.None: // Red - m_Report[R] = m_Brightness; - m_Report[G] = 0x00; - m_Report[B] = 0x00; - break; - } - - if (Global.DisableLightBar) - { - m_Report[R] = m_Report[G] = m_Report[B] = m_Report[12] = m_Report[13] = 0x00; - } - - m_Queued = 1; - } - } - - - public BthDs4() - { - InitializeComponent(); - } - - public BthDs4(IContainer container) - { - container.Add(this); - - InitializeComponent(); - } - - public BthDs4(IBthDevice Device, Byte[] Master, Byte Lsb, Byte Msb) : base(Device, Master, Lsb, Msb) - { - } - - - public override Boolean Start() - { - CanStartHid = false; - m_State = DsState.Connected; - - m_Last = DateTime.Now; - Rumble(0, 0); - - return base.Start(); - } - - - public override void Parse(Byte[] Report) - { - m_Packet++; - - m_ReportArgs.Report[2] = m_BatteryStatus = (Byte)((Report[41] + 2) / 2); - - m_ReportArgs.Report[4] = (Byte)(m_Packet >> 0 & 0xFF); - m_ReportArgs.Report[5] = (Byte)(m_Packet >> 8 & 0xFF); - m_ReportArgs.Report[6] = (Byte)(m_Packet >> 16 & 0xFF); - m_ReportArgs.Report[7] = (Byte)(m_Packet >> 24 & 0xFF); - - Ds4Button Buttons = (Ds4Button)((Report[16] << 0) | (Report[17] << 8) | (Report[18] << 16)); - Boolean Trigger = false, Active = false; - - //++ Convert HAT to DPAD - Report[16] &= 0xF0; - - switch ((UInt32) Buttons & 0xF) - { - case 0: - Report[16] |= (Byte)(Ds4Button.Up); - break; - case 1: - Report[16] |= (Byte)(Ds4Button.Up | Ds4Button.Right); - break; - case 2: - Report[16] |= (Byte)(Ds4Button.Right); - break; - case 3: - Report[16] |= (Byte)(Ds4Button.Right | Ds4Button.Down); - break; - case 4: - Report[16] |= (Byte)(Ds4Button.Down); - break; - case 5: - Report[16] |= (Byte)(Ds4Button.Down | Ds4Button.Left); - break; - case 6: - Report[16] |= (Byte)(Ds4Button.Left); - break; - case 7: - Report[16] |= (Byte)(Ds4Button.Left | Ds4Button.Up); - break; - } - //-- - - // Quick Disconnect - if ((Buttons & Ds4Button.L1) == Ds4Button.L1 - && (Buttons & Ds4Button.R1) == Ds4Button.R1 - && (Buttons & Ds4Button.PS) == Ds4Button.PS - ) - { - Trigger = true; Report[18] ^= 0x1; - } - - for (Int32 Index = 8; Index < 84; Index++) - { - m_ReportArgs.Report[Index] = Report[Index + 3]; - } - - m_ReportArgs.Report[8] = Report[9]; - - // Buttons - for (Int32 Index = 16; Index < 18 && !Active; Index++) - { - if (Report[Index] != 0) Active = true; - } - - // Axis - for (Int32 Index = 12; Index < 16 && !Active; Index++) - { - if (Report[Index] < 117 || Report[Index] > 137) Active = true; - } - - // Triggers - for (Int32 Index = 19; Index < 21 && !Active; Index++) - { - if (Report[Index] != 0) Active = true; - } - - if (Active) - { - m_IsIdle = false; - } - else if (!m_IsIdle) - { - m_IsIdle = true; m_Idle = DateTime.Now; - } - - if (Trigger && !m_IsDisconnect) - { - m_IsDisconnect = true; m_Disconnect = DateTime.Now; - } - else if (!Trigger && m_IsDisconnect) - { - m_IsDisconnect = false; - } - - Publish(); - } - - public override Boolean Rumble(Byte Large, Byte Small) - { - lock (this) - { - if (Global.DisableRumble) - { - m_Report[7] = 0; - m_Report[8] = 0; - } - else - { - m_Report[7] = (Byte)(Small); - m_Report[8] = (Byte)(Large); - } - - if (!m_Blocked) - { - m_Last = DateTime.Now; m_Blocked = true; - m_Device.HID_Command(HCI_Handle.Bytes, Get_SCID(L2CAP.PSM.HID_Command), m_Report); - } - else - { - m_Queued = 1; - } - } - - return true; - } - - public override Boolean InitReport(Byte[] Report) - { - Boolean retVal = false; - - if (m_Init < m_InitReport.Length) - { - m_Device.HID_Command(HCI_Handle.Bytes, Get_SCID(L2CAP.PSM.HID_Service), m_InitReport[m_Init++]); - } - else if (m_Init == m_InitReport.Length) - { - m_Init++; retVal = true; - } - - return retVal; - } - - - protected override void Process(DateTime Now) - { - lock (this) - { - if (m_State == DsState.Connected) - { - if (!Global.DisableLightBar) - { - if (Battery < DsBattery.Medium) - { - if (!m_Flash) - { - m_Report[12] = m_Report[13] = 0x40; - - m_Flash = true; - m_Queued = 1; - } - } - else - { - if (m_Flash) - { - m_Report[12] = m_Report[13] = 0x00; - - m_Flash = false; - m_Queued = 1; - } - } - } - - if (Global.Brightness != m_Brightness) - { - m_Brightness = Global.Brightness; - PadId = PadId; - } - - if (Global.DisableLightBar != m_DisableLightBar) - { - m_DisableLightBar = Global.DisableLightBar; - PadId = PadId; - } - - if ((Now - m_Last).TotalMilliseconds >= 500) - { - if (m_Report[7] > 0x00 || m_Report[8] > 0x00) - { - m_Queued = 1; - } - } - - if (!m_Blocked && m_Queued > 0) - { - m_Last = Now; m_Blocked = true; m_Queued--; - - m_Device.HID_Command(HCI_Handle.Bytes, Get_SCID(L2CAP.PSM.HID_Command), m_Report); - } - } - } - } - } -} diff --git a/Scp/ScpControl/BthHub.Designer.cs b/Scp/ScpControl/BthHub.Designer.cs deleted file mode 100644 index b82d81d..0000000 --- a/Scp/ScpControl/BthHub.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace ScpControl -{ - partial class BthHub - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - } - - #endregion - } -} diff --git a/Scp/ScpControl/BthHub.cs b/Scp/ScpControl/BthHub.cs deleted file mode 100644 index 364c319..0000000 --- a/Scp/ScpControl/BthHub.cs +++ /dev/null @@ -1,146 +0,0 @@ -using System; -using System.ComponentModel; - -namespace ScpControl -{ - public partial class BthHub : ScpHub - { - protected BthDongle Device; - - public String Dongle - { - get { return Device.ToString(); } - } - public String Master - { - get { return Device.Local; } - } - public Boolean Pairable - { - get { return m_Started && Device.State == DsState.Connected && Device.Initialised; } - } - - - public BthHub() - { - InitializeComponent(); - } - - public BthHub(IContainer container) - { - container.Add(this); - - InitializeComponent(); - } - - - public override Boolean Open() - { - Device = new BthDongle(); - - Device.Arrival += new EventHandler(On_Arrival); - Device.Debug += new EventHandler (On_Debug); - Device.Report += new EventHandler (On_Report); - - if (!Device.Open()) Device.Close(); - - return true; - } - - public override Boolean Start() - { - m_Started = true; - - if (Device.State == DsState.Reserved) - { - Device.Start(); - } - - return m_Started; - } - - public override Boolean Stop() - { - m_Started = false; - - if (Device.State == DsState.Connected) - { - Device.Stop(); - } - - return !m_Started; - } - - public override Boolean Close() - { - m_Started = false; - - return Device.Close(); - } - - - public override Boolean Suspend() - { - Stop(); - Close(); - - return base.Suspend(); - } - - public override Boolean Resume() - { - Open(); - Start(); - - return base.Resume(); - } - - - public override DsPadId Notify(ScpDevice.Notified Notification, String Class, String Path) - { - LogDebug(String.Format("++ Notify [{0}] [{1}] [{2}]", Notification, Class, Path)); - - switch (Notification) - { - case ScpDevice.Notified.Arrival: - { - if (Device.State != DsState.Connected) - { - BthDongle Arrived = new BthDongle(); - - if (Arrived.Open(Path)) - { - LogDebug(String.Format("-- Device Arrival [{0}]", Arrived.Local)); - - Device.Close(); - Device = Arrived; - - Device.Arrival += new EventHandler(On_Arrival); - Device.Debug += new EventHandler (On_Debug ); - Device.Report += new EventHandler (On_Report ); - - if (m_Started) Device.Start(); - break; - } - - Arrived.Close(); - Arrived.Dispose(); - } - } - break; - - case ScpDevice.Notified.Removal: - - if (Device.Path == Path) - { - LogDebug(String.Format("-- Device Removal [{0}]", Device.Local)); - - Device.Stop(); - } - break; - } - - return DsPadId.None; - } - } -} diff --git a/Scp/ScpControl/BusDevice.Designer.cs b/Scp/ScpControl/BusDevice.Designer.cs deleted file mode 100644 index 193da1a..0000000 --- a/Scp/ScpControl/BusDevice.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace ScpControl -{ - partial class BusDevice - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - } - - #endregion - } -} diff --git a/Scp/ScpControl/BusDevice.cs b/Scp/ScpControl/BusDevice.cs deleted file mode 100644 index bfffa75..0000000 --- a/Scp/ScpControl/BusDevice.cs +++ /dev/null @@ -1,398 +0,0 @@ -using System; -using System.ComponentModel; - -using System.Collections.Generic; - -namespace ScpControl -{ - public partial class BusDevice : ScpDevice - { - public const String SCP_BUS_CLASS_GUID = "{F679F562-3164-42CE-A4DB-E7DDBE723909}"; - - public const Int32 ReportSize = 28; - public const Int32 RumbleSize = 8; - public const Int32 BusWidth = 4; - - protected DsState m_State = DsState.Disconnected; - public DsState State - { - get { return m_State; } - } - - protected Int32 m_Offset = 0; - protected List m_Plugged = new List(); - - protected virtual Int32 IndexToSerial(Byte Index) - { - return Index + m_Offset + 1; - } - - public event EventHandler Debug = null; - - protected virtual void LogDebug(String Data) - { - DebugEventArgs args = new DebugEventArgs(Data); - - if (Debug != null) - { - Debug(this, args); - } - } - - - protected virtual Int32 Scale(Int32 Value, Boolean Flip) - { - Value -= 0x80; if (Value == -128) Value = -127; - - if (Flip) Value *= -1; - - return (Int32)((float) Value * 258.00787401574803149606299212599f); - } - - protected virtual Boolean DeadZone(Int32 R, Int32 X, Int32 Y) - { - X -= 0x80; if (X == -128) X = -127; - Y -= 0x80; if (Y == -128) Y = -127; - - return R * R >= X * X + Y * Y; - } - - - public BusDevice() : base(SCP_BUS_CLASS_GUID) - { - InitializeComponent(); - } - - public BusDevice(IContainer container) : base(SCP_BUS_CLASS_GUID) - { - container.Add(this); - - InitializeComponent(); - } - - - public override Boolean Open(Int32 Instance = 0) - { - if (State == DsState.Disconnected) - { - m_Offset = Instance * BusWidth; - - LogDebug(String.Format("-- Bus Open : Offset {0}", m_Offset)); - - if (!base.Open(0)) - { - LogDebug(String.Format("-- Bus Open : Failed!!", m_Offset)); - } - } - - return State == DsState.Reserved; - } - - public override Boolean Open(String DevicePath) - { - if (State == DsState.Disconnected) - { - m_Path = DevicePath; - - LogDebug(String.Format("-- Bus Open : Path {0}", m_Path)); - - if (GetDeviceHandle(m_Path)) - { - m_IsActive = true; - m_State = DsState.Reserved; - } - } - - return State == DsState.Reserved; - } - - public override Boolean Start() - { - if (State == DsState.Reserved) - { - m_State = DsState.Connected; - } - - return State == DsState.Connected; - } - - public override Boolean Stop() - { - if (State == DsState.Connected) - { - Queue Items = new Queue(); - - lock (m_Plugged) - { - foreach (Int32 Serial in m_Plugged) Items.Enqueue(Serial - m_Offset); - } - - while (Items.Count > 0) Unplug(Items.Dequeue()); - - m_State = DsState.Reserved; - } - - return State == DsState.Reserved; - } - - public override Boolean Close() - { - if (base.Stop()) - { - m_State = DsState.Reserved; - } - - if (State != DsState.Reserved) - { - if (base.Close()) - { - m_State = DsState.Disconnected; - } - } - - return State == DsState.Disconnected; - } - - - public virtual Boolean Suspend() - { - return Stop(); - } - - public virtual Boolean Resume() - { - return Start(); - } - - - public virtual Int32 Parse(Byte[] Input, Byte[] Output, DsModel Type = DsModel.DS3) - { - Int32 Serial = IndexToSerial(Input[0]); - - for (Int32 Index = 0; Index < ReportSize; Index++) Output[Index] = 0x00; - - Output[0] = 0x1C; - Output[4] = (Byte)((Serial >> 0) & 0xFF); - Output[5] = (Byte)((Serial >> 8) & 0xFF); - Output[6] = (Byte)((Serial >> 16) & 0xFF); - Output[7] = (Byte)((Serial >> 24) & 0xFF); - Output[9] = 0x14; - - X360Button XButton = X360Button.None; - - if (Input[1] == 0x02) // Pad is active - { - switch (Type) - { - case DsModel.DS3: - { - Ds3Button Buttons = (Ds3Button)((Input[10] << 0) | (Input[11] << 8) | (Input[12] << 16) | (Input[13] << 24)); - - if (Buttons.HasFlag(Ds3Button.Select )) XButton |= X360Button.Back; - if (Buttons.HasFlag(Ds3Button.Start )) XButton |= X360Button.Start; - - if (Buttons.HasFlag(Ds3Button.Up )) XButton |= X360Button.Up; - if (Buttons.HasFlag(Ds3Button.Right )) XButton |= X360Button.Right; - if (Buttons.HasFlag(Ds3Button.Down )) XButton |= X360Button.Down; - if (Buttons.HasFlag(Ds3Button.Left )) XButton |= X360Button.Left; - - if (Buttons.HasFlag(Ds3Button.L1 )) XButton |= X360Button.LB; - if (Buttons.HasFlag(Ds3Button.R1 )) XButton |= X360Button.RB; - - if (Buttons.HasFlag(Ds3Button.Triangle)) XButton |= X360Button.Y; - if (Buttons.HasFlag(Ds3Button.Circle )) XButton |= X360Button.B; - if (Buttons.HasFlag(Ds3Button.Cross )) XButton |= X360Button.A; - if (Buttons.HasFlag(Ds3Button.Square )) XButton |= X360Button.X; - - if (Buttons.HasFlag(Ds3Button.PS )) XButton |= X360Button.Guide; - - if (Buttons.HasFlag(Ds3Button.L3 )) XButton |= X360Button.LS; - if (Buttons.HasFlag(Ds3Button.R3 )) XButton |= X360Button.RS; - - Output[(UInt32) X360Axis.BT_Lo] = (Byte)((UInt32) XButton >> 0 & 0xFF); - Output[(UInt32) X360Axis.BT_Hi] = (Byte)((UInt32) XButton >> 8 & 0xFF); - - Output[(UInt32) X360Axis.LT ] = Input[(UInt32) Ds3Axis.L2]; - Output[(UInt32) X360Axis.RT ] = Input[(UInt32) Ds3Axis.R2]; - - if (!DeadZone(Global.DeadZoneL, Input[(UInt32) Ds3Axis.LX], Input[(UInt32) Ds3Axis.LY])) // Left Stick DeadZone - { - Int32 ThumbLX = +Scale(Input[(UInt32) Ds3Axis.LX], Global.FlipLX); - Int32 ThumbLY = -Scale(Input[(UInt32) Ds3Axis.LY], Global.FlipLY); - - Output[(UInt32) X360Axis.LX_Lo] = (Byte)((ThumbLX >> 0) & 0xFF); // LX - Output[(UInt32) X360Axis.LX_Hi] = (Byte)((ThumbLX >> 8) & 0xFF); - - Output[(UInt32) X360Axis.LY_Lo] = (Byte)((ThumbLY >> 0) & 0xFF); // LY - Output[(UInt32) X360Axis.LY_Hi] = (Byte)((ThumbLY >> 8) & 0xFF); - } - - if (!DeadZone(Global.DeadZoneR, Input[(UInt32) Ds3Axis.RX], Input[(UInt32) Ds3Axis.RY])) // Right Stick DeadZone - { - Int32 ThumbRX = +Scale(Input[(UInt32) Ds3Axis.RX], Global.FlipRX); - Int32 ThumbRY = -Scale(Input[(UInt32) Ds3Axis.RY], Global.FlipRY); - - Output[(UInt32) X360Axis.RX_Lo] = (Byte)((ThumbRX >> 0) & 0xFF); // RX - Output[(UInt32) X360Axis.RX_Hi] = (Byte)((ThumbRX >> 8) & 0xFF); - - Output[(UInt32) X360Axis.RY_Lo] = (Byte)((ThumbRY >> 0) & 0xFF); // RY - Output[(UInt32) X360Axis.RY_Hi] = (Byte)((ThumbRY >> 8) & 0xFF); - } - } - break; - - case DsModel.DS4: - { - Ds4Button Buttons = (Ds4Button)((Input[13] << 0) | (Input[14] << 8) | (Input[15] << 16)); - - if (Buttons.HasFlag(Ds4Button.Share )) XButton |= X360Button.Back; - if (Buttons.HasFlag(Ds4Button.Options )) XButton |= X360Button.Start; - - if (Buttons.HasFlag(Ds4Button.Up )) XButton |= X360Button.Up; - if (Buttons.HasFlag(Ds4Button.Right )) XButton |= X360Button.Right; - if (Buttons.HasFlag(Ds4Button.Down )) XButton |= X360Button.Down; - if (Buttons.HasFlag(Ds4Button.Left )) XButton |= X360Button.Left; - - if (Buttons.HasFlag(Ds4Button.L1 )) XButton |= X360Button.LB; - if (Buttons.HasFlag(Ds4Button.R1 )) XButton |= X360Button.RB; - - if (Buttons.HasFlag(Ds4Button.Triangle)) XButton |= X360Button.Y; - if (Buttons.HasFlag(Ds4Button.Circle )) XButton |= X360Button.B; - if (Buttons.HasFlag(Ds4Button.Cross )) XButton |= X360Button.A; - if (Buttons.HasFlag(Ds4Button.Square )) XButton |= X360Button.X; - - if (Buttons.HasFlag(Ds4Button.PS )) XButton |= X360Button.Guide; - - if (Buttons.HasFlag(Ds4Button.L3 )) XButton |= X360Button.LS; - if (Buttons.HasFlag(Ds4Button.R3 )) XButton |= X360Button.RS; - - Output[(UInt32) X360Axis.BT_Lo] = (Byte)((UInt32) XButton >> 0 & 0xFF); - Output[(UInt32) X360Axis.BT_Hi] = (Byte)((UInt32) XButton >> 8 & 0xFF); - - Output[(UInt32) X360Axis.LT ] = Input[(UInt32) Ds4Axis.L2]; - Output[(UInt32) X360Axis.RT ] = Input[(UInt32) Ds4Axis.R2]; - - if (!DeadZone(Global.DeadZoneL, Input[(UInt32) Ds4Axis.LX], Input[(UInt32) Ds4Axis.LY])) // Left Stick DeadZone - { - Int32 ThumbLX = +Scale(Input[(UInt32) Ds4Axis.LX], Global.FlipLX); - Int32 ThumbLY = -Scale(Input[(UInt32) Ds4Axis.LY], Global.FlipLY); - - Output[(UInt32) X360Axis.LX_Lo] = (Byte)((ThumbLX >> 0) & 0xFF); // LX - Output[(UInt32) X360Axis.LX_Hi] = (Byte)((ThumbLX >> 8) & 0xFF); - - Output[(UInt32) X360Axis.LY_Lo] = (Byte)((ThumbLY >> 0) & 0xFF); // LY - Output[(UInt32) X360Axis.LY_Hi] = (Byte)((ThumbLY >> 8) & 0xFF); - } - - if (!DeadZone(Global.DeadZoneR, Input[(UInt32) Ds4Axis.RX], Input[(UInt32) Ds4Axis.RY])) // Right Stick DeadZone - { - Int32 ThumbRX = +Scale(Input[(UInt32) Ds4Axis.RX], Global.FlipRX); - Int32 ThumbRY = -Scale(Input[(UInt32) Ds4Axis.RY], Global.FlipRY); - - Output[(UInt32) X360Axis.RX_Lo] = (Byte)((ThumbRX >> 0) & 0xFF); // RX - Output[(UInt32) X360Axis.RX_Hi] = (Byte)((ThumbRX >> 8) & 0xFF); - - Output[(UInt32) X360Axis.RY_Lo] = (Byte)((ThumbRY >> 0) & 0xFF); // RY - Output[(UInt32) X360Axis.RY_Hi] = (Byte)((ThumbRY >> 8) & 0xFF); - } - } - break; - } - } - - return Input[0]; - } - - - public virtual Boolean Plugin(Int32 Serial) - { - Boolean retVal = false; - - if (Serial < 1 || Serial > BusWidth) return retVal; - - Serial += m_Offset; - - if (State == DsState.Connected) - { - lock (m_Plugged) - { - if (!m_Plugged.Contains(Serial)) - { - Int32 Transfered = 0; - Byte[] Buffer = new Byte[16]; - - Buffer[0] = 0x10; - Buffer[1] = 0x00; - Buffer[2] = 0x00; - Buffer[3] = 0x00; - - Buffer[4] = (Byte)((Serial >> 0) & 0xFF); - Buffer[5] = (Byte)((Serial >> 8) & 0xFF); - Buffer[6] = (Byte)((Serial >> 16) & 0xFF); - Buffer[7] = (Byte)((Serial >> 24) & 0xFF); - - if (DeviceIoControl(m_FileHandle, 0x2A4000, Buffer, Buffer.Length, null, 0, ref Transfered, IntPtr.Zero)) - { - m_Plugged.Add(Serial); retVal = true; - - LogDebug(String.Format("-- Bus Plugin : Serial {0}", Serial)); - } - } - else retVal = true; - } - } - - return retVal; - } - - public virtual Boolean Unplug(Int32 Serial) - { - Boolean retVal = false; - Serial += m_Offset; - - if (State == DsState.Connected) - { - lock (m_Plugged) - { - if (m_Plugged.Contains(Serial)) - { - Int32 Transfered = 0; - Byte[] Buffer = new Byte[16]; - - Buffer[0] = 0x10; - Buffer[1] = 0x00; - Buffer[2] = 0x00; - Buffer[3] = 0x00; - - Buffer[4] = (Byte)((Serial >> 0) & 0xFF); - Buffer[5] = (Byte)((Serial >> 8) & 0xFF); - Buffer[6] = (Byte)((Serial >> 16) & 0xFF); - Buffer[7] = (Byte)((Serial >> 24) & 0xFF); - - if (DeviceIoControl(m_FileHandle, 0x2A4004, Buffer, Buffer.Length, null, 0, ref Transfered, IntPtr.Zero)) - { - m_Plugged.Remove(Serial); retVal = true; - - LogDebug(String.Format("-- Bus Unplug : Serial {0}", Serial)); - } - } - else retVal = true; - } - } - - return retVal; - } - - public virtual Boolean Report(Byte[] Input, Byte[] Output) - { - if (State == DsState.Connected) - { - Int32 Transfered = 0; - - return DeviceIoControl(m_FileHandle, 0x2A400C, Input, Input.Length, Output, Output.Length, ref Transfered, IntPtr.Zero) && Transfered > 0; - } - - return false; - } - } -} diff --git a/Scp/ScpControl/Properties/AssemblyInfo.cs b/Scp/ScpControl/Properties/AssemblyInfo.cs deleted file mode 100644 index c4eba69..0000000 --- a/Scp/ScpControl/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("ScpControl")] -[assembly: AssemblyProduct("ScpControl")] - -[assembly: Guid("8848658d-0ae2-43fe-9b7c-5ff3ad35c1a8")] diff --git a/Scp/ScpControl/Properties/CommonInfo.cs b/Scp/ScpControl/Properties/CommonInfo.cs deleted file mode 100644 index 74c03ae..0000000 --- a/Scp/ScpControl/Properties/CommonInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyCompany("Scarlet.Crush Productions")] -[assembly: AssemblyCopyright("Copyright © Scarlet.Crush Productions 2012, 2013, 2014")] - -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] - -[assembly: AssemblyVersion("1.2.2.175")] -[assembly: AssemblyFileVersion("1.2.2.175")] diff --git a/Scp/ScpControl/RootHub.Designer.cs b/Scp/ScpControl/RootHub.Designer.cs deleted file mode 100644 index 2253d80..0000000 --- a/Scp/ScpControl/RootHub.Designer.cs +++ /dev/null @@ -1,51 +0,0 @@ -namespace ScpControl -{ - partial class RootHub - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.UDP_Worker = new System.ComponentModel.BackgroundWorker(); - this.scpMap = new ScpControl.ScpMapper(this.components); - // - // UDP_Worker - // - this.UDP_Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.UDP_Worker_Thread); - // - // scpMapper - // - this.scpMap.Active = ""; - this.scpMap.Xml = "System.Xml.XmlDocument"; - - } - - #endregion - - private System.ComponentModel.BackgroundWorker UDP_Worker; - private ScpMapper scpMap; - } -} diff --git a/Scp/ScpControl/RootHub.cs b/Scp/ScpControl/RootHub.cs deleted file mode 100644 index 3eecb72..0000000 --- a/Scp/ScpControl/RootHub.cs +++ /dev/null @@ -1,558 +0,0 @@ -using System; -using System.ComponentModel; -using System.Text; - -using System.Net; -using System.Net.Sockets; -using System.Threading; - -using System.Management; -using System.Text.RegularExpressions; -using System.Reflection; - -namespace ScpControl -{ - public partial class RootHub : ScpHub - { - protected class Cache - { - protected Byte[] m_Report = new Byte[BusDevice.ReportSize]; - protected Byte[] m_Rumble = new Byte[BusDevice.RumbleSize]; - protected Byte[] m_Mapped = new Byte[ReportEventArgs.Length]; - - public Byte[] Report - { - get { return m_Report; } - } - - public Byte[] Rumble - { - get { return m_Rumble; } - } - - public Byte[] Mapped - { - get { return m_Mapped; } - } - } - protected Cache[] m_Cache = { new Cache(), new Cache(), new Cache(), new Cache() }; - - protected volatile Boolean m_Suspended = false; - - protected BthHub bthHub = new BthHub(); - protected UsbHub usbHub = new UsbHub(); - protected BusDevice scpBus = new BusDevice(); - - protected Byte[][] m_XInput = { new Byte[2] { 0, 0 }, new Byte[2] { 0, 0 }, new Byte[2] { 0, 0 }, new Byte[2] { 0, 0 }}; - protected Byte[][] m_Native = { new Byte[2] { 0, 0 }, new Byte[2] { 0, 0 }, new Byte[2] { 0, 0 }, new Byte[2] { 0, 0 }}; - - protected IDsDevice[] m_Pad = { new DsNull(DsPadId.One), new DsNull(DsPadId.Two), new DsNull(DsPadId.Three), new DsNull(DsPadId.Four) }; - protected String[] m_Reserved = new String[] { String.Empty, String.Empty, String.Empty, String.Empty }; - - protected IPEndPoint m_ServerEp = new IPEndPoint(IPAddress.Loopback, 26760); - protected UdpClient m_Server = new UdpClient(); - - protected IPEndPoint m_ClientEp = new IPEndPoint(IPAddress.Loopback, 26761); - protected UdpClient m_Client = new UdpClient(); - - public IDsDevice[] Pad - { - get { return m_Pad; } - } - - public String Dongle - { - get { return bthHub.Dongle; } - } - public String Master - { - get { return bthHub.Master; } - } - public Boolean Pairable - { - get { return m_Started && bthHub.Pairable; } - } - - - public RootHub() - { - InitializeComponent(); - - scpMap.Debug += new EventHandler(On_Debug); - - bthHub.Debug += new EventHandler(On_Debug); - usbHub.Debug += new EventHandler(On_Debug); - scpBus.Debug += new EventHandler(On_Debug); - - bthHub.Arrival += new EventHandler(On_Arrival); - usbHub.Arrival += new EventHandler(On_Arrival); - - bthHub.Report += new EventHandler(On_Report); - usbHub.Report += new EventHandler(On_Report); - } - - public RootHub(IContainer container) - { - container.Add(this); - InitializeComponent(); - - scpMap.Debug += new EventHandler(On_Debug); - - bthHub.Debug += new EventHandler(On_Debug); - usbHub.Debug += new EventHandler(On_Debug); - scpBus.Debug += new EventHandler(On_Debug); - - bthHub.Arrival += new EventHandler(On_Arrival); - usbHub.Arrival += new EventHandler(On_Arrival); - - bthHub.Report += new EventHandler(On_Report); - usbHub.Report += new EventHandler(On_Report); - } - - - public override Boolean Open() - { - bool Opened = false; - - LogDebug(String.Format("++ {0} {1}", Assembly.GetExecutingAssembly().Location, Assembly.GetExecutingAssembly().GetName().Version.ToString())); - LogDebug(String.Format("++ {0}", OSInfo())); - - scpMap.Open(); - - Opened |= scpBus.Open(Global.Bus); - Opened |= usbHub.Open(); - Opened |= bthHub.Open(); - - Global.Load(); - return Opened; - } - - public override Boolean Start() - { - if (!m_Started) - { - scpMap.Start(); - - m_Started |= scpBus.Start(); - m_Started |= usbHub.Start(); - m_Started |= bthHub.Start(); - - if (m_Started) UDP_Worker.RunWorkerAsync(); - } - - return m_Started; - } - - public override Boolean Stop() - { - if (m_Started) - { - m_Started = false; - m_Server.Close(); - - scpMap.Stop(); - - scpBus.Stop(); - usbHub.Stop(); - bthHub.Stop(); - } - - return !m_Started; - } - - public override Boolean Close() - { - if (m_Started) - { - m_Started = false; - m_Server.Close(); - - scpMap.Close(); - - scpBus.Close(); - usbHub.Close(); - bthHub.Close(); - } - - Global.Save(); - - return !m_Started; - } - - - public override Boolean Suspend() - { - m_Suspended = true; - - for (Int32 Index = 0; Index < m_Pad.Length; Index++) m_Pad[Index].Disconnect(); - - scpBus.Suspend(); - usbHub.Suspend(); - bthHub.Suspend(); - - LogDebug("++ Suspended"); - return true; - } - - public override Boolean Resume() - { - LogDebug("++ Resumed"); - - scpBus.Resume(); - for (Int32 Index = 0; Index < m_Pad.Length; Index++) - { - if (m_Pad[Index].State != DsState.Disconnected) - { - scpBus.Plugin(Index + 1); - } - } - - usbHub.Resume(); - bthHub.Resume(); - - m_Suspended = false; - return true; - } - - - public override DsPadId Notify(ScpDevice.Notified Notification, String Class, String Path) - { - if (!m_Suspended) - { - if (Class == UsbDs4.USB_CLASS_GUID) - { - return usbHub.Notify(Notification, Class, Path); - } - - if (Class == UsbDs3.USB_CLASS_GUID) - { - return usbHub.Notify(Notification, Class, Path); - } - - if (Class == BthDongle.BTH_CLASS_GUID) - { - bthHub.Notify(Notification, Class, Path); - } - } - - return DsPadId.None; - } - - protected virtual void UDP_Worker_Thread(object sender, DoWorkEventArgs e) - { - Byte Serial; - StringBuilder sb = new StringBuilder(); - - Thread.Sleep(1); - - IPEndPoint Remote = new IPEndPoint(IPAddress.Loopback, 0); - - m_Server = new UdpClient(m_ServerEp); - - LogDebug("-- Controller : UDP_Worker_Thread Starting"); - - while (m_Started) - { - try - { - Byte[] Buffer = m_Server.Receive(ref Remote); - - switch (Buffer[1]) - { - case 0x00: // Status Request - - if (!Global.DisableNative) - { - Buffer[2] = (Byte)Pad[0].State; - Buffer[3] = (Byte)Pad[1].State; - Buffer[4] = (Byte)Pad[2].State; - Buffer[5] = (Byte)Pad[3].State; - } - else - { - Buffer[2] = 0; - Buffer[3] = 0; - Buffer[4] = 0; - Buffer[5] = 0; - } - - m_Server.Send(Buffer, Buffer.Length, Remote); - break; - - case 0x01: // Rumble Request - - Serial = Buffer[0]; - - if (Pad[Serial].State == DsState.Connected) - { - if (Buffer[2] != m_Native[Serial][0] || Buffer[3] != m_Native[Serial][1]) - { - m_Native[Serial][0] = Buffer[2]; - m_Native[Serial][1] = Buffer[3]; - - Pad[Buffer[0]].Rumble(Buffer[2], Buffer[3]); - } - } - break; - - case 0x02: // Status Data Request - { - sb.Clear(); - sb.Append(Dongle); sb.Append('^'); - - sb.Append(Pad[0].ToString()); sb.Append('^'); - sb.Append(Pad[1].ToString()); sb.Append('^'); - sb.Append(Pad[2].ToString()); sb.Append('^'); - sb.Append(Pad[3].ToString()); sb.Append('^'); - - Byte[] Data = Encoding.Unicode.GetBytes(sb.ToString()); - - m_Server.Send(Data, Data.Length, Remote); - } - break; - - case 0x03: // Config Read Request - { - Byte[] Data = Global.Packed; - - m_Server.Send(Data, Data.Length, Remote); - } - break; - - case 0x04: // Config Write Request - { - Global.Packed = Buffer; - } - break; - - case 0x05: // Pad Promote Request - { - Int32 Target = Buffer[2]; - - lock (this) - { - if (Pad[Target].State != DsState.Disconnected) - { - IDsDevice Swap = Pad[Target]; - Pad[Target] = Pad[Target - 1]; - Pad[Target - 1] = Swap; - - Pad[Target].PadId = (DsPadId)(Target); - Pad[Target - 1].PadId = (DsPadId)(Target - 1); - - m_Reserved[Target] = Pad[Target].Local; - m_Reserved[Target - 1] = Pad[Target - 1].Local; - } - } - } - break; - - case 0x06: // Profile List - { - sb.Clear(); - sb.Append(scpMap.Active); sb.Append('^'); - - foreach (String Profile in scpMap.Profiles) - { - sb.Append(Profile); sb.Append('^'); - } - - Byte[] Data = Encoding.Unicode.GetBytes(sb.ToString()); - - m_Server.Send(Data, Data.Length, Remote); - } - break; - - case 0x07: // Set Active Profile - { - Byte[] Data = new Byte[Buffer.Length - 2]; - - Array.Copy(Buffer, 2, Data, 0, Data.Length); - - scpMap.Active = Encoding.Unicode.GetString(Data); - } - break; - - case 0x08: // Get XML - { - Byte[] Data = Encoding.UTF8.GetBytes(scpMap.Xml); - - m_Server.Send(Data, Data.Length, Remote); - } - break; - - case 0x09: // Set XML - { - Byte[] Data = new Byte[Buffer.Length - 2]; - - Array.Copy(Buffer, 2, Data, 0, Data.Length); - - scpMap.Xml = Encoding.UTF8.GetString(Data); - } - break; - - case 0x0A: // Pad Detail - { - - Serial = Buffer[0]; - - Byte[] Data = new Byte[11]; - Byte[] Temp = Encoding.Unicode.GetBytes(m_Pad[Serial].Local); - - Data[0] = Serial; - Data[1] = (Byte) m_Pad[Serial].State; - Data[2] = (Byte) m_Pad[Serial].Model; - Data[3] = (Byte) m_Pad[Serial].Connection; - Data[4] = (Byte) m_Pad[Serial].Battery; - Array.Copy(m_Pad[Serial].BD_Address, 0, Data, 5, m_Pad[Serial].BD_Address.Length); - - m_Server.Send(Data, Data.Length, Remote); - } - break; - } - } - catch { } - } - - LogDebug("-- Controller : UDP_Worker_Thread Exiting"); - } - - - protected override void On_Arrival(object sender, ArrivalEventArgs e) - { - lock (this) - { - Boolean bFound = false; - IDsDevice Arrived = e.Device; - - for (Int32 Index = 0; Index < m_Pad.Length && !bFound; Index++) - { - if (Arrived.Local == m_Reserved[Index]) - { - if (m_Pad[Index].State == DsState.Connected) - { - if (m_Pad[Index].Connection == DsConnection.BTH) - { - m_Pad[Index].Disconnect(); - } - - if (m_Pad[Index].Connection == DsConnection.USB) - { - Arrived.Disconnect(); - - e.Handled = false; - return; - } - } - - bFound = true; - - Arrived.PadId = (DsPadId) Index; - m_Pad[Index] = Arrived; - } - } - - for (Int32 Index = 0; Index < m_Pad.Length && !bFound; Index++) - { - if (m_Pad[Index].State == DsState.Disconnected) - { - bFound = true; - m_Reserved[Index] = Arrived.Local; - - Arrived.PadId = (DsPadId) Index; - m_Pad[Index] = Arrived; - } - } - - if (bFound) - { - scpBus.Plugin((int) Arrived.PadId + 1); - - LogDebug(String.Format("++ Plugin Port #{0} for [{1}]", (int) Arrived.PadId + 1, Arrived.Local)); - } - e.Handled = bFound; - } - } - - protected override void On_Report(object sender, ReportEventArgs e) - { - Int32 Serial = e.Report[(Int32) DsOffset.Pad]; - DsModel Model = (DsModel) e.Report[(Int32) DsOffset.Model]; - - Byte[] Report = m_Cache[Serial].Report; - Byte[] Rumble = m_Cache[Serial].Rumble; - Byte[] Mapped = m_Cache[Serial].Mapped; - - if (scpMap.Remap(Model, Serial, m_Pad[Serial].Local, e.Report, Mapped)) - { - scpBus.Parse(Mapped, Report, Model); - } - else - { - scpBus.Parse(e.Report, Report, Model); - } - - if (scpBus.Report(Report, Rumble) && (DsState) e.Report[1] == DsState.Connected) - { - Byte Large = (Byte)(Rumble[3]); - Byte Small = (Byte)(Rumble[4]); - - if (Rumble[1] == 0x08 && (Large != m_XInput[Serial][0] || Small != m_XInput[Serial][1])) - { - m_XInput[Serial][0] = Large; - m_XInput[Serial][1] = Small; - - Pad[Serial].Rumble(Large, Small); - } - } - - if ((DsState) e.Report[1] != DsState.Connected) - { - m_XInput[Serial][0] = m_XInput[Serial][1] = 0; - m_Native[Serial][0] = m_Native[Serial][1] = 0; - } - - if (!Global.DisableNative) m_Client.Send(e.Report, e.Report.Length, m_ClientEp); - } - - - protected String OSInfo() - { - String Info = String.Empty; - - try - { - using (ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")) - { - foreach (ManagementObject mo in mos.Get()) - { - try - { - Info = Regex.Replace(mo.GetPropertyValue("Caption").ToString(), "[^A-Za-z0-9 ]", "").Trim(); - - try - { - Object spv = mo.GetPropertyValue("ServicePackMajorVersion"); - - if (spv != null && spv.ToString() != "0") - { - Info += " Service Pack " + spv.ToString(); - } - } - catch { } - - Info = String.Format("{0} ({1} {2})", Info, System.Environment.OSVersion.Version.ToString(), System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")); - - } - catch { } - - mo.Dispose(); - } - } - } - catch { } - - return Info; - } - } -} diff --git a/Scp/ScpControl/RootHub.resx b/Scp/ScpControl/RootHub.resx deleted file mode 100644 index 216c0f5..0000000 --- a/Scp/ScpControl/RootHub.resx +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 56 - - - 17, 17 - - - False - - \ No newline at end of file diff --git a/Scp/ScpControl/ScpControl.csproj b/Scp/ScpControl/ScpControl.csproj deleted file mode 100644 index 2fc1622..0000000 --- a/Scp/ScpControl/ScpControl.csproj +++ /dev/null @@ -1,227 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C} - Library - Properties - ScpControl - ScpControl - v4.0 - 512 - - - - true - full - false - ..\..\bin\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - false - ..\..\bin\ - TRACE - prompt - 4 - - - true - bin\DebugLB\ - DEBUG;TRACE - full - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - bin\ReleaseLB\ - TRACE - pdbonly - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - - - - - - - - - - - Component - - - BthConnection.cs - - - Component - - - BthDevice.cs - - - Component - - - BthDongle.cs - - - Component - - - BthDs3.cs - - - Component - - - BthDs4.cs - - - Component - - - BthHub.cs - - - - Component - - - ScpMapper.cs - - - Component - - - ScpPadState.cs - - - Component - - - ScpProxy.cs - - - Component - - - ScpTimer.cs - - - Component - - - UsbDevice.cs - - - Component - - - UsbDs4.cs - - - - Component - - - RootHub.cs - - - Component - - - BusDevice.cs - - - Component - - - ScpDevice.cs - - - Component - - - ScpHub.cs - - - - Component - - - UsbDs3.cs - - - Component - - - UsbHub.cs - - - Component - - - XmlMapper.cs - - - - - - BthDevice.cs - - - BthDongle.cs - - - ScpMapper.cs - - - ScpPadState.cs - - - ScpProxy.cs - - - UsbDevice.cs - - - UsbDs4.cs - - - RootHub.cs - - - UsbDs3.cs - - - - - PreserveNewest - Designer - - - - - - - - - \ No newline at end of file diff --git a/Scp/ScpControl/ScpControl_2010.csproj b/Scp/ScpControl/ScpControl_2010.csproj deleted file mode 100644 index de32402..0000000 --- a/Scp/ScpControl/ScpControl_2010.csproj +++ /dev/null @@ -1,204 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C} - Library - Properties - ScpControl - ScpControl - v4.0 - 512 - - - - true - full - false - ..\..\bin\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - ..\..\bin\ - TRACE - prompt - 4 - - - - - - - - - - - Component - - - BthConnection.cs - - - Component - - - BthDevice.cs - - - Component - - - BthDongle.cs - - - Component - - - BthDs3.cs - - - Component - - - BthDs4.cs - - - Component - - - BthHub.cs - - - - Component - - - ScpMapper.cs - - - Component - - - ScpPadState.cs - - - Component - - - ScpProxy.cs - - - Component - - - ScpTimer.cs - - - Component - - - UsbDevice.cs - - - Component - - - UsbDs4.cs - - - - Component - - - RootHub.cs - - - Component - - - BusDevice.cs - - - Component - - - ScpDevice.cs - - - Component - - - ScpHub.cs - - - - Component - - - UsbDs3.cs - - - Component - - - UsbHub.cs - - - Component - - - XmlMapper.cs - - - - - - BthDongle.cs - - - ScpMapper.cs - - - ScpPadState.cs - - - ScpProxy.cs - - - UsbDevice.cs - - - UsbDs4.cs - - - RootHub.cs - - - UsbDs3.cs - - - - - PreserveNewest - - - - - Copy /Y /B $(SolutionDir)\Common\Properties\Info.cs $(ProjectDir)\Properties\CommonInfo.cs > nul: - - - - \ No newline at end of file diff --git a/Scp/ScpControl/ScpDevice.Designer.cs b/Scp/ScpControl/ScpDevice.Designer.cs deleted file mode 100644 index 2d203ce..0000000 --- a/Scp/ScpControl/ScpDevice.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace ScpControl -{ - partial class ScpDevice - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - } - - #endregion - } -} diff --git a/Scp/ScpControl/ScpDevice.cs b/Scp/ScpControl/ScpDevice.cs deleted file mode 100644 index 24fa6f3..0000000 --- a/Scp/ScpControl/ScpDevice.cs +++ /dev/null @@ -1,718 +0,0 @@ -using System; -using System.ComponentModel; - -using System.Runtime.InteropServices; - -namespace ScpControl -{ - public partial class ScpDevice : Component - { - public virtual Boolean IsActive - { - get { return m_IsActive; } - } - - public virtual String Path - { - get { return m_Path; } - } - - - public ScpDevice() - { - InitializeComponent(); - } - - public ScpDevice(IContainer container) - { - container.Add(this); - - InitializeComponent(); - } - - public ScpDevice(String Class) - { - InitializeComponent(); - - this.m_Class = new Guid(Class); - } - - - public virtual Boolean Open(Int32 Instance = 0) - { - String DevicePath = String.Empty; - - if (Find(m_Class, ref DevicePath, Instance)) - { - Open(DevicePath); - } - - return m_IsActive; - } - - public virtual Boolean Open(String DevicePath) - { - m_Path = DevicePath.ToUpper(); - - if (GetDeviceHandle(m_Path)) - { - if (WinUsb_Initialize(m_FileHandle, ref m_WinUsbHandle)) - { - if (InitializeDevice()) - { - m_IsActive = true; - } - else - { - WinUsb_Free(m_WinUsbHandle); - m_WinUsbHandle = (IntPtr) INVALID_HANDLE_VALUE; - } - } - else - { - CloseHandle(m_FileHandle); - } - } - - return m_IsActive; - } - - - public virtual Boolean Start() - { - return m_IsActive; - } - - public virtual Boolean Stop() - { - m_IsActive = false; - - if (!(m_WinUsbHandle == (IntPtr) INVALID_HANDLE_VALUE)) - { - WinUsb_AbortPipe(m_WinUsbHandle, m_IntIn); - WinUsb_AbortPipe(m_WinUsbHandle, m_BulkIn); - WinUsb_AbortPipe(m_WinUsbHandle, m_BulkOut); - - WinUsb_Free(m_WinUsbHandle); - m_WinUsbHandle = (IntPtr) INVALID_HANDLE_VALUE; - } - - if (m_FileHandle != IntPtr.Zero) - { - CloseHandle(m_FileHandle); - - m_FileHandle = IntPtr.Zero; - } - - return true; - } - - public virtual Boolean Close() - { - return Stop(); - } - - - public virtual Boolean ReadIntPipe (Byte[] Buffer, Int32 Length, ref Int32 Transfered) - { - if (!m_IsActive) return false; - - return WinUsb_ReadPipe(m_WinUsbHandle, m_IntIn, Buffer, Length, ref Transfered, IntPtr.Zero); - } - - public virtual Boolean ReadBulkPipe (Byte[] Buffer, Int32 Length, ref Int32 Transfered) - { - if (!m_IsActive) return false; - - return WinUsb_ReadPipe(m_WinUsbHandle, m_BulkIn, Buffer, Length, ref Transfered, IntPtr.Zero); - } - - public virtual Boolean WriteIntPipe (Byte[] Buffer, Int32 Length, ref Int32 Transfered) - { - if (!m_IsActive) return false; - - return WinUsb_WritePipe(m_WinUsbHandle, m_IntOut, Buffer, Length, ref Transfered, IntPtr.Zero); - } - - public virtual Boolean WriteBulkPipe(Byte[] Buffer, Int32 Length, ref Int32 Transfered) - { - if (!m_IsActive) return false; - - return WinUsb_WritePipe(m_WinUsbHandle, m_BulkOut, Buffer, Length, ref Transfered, IntPtr.Zero); - } - - - public virtual Boolean SendTransfer(Byte RequestType, Byte Request, UInt16 Value, Byte[] Buffer, ref Int32 Transfered) - { - if (!m_IsActive) return false; - - WINUSB_SETUP_PACKET Setup = new WINUSB_SETUP_PACKET(); - - Setup.RequestType = RequestType; - Setup.Request = Request; - Setup.Value = Value; - Setup.Index = 0; - Setup.Length = (UInt16) Buffer.Length; - - return WinUsb_ControlTransfer(m_WinUsbHandle, Setup, Buffer, Buffer.Length, ref Transfered, IntPtr.Zero); - } - - - #region Constant and Structure Definitions - public const Int32 SERVICE_CONTROL_STOP = 0x00000001; - public const Int32 SERVICE_CONTROL_SHUTDOWN = 0x00000005; - public const Int32 SERVICE_CONTROL_DEVICEEVENT = 0x0000000B; - public const Int32 SERVICE_CONTROL_POWEREVENT = 0x0000000D; - - public const Int32 DBT_DEVICEARRIVAL = 0x8000; - public const Int32 DBT_DEVICEQUERYREMOVE = 0x8001; - public const Int32 DBT_DEVICEREMOVECOMPLETE = 0x8004; - public const Int32 DBT_DEVTYP_DEVICEINTERFACE = 0x0005; - public const Int32 DBT_DEVTYP_HANDLE = 0x0006; - - public const Int32 PBT_APMRESUMEAUTOMATIC = 0x0012; - public const Int32 PBT_APMSUSPEND = 0x0004; - - public const Int32 DEVICE_NOTIFY_WINDOW_HANDLE = 0x0000; - public const Int32 DEVICE_NOTIFY_SERVICE_HANDLE = 0x0001; - public const Int32 DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = 0x0004; - - public const Int32 WM_DEVICECHANGE = 0x0219; - - public const Int32 DIGCF_PRESENT = 0x0002; - public const Int32 DIGCF_DEVICEINTERFACE = 0x0010; - - public delegate Int32 ServiceControlHandlerEx(Int32 Control, Int32 Type, IntPtr Data, IntPtr Context); - - [StructLayout(LayoutKind.Sequential)] - public class DEV_BROADCAST_DEVICEINTERFACE - { - internal Int32 dbcc_size; - internal Int32 dbcc_devicetype; - internal Int32 dbcc_reserved; - internal Guid dbcc_classguid; - internal Int16 dbcc_name; - } - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] - public class DEV_BROADCAST_DEVICEINTERFACE_M - { - public Int32 dbcc_size; - public Int32 dbcc_devicetype; - public Int32 dbcc_reserved; - - [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 16)] - public Byte[] dbcc_classguid; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)] - public Char[] dbcc_name; - } - - [StructLayout(LayoutKind.Sequential)] - public class DEV_BROADCAST_HDR - { - public Int32 dbch_size; - public Int32 dbch_devicetype; - public Int32 dbch_reserved; - } - - [StructLayout(LayoutKind.Sequential)] - protected struct SP_DEVICE_INTERFACE_DATA - { - internal Int32 cbSize; - internal Guid InterfaceClassGuid; - internal Int32 Flags; - internal IntPtr Reserved; - } - - protected const UInt32 FILE_ATTRIBUTE_NORMAL = 0x80; - protected const UInt32 FILE_FLAG_OVERLAPPED = 0x40000000; - protected const UInt32 FILE_SHARE_READ = 1; - protected const UInt32 FILE_SHARE_WRITE = 2; - protected const UInt32 GENERIC_READ = 0x80000000; - protected const UInt32 GENERIC_WRITE = 0x40000000; - protected const Int32 INVALID_HANDLE_VALUE = -1; - protected const UInt32 OPEN_EXISTING = 3; - protected const UInt32 DEVICE_SPEED = 1; - protected const Byte USB_ENDPOINT_DIRECTION_MASK = 0x80; - - protected enum POLICY_TYPE - { - SHORT_PACKET_TERMINATE = 1, - AUTO_CLEAR_STALL = 2, - PIPE_TRANSFER_TIMEOUT = 3, - IGNORE_SHORT_PACKETS = 4, - ALLOW_PARTIAL_READS = 5, - AUTO_FLUSH = 6, - RAW_IO = 7, - } - - protected enum USBD_PIPE_TYPE - { - UsbdPipeTypeControl = 0, - UsbdPipeTypeIsochronous = 1, - UsbdPipeTypeBulk = 2, - UsbdPipeTypeInterrupt = 3, - } - - protected enum USB_DEVICE_SPEED - { - UsbLowSpeed = 1, - UsbFullSpeed = 2, - UsbHighSpeed = 3, - } - - [StructLayout(LayoutKind.Sequential)] - protected struct USB_CONFIGURATION_DESCRIPTOR - { - internal Byte bLength; - internal Byte bDescriptorType; - internal UInt16 wTotalLength; - internal Byte bNumInterfaces; - internal Byte bConfigurationValue; - internal Byte iConfiguration; - internal Byte bmAttributes; - internal Byte MaxPower; - } - - [StructLayout(LayoutKind.Sequential)] - protected struct USB_INTERFACE_DESCRIPTOR - { - internal Byte bLength; - internal Byte bDescriptorType; - internal Byte bInterfaceNumber; - internal Byte bAlternateSetting; - internal Byte bNumEndpoints; - internal Byte bInterfaceClass; - internal Byte bInterfaceSubClass; - internal Byte bInterfaceProtocol; - internal Byte iInterface; - } - - [StructLayout(LayoutKind.Sequential)] - protected struct WINUSB_PIPE_INFORMATION - { - internal USBD_PIPE_TYPE PipeType; - internal Byte PipeId; - internal UInt16 MaximumPacketSize; - internal Byte Interval; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - protected struct WINUSB_SETUP_PACKET - { - internal Byte RequestType; - internal Byte Request; - internal UInt16 Value; - internal UInt16 Index; - internal UInt16 Length; - } - - protected const Int32 DIF_PROPERTYCHANGE = 0x12; - protected const Int32 DICS_ENABLE = 1; - protected const Int32 DICS_DISABLE = 2; - protected const Int32 DICS_PROPCHANGE = 3; - protected const Int32 DICS_FLAG_GLOBAL = 1; - - [StructLayout(LayoutKind.Sequential)] - protected struct SP_CLASSINSTALL_HEADER - { - internal Int32 cbSize; - internal Int32 InstallFunction; - } - - [StructLayout(LayoutKind.Sequential)] - protected struct SP_PROPCHANGE_PARAMS - { - internal SP_CLASSINSTALL_HEADER ClassInstallHeader; - internal Int32 StateChange; - internal Int32 Scope; - internal Int32 HwProfile; - } - #endregion - - #region Protected Data Members - protected Guid m_Class = Guid.Empty; - protected String m_Path = String.Empty; - - protected IntPtr m_FileHandle = IntPtr.Zero; - private IntPtr m_WinUsbHandle = (IntPtr) INVALID_HANDLE_VALUE; - - protected Byte m_IntIn = 0xFF; - protected Byte m_IntOut = 0xFF; - protected Byte m_BulkIn = 0xFF; - protected Byte m_BulkOut = 0xFF; - - protected Boolean m_IsActive = false; - #endregion - - #region Static Helper Methods - public enum Notified { Ignore = 0x0000, Arrival = 0x8000, QueryRemove = 0x8001, Removal = 0x8004 }; - - public static Boolean RegisterNotify(IntPtr Form, Guid Class, ref IntPtr Handle, Boolean Window = true) - { - IntPtr devBroadcastDeviceInterfaceBuffer = IntPtr.Zero; - - try - { - DEV_BROADCAST_DEVICEINTERFACE devBroadcastDeviceInterface = new DEV_BROADCAST_DEVICEINTERFACE(); - Int32 Size = Marshal.SizeOf(devBroadcastDeviceInterface); - - devBroadcastDeviceInterface.dbcc_size = Size; - devBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; - devBroadcastDeviceInterface.dbcc_reserved = 0; - devBroadcastDeviceInterface.dbcc_classguid = Class; - - devBroadcastDeviceInterfaceBuffer = Marshal.AllocHGlobal(Size); - Marshal.StructureToPtr(devBroadcastDeviceInterface, devBroadcastDeviceInterfaceBuffer, true); - - Handle = RegisterDeviceNotification(Form, devBroadcastDeviceInterfaceBuffer, Window ? DEVICE_NOTIFY_WINDOW_HANDLE : DEVICE_NOTIFY_SERVICE_HANDLE); - - Marshal.PtrToStructure(devBroadcastDeviceInterfaceBuffer, devBroadcastDeviceInterface); - - return Handle != IntPtr.Zero; - } - catch (Exception ex) - { - Console.WriteLine("{0} {1}", ex.HelpLink, ex.Message); - throw; - } - finally - { - if (devBroadcastDeviceInterfaceBuffer != IntPtr.Zero) - { - Marshal.FreeHGlobal(devBroadcastDeviceInterfaceBuffer); - } - } - } - - public static Boolean UnregisterNotify(IntPtr Handle) - { - try - { - return UnregisterDeviceNotification(Handle); - } - catch (Exception ex) - { - Console.WriteLine("{0} {1}", ex.HelpLink, ex.Message); - throw; - } - } - #endregion - - #region Protected Methods - protected virtual Boolean Find(Guid Target, ref String Path, Int32 Instance = 0) - { - IntPtr detailDataBuffer = IntPtr.Zero; - IntPtr deviceInfoSet = IntPtr.Zero; - - try - { - SP_DEVICE_INTERFACE_DATA DeviceInterfaceData = new SP_DEVICE_INTERFACE_DATA(), da = new SP_DEVICE_INTERFACE_DATA(); - Int32 bufferSize = 0, memberIndex = 0; - - deviceInfoSet = SetupDiGetClassDevs(ref Target, IntPtr.Zero, IntPtr.Zero, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - - DeviceInterfaceData.cbSize = da.cbSize = Marshal.SizeOf(DeviceInterfaceData); - - while (SetupDiEnumDeviceInterfaces(deviceInfoSet, IntPtr.Zero, ref Target, memberIndex, ref DeviceInterfaceData)) - { - SetupDiGetDeviceInterfaceDetail(deviceInfoSet, ref DeviceInterfaceData, IntPtr.Zero, 0, ref bufferSize, ref da); - { - detailDataBuffer = Marshal.AllocHGlobal(bufferSize); - - Marshal.WriteInt32(detailDataBuffer, (IntPtr.Size == 4) ? (4 + Marshal.SystemDefaultCharSize) : 8); - - if (SetupDiGetDeviceInterfaceDetail(deviceInfoSet, ref DeviceInterfaceData, detailDataBuffer, bufferSize, ref bufferSize, ref da)) - { - IntPtr pDevicePathName = detailDataBuffer + 4; - - Path = Marshal.PtrToStringAuto(pDevicePathName).ToUpper(); - Marshal.FreeHGlobal(detailDataBuffer); - - if (memberIndex == Instance) return true; - } - else Marshal.FreeHGlobal(detailDataBuffer); - } - - memberIndex++; - } - } - catch (Exception ex) - { - Console.WriteLine("{0} {1}", ex.HelpLink, ex.Message); - throw; - } - finally - { - if (deviceInfoSet != IntPtr.Zero) - { - SetupDiDestroyDeviceInfoList(deviceInfoSet); - } - } - - return false; - } - - protected virtual Boolean GetDeviceInstance(ref String Instance) - { - IntPtr detailDataBuffer = IntPtr.Zero; - IntPtr deviceInfoSet = IntPtr.Zero; - - try - { - SP_DEVICE_INTERFACE_DATA DeviceInterfaceData = new SP_DEVICE_INTERFACE_DATA(), da = new SP_DEVICE_INTERFACE_DATA(); - Int32 bufferSize = 0, memberIndex = 0; - - deviceInfoSet = SetupDiGetClassDevs(ref m_Class, IntPtr.Zero, IntPtr.Zero, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - - DeviceInterfaceData.cbSize = da.cbSize = Marshal.SizeOf(DeviceInterfaceData); - - while (SetupDiEnumDeviceInterfaces(deviceInfoSet, IntPtr.Zero, ref m_Class, memberIndex, ref DeviceInterfaceData)) - { - SetupDiGetDeviceInterfaceDetail(deviceInfoSet, ref DeviceInterfaceData, IntPtr.Zero, 0, ref bufferSize, ref da); - { - detailDataBuffer = Marshal.AllocHGlobal(bufferSize); - - Marshal.WriteInt32(detailDataBuffer, (IntPtr.Size == 4) ? (4 + Marshal.SystemDefaultCharSize) : 8); - - if (SetupDiGetDeviceInterfaceDetail(deviceInfoSet, ref DeviceInterfaceData, detailDataBuffer, bufferSize, ref bufferSize, ref da)) - { - IntPtr pDevicePathName = detailDataBuffer + 4; - - String Current = Marshal.PtrToStringAuto(pDevicePathName).ToUpper(); - Marshal.FreeHGlobal(detailDataBuffer); - - if (Current == Path) - { - Int32 nBytes = 256; - IntPtr ptrInstanceBuf = Marshal.AllocHGlobal(nBytes); - - CM_Get_Device_ID(da.Flags, ptrInstanceBuf, nBytes, 0); - Instance = Marshal.PtrToStringAuto(ptrInstanceBuf).ToUpper(); - - Marshal.FreeHGlobal(ptrInstanceBuf); - return true; - } - } - else Marshal.FreeHGlobal(detailDataBuffer); - } - - memberIndex++; - } - } - catch (Exception ex) - { - Console.WriteLine("{0} {1}", ex.HelpLink, ex.Message); - throw; - } - finally - { - if (deviceInfoSet != IntPtr.Zero) - { - SetupDiDestroyDeviceInfoList(deviceInfoSet); - } - } - - return false; - } - - protected virtual Boolean GetDeviceHandle(String Path) - { - Int32 LastError; - - m_FileHandle = CreateFile(Path, (GENERIC_WRITE | GENERIC_READ), FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0); - - if (m_FileHandle == IntPtr.Zero || m_FileHandle == (IntPtr) INVALID_HANDLE_VALUE) - { - m_FileHandle = IntPtr.Zero; - LastError = GetLastError(); - } - - return !(m_FileHandle == IntPtr.Zero); - } - - protected virtual Boolean UsbEndpointDirectionIn(Int32 addr) - { - return (addr & 0x80) == 0x80; - } - - protected virtual Boolean UsbEndpointDirectionOut(Int32 addr) - { - return (addr & 0x80) == 0x00; - } - - protected virtual Boolean InitializeDevice() - { - try - { - USB_INTERFACE_DESCRIPTOR ifaceDescriptor = new USB_INTERFACE_DESCRIPTOR(); - WINUSB_PIPE_INFORMATION pipeInfo = new WINUSB_PIPE_INFORMATION(); - - if (WinUsb_QueryInterfaceSettings(m_WinUsbHandle, 0, ref ifaceDescriptor)) - { - for (Int32 i = 0; i < ifaceDescriptor.bNumEndpoints; i++) - { - WinUsb_QueryPipe(m_WinUsbHandle, 0, System.Convert.ToByte(i), ref pipeInfo); - - if (((pipeInfo.PipeType == USBD_PIPE_TYPE.UsbdPipeTypeBulk) & UsbEndpointDirectionIn(pipeInfo.PipeId))) - { - m_BulkIn = pipeInfo.PipeId; - WinUsb_FlushPipe(m_WinUsbHandle, m_BulkIn); - } - else if (((pipeInfo.PipeType == USBD_PIPE_TYPE.UsbdPipeTypeBulk) & UsbEndpointDirectionOut(pipeInfo.PipeId))) - { - m_BulkOut = pipeInfo.PipeId; - WinUsb_FlushPipe(m_WinUsbHandle, m_BulkOut); - } - else if ((pipeInfo.PipeType == USBD_PIPE_TYPE.UsbdPipeTypeInterrupt) & UsbEndpointDirectionIn(pipeInfo.PipeId)) - { - m_IntIn = pipeInfo.PipeId; - WinUsb_FlushPipe(m_WinUsbHandle, m_IntIn); - } - else if ((pipeInfo.PipeType == USBD_PIPE_TYPE.UsbdPipeTypeInterrupt) & UsbEndpointDirectionOut(pipeInfo.PipeId)) - { - m_IntOut = pipeInfo.PipeId; - WinUsb_FlushPipe(m_WinUsbHandle, m_IntOut); - } - } - - return true; - } - - return false; - } - catch (Exception ex) - { - Console.WriteLine("{0} {1}", ex.HelpLink, ex.Message); - throw; - } - } - - protected virtual Boolean RestartDevice(String InstanceId) - { - IntPtr deviceInfoSet = IntPtr.Zero; - - try - { - SP_DEVICE_INTERFACE_DATA deviceInterfaceData = new SP_DEVICE_INTERFACE_DATA(); - - deviceInterfaceData.cbSize = Marshal.SizeOf(deviceInterfaceData); - deviceInfoSet = SetupDiGetClassDevs(ref m_Class, IntPtr.Zero, IntPtr.Zero, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - - if (SetupDiOpenDeviceInfo(deviceInfoSet, InstanceId, IntPtr.Zero, 0, ref deviceInterfaceData)) - { - SP_PROPCHANGE_PARAMS props = new SP_PROPCHANGE_PARAMS(); - - props.ClassInstallHeader = new SP_CLASSINSTALL_HEADER(); - props.ClassInstallHeader.cbSize = Marshal.SizeOf(props.ClassInstallHeader); - props.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; - - props.Scope = DICS_FLAG_GLOBAL; - props.StateChange = DICS_PROPCHANGE; - props.HwProfile = 0x00; - - if (SetupDiSetClassInstallParams(deviceInfoSet, ref deviceInterfaceData, ref props, Marshal.SizeOf(props))) - { - return SetupDiChangeState(deviceInfoSet, ref deviceInterfaceData); - } - } - } - catch (Exception ex) - { - Console.WriteLine("{0} {1}", ex.HelpLink, ex.Message); - throw; - } - finally - { - if (deviceInfoSet != IntPtr.Zero) - { - SetupDiDestroyDeviceInfoList(deviceInfoSet); - } - } - - return false; - } - #endregion - - #region Interop Definitions - [DllImport("setupapi.dll", SetLastError = true)] - protected static extern Int32 SetupDiCreateDeviceInfoList(ref System.Guid ClassGuid, Int32 hwndParent); - - [DllImport("setupapi.dll", SetLastError = true)] - protected static extern Int32 SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet); - - [DllImport("setupapi.dll", SetLastError = true)] - protected static extern Boolean SetupDiEnumDeviceInterfaces(IntPtr DeviceInfoSet, IntPtr DeviceInfoData, ref System.Guid InterfaceClassGuid, Int32 MemberIndex, ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern IntPtr SetupDiGetClassDevs(ref System.Guid ClassGuid, IntPtr Enumerator, IntPtr hwndParent, Int32 Flags); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Boolean SetupDiGetDeviceInterfaceDetail(IntPtr DeviceInfoSet, ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData, IntPtr DeviceInterfaceDetailData, Int32 DeviceInterfaceDetailDataSize, ref Int32 RequiredSize, IntPtr DeviceInfoData); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Boolean SetupDiGetDeviceInterfaceDetail(IntPtr DeviceInfoSet, ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData, IntPtr DeviceInterfaceDetailData, Int32 DeviceInterfaceDetailDataSize, ref Int32 RequiredSize, ref SP_DEVICE_INTERFACE_DATA DeviceInfoData); - - [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] - protected static extern IntPtr RegisterDeviceNotification(IntPtr hRecipient, IntPtr NotificationFilter, Int32 Flags); - - [DllImport("user32.dll", SetLastError = true)] - protected static extern Boolean UnregisterDeviceNotification(IntPtr Handle); - - [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern IntPtr CreateFile(String lpFileName, UInt32 dwDesiredAccess, UInt32 dwShareMode, IntPtr lpSecurityAttributes, UInt32 dwCreationDisposition, UInt32 dwFlagsAndAttributes, UInt32 hTemplateFile); - - [DllImport("winusb.dll", SetLastError = true)] - protected static extern Boolean WinUsb_Initialize(IntPtr DeviceHandle, ref IntPtr InterfaceHandle); - - [DllImport("winusb.dll", SetLastError = true)] - protected static extern Boolean WinUsb_QueryInterfaceSettings(IntPtr InterfaceHandle, Byte AlternateInterfaceNumber, ref USB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor); - - [DllImport("winusb.dll", SetLastError = true)] - protected static extern Boolean WinUsb_QueryPipe(IntPtr InterfaceHandle, Byte AlternateInterfaceNumber, Byte PipeIndex, ref WINUSB_PIPE_INFORMATION PipeInformation); - - [DllImport("winusb.dll", SetLastError = true)] - protected static extern Boolean WinUsb_AbortPipe(IntPtr InterfaceHandle, Byte PipeID); - - [DllImport("winusb.dll", SetLastError = true)] - protected static extern Boolean WinUsb_FlushPipe(IntPtr InterfaceHandle, Byte PipeID); - - [DllImport("winusb.dll", SetLastError = true)] - protected static extern Boolean WinUsb_ControlTransfer(IntPtr InterfaceHandle, WINUSB_SETUP_PACKET SetupPacket, Byte[] Buffer, Int32 BufferLength, ref Int32 LengthTransferred, IntPtr Overlapped); - - [DllImport("winusb.dll", SetLastError = true)] - protected static extern Boolean WinUsb_ReadPipe(IntPtr InterfaceHandle, Byte PipeID, Byte[] Buffer, Int32 BufferLength, ref Int32 LengthTransferred, IntPtr Overlapped); - - [DllImport("winusb.dll", SetLastError = true)] - protected static extern Boolean WinUsb_WritePipe(IntPtr InterfaceHandle, Byte PipeID, Byte[] Buffer, Int32 BufferLength, ref Int32 LengthTransferred, IntPtr Overlapped); - - [DllImport("winusb.dll", SetLastError = true)] - protected static extern Boolean WinUsb_Free(IntPtr InterfaceHandle); - - [DllImport("advapi32.dll", SetLastError = true)] - public static extern IntPtr RegisterServiceCtrlHandlerEx(String ServiceName, ServiceControlHandlerEx Callback, IntPtr Context); - - [DllImport("kernel32.dll", SetLastError = true)] - protected static extern Boolean DeviceIoControl(IntPtr DeviceHandle, Int32 IoControlCode, Byte[] InBuffer, Int32 InBufferSize, Byte[] OutBuffer, Int32 OutBufferSize, ref Int32 BytesReturned, IntPtr Overlapped); - - [DllImport("kernel32.dll", SetLastError = true)] - protected static extern Boolean CloseHandle(IntPtr Handle); - - [DllImport("kernel32.dll")] - protected static extern Int32 GetLastError(); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Int32 CM_Get_Device_ID(Int32 dnDevInst, IntPtr Buffer, Int32 BufferLen, Int32 ulFlags); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Boolean SetupDiOpenDeviceInfo(IntPtr DeviceInfoSet, String DeviceInstanceId, IntPtr hwndParent, Int32 Flags, ref SP_DEVICE_INTERFACE_DATA DeviceInfoData); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Boolean SetupDiChangeState(IntPtr DeviceInfoSet, ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Boolean SetupDiSetClassInstallParams(IntPtr DeviceInfoSet, ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData, ref SP_PROPCHANGE_PARAMS ClassInstallParams, Int32 ClassInstallParamsSize); - #endregion - } -} diff --git a/Scp/ScpControl/ScpHub.Designer.cs b/Scp/ScpControl/ScpHub.Designer.cs deleted file mode 100644 index e0ff0fb..0000000 --- a/Scp/ScpControl/ScpHub.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace ScpControl -{ - partial class ScpHub - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - } - - #endregion - } -} diff --git a/Scp/ScpControl/ScpHub.cs b/Scp/ScpControl/ScpHub.cs deleted file mode 100644 index 7702e52..0000000 --- a/Scp/ScpControl/ScpHub.cs +++ /dev/null @@ -1,114 +0,0 @@ -using System; -using System.ComponentModel; - -namespace ScpControl -{ - public partial class ScpHub : Component - { - protected IntPtr m_Reference = IntPtr.Zero; - protected volatile Boolean m_Started = false; - - public event EventHandler Debug = null; - public event EventHandler Arrival = null; - public event EventHandler Report = null; - - protected virtual Boolean LogDebug(String Data) - { - DebugEventArgs args = new DebugEventArgs(Data); - - On_Debug(this, args); - - return true; - } - protected virtual Boolean LogArrival(IDsDevice Arrived) - { - ArrivalEventArgs args = new ArrivalEventArgs(Arrived); - - On_Arrival(this, args); - - return args.Handled; - } - - public Boolean Active - { - get { return m_Started; } - } - - - public ScpHub() - { - InitializeComponent(); - } - - public ScpHub(IContainer container) - { - container.Add(this); - - InitializeComponent(); - } - - - public virtual Boolean Open() - { - return true; - } - - public virtual Boolean Start() - { - return m_Started; - } - - public virtual Boolean Stop() - { - return !m_Started; - } - - public virtual Boolean Close() - { - if (m_Reference != IntPtr.Zero) ScpDevice.UnregisterNotify(m_Reference); - - return !m_Started; - } - - - public virtual Boolean Suspend() - { - return true; - } - - public virtual Boolean Resume() - { - return true; - } - - - public virtual DsPadId Notify(ScpDevice.Notified Notification, String Class, String Path) - { - switch (Notification) - { - case ScpDevice.Notified.Arrival: - break; - - case ScpDevice.Notified.Removal: - break; - } - - return DsPadId.None; - } - - protected virtual void On_Debug(object sender, DebugEventArgs e) - { - if (Debug != null) Debug(sender, e); - } - - protected virtual void On_Arrival(object sender, ArrivalEventArgs e) - { - if (Arrival != null) Arrival(this, e); - } - - protected virtual void On_Report(object sender, ReportEventArgs e) - { - if (Report != null) Report(sender, e); - } - } -} diff --git a/Scp/ScpControl/ScpMapper.Designer.cs b/Scp/ScpControl/ScpMapper.Designer.cs deleted file mode 100644 index a8f8a16..0000000 --- a/Scp/ScpControl/ScpMapper.Designer.cs +++ /dev/null @@ -1,44 +0,0 @@ -namespace ScpControl -{ - partial class ScpMapper - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.userMapper = new XmlMapper(this.components); - // - // userMapper - // - this.userMapper.Debug += new System.EventHandler(this.OnDebug); - - } - - #endregion - - private XmlMapper userMapper; - } -} diff --git a/Scp/ScpControl/ScpMapper.cs b/Scp/ScpControl/ScpMapper.cs deleted file mode 100644 index c8c2dca..0000000 --- a/Scp/ScpControl/ScpMapper.cs +++ /dev/null @@ -1,232 +0,0 @@ -using System; -using System.ComponentModel; - -using System.IO; -using System.Xml; -using System.Reflection; -using System.Threading; - -namespace ScpControl -{ - public partial class ScpMapper : Component - { - protected XmlDocument m_Map = new XmlDocument(); - protected static String m_FileName = "ScpMapper.xml"; - protected static String m_FilePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + m_FileName; - - protected FileSystemWatcher m_Watcher = new FileSystemWatcher(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), m_FileName); - protected DateTime m_Last = DateTime.Now; - - - protected Boolean m_Started = false; - public Boolean Started - { - get { return m_Started; } - } - - public event EventHandler Debug = null; - - protected virtual void LogDebug(String Data) - { - DebugEventArgs args = new DebugEventArgs(Data); - - if (Debug != null) - { - Debug(this, args); - } - } - - protected virtual void OnDebug(object sender, DebugEventArgs e) - { - if (Debug != null) - { - Debug(this, e); - } - } - - - protected void OnCreated(object sender, FileSystemEventArgs e) - { - Thread.Sleep(1000); Start(); - m_Last = DateTime.Now; - } - - protected void OnChanged(object sender, FileSystemEventArgs e) - { - if ((DateTime.Now - m_Last).TotalMilliseconds < 100) return; - - Thread.Sleep(1000); Reload(); - m_Last = DateTime.Now; - } - - protected void OnDeleted(object sender, FileSystemEventArgs e) - { - Stop(); - } - - protected void OnRenamed(object sender, RenamedEventArgs e) - { - if (e.Name == m_FilePath) - { - Thread.Sleep(1000); Start(); - m_Last = DateTime.Now; - } - else - { - Stop(); - } - } - - - public ScpMapper() - { - InitializeComponent(); - } - - public ScpMapper(IContainer container) - { - container.Add(this); - - InitializeComponent(); - } - - - public virtual Boolean Open() - { - m_Watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size; - - m_Watcher.Created += OnCreated; - m_Watcher.Changed += OnChanged; - m_Watcher.Deleted += OnDeleted; - m_Watcher.Renamed += OnRenamed; - - return true; - } - - public virtual Boolean Start() - { - if (!m_Started) - { - try - { - m_Watcher.EnableRaisingEvents = true; - - m_Map = new XmlDocument(); - - m_Map.Load(m_FilePath); - - m_Watcher.EnableRaisingEvents = m_Started = userMapper.Initialize(m_Map); - } - catch (Exception e) { LogDebug(String.Format("-- Mapper.Start [{0}]", e.Message)); } - } - - return m_Started; - } - - public virtual Boolean Stop() - { - if (m_Started) - { - try - { - m_Started = false; - - userMapper.Shutdown(); - } - catch (Exception e) { LogDebug(String.Format("-- Mapper.Stop [{0}]", e.Message)); } - } - - return !m_Started; - } - - public virtual Boolean Close() - { - m_Watcher.EnableRaisingEvents = false; - - m_Watcher.Created -= OnCreated; - m_Watcher.Changed -= OnChanged; - m_Watcher.Deleted -= OnDeleted; - m_Watcher.Renamed -= OnRenamed; - - return true; - } - - - public virtual Boolean Reload() - { - Boolean Updated = false; - - if (m_Started) - { - try - { - m_Map = new XmlDocument(); - - m_Map.Load(m_FilePath); - - m_Watcher.EnableRaisingEvents = Updated = userMapper.Initialize(m_Map); - } - catch (Exception e) { LogDebug(String.Format("-- Mapper.Reload [{0}]", e.Message)); } - } - - return Updated; - } - - - public virtual Boolean Remap(DsModel Type, Int32 PadId, String MacAddr, Byte[] Input, Byte[] Output) - { - Boolean Mapped = false; - - if (m_Started) - { - try - { - Mapped = userMapper.Remap(Type, PadId, MacAddr, Input, Output); - } - catch { } - } - - return Mapped; - } - - - public virtual String[] Profiles - { - get { return userMapper.Profiles; } - } - - public virtual String Active - { - get { return userMapper.Active; } - set - { - new Thread(() => - { - try - { - m_Map.SelectSingleNode("/ScpMapper/Active").FirstChild.Value = value; - m_Map.Save(m_FilePath); - } - catch { } - }).Start(); - } - } - - public virtual String Xml - { - get { return m_Map.InnerXml; } - set - { - new Thread(() => - { - try - { - m_Map.LoadXml(value); - m_Map.Save(m_FilePath); - } - catch { } - }).Start(); - } - } - } -} diff --git a/Scp/ScpControl/ScpMapper.resx b/Scp/ScpControl/ScpMapper.resx deleted file mode 100644 index 4db65f4..0000000 --- a/Scp/ScpControl/ScpMapper.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - False - - \ No newline at end of file diff --git a/Scp/ScpControl/ScpMapper.xml b/Scp/ScpControl/ScpMapper.xml deleted file mode 100644 index 42b5fba..0000000 --- a/Scp/ScpControl/ScpMapper.xml +++ /dev/null @@ -1,136 +0,0 @@ - - - - SCP Mapping File - 1.2.2.175 - Default - - - Default - Global - - - - - R2 - L2 - R1 - L1 - - - - - - R2 - L2 - - - - - Map Triggers - Global - - - - - None - None - - - - - - None - None - - - - - TB Swap - Global - - - - - None - None - None - None - - - - - - None - None - - - - - \ No newline at end of file diff --git a/Scp/ScpControl/ScpPadState.Designer.cs b/Scp/ScpControl/ScpPadState.Designer.cs deleted file mode 100644 index 262ea42..0000000 --- a/Scp/ScpControl/ScpPadState.Designer.cs +++ /dev/null @@ -1,49 +0,0 @@ -namespace ScpControl -{ - partial class ScpPadState - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - Enabled = false; - - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.tmUpdate = new ScpControl.ScpTimer(this.components); - // - // tmUpdate - // - this.tmUpdate.Enabled = false; - this.tmUpdate.Interval = ((uint)(10u)); - this.tmUpdate.Tag = null; - this.tmUpdate.Tick += new System.EventHandler(this.tmUpdate_Tick); - - } - - #endregion - - private ScpTimer tmUpdate; - } -} diff --git a/Scp/ScpControl/ScpPadState.cs b/Scp/ScpControl/ScpPadState.cs deleted file mode 100644 index 05c003c..0000000 --- a/Scp/ScpControl/ScpPadState.cs +++ /dev/null @@ -1,234 +0,0 @@ -using System; -using System.Windows.Forms; -using System.ComponentModel; - -namespace ScpControl -{ - public partial class ScpPadState : Component - { - protected ScpProxy m_Proxy = null; - - protected const Int32 Centre = 127; - protected const Int32 Accelerate = 75; - protected const Int32 Repeat_Delay = 40; - protected const Int32 Repeat_Rate = 5; - - protected DsPadId m_Pad = DsPadId.One; - - // Mouse - protected Int32 m_Threshold = 0; - protected Int32 m_vx = 0, m_vy = 0; - protected Int32 m_dx = 0, m_dy = 0; - - public ScpProxy Proxy - { - get { return m_Proxy; } - set { m_Proxy = value; Proxy.Packet += Sample; } - } - - public DsPadId Pad - { - get { return m_Pad; } - set { lock (this) { m_Pad = value; } } - } - - public Boolean Enabled - { - get { return tmUpdate.Enabled; } - set - { - if (tmUpdate.Enabled != value) - { - lock (this) - { - tmUpdate.Enabled = value; - - if (!value) - { - try { Reset(); } - catch { } - } - } - } - } - } - - - public Int32 Threshold - { - get { return m_Threshold; } - set { lock (this) { m_Threshold = value; } } - } - - public Int32 ScaleX - { - get { return m_vx; } - set { lock (this) { m_vx = value; } } - } - - public Int32 ScaleY - { - get { return m_vy; } - set { lock (this) { m_vy = value; } } - } - - - public ScpPadState() - { - InitializeComponent(); - } - - public ScpPadState(IContainer container) - { - container.Add(this); - - InitializeComponent(); - } - - - public virtual void Sample(object sender, DsPacket Packet) - { - lock (this) - { - if (Packet.Detail.Pad == Pad) - { - if (Packet.Detail.State == DsState.Connected) - { - switch (Packet.Detail.Model) - { - case DsModel.DS3: - - try { SampleDs3(Packet); } - catch { }; - break; - - case DsModel.DS4: - - try { SampleDs4(Packet); } - catch { } - break; - } - } - else - { - try { Reset(); } - catch { } - } - } - } - } - - - protected virtual void SampleDs3(DsPacket Packet) - { - m_dx = Mouse(Packet.Axis(Ds3Axis.RX), m_vx); - m_dy = Mouse(Packet.Axis(Ds3Axis.RY), m_vy); - } - - protected virtual void SampleDs4(DsPacket Packet) - { - m_dx = Mouse(Packet.Axis(Ds4Axis.RX), m_vx); - m_dy = Mouse(Packet.Axis(Ds4Axis.RY), m_vy); - } - - - protected virtual void Rumble(Byte Large, Byte Small) - { - if (Proxy != null) - { - Proxy.Rumble(Pad, Large, Small); - } - } - - protected virtual void Reset() - { - m_dx = m_dy = 0; - } - - protected virtual void Timer() - { - if (m_dx != 0 || m_dy != 0) KbmPost.Move(m_dx, m_dy); - } - - - protected virtual Int32 Mouse (Int32 Old, Int32 Scale) - { - Int32 New = 0; - - if (Old < (Centre - m_Threshold)) { New = -Scale; if (Old < (Centre - Accelerate)) New <<= 1; } - if (Old > (Centre + m_Threshold)) { New = +Scale; if (Old > (Centre + Accelerate)) New <<= 1; } - - return New; - } - - protected virtual Boolean Mouse (Boolean Old, Boolean New, KbmPost.MouseButtons Button) - { - if (Old != New) KbmPost.Button(Button, New); - - return New; - } - - protected virtual Boolean Button(Boolean Old, Boolean New, Keys Key, Boolean Extended) - { - if (Old != New) KbmPost.Key(Key, Extended, New); - - return New; - } - - protected virtual Int32 Repeat(Boolean Old, Int32 Count, Keys Key, Boolean Extended) - { - if (Old) - { - if ((++Count >= Repeat_Delay) && ((Count % Repeat_Rate) == 0)) - { - KbmPost.Key(Key, Extended, false); - KbmPost.Key(Key, Extended, true); - } - } - else - { - Count = 0; - } - - return Count; - } - - protected virtual Boolean Macro (Boolean Old, Boolean New, Keys[] Keys) - { - if (!Old && New) - { - foreach(Keys Key in Keys) - { - KbmPost.Key(Key, false, true ); - KbmPost.Key(Key, false, false); - } - } - - return New; - } - - protected virtual Boolean Wheel (Boolean Old, Boolean New, Boolean Vertical, Boolean Direction) - { - if (!Old && New) KbmPost.Wheel(Vertical, Direction ? 1 : -1); - - return New; - } - - protected virtual Boolean Toggle(Boolean Old, Boolean New, ref Boolean Target) - { - if (!Old && New) Target = !Target; - - return New; - } - - - internal virtual void tmUpdate_Tick(object sender, EventArgs e) - { - lock (this) - { - try { Timer(); } - catch { } - } - } - } -} diff --git a/Scp/ScpControl/ScpPadState.resx b/Scp/ScpControl/ScpPadState.resx deleted file mode 100644 index 0e7f0dd..0000000 --- a/Scp/ScpControl/ScpPadState.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - False - - \ No newline at end of file diff --git a/Scp/ScpControl/ScpProxy.Designer.cs b/Scp/ScpControl/ScpProxy.Designer.cs deleted file mode 100644 index 9b2a968..0000000 --- a/Scp/ScpControl/ScpProxy.Designer.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace ScpControl -{ - partial class ScpProxy - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.NativeFeed_Worker = new System.ComponentModel.BackgroundWorker(); - // - // NativeFeed_Worker - // - this.NativeFeed_Worker.WorkerReportsProgress = true; - this.NativeFeed_Worker.WorkerSupportsCancellation = true; - this.NativeFeed_Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.NativeFeed_Worker_DoWork); - } - - #endregion - - protected System.ComponentModel.BackgroundWorker NativeFeed_Worker; - - } -} diff --git a/Scp/ScpControl/ScpProxy.cs b/Scp/ScpControl/ScpProxy.cs deleted file mode 100644 index 5853571..0000000 --- a/Scp/ScpControl/ScpProxy.cs +++ /dev/null @@ -1,495 +0,0 @@ -using System; -using System.ComponentModel; -using System.Xml; -using System.Text; - -using System.Net; -using System.Net.Sockets; - -namespace ScpControl -{ - public partial class ScpProxy : Component - { - protected static Char[] m_Delim = new Char[] { '^' }; - - protected IPEndPoint m_ServerEp = new IPEndPoint(IPAddress.Loopback, 26760); - protected UdpClient m_Server = new UdpClient(); - - protected IPEndPoint m_ClientEp = new IPEndPoint(IPAddress.Loopback, 26761); - protected UdpClient m_Client = new UdpClient(); - - protected XmlDocument m_Map = new XmlDocument(); - protected XmlMapper m_Mapper = new XmlMapper(); - protected Boolean m_Active = false; - - public event EventHandler Packet = null; - - - public virtual XmlMapper Mapper - { - get { return m_Mapper; } - } - - public virtual String Active - { - get - { - String Active = String.Empty; - - try - { - Byte[] Send = { 0, 6 }; - - if (m_Server.Send(Send, Send.Length, m_ServerEp) == Send.Length) - { - IPEndPoint ReferenceEp = new IPEndPoint(IPAddress.Loopback, 0); - - Byte[] Buffer = m_Server.Receive(ref ReferenceEp); - - if (Buffer.Length > 0) - { - String Data = Encoding.Unicode.GetString(Buffer); - String[] Split = Data.Split(m_Delim, StringSplitOptions.RemoveEmptyEntries); - - Active = Split[0]; - } - } - } - catch { } - - return Active; - } - } - - public virtual Boolean Enabled - { - get - { - Boolean Native = false; - - try - { - Byte[] Send = { 0, 3 }; - - if (m_Server.Send(Send, Send.Length, m_ServerEp) == Send.Length) - { - IPEndPoint ReferenceEp = new IPEndPoint(IPAddress.Loopback, 0); - - Byte[] Buffer = m_Server.Receive(ref ReferenceEp); - - if (Buffer.Length > 0) - { - Native = Buffer[13] == 0; - } - } - } - catch { } - - return Native; - } - } - - - public ScpProxy() - { - InitializeComponent(); - } - - public ScpProxy(IContainer container) - { - container.Add(this); - - InitializeComponent(); - } - - - public virtual Boolean Start() - { - try - { - if (!m_Active) - { - m_Client = new UdpClient(m_ClientEp); - m_Client.Client.ReceiveTimeout = 500; - - NativeFeed_Worker.RunWorkerAsync(); - m_Active = true; - } - } - catch { } - - return m_Active; - } - - public virtual Boolean Stop() - { - try - { - if (m_Active) - { - NativeFeed_Worker.CancelAsync(); - m_Active = false; - } - } - catch { } - - return !m_Active; - } - - - public virtual Boolean Load() - { - Boolean Loaded = false; - - try - { - Byte[] Buffer = { 0, 0x08 }; - - if (m_Server.Send(Buffer, Buffer.Length, m_ServerEp) == Buffer.Length) - { - IPEndPoint ReferenceEp = new IPEndPoint(IPAddress.Loopback, 0); - - Buffer = m_Server.Receive(ref ReferenceEp); - - if (Buffer.Length > 0) - { - String Data = Encoding.UTF8.GetString(Buffer); - - m_Map.LoadXml(Data); - - m_Mapper.Initialize(m_Map); - } - } - - Loaded = true; - } - catch { } - - return Loaded; - } - - public virtual Boolean Save() - { - Boolean Saved = false; - - try - { - if (m_Active) - { - if (m_Mapper.Construct(ref m_Map)) - { - Byte[] Data = Encoding.UTF8.GetBytes(m_Map.InnerXml); - Byte[] Buffer = new Byte[Data.Length + 2]; - - Buffer[1] = 0x09; - Array.Copy(Data, 0, Buffer, 2, Data.Length); - - m_Client.Send(Buffer, Buffer.Length, m_ServerEp); - Saved = true; - } - } - } - catch { } - - return Saved; - } - - - public virtual Boolean Select(Profile Target) - { - Boolean Selected = false; - - try - { - if (m_Active) - { - Byte[] Data = Encoding.Unicode.GetBytes(Target.Name); - Byte[] Send = new Byte[Data.Length + 2]; - - Send[1] = 0x07; - Array.Copy(Data, 0, Send, 2, Data.Length); - - m_Server.Send(Send, Send.Length, m_ServerEp); - - SetDefault(Target); - Selected = true; - } - } - catch { } - - return Selected; - } - - public virtual DsDetail Detail(DsPadId Pad) - { - DsDetail Detail = null; - - try - { - Byte[] Buffer = { (Byte) Pad, 0x0A }; - - if (m_Server.Send(Buffer, Buffer.Length, m_ServerEp) == Buffer.Length) - { - IPEndPoint ReferenceEp = new IPEndPoint(IPAddress.Loopback, 0); - - Buffer = m_Server.Receive(ref ReferenceEp); - - if (Buffer.Length > 0) - { - Byte[] Local = new Byte[6]; Array.Copy(Buffer, 5, Local, 0, Local.Length); - - Detail = new DsDetail((DsPadId) Buffer[0], (DsState) Buffer[1], (DsModel) Buffer[2], Local, (DsConnection) Buffer[3], (DsBattery) Buffer[4]); - } - } - } - catch { } - - return Detail; - } - - - public virtual Boolean Rumble(DsPadId Pad, Byte Large, Byte Small) - { - Boolean Rumbled = false; - - try - { - if (m_Active) - { - Byte[] Buffer = { (Byte) Pad, 0x01, Large, Small }; - - m_Server.Send(Buffer, Buffer.Length, m_ServerEp); - Rumbled = true; - } - } - catch { } - - return Rumbled; - } - - public virtual Boolean Remap(String Target, DsPacket Packet) - { - Boolean Remapped = false; - - try - { - if (m_Active) - { - Byte[] Output = new Byte[Packet.Native.Length]; - - switch (Packet.Detail.Model) - { - case DsModel.DS3: if (m_Mapper.RemapDs3(m_Mapper.Map[Target], Packet.Native, Output)) { Array.Copy(Output, Packet.Native, Output.Length); Packet.Remapped(); } break; - case DsModel.DS4: if (m_Mapper.RemapDs4(m_Mapper.Map[Target], Packet.Native, Output)) { Array.Copy(Output, Packet.Native, Output.Length); Packet.Remapped(); } break; - } - - Remapped = true; - } - } - catch { } - - return Remapped; - } - - - public virtual Boolean SetDefault(Profile Profile) - { - Boolean Set = true; - - try - { - foreach (Profile Item in m_Mapper.Map.Values) - { - Item.Default = false; - } - - Profile.Default = true; - } - catch { Set = false; } - - return Set; - } - - - protected virtual void NativeFeed_Worker_DoWork(object sender, DoWorkEventArgs e) - { - DsPacket Packet = new DsPacket(); - Byte[] Buffer = new Byte[ReportEventArgs.Length]; - - while(!NativeFeed_Worker.CancellationPending) - { - try - { - m_Client.Client.Receive(Buffer); - LogPacket(Packet.Load(Buffer)); - } - catch { } - } - - m_Client.Close(); - e.Cancel = true; - } - - protected virtual void LogPacket(DsPacket Data) - { - if (Packet != null) - { - Packet(this, Data); - } - } - } - - public class DsPacket : EventArgs - { - protected Int32 m_Packet; - protected DsDetail m_Detail = new DsDetail(); - protected Byte[] m_Native = new Byte[96]; - protected Byte[] m_Local = new Byte[6]; - protected Ds3Button m_Ds3Button = Ds3Button.None; - protected Ds4Button m_Ds4Button = Ds4Button.None; - - internal DsPacket() { } - - internal DsPacket Load(Byte[] Native) - { - Array.Copy(Native, (Int32) DsOffset.Address, m_Local, 0, m_Local.Length); - - m_Detail.Load( - (DsPadId) Native[(Int32) DsOffset.Pad ], - (DsState) Native[(Int32) DsOffset.State ], - (DsModel) Native[(Int32) DsOffset.Model ], - m_Local, - (DsConnection) Native[(Int32) DsOffset.Connection], - (DsBattery) Native[(Int32) DsOffset.Battery ] - ); - - m_Packet = (Int32)(Native[4] << 0 | Native[5] << 8 | Native[6] << 16 | Native[7] << 24); - Array.Copy(Native, m_Native, m_Native.Length); - - switch(m_Detail.Model) - { - case DsModel.DS3: m_Ds3Button = (Ds3Button)((Native[10] << 0) | (Native[11] << 8) | (Native[12] << 16) | (Native[13] << 24)); break; - case DsModel.DS4: m_Ds4Button = (Ds4Button)((Native[13] << 0) | (Native[14] << 8) | ((Native[15] & 0x03) << 16)); break; - } - - return this; - } - - - internal Byte[] Native - { - get { return m_Native; } - } - - internal void Remapped() - { - switch (m_Detail.Model) - { - case DsModel.DS3: m_Ds3Button = (Ds3Button)((Native[10] << 0) | (Native[11] << 8) | (Native[12] << 16) | (Native[13] << 24)); break; - case DsModel.DS4: m_Ds4Button = (Ds4Button)((Native[13] << 0) | (Native[14] << 8) | ((Native[15] & 0x03) << 16)); break; - } - } - - - public DsDetail Detail - { - get { return m_Detail; } - } - - - public Boolean Button(Ds3Button Flag) - { - if (m_Detail.Model != DsModel.DS3) throw new InvalidEnumArgumentException(); - - return m_Ds3Button.HasFlag(Flag); - } - - public Boolean Button(Ds4Button Flag) - { - if (m_Detail.Model != DsModel.DS4) throw new InvalidEnumArgumentException(); - - return m_Ds4Button.HasFlag(Flag); - } - - - public Byte Axis(Ds3Axis Offset) - { - if (m_Detail.Model != DsModel.DS3) throw new InvalidEnumArgumentException(); - - return Native[(Int32) Offset]; - } - - public Byte Axis(Ds4Axis Offset) - { - if (m_Detail.Model != DsModel.DS4) throw new InvalidEnumArgumentException(); - - return Native[(Int32) Offset]; - } - } - - public class DsDetail - { - protected DsPadId m_Serial; - protected DsModel m_Model; - protected Byte[] m_Local = new Byte[6]; - protected DsConnection m_Mode; - protected DsBattery m_Charge; - protected DsState m_State; - - internal DsDetail() { } - - internal DsDetail(DsPadId PadId, DsState State, DsModel Model, Byte[] Mac, DsConnection Mode, DsBattery Level) - { - m_Serial = PadId; - m_State = State; - m_Model = Model; - m_Mode = Mode; - m_Charge = Level; - - Array.Copy(Mac, m_Local, m_Local.Length); - } - - internal DsDetail Load(DsPadId PadId, DsState State, DsModel Model, Byte[] Mac, DsConnection Mode, DsBattery Level) - { - m_Serial = PadId; - m_State = State; - m_Model = Model; - m_Mode = Mode; - m_Charge = Level; - - Array.Copy(Mac, m_Local, m_Local.Length); - - return this; - } - - public DsPadId Pad - { - get { return m_Serial; } - } - - public DsState State - { - get { return m_State; } - } - - public DsModel Model - { - get { return m_Model; } - } - - public String Local - { - get { return String.Format("{0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}", m_Local[0], m_Local[1], m_Local[2], m_Local[3], m_Local[4], m_Local[5]); } - } - - public DsConnection Mode - { - get { return m_Mode; } - } - - public DsBattery Charge - { - get { return m_Charge; } - } - } -} diff --git a/Scp/ScpControl/ScpProxy.resx b/Scp/ScpControl/ScpProxy.resx deleted file mode 100644 index fd36430..0000000 --- a/Scp/ScpControl/ScpProxy.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - False - - \ No newline at end of file diff --git a/Scp/ScpControl/ScpTimer.Designer.cs b/Scp/ScpControl/ScpTimer.Designer.cs deleted file mode 100644 index 9f45cb6..0000000 --- a/Scp/ScpControl/ScpTimer.Designer.cs +++ /dev/null @@ -1,38 +0,0 @@ -namespace ScpControl -{ - partial class ScpTimer - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - Stop(); - - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - } - - #endregion - } -} diff --git a/Scp/ScpControl/ScpTimer.cs b/Scp/ScpControl/ScpTimer.cs deleted file mode 100644 index ab3c228..0000000 --- a/Scp/ScpControl/ScpTimer.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using System.ComponentModel; - -using System.Runtime.InteropServices; - -namespace ScpControl -{ - public partial class ScpTimer : Component - { - [Flags] - protected enum EventFlags : uint - { - TIME_ONESHOT = 0, - TIME_PERIODIC = 1, - } - - protected delegate void TimerCallback(UInt32 uTimerId, UInt32 uMsg, UIntPtr dwUser, UIntPtr dw1, UIntPtr dw2); - - [DllImport("Winmm", CharSet = CharSet.Auto)] - private static extern UInt32 timeSetEvent(UInt32 uDelay, UInt32 uResolution, TimerCallback lpTimeProc, UIntPtr dwUser, EventFlags Flags); - - [DllImport("Winmm", CharSet = CharSet.Auto)] - private static extern UInt32 timeKillEvent(UInt32 uTimerId); - - protected UInt32 m_Id = 0, m_Interval = 100; - protected EventArgs m_Args = new EventArgs(); - protected TimerCallback m_Callback; - - public event EventHandler Tick; - - public object Tag - { - get; - set; - } - - public Boolean Enabled - { - get { return m_Id != 0; } - set - { - lock (this) - { - if (Enabled != value) - { - if (value) - { - Start(); - } - else - { - Stop(); - } - } - } - } - } - - public UInt32 Interval - { - get { return m_Interval; } - set { m_Interval = value; } - } - - - public ScpTimer() - { - InitializeComponent(); - - m_Callback = new TimerCallback(OnTick); - } - - public ScpTimer(IContainer container) - { - container.Add(this); - - InitializeComponent(); - - m_Callback = new TimerCallback(OnTick); - } - - - public void Start() - { - lock (this) - { - if (!Enabled) - { - m_Id = timeSetEvent(Interval, 0, m_Callback, UIntPtr.Zero, EventFlags.TIME_PERIODIC); - } - } - } - - public void Stop() - { - lock (this) - { - if (Enabled) - { - timeKillEvent(m_Id); - m_Id = 0; - } - } - } - - - protected void OnTick(UInt32 uTimerID, UInt32 uMsg, UIntPtr dwUser, UIntPtr dw1, UIntPtr dw2) - { - if (Tick != null) - { - Tick(this, m_Args); - } - } - } -} diff --git a/Scp/ScpControl/ScpUtil.cs b/Scp/ScpControl/ScpUtil.cs deleted file mode 100644 index abd0868..0000000 --- a/Scp/ScpControl/ScpUtil.cs +++ /dev/null @@ -1,1268 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Windows.Forms; - -using System.IO; -using System.Reflection; -using System.Xml; -using System.Runtime.InteropServices; - -using System.Configuration; -using Microsoft.Win32; -using System.Collections; -using System.Collections.Specialized; - -namespace ScpControl -{ - public enum DsOffset : int { Pad = 0, State = 1, Battery = 2, Connection = 3, Model = 89, Address = 90 }; - public enum DsState { Disconnected = 0x00, Reserved = 0x01, Connected = 0x02 }; - public enum DsConnection { None = 0x00, USB = 0x01, BTH = 0x02 }; - public enum DsBattery : byte { None = 0x00, Dieing = 0x01, Low = 0x02, Medium = 0x03, High = 0x04, Full = 0x05, Charging = 0xEE, Charged = 0xEF }; - public enum DsPadId : byte { None = 0xFF, One = 0x00, Two = 0x01, Three = 0x02, Four = 0x03, All = 0x04 }; - public enum DsModel : byte { None = 0, DS3 = 1, DS4 = 2, } - public enum DsMatch { None = 0, Global = 1, Pad = 2, Mac = 3, } - - [Flags] - public enum X360Button : uint - { - None = 0, - - Up = 1 << 0, - Down = 1 << 1, - Left = 1 << 2, - Right = 1 << 3, - - Start = 1 << 4, - Back = 1 << 5, - LS = 1 << 6, - RS = 1 << 7, - - LB = 1 << 8, - RB = 1 << 9, - - Guide = 1 << 10, - - A = 1 << 12, - B = 1 << 13, - X = 1 << 14, - Y = 1 << 15, - } - public enum X360Axis - { - BT_Lo = 10, - BT_Hi = 11, - - LT = 12, - RT = 13, - - LX_Lo = 14, - LX_Hi = 15, - LY_Lo = 16, - LY_Hi = 17, - - RX_Lo = 18, - RX_Hi = 19, - RY_Lo = 20, - RY_Hi = 21, - } - - [Flags] - public enum Ds3Button : uint - { - None = 0, - - Select = 1 << 0, - L3 = 1 << 1, - R3 = 1 << 2, - Start = 1 << 3, - - Up = 1 << 4, - Right = 1 << 5, - Down = 1 << 6, - Left = 1 << 7, - - L2 = 1 << 8, - R2 = 1 << 9, - L1 = 1 << 10, - R1 = 1 << 11, - - Triangle = 1 << 12, - Circle = 1 << 13, - Cross = 1 << 14, - Square = 1 << 15, - - PS = 1 << 16, - } - public enum Ds3Axis - { - None = 0, - - LX = 14, - LY = 15, - RX = 16, - RY = 17, - - Up = 22, - Right = 23, - Down = 24, - Left = 25, - - L2 = 26, - R2 = 27, - L1 = 28, - R1 = 29, - - Triangle = 30, - Circle = 31, - Cross = 32, - Square = 33, - } - - [Flags] - public enum Ds4Button : uint - { - None = 0, - - Up = 1 << 0, - Right = 1 << 1, - Down = 1 << 2, - Left = 1 << 3, - - Square = 1 << 4, - Cross = 1 << 5, - Circle = 1 << 6, - Triangle = 1 << 7, - - L1 = 1 << 8, - R1 = 1 << 9, - L2 = 1 << 10, - R2 = 1 << 11, - - Share = 1 << 12, - Options = 1 << 13, - L3 = 1 << 14, - R3 = 1 << 15, - - PS = 1 << 16, - TouchPad = 1 << 17, - } - public enum Ds4Axis - { - None = 0, - - LX = 9, - LY = 10, - RX = 11, - RY = 12, - - L2 = 16, - R2 = 17, - } - - public class Ds3ButtonMap : SortedDictionary { } - public class Ds3AxisMap : SortedDictionary { } - public class Ds3ButtonAxisMap : SortedDictionary { } - - public class Ds4ButtonMap : SortedDictionary { } - public class Ds4AxisMap : SortedDictionary { } - public class Ds4ButtonAxisMap : SortedDictionary { } - - public class ProfileMap : SortedDictionary { } - - public class Profile - { - protected String m_Name, m_Type, m_Pad = String.Empty, m_Mac = String.Empty; - protected DsMatch m_Match = DsMatch.Global; - protected Boolean m_Default = false; - - protected Ds3ButtonMap m_Ds3ButtonMap = new Ds3ButtonMap(); - protected Ds3AxisMap m_Ds3AxisMap = new Ds3AxisMap(); - protected Ds4ButtonMap m_Ds4ButtonMap = new Ds4ButtonMap(); - protected Ds4AxisMap m_Ds4AxisMap = new Ds4AxisMap(); - - public Profile(String Name) - { - m_Name = Name; - } - - public Profile(Boolean Default, String Name, String Type, String Qualifier) - { - m_Name = Name; - m_Type = Type; - - m_Default = Default; - m_Match = (DsMatch) Enum.Parse(typeof(DsMatch), Type, true); - - switch(m_Match) - { - case DsMatch.Pad: m_Pad = Qualifier; break; - case DsMatch.Mac: m_Mac = Qualifier; break; - } - } - - - public String Name - { - get { return m_Name; } - } - - public String Type - { - get { return m_Type; } - } - - public DsMatch Match - { - get { return m_Match; } - } - - public String Qualifier - { - get - { - String Qualifier = String.Empty; - - switch(m_Match) - { - case DsMatch.Pad: Qualifier = m_Pad; break; - case DsMatch.Mac: Qualifier = m_Mac; break; - } - - return Qualifier; - } - } - - public Boolean Default - { - get { return m_Default; } - set { m_Default = value; } - } - - - public Ds3ButtonMap Ds3Button - { - get { return m_Ds3ButtonMap; } - } - - public Ds3AxisMap Ds3Axis - { - get { return m_Ds3AxisMap; } - } - - public Ds4ButtonMap Ds4Button - { - get { return m_Ds4ButtonMap; } - } - - public Ds4AxisMap Ds4Axis - { - get { return m_Ds4AxisMap; } - } - - - public DsMatch Usage(String Pad, String Mac) - { - DsMatch Matched = DsMatch.None; - - switch (m_Match) - { - case DsMatch.Mac: - if (Mac == m_Mac) Matched = DsMatch.Mac; - break; - case DsMatch.Pad: - if (Pad == m_Pad) Matched = DsMatch.Pad; - break; - case DsMatch.Global: - if (m_Default) Matched = DsMatch.Global; - break; - } - - return Matched; - } - } - - public interface IDsDevice - { - DsPadId PadId - { - get; - set; - } - - DsConnection Connection - { - get; - } - - DsState State - { - get; - } - - DsBattery Battery - { - get; - } - - DsModel Model - { - get; - } - - Byte[] BD_Address - { - get; - } - - String Local - { - get; - } - - String Remote - { - get; - } - - Boolean Start(); - - Boolean Rumble(Byte Large, Byte Small); - - Boolean Pair(Byte[] Master); - - Boolean Disconnect(); - } - - public interface IBthDevice - { - Int32 HCI_Disconnect(BthHandle Handle); - - Int32 HID_Command(Byte[] Handle, Byte[] Channel, Byte[] Data); - } - - public class BthHandle : IEquatable, IComparable - { - protected Byte[] m_Handle = new Byte[2] { 0x00, 0x00 }; - protected UInt16 m_Value; - - public BthHandle(Byte Lsb, Byte Msb) - { - m_Handle[0] = Lsb; - m_Handle[1] = Msb; - - m_Value = (UInt16)(m_Handle[0] | (UInt16)(m_Handle[1] << 8)); - } - - public BthHandle(Byte[] Handle) : this(Handle[0], Handle[1]) - { - } - - public BthHandle(UInt16 Short) : this((Byte)((Short >> 0) & 0xFF), (Byte)((Short >> 8) & 0xFF)) - { - } - - public virtual Byte[] Bytes - { - get { return m_Handle; } - } - - public virtual UInt16 Short - { - get { return m_Value; } - } - - public override String ToString() - { - return String.Format("{0:X4}", m_Value); - } - - #region IEquatable Members - - public virtual bool Equals(BthHandle other) - { - return m_Value == other.m_Value; - } - - public virtual bool Equals(Byte Lsb, Byte Msb) - { - return m_Handle[0] == Lsb && m_Handle[1] == Msb; - } - - public virtual bool Equals(Byte[] other) - { - return Equals(other[0], other[1]); - } - - #endregion - - #region IComparable Members - - public virtual int CompareTo(BthHandle other) - { - return m_Value.CompareTo(other.m_Value); - } - - #endregion - } - - public class DsNull : IDsDevice - { - protected DsPadId m_PadId = DsPadId.None; - - public DsNull(DsPadId PadId) - { - m_PadId = PadId; - } - - public DsPadId PadId - { - get { return m_PadId; } - set { m_PadId = value; } - } - - public DsConnection Connection - { - get { return DsConnection.None; } - } - - public DsState State - { - get { return DsState.Disconnected; } - } - - public DsBattery Battery - { - get { return DsBattery.None; } - } - - public DsModel Model - { - get { return DsModel.None; } - } - - public Byte[] BD_Address - { - get { return new Byte[6]; } - } - - public string Local - { - get { return "00:00:00:00:00:00"; } - } - - public string Remote - { - get { return "00:00:00:00:00:00"; } - } - - public bool Start() - { - return true; - } - - public bool Rumble(Byte Left, Byte Right) - { - return true; - } - - public bool Pair(Byte[] Master) - { - return true; - } - - public bool Disconnect() - { - return true; - } - - public override String ToString() - { - return String.Format("Pad {0} : {1}", 1 + (Int32) PadId, DsState.Disconnected); - } - } - - public class ArrivalEventArgs : EventArgs - { - protected IDsDevice m_Device = null; - protected Boolean m_Handled = false; - - public ArrivalEventArgs(IDsDevice Device) - { - m_Device = Device; - } - - public IDsDevice Device - { - get { return m_Device; } - set { m_Device = value; } - } - - public Boolean Handled - { - get { return m_Handled; } - set { m_Handled = value; } - } - } - - public class DebugEventArgs : EventArgs - { - protected DateTime m_Time = DateTime.Now; - protected String m_Data = String.Empty; - - public DebugEventArgs(String Data) - { - m_Data = Data; - } - - public DateTime Time - { - get { return m_Time; } - } - - public String Data - { - get { return m_Data; } - } - } - - public class ReportEventArgs : EventArgs - { - public const Int32 Length = 96; - - protected DsPadId m_Pad = DsPadId.None; - protected volatile Byte[] m_Report = new Byte[Length]; - - public ReportEventArgs() - { - } - - public ReportEventArgs(DsPadId Pad) - { - m_Pad = Pad; - } - - public DsPadId Pad - { - get { return m_Pad; } - set { m_Pad = value; } - } - - public Byte[] Report - { - get { return m_Report; } - } - } - - public class HCI - { - public enum Event : byte - { - HCI_Inquiry_Complete_EV = 0x01, - HCI_Inquiry_Result_EV = 0x02, - HCI_Connection_Complete_EV = 0x03, - HCI_Connection_Request_EV = 0x04, - HCI_Disconnection_Complete_EV = 0x05, - HCI_Authentication_Complete_EV = 0x06, - HCI_Remote_Name_Request_Complete_EV = 0x07, - HCI_Encryption_Change_EV = 0x08, - HCI_Change_Connection_Link_Key_Complete_EV = 0x09, - HCI_Master_Link_Key_Complete_EV = 0x0A, - HCI_Read_Remote_Supported_Features_Complete_EV = 0x0B, - HCI_Read_Remote_Version_Information_Complete_EV = 0x0C, - HCI_QoS_Setup_Complete_EV = 0x0D, - HCI_Command_Complete_EV = 0x0E, - HCI_Command_Status_EV = 0x0F, - HCI_Hardware_Error_EV = 0x10, - HCI_Flush_Occurred_EV = 0x11, - HCI_Role_Change_EV = 0x12, - HCI_Number_Of_Completed_Packets_EV = 0x13, - HCI_Mode_Change_EV = 0x14, - HCI_Return_Link_Keys_EV = 0x15, - HCI_PIN_Code_Request_EV = 0x16, - HCI_Link_Key_Request_EV = 0x17, - HCI_Link_Key_Notification_EV = 0x18, - HCI_Loopback_Command_EV = 0x19, - HCI_Data_Buffer_Overflow_EV = 0x1A, - HCI_Max_Slots_Change_EV = 0x1B, - HCI_Read_Clock_Offset_Complete_EV = 0x1C, - HCI_Connection_Packet_Type_Changed_EV = 0x1D, - HCI_QoS_Violation_EV = 0x1E, - HCI_Page_Scan_Repetition_Mode_Change_EV = 0x20, - HCI_Flow_Specification_Complete_EV = 0x21, - HCI_Inquiry_Result_With_RSSI_EV = 0x22, - HCI_Read_Remote_Extended_Features_Complete_EV = 0x23, - HCI_Synchronous_Connection_Complete_EV = 0x2C, - HCI_Synchronous_Connection_Changed_EV = 0x2D, - HCI_Sniff_Subrating_EV = 0x2E, - HCI_Extended_Inquiry_Result_EV = 0x2F, - HCI_IO_Capability_Request_EV = 0x31, - HCI_IO_Capability_Response_EV = 0x32, - HCI_User_Confirmation_Request_EV = 0x33, - HCI_Simple_Pairing_Complete_EV = 0x36, - } - - public enum Command : ushort - { - HCI_Null = 0x0000, - HCI_Accept_Connection_Request = 0x0409, - HCI_Reject_Connection_Request = 0x040A, - HCI_Remote_Name_Request = 0x0419, - HCI_Reset = 0x0C03, - HCI_Write_Scan_Enable = 0x0C1A, - HCI_Read_Buffer_Size = 0x1005, - HCI_Read_BD_ADDR = 0x1009, - HCI_Read_Local_Version_Info = 0x1001, - HCI_Create_Connection = 0x0405, - HCI_Disconnect = 0x0406, - HCI_Link_Key_Request_Reply = 0x040B, - HCI_Link_Key_Request_Negative_Reply = 0x040C, - HCI_PIN_Code_Request_Reply = 0x040D, - HCI_PIN_Code_Request_Negative_Reply = 0x040E, - HCI_Inquiry = 0x0401, - HCI_Inquiry_Cancel = 0x0402, - HCI_Write_Inquiry_Transmit_Power_Level = 0x0C59, - HCI_Write_Inquiry_Mode = 0x0C45, - HCI_Write_Simple_Pairing_Mode = 0x0C56, - HCI_Write_Simple_Pairing_Debug_Mode = 0x1804, - HCI_Write_Authentication_Enable = 0x0C20, - HCI_Write_Page_Timeout = 0x0C18, - HCI_Write_Page_Scan_Activity = 0x0C1C, - HCI_Write_Page_Scan_Type = 0x0C47, - HCI_Write_Inquiry_Scan_Activity = 0x0C1E, - HCI_Write_Inquiry_Scan_Type = 0x0C43, - HCI_Write_Class_of_Device = 0x0C24, - HCI_Write_Extended_Inquiry_Response = 0x0C52, - HCI_Write_Local_Name = 0x0C13, - HCI_Set_Event_Mask = 0x0C01, - HCI_IO_Capability_Request_Reply = 0x042B, - HCI_User_Confirmation_Request_Reply = 0x042C, - HCI_Set_Connection_Encryption = 0x0413, - HCI_Authentication_Requested = 0x0411, - HCI_Change_Connection_Link_Key = 0x0415, - HCI_Read_Stored_Link_Key = 0x0C0D, - HCI_Write_Stored_Link_Key = 0x0C11, - HCI_Delete_Stored_Link_Key = 0x0C12, - } - } - - public class L2CAP - { - public enum PSM - { - HID_Service = 0x01, - HID_Command = 0x11, - HID_Interrupt = 0x13, - } - - public enum Code : byte - { - L2CAP_Reserved = 0x00, - L2CAP_Command_Reject = 0x01, - L2CAP_Connection_Request = 0x02, - L2CAP_Connection_Response = 0x03, - L2CAP_Configuration_Request = 0x04, - L2CAP_Configuration_Response = 0x05, - L2CAP_Disconnection_Request = 0x06, - L2CAP_Disconnection_Response = 0x07, - L2CAP_Echo_Request = 0x08, - L2CAP_Echo_Response = 0x09, - L2CAP_Information_Request = 0x0A, - L2CAP_Information_Response = 0x0B, - } - } - - public class Global - { - protected static BackingStore m_Config = new BackingStore(); - protected static Byte[] m_BD_Link = { 0x56, 0xE8, 0x81, 0x38, 0x08, 0x06, 0x51, 0x41, 0xC0, 0x7F, 0x12, 0xAA, 0xD9, 0x66, 0x3C, 0xCE }; - - protected static Int32 m_IdleTimeout = 60000; - protected static Int32 m_Latency = 16; - - public static Boolean FlipLX - { - get { return m_Config.LX; } - set { m_Config.LX = value; } - } - - public static Boolean FlipLY - { - get { return m_Config.LY; } - set { m_Config.LY = value; } - } - - public static Boolean FlipRX - { - get { return m_Config.RX; } - set { m_Config.RX = value; } - } - - public static Boolean FlipRY - { - get { return m_Config.RY; } - set { m_Config.RY = value; } - } - - public static Boolean DisableLED - { - get { return m_Config.LED; } - set { m_Config.LED = value; } - } - - public static Boolean DisableRumble - { - get { return m_Config.Rumble; } - set { m_Config.Rumble = value; } - } - - public static Boolean SwapTriggers - { - get { return m_Config.Triggers; } - set { m_Config.Triggers = value; } - } - - public static Boolean DisableLightBar - { - get { return m_Config.Brightness == 0; } - } - - public static Boolean IdleDisconnect - { - get { return m_Config.Idle != 0; } - } - - public static Int32 IdleTimeout - { - get { return m_Config.Idle; } - set { m_Config.Idle = value * m_IdleTimeout; } - } - - public static Int32 Latency - { - get { return m_Config.Latency; } - set { m_Config.Latency = value * m_Latency; } - } - - public static Byte DeadZoneL - { - get { return m_Config.DeadL; } - set { m_Config.DeadL = value; } - } - - public static Byte DeadZoneR - { - get { return m_Config.DeadR; } - set { m_Config.DeadR = value; } - } - - public static Boolean DisableNative - { - get { return m_Config.Native; } - set { m_Config.Native = value; } - } - - public static Boolean DisableSSP - { - get { return m_Config.SSP; } - set { m_Config.SSP = value; } - } - - public static Byte Brightness - { - get { return m_Config.Brightness; } - set { m_Config.Brightness = value; } - } - - public static Int32 Bus - { - get { return m_Config.Bus; } - set { m_Config.Bus = value; } - } - - public static Boolean Repair - { - get { return m_Config.Repair; } - set { m_Config.Repair = value; } - } - - public static Byte[] Packed - { - get - { - Byte[] Buffer = new Byte[17]; - - Buffer[ 1] = 0x03; - Buffer[ 2] = (Byte)(IdleTimeout / m_IdleTimeout); - Buffer[ 3] = (Byte)(FlipLX ? 0x01 : 0x00); - Buffer[ 4] = (Byte)(FlipLY ? 0x01 : 0x00); - Buffer[ 5] = (Byte)(FlipRX ? 0x01 : 0x00); - Buffer[ 6] = (Byte)(FlipRY ? 0x01 : 0x00); - Buffer[ 7] = (Byte)(DisableLED ? 0x01 : 0x00); - Buffer[ 8] = (Byte)(DisableRumble ? 0x01 : 0x00); - Buffer[ 9] = (Byte)(SwapTriggers ? 0x01 : 0x00); - Buffer[10] = (Byte)(Latency / m_Latency); - Buffer[11] = DeadZoneL; - Buffer[12] = DeadZoneR; - Buffer[13] = (Byte)(DisableNative ? 0x01 : 0x00); - Buffer[14] = (Byte)(DisableSSP ? 0x01 : 0x00); - Buffer[15] = Brightness; - Buffer[16] = (Byte)(Repair ? 0x01 : 0x00); ; - - return Buffer; - } - set - { - try - { - IdleTimeout = value[2]; - FlipLX = value[3] == 0x01; - FlipLY = value[4] == 0x01; - FlipRX = value[5] == 0x01; - FlipRY = value[6] == 0x01; - DisableLED = value[7] == 0x01; - DisableRumble = value[8] == 0x01; - SwapTriggers = value[9] == 0x01; - Latency = value[10]; - DeadZoneL = value[11]; - DeadZoneR = value[12]; - DisableNative = value[13] == 0x01; - DisableSSP = value[14] == 0x01; - Brightness = value[15]; - Repair = value[16] == 0x01; - } - catch { } - } - } - - public static Byte[] BD_Link - { - get { return m_BD_Link; } - } - - public static void Load() - { - m_Config.Load(); - } - - public static void Save() - { - m_Config.Save(); - } - } - - public class BackingStore - { - protected String m_File = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + Assembly.GetExecutingAssembly().GetName().Name + ".xml"; - protected XmlDocument m_Doc = new XmlDocument(); - - protected virtual void CreateTextNode(XmlNode Node, String Name, String Text) - { - XmlNode Item = m_Doc.CreateNode(XmlNodeType.Element, Name, null); - - if (Text.Length > 0) - { - XmlNode Elem = m_Doc.CreateNode(XmlNodeType.Text, Name, null); - - Elem.Value = Text; - Item.AppendChild(Elem); - } - Node.AppendChild(Item); - } - - public Boolean Load() - { - Boolean Loaded = true; - - try - { - m_Doc.Load(m_File); - - try - { - XmlNode Node = m_Doc.SelectSingleNode("/ScpControl"); - - try { XmlNode Item = Node.SelectSingleNode("Idle"); Int32.TryParse(Item.FirstChild.Value, out m_Idle); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("LX"); Boolean.TryParse(Item.FirstChild.Value, out m_LX); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("LY"); Boolean.TryParse(Item.FirstChild.Value, out m_LY); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("RX"); Boolean.TryParse(Item.FirstChild.Value, out m_RX); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("RY"); Boolean.TryParse(Item.FirstChild.Value, out m_RY); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("LED"); Boolean.TryParse(Item.FirstChild.Value, out m_LED); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("Rumble"); Boolean.TryParse(Item.FirstChild.Value, out m_Rumble); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("Triggers"); Boolean.TryParse(Item.FirstChild.Value, out m_Triggers); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("Latency"); Int32.TryParse(Item.FirstChild.Value, out m_Latency); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("DeadL"); Byte.TryParse(Item.FirstChild.Value, out m_DeadL); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("DeadR"); Byte.TryParse(Item.FirstChild.Value, out m_DeadR); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("Native"); Boolean.TryParse(Item.FirstChild.Value, out m_Native); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("SSP"); Boolean.TryParse(Item.FirstChild.Value, out m_SSP); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("Brightness"); Byte.TryParse(Item.FirstChild.Value, out m_Brightness); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("Bus"); Int32.TryParse(Item.FirstChild.Value, out m_Bus); } - catch { } - - try { XmlNode Item = Node.SelectSingleNode("Force"); Boolean.TryParse(Item.FirstChild.Value, out m_Repair); } - catch { } - } - catch { } - } - catch { Loaded = false; } - - return Loaded; - } - - public Boolean Save() - { - Boolean Saved = true; - - try - { - XmlNode Node; - - m_Doc.RemoveAll(); - - Node = m_Doc.CreateXmlDeclaration("1.0", "utf-8", String.Empty); - m_Doc.AppendChild(Node); - - Node = m_Doc.CreateComment(String.Format(" ScpControl Configuration Data. {0} ", DateTime.Now)); - m_Doc.AppendChild(Node); - - Node = m_Doc.CreateWhitespace("\r\n"); - m_Doc.AppendChild(Node); - - Node = m_Doc.CreateNode(XmlNodeType.Element, "ScpControl", null); - { - CreateTextNode(Node, "Idle", Idle.ToString()); - - CreateTextNode(Node, "LX", LX.ToString()); - CreateTextNode(Node, "LY", LY.ToString()); - CreateTextNode(Node, "RX", RX.ToString()); - CreateTextNode(Node, "RY", RY.ToString()); - - CreateTextNode(Node, "LED", LED.ToString()); - CreateTextNode(Node, "Rumble", Rumble.ToString()); - CreateTextNode(Node, "Triggers", Triggers.ToString()); - - CreateTextNode(Node, "Latency", Latency.ToString()); - CreateTextNode(Node, "DeadL", DeadL.ToString()); - CreateTextNode(Node, "DeadR", DeadR.ToString()); - - CreateTextNode(Node, "Native", Native.ToString()); - CreateTextNode(Node, "SSP", SSP.ToString()); - - CreateTextNode(Node, "Brightness", Brightness.ToString()); - CreateTextNode(Node, "Bus", Bus.ToString()); - CreateTextNode(Node, "Force", Repair.ToString()); - } - m_Doc.AppendChild(Node); - - m_Doc.Save(m_File); - } - catch { Saved = false; } - - return Saved; - } - - protected Boolean m_LX = false; - public Boolean LX - { - get { return m_LX; } - set { m_LX = value; } - } - - protected Boolean m_LY = false; - public Boolean LY - { - get { return m_LY; } - set { m_LY = value; } - } - - protected Boolean m_RX = false; - public Boolean RX - { - get { return m_RX; } - set { m_RX = value; } - } - - protected Boolean m_RY = false; - public Boolean RY - { - get { return m_RY; } - set { m_RY = value; } - } - - protected Int32 m_Idle = 600000; - public Int32 Idle - { - get { return m_Idle; } - set { m_Idle = value; } - } - - protected Boolean m_LED = false; - public Boolean LED - { - get { return m_LED; } - set { m_LED = value; } - } - - protected Boolean m_Rumble = false; - public Boolean Rumble - { - get { return m_Rumble; } - set { m_Rumble = value; } - } - - protected Boolean m_Triggers = false; - public Boolean Triggers - { - get { return m_Triggers; } - set { m_Triggers = value; } - } - - protected Int32 m_Latency = 128; - public Int32 Latency - { - get { return m_Latency; } - set { m_Latency = value; } - } - - protected Byte m_DeadL = 0; - public Byte DeadL - { - get { return m_DeadL; } - set { m_DeadL = value; } - } - - protected Byte m_DeadR = 0; - public Byte DeadR - { - get { return m_DeadR; } - set { m_DeadR = value; } - } - - protected Boolean m_Native = false; - public Boolean Native - { - get { return m_Native; } - set { m_Native = value; } - } - - protected Boolean m_SSP = true; - public Boolean SSP - { - get { return m_SSP; } - set { m_SSP = value; } - } - - protected Byte m_Brightness = 0x80; - public Byte Brightness - { - get { return m_Brightness; } - set { m_Brightness = value; } - } - - protected Int32 m_Bus = 0; - public Int32 Bus - { - get { return m_Bus; } - set { m_Bus = value; } - } - - protected Boolean m_Repair = false; - public Boolean Repair - { - get { return m_Repair; } - set { m_Repair = value; } - } - } - - public class ThemeUtil - { - [DllImport("UxTheme", CharSet = CharSet.Auto)] - private static extern Int32 SetWindowTheme(IntPtr hWnd, String appName, String partList); - - [DllImport("User32", CharSet = CharSet.Auto)] - private static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, Int32 wParam, Int32 lParam); - - private const Int32 WM_CHANGEUISTATE = 0x127; - private const Int32 HIDEFOCUS = 0x10001; - - public static void SetTheme(ListView lv) - { - try - { - SetWindowTheme(lv.Handle, "Explorer", null); - SendMessage(lv.Handle, WM_CHANGEUISTATE, HIDEFOCUS, 0); - } - catch { } - } - - public static void SetTheme(TreeView tv) - { - try - { - SetWindowTheme(tv.Handle, "Explorer", null); - SendMessage(tv.Handle, WM_CHANGEUISTATE, HIDEFOCUS, 0); - } - catch { } - } - - public static void UpdateFocus(IntPtr Handle) - { - try - { - SendMessage(Handle, WM_CHANGEUISTATE, HIDEFOCUS, 0); - } - catch { } - } - } - - public class KbmPost - { - public enum MouseButtons { Left = 0x0002, Right = 0x0008, Middle = 0x0020 }; - - protected const Int32 MOUSE_VWHEEL = 0x0800; - protected const Int32 MOUSE_HWHEEL = 0x1000; - protected const Int32 WHEEL_DELTA = 120; - - protected const Int32 MOUSE_MOVE = 1; - - protected const Int32 VK_STANDARD = 0; - protected const Int32 VK_EXTENDED = 1; - - protected const Int32 VK_KEYDOWN = 0; - protected const Int32 VK_KEYUP = 2; - - [DllImport("User32", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)] - private static extern void mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 dwData, IntPtr dwExtraInfo); - - [DllImport("User32", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)] - private static extern void keybd_event(Byte bVk, Byte bScan, Int32 dwFlags, IntPtr dwExtraInfo); - - [DllImport("User32", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)] - private static extern UInt32 MapVirtualKeyW(UInt32 uCode, UInt32 uMapType); - - public static void Key(Keys Key, Boolean bExtended, Boolean bDown) - { - keybd_event((Byte) Key, (Byte) MapVirtualKeyW((UInt32) Key, 0), (bDown ? VK_KEYDOWN : VK_KEYUP) | (bExtended ? VK_EXTENDED : VK_STANDARD), IntPtr.Zero); - } - - public static void Move(Int32 dx, Int32 dy) - { - mouse_event(MOUSE_MOVE, dx, dy, 0, IntPtr.Zero); - } - - public static void Button(MouseButtons Button, Boolean bDown) - { - mouse_event(bDown ? (Int32) Button : (Int32) Button << 1, 0, 0, 0, IntPtr.Zero); - } - - public static void Wheel(Boolean bVertical, Int32 Clicks) - { - mouse_event(bVertical ? MOUSE_VWHEEL : MOUSE_HWHEEL, 0, 0, Clicks * WHEEL_DELTA, IntPtr.Zero); - } - } - - public class RegistryProvider : SettingsProvider - { - public RegistryProvider() { } - - public override string ApplicationName - { - get { return Application.ProductName; } - set { } - } - - public override void Initialize(String name, NameValueCollection Collection) - { - base.Initialize(ApplicationName, Collection); - } - - public override void SetPropertyValues(SettingsContext Context, SettingsPropertyValueCollection PropertyValues) - { - foreach (SettingsPropertyValue PropertyValue in PropertyValues) - { - if (PropertyValue.IsDirty) GetRegKey(PropertyValue.Property).SetValue(PropertyValue.Name, PropertyValue.SerializedValue); - } - } - - public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext Context, SettingsPropertyCollection Properties) - { - SettingsPropertyValueCollection values = new SettingsPropertyValueCollection(); - - foreach (SettingsProperty Setting in Properties) - { - SettingsPropertyValue Value = new SettingsPropertyValue(Setting); - - Value.IsDirty = false; - Value.SerializedValue = GetRegKey(Setting).GetValue(Setting.Name); - values.Add(Value); - } - - return values; - } - - private RegistryKey GetRegKey(SettingsProperty Property) - { - RegistryKey RegistryKey; - - if (IsUserScoped(Property)) - { - RegistryKey = Registry.CurrentUser; - } - else - { - RegistryKey = Registry.LocalMachine; - } - - RegistryKey = RegistryKey.CreateSubKey(GetSubKeyPath()); - - return RegistryKey; - } - - private bool IsUserScoped(SettingsProperty Property) - { - foreach (DictionaryEntry Entry in Property.Attributes) - { - Attribute Attribute = (Attribute)Entry.Value; - - if (Attribute.GetType() == typeof(UserScopedSettingAttribute)) - { - return true; - } - } - - return false; - } - - private string GetSubKeyPath() - { - return "Software\\" + Application.CompanyName + "\\" + Application.ProductName; - } - } -} diff --git a/Scp/ScpControl/UsbDevice.Designer.cs b/Scp/ScpControl/UsbDevice.Designer.cs deleted file mode 100644 index 0395ded..0000000 --- a/Scp/ScpControl/UsbDevice.Designer.cs +++ /dev/null @@ -1,54 +0,0 @@ -namespace ScpControl -{ - partial class UsbDevice - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.HID_Worker = new System.ComponentModel.BackgroundWorker(); - this.tmUpdate = new ScpControl.ScpTimer(this.components); - // - // HID_Worker - // - this.HID_Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.HID_Worker_Thread); - // - // tmUpdate - // - this.tmUpdate.Enabled = false; - this.tmUpdate.Interval = ((uint)(10u)); - this.tmUpdate.Tag = null; - this.tmUpdate.Tick += new System.EventHandler(this.On_Timer); - - } - - #endregion - - protected System.ComponentModel.BackgroundWorker HID_Worker; - private ScpTimer tmUpdate; - - } -} diff --git a/Scp/ScpControl/UsbDevice.cs b/Scp/ScpControl/UsbDevice.cs deleted file mode 100644 index a9f3f0d..0000000 --- a/Scp/ScpControl/UsbDevice.cs +++ /dev/null @@ -1,261 +0,0 @@ -using System; -using System.ComponentModel; - -namespace ScpControl -{ - public partial class UsbDevice : ScpDevice, IDsDevice - { - protected ReportEventArgs m_ReportArgs = new ReportEventArgs(); - - protected String m_Instance = String.Empty, m_Mac = String.Empty; - protected Boolean m_Publish = false; - protected Boolean m_IsDisconnect = false; - protected DateTime m_Last = DateTime.Now, m_Tick = DateTime.Now, m_Disconnect = DateTime.Now; - - public event EventHandler Debug = null; - public event EventHandler Report = null; - - protected Byte[] m_Buffer = new Byte[64]; - protected Byte[] m_Master = new Byte[6]; - protected Byte[] m_Local = new Byte[6]; - - protected Byte m_ControllerId = 0; - protected Byte m_BatteryStatus = 0; - protected Byte m_CableStatus = 0; - protected Byte m_PlugStatus = 0; - protected Byte m_Model = 0; - - protected DsState m_State = DsState.Disconnected; - - protected UInt32 m_Packet = 0; - - public virtual DsModel Model - { - get { return (DsModel) m_Model; } - } - - public virtual DsPadId PadId - { - get { return (DsPadId) m_ControllerId; } - set - { - m_ControllerId = (Byte) value; - - m_ReportArgs.Pad = PadId; - } - } - - public virtual DsConnection Connection - { - get { return DsConnection.USB; } - } - - public virtual DsState State - { - get { return (DsState) m_State; } - } - - public virtual DsBattery Battery - { - get { return (DsBattery) m_BatteryStatus; } - } - - public virtual Byte[] BD_Address - { - get { return m_Local; } - } - - public virtual String Local - { - get { return m_Mac; } - } - - public virtual String Remote - { - get { return String.Format("{0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}", m_Master[0], m_Master[1], m_Master[2], m_Master[3], m_Master[4], m_Master[5]); } - } - - public virtual Boolean IsShutdown - { - get { return m_IsDisconnect; } - set { m_IsDisconnect = value; } - } - - - protected virtual void Publish() - { - m_ReportArgs.Report[0] = m_ControllerId; - m_ReportArgs.Report[1] = (Byte) m_State; - - if (Report != null) Report(this, m_ReportArgs); - } - - protected virtual void LogDebug(String Data) - { - DebugEventArgs args = new DebugEventArgs(Data); - - if (Debug != null) - { - Debug(this, args); - } - } - - - protected virtual void Process(DateTime Now) - { - } - - protected virtual void Parse(Byte[] Report) - { - } - - protected virtual Boolean Shutdown() - { - Stop(); - - return RestartDevice(m_Instance); - } - - - protected UsbDevice(String Guid) : base(Guid) - { - InitializeComponent(); - } - - - public UsbDevice() - { - InitializeComponent(); - } - - public UsbDevice(IContainer container) - { - container.Add(this); - - InitializeComponent(); - } - - - public override Boolean Start() - { - if (IsActive) - { - Array.Copy(m_Local, 0, m_ReportArgs.Report, (Int32) DsOffset.Address, m_Local.Length); - - m_ReportArgs.Report[(Int32) DsOffset.Connection] = (Byte) Connection; - m_ReportArgs.Report[(Int32) DsOffset.Model ] = (Byte) Model; - - m_State = DsState.Connected; - m_Packet = 0; - - HID_Worker.RunWorkerAsync(); - tmUpdate.Enabled = true; - - Rumble(0, 0); - LogDebug(String.Format("-- Started Device Instance [{0}] Local [{1}] Remote [{2}]", m_Instance, Local, Remote)); - } - - return State == DsState.Connected; - } - - public override Boolean Stop() - { - if (IsActive) - { - tmUpdate.Enabled = false; - m_State = DsState.Reserved; - - Publish(); - } - - return base.Stop(); - } - - public override Boolean Close() - { - if (IsActive) - { - base.Close(); - - tmUpdate.Enabled = false; - m_State = DsState.Disconnected; - - Publish(); - } - - return !IsActive; - } - - public override String ToString() - { - switch ((DsState) m_State) - { - case DsState.Disconnected: - - return String.Format("Pad {0} : Disconnected", m_ControllerId + 1); - - case DsState.Reserved: - - return String.Format("Pad {0} : {1} {2} - Reserved", m_ControllerId + 1, Model, Local); - - case DsState.Connected: - - return String.Format("Pad {0} : {1} {2} - {3} {4:X8} {5}", m_ControllerId + 1, Model, - Local, - Connection, - m_Packet, - Battery - ); - } - - throw new Exception(); - } - - - protected void HID_Worker_Thread(object sender, DoWorkEventArgs e) - { - Int32 Transfered = 0; - Byte[] Buffer = new Byte[64]; - - LogDebug("-- USB Device : HID_Worker_Thread Starting"); - - while (IsActive) - { - try - { - if (ReadIntPipe(Buffer, Buffer.Length, ref Transfered) && Transfered > 0) - { - Parse(Buffer); - } - } - catch { } - } - - LogDebug("-- USB Device : HID_Worker_Thread Exiting"); - } - - protected void On_Timer(object sender, EventArgs e) - { - lock (this) - { - Process(DateTime.Now); - } - } - - - public virtual Boolean Rumble(Byte Large, Byte Small) - { - return false; - } - - public virtual Boolean Pair(Byte[] Master) - { - return false; - } - - public virtual Boolean Disconnect() - { - return true; - } - } -} diff --git a/Scp/ScpControl/UsbDevice.resx b/Scp/ScpControl/UsbDevice.resx deleted file mode 100644 index 1c4635f..0000000 --- a/Scp/ScpControl/UsbDevice.resx +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 123, 17 - - - 17, 17 - - - False - - \ No newline at end of file diff --git a/Scp/ScpControl/UsbDs3.Designer.cs b/Scp/ScpControl/UsbDs3.Designer.cs deleted file mode 100644 index e991354..0000000 --- a/Scp/ScpControl/UsbDs3.Designer.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace ScpControl -{ - partial class UsbDs3 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - - } - - #endregion - - } -} diff --git a/Scp/ScpControl/UsbDs3.cs b/Scp/ScpControl/UsbDs3.cs deleted file mode 100644 index 5be3806..0000000 --- a/Scp/ScpControl/UsbDs3.cs +++ /dev/null @@ -1,216 +0,0 @@ -using System; -using System.ComponentModel; - -namespace ScpControl -{ - public partial class UsbDs3 : UsbDevice - { - public static String USB_CLASS_GUID = "{E2824A09-DBAA-4407-85CA-C8E8FF5F6FFA}"; - - protected Byte[] m_Leds = { 0x02, 0x04, 0x08, 0x10 }; - protected Byte[] m_Enable = { 0x42, 0x0C, 0x00, 0x00 }; - protected Byte[] m_Report = - { - 0x00, 0xFF, 0x00, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0x27, 0x10, 0x00, 0x32, - 0xFF, 0x27, 0x10, 0x00, 0x32, - 0xFF, 0x27, 0x10, 0x00, 0x32, - 0xFF, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, - }; - - public override DsPadId PadId - { - get { return (DsPadId) m_ControllerId; } - set - { - m_ControllerId = (Byte) value; - m_ReportArgs.Pad = PadId; - - m_Report[9] = m_Leds[m_ControllerId]; - } - } - - - public UsbDs3() : base(USB_CLASS_GUID) - { - InitializeComponent(); - } - - public UsbDs3(IContainer container) : base(USB_CLASS_GUID) - { - container.Add(this); - - InitializeComponent(); - } - - - public override Boolean Open(String DevicePath) - { - if (base.Open(DevicePath)) - { - m_State = DsState.Reserved; - GetDeviceInstance(ref m_Instance); - - Int32 Transfered = 0; - - if (SendTransfer(0xA1, 0x01, 0x03F5, m_Buffer, ref Transfered)) - { - m_Master = new Byte[] { m_Buffer[2], m_Buffer[3], m_Buffer[4], m_Buffer[5], m_Buffer[6], m_Buffer[7] }; - } - - if (SendTransfer(0xA1, 0x01, 0x03F2, m_Buffer, ref Transfered)) - { - m_Local = new Byte[] { m_Buffer[4], m_Buffer[5], m_Buffer[6], m_Buffer[7], m_Buffer[8], m_Buffer[9] }; - } - - m_Mac = String.Format("{0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}", m_Local[0], m_Local[1], m_Local[2], m_Local[3], m_Local[4], m_Local[5]); - } - - return State == DsState.Reserved; - } - - public override Boolean Start() - { - m_Model = (Byte) DsModel.DS3; - - if (IsActive) - { - Int32 Transfered = 0; - - if (SendTransfer(0x21, 0x09, 0x03F4, m_Enable, ref Transfered)) - { - base.Start(); - } - } - - return State == DsState.Connected; - } - - - public override Boolean Rumble(Byte Large, Byte Small) - { - lock (this) - { - Int32 Transfered = 0; - - if (Global.DisableRumble) - { - m_Report[2] = 0; - m_Report[4] = 0; - } - else - { - m_Report[2] = (Byte)(Small > 0 ? 0x01 : 0x00); - m_Report[4] = (Byte)(Large); - } - - m_Report[9] = (Byte)(Global.DisableLED ? 0 : m_Leds[m_ControllerId]); - - return SendTransfer(0x21, 0x09, 0x0201, m_Report, ref Transfered); - } - } - - public override Boolean Pair(Byte[] Master) - { - Int32 Transfered = 0; Byte[] Buffer = { 0x00, 0x00, Master[0], Master[1], Master[2], Master[3], Master[4], Master[5] }; - - if (SendTransfer(0x21, 0x09, 0x03F5, Buffer, ref Transfered)) - { - for (Int32 Index = 0; Index < m_Master.Length; Index++) - { - m_Master[Index] = Master[Index]; - } - - LogDebug(String.Format("++ Paired DS3 [{0}] To BTH Dongle [{1}]", Local, Remote)); - return true; - } - - LogDebug(String.Format("++ Pair Failed [{0}]", Local)); - return false; - } - - - protected override void Parse(Byte[] Report) - { - if (Report[0] != 0x01) return; - - m_Packet++; - - m_ReportArgs.Report[2] = m_BatteryStatus = Report[30]; - - m_ReportArgs.Report[4] = (Byte)(m_Packet >> 0 & 0xFF); - m_ReportArgs.Report[5] = (Byte)(m_Packet >> 8 & 0xFF); - m_ReportArgs.Report[6] = (Byte)(m_Packet >> 16 & 0xFF); - m_ReportArgs.Report[7] = (Byte)(m_Packet >> 24 & 0xFF); - - Ds3Button Buttons = (Ds3Button)((Report[2] << 0) | (Report[3] << 8) | (Report[4] << 16) | (Report[5] << 24)); - Boolean Trigger = false; - - if ((Buttons & Ds3Button.L1) == Ds3Button.L1 - && (Buttons & Ds3Button.R1) == Ds3Button.R1 - && (Buttons & Ds3Button.PS) == Ds3Button.PS - ) - { - Trigger = true; Report[4] ^= 0x1; - } - - for (int Index = 8; Index < 57; Index++) - { - m_ReportArgs.Report[Index] = Report[Index - 8]; - } - - if (Trigger && !m_IsDisconnect) - { - m_IsDisconnect = true; m_Disconnect = DateTime.Now; - } - else if (!Trigger && m_IsDisconnect) - { - m_IsDisconnect = false; - } - - Publish(); - } - - protected override void Process(DateTime Now) - { - lock (this) - { - if (m_IsDisconnect) - { - if ((Now - m_Disconnect).TotalMilliseconds >= 2000) - { - LogDebug("++ Quick Disconnect Triggered"); - - Shutdown(); - return; - } - } - - if ((Now - m_Last).TotalMilliseconds >= 1500 && m_Packet > 0) - { - Int32 Transfered = 0; - - m_Last = Now; - - if (Battery == DsBattery.Charging) - { - m_Report[9] ^= m_Leds[m_ControllerId]; - } - else - { - m_Report[9] |= m_Leds[m_ControllerId]; - } - - if (Global.DisableLED) m_Report[9] = 0; - - SendTransfer(0x21, 0x09, 0x0201, m_Report, ref Transfered); - } - } - } - } -} diff --git a/Scp/ScpControl/UsbDs3.resx b/Scp/ScpControl/UsbDs3.resx deleted file mode 100644 index e5858cc..0000000 --- a/Scp/ScpControl/UsbDs3.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - \ No newline at end of file diff --git a/Scp/ScpControl/UsbDs4.Designer.cs b/Scp/ScpControl/UsbDs4.Designer.cs deleted file mode 100644 index 6c123cd..0000000 --- a/Scp/ScpControl/UsbDs4.Designer.cs +++ /dev/null @@ -1,38 +0,0 @@ -namespace ScpControl -{ - partial class UsbDs4 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - - } - - #endregion - - - } -} diff --git a/Scp/ScpControl/UsbDs4.cs b/Scp/ScpControl/UsbDs4.cs deleted file mode 100644 index a4c6d50..0000000 --- a/Scp/ScpControl/UsbDs4.cs +++ /dev/null @@ -1,288 +0,0 @@ -using System; -using System.ComponentModel; - -namespace ScpControl -{ - public partial class UsbDs4 : UsbDevice - { - public static String USB_CLASS_GUID = "{2ED90CE1-376F-4982-8F7F-E056CBC3CA71}"; - - protected Boolean m_DisableLightBar = false; - protected Byte m_Brightness = Global.Brightness; - - protected const Int32 R = 6, G = 7, B = 8; // Led Offsets - - protected Byte[] m_Report = - { - 0x05, - 0xFF, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, - }; - - protected virtual Byte MapBattery(Byte Value) - { - Byte Mapped = (Byte) DsBattery.None; - - switch (Value) - { - case 0x10: - case 0x11: - case 0x12: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - case 0x18: - case 0x19: - case 0x1A: - Mapped = (Byte) DsBattery.Charging; - break; - case 0x1B: - Mapped = (Byte) DsBattery.Charged; - break; - } - - return Mapped; - } - - public override DsPadId PadId - { - get { return (DsPadId) m_ControllerId; } - set - { - m_ControllerId = (Byte) value; - m_ReportArgs.Pad = PadId; - - switch (value) - { - case DsPadId.One: // Blue - m_Report[R] = 0x00; - m_Report[G] = 0x00; - m_Report[B] = m_Brightness; - break; - case DsPadId.Two: // Green - m_Report[R] = 0x00; - m_Report[G] = m_Brightness; - m_Report[B] = 0x00; - break; - case DsPadId.Three: // Yellow - m_Report[R] = m_Brightness; - m_Report[G] = m_Brightness; - m_Report[B] = 0x00; - break; - case DsPadId.Four: // Cyan - m_Report[R] = 0x00; - m_Report[G] = m_Brightness; - m_Report[B] = m_Brightness; - break; - case DsPadId.None: // Red - m_Report[R] = m_Brightness; - m_Report[G] = 0x00; - m_Report[B] = 0x00; - break; - } - - if (Global.DisableLightBar) - { - m_Report[R] = m_Report[G] = m_Report[B] = m_Report[12] = m_Report[13] = 0x00; - } - } - } - - - public UsbDs4() : base(USB_CLASS_GUID) - { - InitializeComponent(); - } - - public UsbDs4(IContainer container) : base(USB_CLASS_GUID) - { - container.Add(this); - - InitializeComponent(); - } - - - public override Boolean Open(String DevicePath) - { - if (base.Open(DevicePath)) - { - m_State = DsState.Reserved; - GetDeviceInstance(ref m_Instance); - - Int32 Transfered = 0; - - if (SendTransfer(0xA1, 0x01, 0x0312, m_Buffer, ref Transfered)) - { - m_Master = new Byte[] { m_Buffer[15], m_Buffer[14], m_Buffer[13], m_Buffer[12], m_Buffer[11], m_Buffer[10] }; - m_Local = new Byte[] { m_Buffer[ 6], m_Buffer[ 5], m_Buffer[ 4], m_Buffer[ 3], m_Buffer[ 2], m_Buffer[ 1] }; - } - - m_Mac = String.Format("{0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}", m_Local[0], m_Local[1], m_Local[2], m_Local[3], m_Local[4], m_Local[5]); - } - - return State == DsState.Reserved; - } - - public override Boolean Start() - { - m_Model = (Byte) DsModel.DS4; - - if (Global.Repair) - { - Int32 Transfered = 0; - Byte[] Buffer = { 0x13, m_Master[5], m_Master[4], m_Master[3], m_Master[2], m_Master[1], m_Master[0], 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - - Array.Copy(Global.BD_Link, 0, Buffer, 7, Global.BD_Link.Length); - - if (SendTransfer(0x21, 0x09, 0x0313, Buffer, ref Transfered)) - { - LogDebug(String.Format("++ Repaired DS4 [{0}] Link Key For BTH Dongle [{1}]", Local, Remote)); - } - else - { - LogDebug(String.Format("++ Repair DS4 [{0}] Link Key For BTH Dongle [{1}] Failed!", Local, Remote)); - } - } - - return base.Start(); - } - - - public override Boolean Rumble(Byte Large, Byte Small) - { - lock (this) - { - Int32 Transfered = 0; - - m_Report[4] = (Byte)(Small); - m_Report[5] = (Byte)(Large); - - return WriteIntPipe(m_Report, m_Report.Length, ref Transfered); - } - } - - public override Boolean Pair(Byte[] Master) - { - Int32 Transfered = 0; - Byte[] Buffer = { 0x13, Master[5], Master[4], Master[3], Master[2], Master[1], Master[0], 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - - Array.Copy(Global.BD_Link, 0, Buffer, 7, Global.BD_Link.Length); - - if (SendTransfer(0x21, 0x09, 0x0313, Buffer, ref Transfered)) - { - for (Int32 Index = 0; Index < m_Master.Length; Index++) - { - m_Master[Index] = Master[Index]; - } - - LogDebug(String.Format("++ Paired DS4 [{0}] To BTH Dongle [{1}]", Local, Remote)); - return true; - } - - LogDebug(String.Format("++ Pair Failed [{0}]", Local)); - return false; - } - - - protected override void Parse(Byte[] Report) - { - if (Report[0] != 0x01) return; - - m_Packet++; - - m_ReportArgs.Report[2] = m_BatteryStatus = MapBattery(Report[30]); - - m_ReportArgs.Report[4] = (Byte)(m_Packet >> 0 & 0xFF); - m_ReportArgs.Report[5] = (Byte)(m_Packet >> 8 & 0xFF); - m_ReportArgs.Report[6] = (Byte)(m_Packet >> 16 & 0xFF); - m_ReportArgs.Report[7] = (Byte)(m_Packet >> 24 & 0xFF); - - Ds4Button Buttons = (Ds4Button)((Report[5] << 0) | (Report[6] << 8) | (Report[7] << 16)); - - //++ Convert HAT to DPAD - Report[5] &= 0xF0; - - switch ((UInt32) Buttons & 0xF) - { - case 0: - Report[5] |= (Byte)(Ds4Button.Up); - break; - case 1: - Report[5] |= (Byte)(Ds4Button.Up | Ds4Button.Right); - break; - case 2: - Report[5] |= (Byte)(Ds4Button.Right); - break; - case 3: - Report[5] |= (Byte)(Ds4Button.Right | Ds4Button.Down); - break; - case 4: - Report[5] |= (Byte)(Ds4Button.Down); - break; - case 5: - Report[5] |= (Byte)(Ds4Button.Down | Ds4Button.Left); - break; - case 6: - Report[5] |= (Byte)(Ds4Button.Left); - break; - case 7: - Report[5] |= (Byte)(Ds4Button.Left | Ds4Button.Up); - break; - } - //-- - - for (int Index = 8; Index < 72; Index++) - { - m_ReportArgs.Report[Index] = Report[Index - 8]; - } - - Publish(); - } - - protected override void Process(DateTime Now) - { - lock (this) - { - if ((Now - m_Last).TotalMilliseconds >= 500) - { - Int32 Transfered = 0; - - m_Last = Now; - - if (!Global.DisableLightBar) - { - if (Battery != DsBattery.Charged) - { - m_Report[9] = m_Report[10] = 0x80; - } - else - { - m_Report[9] = m_Report[10] = 0x00; - } - } - - if (Global.Brightness != m_Brightness) - { - m_Brightness = Global.Brightness; - PadId = PadId; - } - - if (Global.DisableLightBar != m_DisableLightBar) - { - m_DisableLightBar = Global.DisableLightBar; - PadId = PadId; - } - - WriteIntPipe(m_Report, m_Report.Length, ref Transfered); - } - } - } - } -} diff --git a/Scp/ScpControl/UsbDs4.resx b/Scp/ScpControl/UsbDs4.resx deleted file mode 100644 index e5858cc..0000000 --- a/Scp/ScpControl/UsbDs4.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - \ No newline at end of file diff --git a/Scp/ScpControl/UsbHub.Designer.cs b/Scp/ScpControl/UsbHub.Designer.cs deleted file mode 100644 index 5c1200b..0000000 --- a/Scp/ScpControl/UsbHub.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace ScpControl -{ - partial class UsbHub - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - } - - #endregion - } -} diff --git a/Scp/ScpControl/UsbHub.cs b/Scp/ScpControl/UsbHub.cs deleted file mode 100644 index 91aff1d..0000000 --- a/Scp/ScpControl/UsbHub.cs +++ /dev/null @@ -1,223 +0,0 @@ -using System; -using System.ComponentModel; - -namespace ScpControl -{ - public partial class UsbHub : ScpHub - { - protected UsbDevice[] Device = new UsbDevice[4]; - - - public UsbHub() - { - InitializeComponent(); - } - - public UsbHub(IContainer container) - { - container.Add(this); - - InitializeComponent(); - } - - - public override Boolean Open() - { - for (Byte Pad = 0; Pad < Device.Length; Pad++) - { - Device[Pad] = new UsbDevice(); - - Device[Pad].PadId = (DsPadId) Pad; - } - - return base.Open(); - } - - public override Boolean Start() - { - m_Started = true; - - Byte Index = 0; - - for (Byte Instance = 0; Instance < Device.Length && Index < Device.Length; Instance++) - { - try - { - UsbDevice Current = new UsbDs4(); - Current.PadId = (DsPadId)Index; - - if (Current.Open(Instance)) - { - if (LogArrival(Current)) - { - Current.Debug += new EventHandler (On_Debug); - Current.Report += new EventHandler(On_Report); - - Device[Index++] = Current; - } - else Current.Close(); - } - else Current.Close(); - } - catch { break; } - } - - for (Byte Instance = 0; Instance < Device.Length && Index < Device.Length; Instance++) - { - try - { - UsbDevice Current = new UsbDs3(); - Current.PadId = (DsPadId)Index; - - if (Current.Open(Instance)) - { - if (LogArrival(Current)) - { - Current.Debug += new EventHandler (On_Debug); - Current.Report += new EventHandler(On_Report); - - Device[Index++] = Current; - } - else Current.Close(); - } - else Current.Close(); - } - catch { break; } - } - - try - { - for (Index = 0; Index < Device.Length; Index++) - { - if (Device[Index].State == DsState.Reserved) - { - Device[Index].Start(); - } - } - } - catch { } - - return base.Start(); - } - - public override Boolean Stop() - { - m_Started = false; - - try - { - for (Int32 Index = 0; Index < Device.Length; Index++) - { - if (Device[Index].State == DsState.Connected) - { - Device[Index].Stop(); - } - } - } - catch { } - - return base.Stop(); - } - - public override Boolean Close() - { - m_Started = false; - - try - { - for (Int32 Index = 0; Index < Device.Length; Index++) - { - if (Device[Index].State == DsState.Connected) - { - Device[Index].Close(); - } - } - } - catch { } - - return base.Close(); - } - - - public override Boolean Suspend() - { - Stop(); - Close(); - - return base.Suspend(); - } - - public override Boolean Resume() - { - Open(); - Start(); - - return base.Resume(); - } - - - public override DsPadId Notify(ScpDevice.Notified Notification, String Class, String Path) - { - LogDebug(String.Format("++ Notify [{0}] [{1}] [{2}]", Notification, Class, Path)); - - switch (Notification) - { - case ScpDevice.Notified.Arrival: - { - UsbDevice Arrived = new UsbDevice(); - - if (Class.ToUpper() == UsbDs3.USB_CLASS_GUID.ToUpper()) { Arrived = new UsbDs3(); LogDebug("-- DS3 Arrival Event"); } - if (Class.ToUpper() == UsbDs4.USB_CLASS_GUID.ToUpper()) { Arrived = new UsbDs4(); LogDebug("-- DS4 Arrival Event"); } - - if (Arrived.Open(Path)) - { - LogDebug(String.Format("-- Device Arrival [{0}]", Arrived.Local)); - - if (LogArrival(Arrived)) - { - if (Device[(Byte) Arrived.PadId].IsShutdown) - { - Device[(Byte) Arrived.PadId].IsShutdown = false; - - Device[(Byte) Arrived.PadId].Close(); - Device[(Byte) Arrived.PadId] = Arrived; - - return Arrived.PadId; - } - else - { - Arrived.Debug += new EventHandler (On_Debug ); - Arrived.Report += new EventHandler(On_Report); - - Device[(Byte) Arrived.PadId].Close(); - Device[(Byte) Arrived.PadId] = Arrived; - - if (m_Started) Arrived.Start(); - return Arrived.PadId; - } - } - } - - Arrived.Close(); - } - break; - - case ScpDevice.Notified.Removal: - { - for (Int32 Index = 0; Index < Device.Length; Index++) - { - if (Device[Index].State == DsState.Connected && Path == Device[Index].Path) - { - LogDebug(String.Format("-- Device Removal [{0}]", Device[Index].Local)); - - Device[Index].Stop(); - } - } - } - break; - } - - return DsPadId.None; - } - } -} diff --git a/Scp/ScpControl/XmlMapper.Designer.cs b/Scp/ScpControl/XmlMapper.Designer.cs deleted file mode 100644 index 6c810ac..0000000 --- a/Scp/ScpControl/XmlMapper.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace ScpControl -{ - partial class XmlMapper - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - } - - #endregion - } -} diff --git a/Scp/ScpControl/XmlMapper.cs b/Scp/ScpControl/XmlMapper.cs deleted file mode 100644 index 64143a3..0000000 --- a/Scp/ScpControl/XmlMapper.cs +++ /dev/null @@ -1,492 +0,0 @@ -using System; -using System.ComponentModel; -using System.Xml; -using System.Reflection; - -namespace ScpControl -{ - public partial class XmlMapper : Component - { - public event EventHandler Debug = null; - - protected virtual void LogDebug(String Data) - { - DebugEventArgs args = new DebugEventArgs(Data); - - if (Debug != null) - { - Debug(this, args); - } - } - - protected Profile m_Empty = new Profile(true, DsMatch.None.ToString(), DsMatch.Global.ToString(), String.Empty); - protected ProfileMap m_Mapper = new ProfileMap(); - - protected Ds3ButtonAxisMap Ds3ButtonAxis = new Ds3ButtonAxisMap(); - protected Ds4ButtonAxisMap Ds4ButtonAxis = new Ds4ButtonAxisMap(); - - protected volatile Boolean m_Remapping = false; - protected volatile String m_Active = String.Empty, m_Version = String.Empty, m_Description = String.Empty; - - protected Profile Find(String Mac, Int32 PadId) - { - Profile Found = m_Empty; - String Pad = ((DsPadId) PadId).ToString(); - - DsMatch Current = DsMatch.None, Target = DsMatch.None; - - foreach(Profile Item in m_Mapper.Values) - { - Target = Item.Usage(Pad, Mac); - - if (Target > Current) - { - Found = Item; Current = Target; - } - } - - return Found; - } - - protected void CreateTextNode(XmlDocument Doc, XmlNode Node, String Name, String Text) - { - XmlNode Item = Doc.CreateNode(XmlNodeType.Element, Name, null); - - if (Text.Length > 0) - { - XmlNode Elem = Doc.CreateNode(XmlNodeType.Text, Name, null); - - Elem.Value = Text; - Item.AppendChild(Elem); - } - - Node.AppendChild(Item); - } - - - public XmlMapper() - { - InitializeComponent(); - - Ds3ButtonAxis[Ds3Button.L1 ] = Ds3Axis.L1; - Ds3ButtonAxis[Ds3Button.L2 ] = Ds3Axis.L2; - Ds3ButtonAxis[Ds3Button.R1 ] = Ds3Axis.R1; - Ds3ButtonAxis[Ds3Button.R2 ] = Ds3Axis.R2; - - Ds3ButtonAxis[Ds3Button.Triangle] = Ds3Axis.Triangle; - Ds3ButtonAxis[Ds3Button.Circle ] = Ds3Axis.Circle; - Ds3ButtonAxis[Ds3Button.Cross ] = Ds3Axis.Cross; - Ds3ButtonAxis[Ds3Button.Square ] = Ds3Axis.Square; - - Ds3ButtonAxis[Ds3Button.Up ] = Ds3Axis.Up; - Ds3ButtonAxis[Ds3Button.Right ] = Ds3Axis.Right; - Ds3ButtonAxis[Ds3Button.Down ] = Ds3Axis.Down; - Ds3ButtonAxis[Ds3Button.Left ] = Ds3Axis.Left; - - Ds4ButtonAxis[Ds4Button.L2 ] = Ds4Axis.L2; - Ds4ButtonAxis[Ds4Button.R2 ] = Ds4Axis.R2; - } - - public XmlMapper(IContainer container) - { - container.Add(this); - - InitializeComponent(); - - Ds3ButtonAxis[Ds3Button.L1 ] = Ds3Axis.L1; - Ds3ButtonAxis[Ds3Button.L2 ] = Ds3Axis.L2; - Ds3ButtonAxis[Ds3Button.R1 ] = Ds3Axis.R1; - Ds3ButtonAxis[Ds3Button.R2 ] = Ds3Axis.R2; - - Ds3ButtonAxis[Ds3Button.Triangle] = Ds3Axis.Triangle; - Ds3ButtonAxis[Ds3Button.Circle ] = Ds3Axis.Circle; - Ds3ButtonAxis[Ds3Button.Cross ] = Ds3Axis.Cross; - Ds3ButtonAxis[Ds3Button.Square ] = Ds3Axis.Square; - - Ds3ButtonAxis[Ds3Button.Up ] = Ds3Axis.Up; - Ds3ButtonAxis[Ds3Button.Right ] = Ds3Axis.Right; - Ds3ButtonAxis[Ds3Button.Down ] = Ds3Axis.Down; - Ds3ButtonAxis[Ds3Button.Left ] = Ds3Axis.Left; - - Ds4ButtonAxis[Ds4Button.L2 ] = Ds4Axis.L2; - Ds4ButtonAxis[Ds4Button.R2 ] = Ds4Axis.R2; - } - - - public virtual Boolean Initialize(XmlDocument Map) - { - try - { - m_Remapping = false; m_Mapper.Clear(); - - XmlNode Node = Map.SelectSingleNode("/ScpMapper"); - - m_Description = Node.SelectSingleNode("Description").FirstChild.Value; - m_Version = Node.SelectSingleNode("Version" ).FirstChild.Value; - m_Active = Node.SelectSingleNode("Active" ).FirstChild.Value; - - foreach (XmlNode ProfileNode in Node.SelectNodes("Mapping/Profile")) - { - String Name = ProfileNode.SelectSingleNode("Name").FirstChild.Value; - String Type = ProfileNode.SelectSingleNode("Type").FirstChild.Value; - - String Qualifier = String.Empty; - - try - { - XmlNode QualifierNode = ProfileNode.SelectSingleNode("Value"); - - if (QualifierNode.HasChildNodes) - { - Qualifier = QualifierNode.FirstChild.Value; - } - } - catch { } - - Profile Profile = new Profile(Name == m_Active, Name, Type, Qualifier); - - try - { - foreach (XmlNode Mapping in ProfileNode.SelectSingleNode("DS3/Button")) - { - foreach (XmlNode Item in Mapping.ChildNodes) - { - Ds3Button Target = (Ds3Button) Enum.Parse(typeof(Ds3Button), Item.ParentNode.Name); - Ds3Button Mapped = (Ds3Button) Enum.Parse(typeof(Ds3Button), Item.Value); - - Profile.Ds3Button[Target] = Mapped; - } - } - } - catch { } - - try - { - foreach (XmlNode Mapping in ProfileNode.SelectSingleNode("DS3/Axis")) - { - foreach (XmlNode Item in Mapping.ChildNodes) - { - Ds3Axis Target = (Ds3Axis) Enum.Parse(typeof(Ds3Axis), Item.ParentNode.Name); - Ds3Axis Mapped = (Ds3Axis) Enum.Parse(typeof(Ds3Axis), Item.Value); - - Profile.Ds3Axis[Target] = Mapped; - } - } - } - catch { } - - try - { - foreach (XmlNode Mapping in ProfileNode.SelectSingleNode("DS4/Button")) - { - foreach (XmlNode Item in Mapping.ChildNodes) - { - Ds4Button Target = (Ds4Button) Enum.Parse(typeof(Ds4Button), Item.ParentNode.Name); - Ds4Button Mapped = (Ds4Button) Enum.Parse(typeof(Ds4Button), Item.Value); - - Profile.Ds4Button[Target] = Mapped; - } - } - } - catch { } - - try - { - foreach (XmlNode Mapping in ProfileNode.SelectSingleNode("DS4/Axis")) - { - foreach (XmlNode Item in Mapping.ChildNodes) - { - Ds4Axis Target = (Ds4Axis) Enum.Parse(typeof(Ds4Axis), Item.ParentNode.Name); - Ds4Axis Mapped = (Ds4Axis) Enum.Parse(typeof(Ds4Axis), Item.Value); - - Profile.Ds4Axis[Target] = Mapped; - } - } - } - catch { } - - m_Mapper[Profile.Name] = Profile; - } - - Int32 Mappings = m_Mapper[m_Active].Ds3Button.Count + m_Mapper[m_Active].Ds3Axis.Count + m_Mapper[m_Active].Ds4Button.Count + m_Mapper[m_Active].Ds4Axis.Count; - LogDebug(String.Format("## Mapper.Initialize() - Profiles [{0}] Active [{1}] Mappings [{2}]", m_Mapper.Count, m_Active, Mappings)); - - m_Remapping = true; - } - catch { } - - return m_Remapping; - } - - public virtual Boolean Shutdown() - { - m_Remapping = false; - - LogDebug("## Mapper.Shutdown()"); - return true; - } - - public virtual Boolean Construct(ref XmlDocument Map) - { - Boolean Constructed = true; - - try - { - XmlNode Node; - XmlDocument Doc = new XmlDocument(); - - Node = Doc.CreateXmlDeclaration("1.0", "utf-8", String.Empty); - Doc.AppendChild(Node); - - Node = Doc.CreateComment(String.Format(" ScpMapper Configuration Data. {0} ", DateTime.Now)); - Doc.AppendChild(Node); - - Node = Doc.CreateNode(XmlNodeType.Element, "ScpMapper", null); - { - CreateTextNode(Doc, Node, "Description", "SCP Mapping File"); - CreateTextNode(Doc, Node, "Version", Assembly.GetExecutingAssembly().GetName().Version.ToString()); - - XmlNode Mapping = Doc.CreateNode(XmlNodeType.Element, "Mapping", null); - { - foreach (Profile Item in m_Mapper.Values) - { - if (Item.Default) CreateTextNode(Doc, Node, "Active", Item.Name); - - XmlNode Profile = Doc.CreateNode(XmlNodeType.Element, "Profile", null); - { - CreateTextNode(Doc, Profile, "Name", Item.Name); - CreateTextNode(Doc, Profile, "Type", Item.Type); - CreateTextNode(Doc, Profile, "Value", Item.Qualifier); - - XmlNode Ds3 = Doc.CreateNode(XmlNodeType.Element, DsModel.DS3.ToString(), null); - { - XmlNode Button = Doc.CreateNode(XmlNodeType.Element, "Button", null); - { - foreach (Ds3Button Ds3Button in Item.Ds3Button.Keys) - { - CreateTextNode(Doc, Button, Ds3Button.ToString(), Item.Ds3Button[Ds3Button].ToString()); - } - } - Ds3.AppendChild(Button); - - XmlNode Axis = Doc.CreateNode(XmlNodeType.Element, "Axis", null); - { - foreach (Ds3Axis Ds3Axis in Item.Ds3Axis.Keys) - { - CreateTextNode(Doc, Axis, Ds3Axis.ToString(), Item.Ds3Axis[Ds3Axis].ToString()); - } - } - Ds3.AppendChild(Axis); - } - Profile.AppendChild(Ds3); - - XmlNode Ds4 = Doc.CreateNode(XmlNodeType.Element, DsModel.DS4.ToString(), null); - { - XmlNode Button = Doc.CreateNode(XmlNodeType.Element, "Button", null); - { - foreach (Ds4Button Ds4Button in Item.Ds4Button.Keys) - { - CreateTextNode(Doc, Button, Ds4Button.ToString(), Item.Ds4Button[Ds4Button].ToString()); - } - } - Ds4.AppendChild(Button); - - XmlNode Axis = Doc.CreateNode(XmlNodeType.Element, "Axis", null); - { - foreach (Ds4Axis Ds4Axis in Item.Ds4Axis.Keys) - { - CreateTextNode(Doc, Axis, Ds4Axis.ToString(), Item.Ds4Axis[Ds4Axis].ToString()); - } - } - Ds4.AppendChild(Axis); - } - Profile.AppendChild(Ds4); - } - Mapping.AppendChild(Profile); - } - } - Node.AppendChild(Mapping); - - } - Doc.AppendChild(Node); - - Map = Doc; - } - catch { Constructed = false; } - - return Constructed; - } - - - public virtual Boolean Remap(DsModel Type, Int32 Pad, String Mac, Byte[] Input, Byte[] Output) - { - Boolean Mapped = false; - - try - { - if (m_Remapping) - { - switch (Type) - { - case DsModel.DS3: Mapped = RemapDs3(Find(Mac, Pad), Input, Output); break; - case DsModel.DS4: Mapped = RemapDs4(Find(Mac, Pad), Input, Output); break; - } - } - } - catch { } - - return Mapped; - } - - - public virtual Boolean RemapDs3(Profile Map, Byte[] Input, Byte[] Output) - { - Boolean Mapped = false; - - try - { - Array.Copy(Input, Output, Input.Length); - - // Map Buttons - Ds3Button In = (Ds3Button)(UInt32)((Input[10] << 0) | (Input[11] << 8) | (Input[12] << 16) | (Input[13] << 24)); - Ds3Button Out = In; - - foreach (Ds3Button Item in Map.Ds3Button.Keys) if ((Out & Item) != Ds3Button.None) Out ^= Item; - foreach (Ds3Button Item in Map.Ds3Button.Keys) if ((In & Item) != Ds3Button.None) Out |= Map.Ds3Button[Item]; - - Output[10] = (Byte)((UInt32) Out >> 0 & 0xFF); - Output[11] = (Byte)((UInt32) Out >> 8 & 0xFF); - Output[12] = (Byte)((UInt32) Out >> 16 & 0xFF); - Output[13] = (Byte)((UInt32) Out >> 24 & 0xFF); - - // Map Axis - foreach (Ds3Axis Item in Map.Ds3Axis.Keys) - { - switch (Item) - { - case Ds3Axis.LX: - case Ds3Axis.LY: - case Ds3Axis.RX: - case Ds3Axis.RY: - Output[(UInt32) Item] = 127; // Centred - break; - - default: - Output[(UInt32) Item] = 0; - break; - } - } - - foreach (Ds3Axis Item in Map.Ds3Axis.Keys) - { - if (Map.Ds3Axis[Item] != Ds3Axis.None) - { - Output[(UInt32) Map.Ds3Axis[Item]] = Input[(UInt32) Item]; - } - } - - // Fix up Button-Axis Relations - foreach (Ds3Button Key in Ds3ButtonAxis.Keys) - { - if ((Out & Key) != Ds3Button.None && Output[(UInt32) Ds3ButtonAxis[Key]] == 0) - { - Output[(UInt32) Ds3ButtonAxis[Key]] = 0xFF; - } - } - - Mapped = true; - } - catch { } - - return Mapped; - } - - public virtual Boolean RemapDs4(Profile Map, Byte[] Input, Byte[] Output) - { - Boolean Mapped = false; - - try - { - Array.Copy(Input, Output, Input.Length); - - // Map Buttons - Ds4Button In = (Ds4Button)(UInt32)((Input[13] << 0) | (Input[14] << 8) | (Input[15] << 16)); - Ds4Button Out = In; - - foreach (Ds4Button Item in Map.Ds4Button.Keys) if ((Out & Item) != Ds4Button.None) Out ^= Item; - foreach (Ds4Button Item in Map.Ds4Button.Keys) if ((In & Item) != Ds4Button.None) Out |= Map.Ds4Button[Item]; - - Output[13] = (Byte)((UInt32) Out >> 0 & 0xFF); - Output[14] = (Byte)((UInt32) Out >> 8 & 0xFF); - Output[15] = (Byte)((UInt32) Out >> 16 & 0xFF); - - // Map Axis - foreach (Ds4Axis Item in Map.Ds4Axis.Keys) - { - switch (Item) - { - case Ds4Axis.LX: - case Ds4Axis.LY: - case Ds4Axis.RX: - case Ds4Axis.RY: - Output[(UInt32) Item] = 127; // Centred - break; - default: - Output[(UInt32) Item] = 0; - break; - } - } - - foreach (Ds4Axis Item in Map.Ds4Axis.Keys) - { - if (Map.Ds4Axis[Item] != Ds4Axis.None) - { - Output[(UInt32) Map.Ds4Axis[Item]] = Input[(UInt32) Item]; - } - } - - // Fix up Button-Axis Relations - foreach (Ds4Button Key in Ds4ButtonAxis.Keys) - { - if ((Out & Key) != Ds4Button.None && Output[(UInt32) Ds4ButtonAxis[Key]] == 0) - { - Output[(UInt32) Ds4ButtonAxis[Key]] = 0xFF; - } - } - - - Mapped = true; - } - catch { } - - return Mapped; - } - - - public virtual String[] Profiles - { - get - { - Int32 Index = 0; - String[] List = new String[m_Mapper.Count]; - - foreach (String Item in m_Mapper.Keys) - { - List[Index++] = Item; - } - - return List; - } - } - - public virtual String Active - { - get { return m_Active; } - } - - public virtual ProfileMap Map - { - get { return m_Mapper; } - } - } -} diff --git a/Scp/ScpInstaller/Devcon.cs b/Scp/ScpInstaller/Devcon.cs deleted file mode 100644 index 0e4e3ca..0000000 --- a/Scp/ScpInstaller/Devcon.cs +++ /dev/null @@ -1,230 +0,0 @@ -using System; -using System.Text; -using System.Runtime.InteropServices; - -namespace ScpDriver -{ - public class Devcon - { - public static Boolean Find(Guid Target, ref String Path, ref String InstanceId, Int32 Instance = 0) - { - IntPtr detailDataBuffer = IntPtr.Zero; - IntPtr deviceInfoSet = IntPtr.Zero; - - try - { - SP_DEVINFO_DATA deviceInterfaceData = new SP_DEVINFO_DATA(), da = new SP_DEVINFO_DATA(); - Int32 bufferSize = 0, memberIndex = 0; - - deviceInfoSet = SetupDiGetClassDevs(ref Target, IntPtr.Zero, IntPtr.Zero, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - - deviceInterfaceData.cbSize = da.cbSize = Marshal.SizeOf(deviceInterfaceData); - - while (SetupDiEnumDeviceInterfaces(deviceInfoSet, IntPtr.Zero, ref Target, memberIndex, ref deviceInterfaceData)) - { - SetupDiGetDeviceInterfaceDetail(deviceInfoSet, ref deviceInterfaceData, IntPtr.Zero, 0, ref bufferSize, ref da); - { - detailDataBuffer = Marshal.AllocHGlobal(bufferSize); - - Marshal.WriteInt32(detailDataBuffer, (IntPtr.Size == 4) ? (4 + Marshal.SystemDefaultCharSize) : 8); - - if (SetupDiGetDeviceInterfaceDetail(deviceInfoSet, ref deviceInterfaceData, detailDataBuffer, bufferSize, ref bufferSize, ref da)) - { - IntPtr pDevicePathName = detailDataBuffer + 4; - - Path = Marshal.PtrToStringAuto(pDevicePathName).ToUpper(); - - if (memberIndex == Instance) - { - Int32 nBytes = 256; - IntPtr ptrInstanceBuf = Marshal.AllocHGlobal(nBytes); - - CM_Get_Device_ID(da.Flags, ptrInstanceBuf, nBytes, 0); - InstanceId = Marshal.PtrToStringAuto(ptrInstanceBuf).ToUpper(); - - Marshal.FreeHGlobal(ptrInstanceBuf); - return true; - } - } - else Marshal.FreeHGlobal(detailDataBuffer); - } - - memberIndex++; - } - } - catch (Exception ex) - { - Console.WriteLine("{0} {1}", ex.HelpLink, ex.Message); - throw; - } - finally - { - if (deviceInfoSet != IntPtr.Zero) - { - SetupDiDestroyDeviceInfoList(deviceInfoSet); - } - } - - return false; - } - - public static Boolean Create(String ClassName, Guid ClassGuid, String Node) - { - IntPtr DeviceInfoSet = (IntPtr)(-1); - SP_DEVINFO_DATA DeviceInfoData = new SP_DEVINFO_DATA(); - - try - { - DeviceInfoSet = SetupDiCreateDeviceInfoList(ref ClassGuid, IntPtr.Zero); - - if (DeviceInfoSet == (IntPtr)(-1)) - { - return false; - } - - DeviceInfoData.cbSize = Marshal.SizeOf(DeviceInfoData); - - if (!SetupDiCreateDeviceInfo(DeviceInfoSet, ClassName, ref ClassGuid, null, IntPtr.Zero, DICD_GENERATE_ID, ref DeviceInfoData)) - { - return false; - } - - if (!SetupDiSetDeviceRegistryProperty(DeviceInfoSet, ref DeviceInfoData, SPDRP_HARDWAREID, Node, Node.Length * 2)) - { - return false; - } - - if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, DeviceInfoSet, ref DeviceInfoData)) - { - return false; - } - } - catch { } - finally - { - if (DeviceInfoSet != (IntPtr)(-1)) - { - SetupDiDestroyDeviceInfoList(DeviceInfoSet); - } - } - - return true; - } - - public static Boolean Remove(Guid ClassGuid, String Path, String InstanceId) - { - IntPtr deviceInfoSet = IntPtr.Zero; - - try - { - SP_DEVINFO_DATA deviceInterfaceData = new SP_DEVINFO_DATA(); - - deviceInterfaceData.cbSize = Marshal.SizeOf(deviceInterfaceData); - deviceInfoSet = SetupDiGetClassDevs(ref ClassGuid, IntPtr.Zero, IntPtr.Zero, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - - if (SetupDiOpenDeviceInfo(deviceInfoSet, InstanceId, IntPtr.Zero, 0, ref deviceInterfaceData)) - { - SP_REMOVEDEVICE_PARAMS props = new SP_REMOVEDEVICE_PARAMS(); - - props.ClassInstallHeader = new SP_CLASSINSTALL_HEADER(); - props.ClassInstallHeader.cbSize = Marshal.SizeOf(props.ClassInstallHeader); - props.ClassInstallHeader.InstallFunction = DIF_REMOVE; - - props.Scope = DI_REMOVEDEVICE_GLOBAL; - props.HwProfile = 0x00; - - if (SetupDiSetClassInstallParams(deviceInfoSet, ref deviceInterfaceData, ref props, Marshal.SizeOf(props))) - { - return SetupDiCallClassInstaller(DIF_REMOVE, deviceInfoSet, ref deviceInterfaceData); - } - } - } - catch (Exception ex) - { - Console.WriteLine("{0} {1}", ex.HelpLink, ex.Message); - throw; - } - finally - { - if (deviceInfoSet != IntPtr.Zero) - { - SetupDiDestroyDeviceInfoList(deviceInfoSet); - } - } - - return false; - } - - #region Constant and Structure Definitions - protected const Int32 DIGCF_PRESENT = 0x0002; - protected const Int32 DIGCF_DEVICEINTERFACE = 0x0010; - - protected const Int32 DICD_GENERATE_ID = 0x0001; - protected const Int32 SPDRP_HARDWAREID = 0x0001; - - protected const Int32 DIF_REMOVE = 0x0005; - protected const Int32 DIF_REGISTERDEVICE = 0x0019; - - protected const Int32 DI_REMOVEDEVICE_GLOBAL = 0x0001; - - [StructLayout(LayoutKind.Sequential)] - protected struct SP_DEVINFO_DATA - { - internal Int32 cbSize; - internal Guid ClassGuid; - internal Int32 Flags; - internal IntPtr Reserved; - } - - [StructLayout(LayoutKind.Sequential)] - protected struct SP_CLASSINSTALL_HEADER - { - internal Int32 cbSize; - internal Int32 InstallFunction; - } - - [StructLayout(LayoutKind.Sequential)] - protected struct SP_REMOVEDEVICE_PARAMS - { - internal SP_CLASSINSTALL_HEADER ClassInstallHeader; - internal Int32 Scope; - internal Int32 HwProfile; - } - #endregion - - #region Interop Definitions - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern IntPtr SetupDiCreateDeviceInfoList(ref Guid ClassGuid, IntPtr hwndParent); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Boolean SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Boolean SetupDiCreateDeviceInfo(IntPtr DeviceInfoSet, String DeviceName, ref Guid ClassGuid, String DeviceDescription, IntPtr hwndParent, Int32 CreationFlags, ref SP_DEVINFO_DATA DeviceInfoData); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Boolean SetupDiSetDeviceRegistryProperty(IntPtr DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData, Int32 Property, [MarshalAs(UnmanagedType.LPWStr)] String PropertyBuffer, Int32 PropertyBufferSize); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Boolean SetupDiCallClassInstaller(Int32 InstallFunction, IntPtr DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, IntPtr Enumerator, IntPtr hwndParent, Int32 Flags); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Boolean SetupDiEnumDeviceInterfaces(IntPtr DeviceInfoSet, IntPtr DeviceInfoData, ref System.Guid InterfaceClassGuid, Int32 MemberIndex, ref SP_DEVINFO_DATA DeviceInterfaceData); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Boolean SetupDiGetDeviceInterfaceDetail(IntPtr DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInterfaceData, IntPtr DeviceInterfaceDetailData, Int32 DeviceInterfaceDetailDataSize, ref Int32 RequiredSize, ref SP_DEVINFO_DATA DeviceInfoData); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Int32 CM_Get_Device_ID(Int32 DevInst, IntPtr Buffer, Int32 BufferLen, Int32 Flags); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Boolean SetupDiOpenDeviceInfo(IntPtr DeviceInfoSet, String DeviceInstanceId, IntPtr hwndParent, Int32 Flags, ref SP_DEVINFO_DATA DeviceInfoData); - - [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] - protected static extern Boolean SetupDiSetClassInstallParams(IntPtr DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInterfaceData, ref SP_REMOVEDEVICE_PARAMS ClassInstallParams, Int32 ClassInstallParamsSize); - #endregion - } -} diff --git a/Scp/ScpInstaller/Difx.cs b/Scp/ScpInstaller/Difx.cs deleted file mode 100644 index 640a6f6..0000000 --- a/Scp/ScpInstaller/Difx.cs +++ /dev/null @@ -1,183 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace ScpDriver -{ - [Flags] - public enum DifxFlags - { - DRIVER_PACKAGE_REPAIR = 0x00000001, - DRIVER_PACKAGE_SILENT = 0x00000002, - DRIVER_PACKAGE_FORCE = 0x00000004, - DRIVER_PACKAGE_ONLY_IF_DEVICE_PRESENT = 0x00000008, - DRIVER_PACKAGE_LEGACY_MODE = 0x00000010, - DRIVER_PACKAGE_DELETE_FILES = 0x00000020, - } - - public enum DifxLog - { - DIFXAPI_SUCCESS = 0, - DIFXAPI_INFO = 1, - DIFXAPI_WARNING = 2, - DIFXAPI_ERROR = 3, - } - - public class Difx - { - public delegate void DIFLOGCALLBACK( - DifxLog EventType, - Int32 ErrorCode, - [MarshalAs(UnmanagedType.LPTStr)] String EventDescription, - IntPtr CallbackContext - ); - - public void Logger( - DifxLog EventType, - Int32 ErrorCode, - [MarshalAs(UnmanagedType.LPTStr)] String EventDescription, - IntPtr CallbackContext) - { - if (onLogEvent != null) onLogEvent(EventType, ErrorCode, EventDescription); - } - - protected DIFLOGCALLBACK m_LogCallback; - - public delegate void LogEventHandler(DifxLog Event, Int32 Error, String Description); - public LogEventHandler onLogEvent; - - protected Difx() - { - m_LogCallback = new DIFLOGCALLBACK(Logger); - } - - public virtual UInt32 Preinstall(String InfPath, DifxFlags Flags) - { - return 0xFFFFFFFF; - } - - public virtual UInt32 Install(String InfPath, DifxFlags Flags, out Boolean RebootRequired) - { - RebootRequired = false; - return 0xFFFFFFFF; - } - - public virtual UInt32 Uninstall(String InfPath, DifxFlags Flags, out Boolean RebootRequired) - { - RebootRequired = false; - return 0xFFFFFFFF; - } - - public static Difx Factory() - { - Difx RetVal = null; - - if (Environment.Is64BitProcess) - { - RetVal = new Difx_64(); - } - else - { - RetVal = new Difx_32(); - } - - return RetVal; - } - } - - public class Difx_32 : Difx - { - [DllImport(@".\DIFxApi\x86\DIFxAPI.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)] - private static extern UInt32 DriverPackagePreinstall( - [MarshalAs(UnmanagedType.LPTStr)] String DriverPackageInfPath, - [MarshalAs(UnmanagedType.U4)] UInt32 Flags - ); - - [DllImport(@".\DIFxApi\x86\DIFxAPI.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)] - private static extern UInt32 DriverPackageInstall( - [MarshalAs(UnmanagedType.LPTStr)] String DriverPackageInfPath, - [MarshalAs(UnmanagedType.U4)] UInt32 Flags, - IntPtr pInstallerInfo, - [MarshalAs(UnmanagedType.Bool)] out Boolean pNeedReboot - ); - - [DllImport(@".\DIFxApi\x86\DIFxAPI.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)] - private static extern UInt32 DriverPackageUninstall( - [MarshalAs(UnmanagedType.LPTStr)] String DriverPackageInfPath, - [MarshalAs(UnmanagedType.U4)] UInt32 Flags, - IntPtr pInstallerInfo, - [MarshalAs(UnmanagedType.Bool)] out Boolean pNeedReboot - ); - - [DllImport(@".\DIFxApi\x86\DIFxAPI.dll", CharSet = CharSet.Auto, SetLastError = true)] - public static extern void SetDifxLogCallback(DIFLOGCALLBACK LogCallback, IntPtr CallbackContext); - - public Difx_32() - { - SetDifxLogCallback(m_LogCallback, IntPtr.Zero); - } - - public override UInt32 Preinstall(String InfPath, DifxFlags Flags) - { - return DriverPackagePreinstall(InfPath, (UInt32) Flags); - } - - public override UInt32 Install(String InfPath, DifxFlags Flags, out Boolean RebootRequired) - { - return DriverPackageInstall(InfPath, (UInt32) Flags, IntPtr.Zero, out RebootRequired); - } - - public override UInt32 Uninstall(String InfPath, DifxFlags Flags, out Boolean RebootRequired) - { - return DriverPackageUninstall(InfPath, (UInt32) Flags, IntPtr.Zero, out RebootRequired); - } - } - - public class Difx_64 : Difx - { - [DllImport(@".\DIFxApi\amd64\DIFxAPI.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)] - private static extern UInt32 DriverPackagePreinstall( - [MarshalAs(UnmanagedType.LPTStr)] String DriverPackageInfPath, - [MarshalAs(UnmanagedType.U4)] UInt32 Flags - ); - - [DllImport(@".\DIFxApi\amd64\DIFxAPI.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)] - private static extern UInt32 DriverPackageInstall( - [MarshalAs(UnmanagedType.LPTStr)] String DriverPackageInfPath, - [MarshalAs(UnmanagedType.U4)] UInt32 Flags, - IntPtr pInstallerInfo, - [MarshalAs(UnmanagedType.Bool)] out Boolean pNeedReboot - ); - - [DllImport(@".\DIFxApi\amd64\DIFxAPI.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)] - private static extern UInt32 DriverPackageUninstall( - [MarshalAs(UnmanagedType.LPTStr)] String DriverPackageInfPath, - [MarshalAs(UnmanagedType.U4)] UInt32 Flags, - IntPtr pInstallerInfo, - [MarshalAs(UnmanagedType.Bool)] out Boolean pNeedReboot - ); - - [DllImport(@".\DIFxApi\amd64\DIFxAPI.dll", CharSet = CharSet.Auto, SetLastError = true)] - public static extern void SetDifxLogCallback(DIFLOGCALLBACK LogCallback, IntPtr CallbackContext); - - - public Difx_64() - { - SetDifxLogCallback(m_LogCallback, IntPtr.Zero); - } - - public override UInt32 Preinstall(String InfPath, DifxFlags Flags) - { - return DriverPackagePreinstall(InfPath, (UInt32) Flags); - } - - public override UInt32 Install(String InfPath, DifxFlags Flags, out Boolean RebootRequired) - { - return DriverPackageInstall(InfPath, (UInt32) Flags, (IntPtr) 0, out RebootRequired); - } - - public override UInt32 Uninstall(String InfPath, DifxFlags Flags, out Boolean RebootRequired) - { - return DriverPackageUninstall(InfPath, (UInt32) Flags, (IntPtr) 0, out RebootRequired); - } - } -} diff --git a/Scp/ScpInstaller/Program.cs b/Scp/ScpInstaller/Program.cs deleted file mode 100644 index aacd6ac..0000000 --- a/Scp/ScpInstaller/Program.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Windows.Forms; -using System.Security.Principal; - -namespace ScpDriver -{ - static class Program - { - [STAThread] - static void Main(String[] args) - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new ScpForm()); - } - } -} diff --git a/Scp/ScpInstaller/Properties/AssemblyInfo.cs b/Scp/ScpInstaller/Properties/AssemblyInfo.cs deleted file mode 100644 index 8d060a0..0000000 --- a/Scp/ScpInstaller/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("ScpDriver")] -[assembly: AssemblyProduct("ScpDriver")] - -[assembly: Guid("57ba2291-9504-441d-a0fe-9ccdd326508c")] diff --git a/Scp/ScpInstaller/Properties/Resources.Designer.cs b/Scp/ScpInstaller/Properties/Resources.Designer.cs deleted file mode 100644 index 84f03f6..0000000 --- a/Scp/ScpInstaller/Properties/Resources.Designer.cs +++ /dev/null @@ -1,73 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.34011 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ScpDriver.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ScpDriver.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). - /// - internal static System.Drawing.Icon Scp_All { - get { - object obj = ResourceManager.GetObject("Scp_All", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - } -} diff --git a/Scp/ScpInstaller/Properties/Resources.resx b/Scp/ScpInstaller/Properties/Resources.resx deleted file mode 100644 index 6224879..0000000 --- a/Scp/ScpInstaller/Properties/Resources.resx +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\Scp_All.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Scp/ScpInstaller/Properties/ScpInstaller.manifest b/Scp/ScpInstaller/Properties/ScpInstaller.manifest deleted file mode 100644 index fe7ac8c..0000000 --- a/Scp/ScpInstaller/Properties/ScpInstaller.manifest +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/Scp/ScpInstaller/Properties/Settings.Designer.cs b/Scp/ScpInstaller/Properties/Settings.Designer.cs deleted file mode 100644 index f639850..0000000 --- a/Scp/ScpInstaller/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.17929 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace SCPFilterDriver.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/Scp/ScpInstaller/Properties/Settings.settings b/Scp/ScpInstaller/Properties/Settings.settings deleted file mode 100644 index 3964565..0000000 --- a/Scp/ScpInstaller/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Scp/ScpInstaller/ScpDriver.xml b/Scp/ScpInstaller/ScpDriver.xml deleted file mode 100644 index 5826e6d..0000000 --- a/Scp/ScpInstaller/ScpDriver.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - True - True - True - True - \ No newline at end of file diff --git a/Scp/ScpInstaller/ScpForm.Designer.cs b/Scp/ScpInstaller/ScpForm.Designer.cs deleted file mode 100644 index 5de6169..0000000 --- a/Scp/ScpInstaller/ScpForm.Designer.cs +++ /dev/null @@ -1,219 +0,0 @@ -namespace ScpDriver -{ - partial class ScpForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.btnUninstall = new System.Windows.Forms.Button(); - this.btnInstall = new System.Windows.Forms.Button(); - this.InstallWorker = new System.ComponentModel.BackgroundWorker(); - this.UninstallWorker = new System.ComponentModel.BackgroundWorker(); - this.tbOutput = new System.Windows.Forms.TextBox(); - this.pbRunning = new System.Windows.Forms.ProgressBar(); - this.btnExit = new System.Windows.Forms.Button(); - this.cbService = new System.Windows.Forms.CheckBox(); - this.cbBluetooth = new System.Windows.Forms.CheckBox(); - this.cbForce = new System.Windows.Forms.CheckBox(); - this.cbDS3 = new System.Windows.Forms.CheckBox(); - this.cbBus = new System.Windows.Forms.CheckBox(); - this.SuspendLayout(); - // - // btnUninstall - // - this.btnUninstall.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnUninstall.Location = new System.Drawing.Point(416, 377); - this.btnUninstall.Name = "btnUninstall"; - this.btnUninstall.Size = new System.Drawing.Size(75, 23); - this.btnUninstall.TabIndex = 3; - this.btnUninstall.Text = "&Uninstall"; - this.btnUninstall.UseVisualStyleBackColor = true; - this.btnUninstall.Click += new System.EventHandler(this.btnUninstall_Click); - // - // btnInstall - // - this.btnInstall.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnInstall.Location = new System.Drawing.Point(335, 377); - this.btnInstall.Name = "btnInstall"; - this.btnInstall.Size = new System.Drawing.Size(75, 23); - this.btnInstall.TabIndex = 2; - this.btnInstall.Text = "&Install"; - this.btnInstall.UseVisualStyleBackColor = true; - this.btnInstall.Click += new System.EventHandler(this.btnInstall_Click); - // - // InstallWorker - // - this.InstallWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.InstallWorker_DoWork); - this.InstallWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.InstallWorker_RunWorkerCompleted); - // - // UninstallWorker - // - this.UninstallWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.UninstallWorker_DoWork); - this.UninstallWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.UninstallWorker_RunWorkerCompleted); - // - // tbOutput - // - this.tbOutput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tbOutput.BackColor = System.Drawing.SystemColors.Window; - this.tbOutput.Font = new System.Drawing.Font("Lucida Console", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.tbOutput.Location = new System.Drawing.Point(13, 13); - this.tbOutput.Multiline = true; - this.tbOutput.Name = "tbOutput"; - this.tbOutput.ReadOnly = true; - this.tbOutput.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.tbOutput.Size = new System.Drawing.Size(559, 335); - this.tbOutput.TabIndex = 4; - this.tbOutput.TabStop = false; - this.tbOutput.WordWrap = false; - // - // pbRunning - // - this.pbRunning.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.pbRunning.Location = new System.Drawing.Point(13, 354); - this.pbRunning.Name = "pbRunning"; - this.pbRunning.Size = new System.Drawing.Size(559, 17); - this.pbRunning.TabIndex = 5; - // - // btnExit - // - this.btnExit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnExit.Location = new System.Drawing.Point(497, 377); - this.btnExit.Name = "btnExit"; - this.btnExit.Size = new System.Drawing.Size(75, 23); - this.btnExit.TabIndex = 0; - this.btnExit.Text = "E&xit"; - this.btnExit.UseVisualStyleBackColor = true; - this.btnExit.Click += new System.EventHandler(this.btnExit_Click); - // - // cbService - // - this.cbService.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.cbService.AutoSize = true; - this.cbService.Checked = true; - this.cbService.CheckState = System.Windows.Forms.CheckState.Checked; - this.cbService.Location = new System.Drawing.Point(102, 381); - this.cbService.Name = "cbService"; - this.cbService.Size = new System.Drawing.Size(110, 17); - this.cbService.TabIndex = 6; - this.cbService.Text = "Configure Service"; - this.cbService.UseVisualStyleBackColor = true; - // - // cbBluetooth - // - this.cbBluetooth.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.cbBluetooth.AutoSize = true; - this.cbBluetooth.Checked = true; - this.cbBluetooth.CheckState = System.Windows.Forms.CheckState.Checked; - this.cbBluetooth.Location = new System.Drawing.Point(218, 381); - this.cbBluetooth.Name = "cbBluetooth"; - this.cbBluetooth.Size = new System.Drawing.Size(102, 17); - this.cbBluetooth.TabIndex = 7; - this.cbBluetooth.Text = "Bluetooth Driver"; - this.cbBluetooth.UseVisualStyleBackColor = true; - // - // cbForce - // - this.cbForce.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.cbForce.AutoSize = true; - this.cbForce.Location = new System.Drawing.Point(13, 381); - this.cbForce.Name = "cbForce"; - this.cbForce.Size = new System.Drawing.Size(83, 17); - this.cbForce.TabIndex = 8; - this.cbForce.Text = "Force Install"; - this.cbForce.UseVisualStyleBackColor = true; - // - // cbDS3 - // - this.cbDS3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.cbDS3.AutoSize = true; - this.cbDS3.Checked = true; - this.cbDS3.CheckState = System.Windows.Forms.CheckState.Checked; - this.cbDS3.Location = new System.Drawing.Point(12, 450); - this.cbDS3.Name = "cbDS3"; - this.cbDS3.Size = new System.Drawing.Size(78, 17); - this.cbDS3.TabIndex = 9; - this.cbDS3.Text = "DS3 Driver"; - this.cbDS3.UseVisualStyleBackColor = true; - // - // cbBus - // - this.cbBus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.cbBus.AutoSize = true; - this.cbBus.Checked = true; - this.cbBus.CheckState = System.Windows.Forms.CheckState.Checked; - this.cbBus.Location = new System.Drawing.Point(102, 450); - this.cbBus.Name = "cbBus"; - this.cbBus.Size = new System.Drawing.Size(75, 17); - this.cbBus.TabIndex = 10; - this.cbBus.Text = "Bus Driver"; - this.cbBus.UseVisualStyleBackColor = true; - // - // ScpForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(584, 412); - this.Controls.Add(this.cbBus); - this.Controls.Add(this.cbDS3); - this.Controls.Add(this.cbForce); - this.Controls.Add(this.cbBluetooth); - this.Controls.Add(this.cbService); - this.Controls.Add(this.btnExit); - this.Controls.Add(this.pbRunning); - this.Controls.Add(this.tbOutput); - this.Controls.Add(this.btnInstall); - this.Controls.Add(this.btnUninstall); - this.MinimumSize = new System.Drawing.Size(600, 450); - this.Name = "ScpForm"; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show; - this.Text = "SCP Driver Installer"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ScpForm_Close); - this.Load += new System.EventHandler(this.ScpForm_Load); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button btnUninstall; - private System.Windows.Forms.Button btnInstall; - private System.ComponentModel.BackgroundWorker InstallWorker; - private System.ComponentModel.BackgroundWorker UninstallWorker; - private System.Windows.Forms.TextBox tbOutput; - private System.Windows.Forms.ProgressBar pbRunning; - private System.Windows.Forms.Button btnExit; - private System.Windows.Forms.CheckBox cbService; - private System.Windows.Forms.CheckBox cbBluetooth; - private System.Windows.Forms.CheckBox cbForce; - private System.Windows.Forms.CheckBox cbDS3; - private System.Windows.Forms.CheckBox cbBus; - } -} - diff --git a/Scp/ScpInstaller/ScpForm.cs b/Scp/ScpInstaller/ScpForm.cs deleted file mode 100644 index d270e15..0000000 --- a/Scp/ScpInstaller/ScpForm.cs +++ /dev/null @@ -1,545 +0,0 @@ -using System; -using System.IO; -using System.ComponentModel; -using System.Text; -using System.Windows.Forms; -using System.Threading; -using System.Reflection; -using System.Xml; - -using System.Resources; -using System.Management; -using System.Text.RegularExpressions; - -using System.ServiceProcess; -using System.Configuration.Install; -using System.Collections; -using System.Collections.Specialized; - -namespace ScpDriver -{ - public enum OSType { INVALID, XP, VISTA, WIN7, WIN8, WIN81, DEFAULT }; - - public partial class ScpForm : Form - { - protected String DS3_BUS_CLASS_GUID = "{F679F562-3164-42CE-A4DB-E7DDBE723909}"; - - protected Cursor Saved; - protected Difx Installer; - - protected Boolean Bus_Device_Configured = false; - protected Boolean Bus_Driver_Configured = false; - protected Boolean DS3_Driver_Configured = false; - protected Boolean BTH_Driver_Configured = false; - protected Boolean Scp_Service_Configured = false; - - protected Boolean Reboot = false; - protected OSType Valid = OSType.INVALID; - protected String InfPath = @".\System\"; - protected String ScpService = "SCP DS3 Service"; - - protected String[] Desc = new String[] { "SUCCESS", "INFO ", "WARNING", "ERROR " }; - - protected void Logger(DifxLog Event, Int32 Error, String Description) - { - if (tbOutput.InvokeRequired) - { - Difx.LogEventHandler d = new Difx.LogEventHandler(Logger); - Invoke(d, new object[] { Event, Error, Description }); - } - else - { - StringBuilder sb = new StringBuilder(); - - sb.AppendFormat("{0} - {1}", Desc[(Int32) Event], Description); - sb.AppendLine(); - - tbOutput.AppendText(sb.ToString()); - } - } - - - protected String OSInfo() - { - String Info = String.Empty; - - try - { - using (ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")) - { - foreach (ManagementObject mo in mos.Get()) - { - try - { - Info = Regex.Replace(mo.GetPropertyValue("Caption").ToString(), "[^A-Za-z0-9 ]", "").Trim(); - - try - { - Object spv = mo.GetPropertyValue("ServicePackMajorVersion"); - - if (spv != null && spv.ToString() != "0") - { - Info += " Service Pack " + spv.ToString(); - } - } - catch { } - - Info = String.Format("{0} ({1} {2})", Info, System.Environment.OSVersion.Version.ToString(), System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")); - - } - catch { } - - mo.Dispose(); - } - } - } - catch { } - - return Info; - } - - protected OSType OSParse(String Info) - { - OSType Valid = OSType.INVALID; - - try - { - String Architecture = System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE").ToUpper().Trim(); - - if (Environment.Is64BitOperatingSystem == Environment.Is64BitProcess && (Architecture == "X86" || Architecture == "AMD64")) - { - Valid = OSType.DEFAULT; - - if (!String.IsNullOrEmpty(Info)) - { - String[] Token = Info.Split(new char[] { ' ' }); - - if (Token[0].ToUpper().Trim() == "MICROSOFT" && Token[1].ToUpper().Trim() == "WINDOWS") - { - switch (Token[2].ToUpper().Trim()) - { - case "XP": - - if (!System.Environment.Is64BitOperatingSystem) Valid = OSType.XP; - break; - - case "VISTA": - - Valid = OSType.VISTA; - break; - - case "7": - - Valid = OSType.WIN7; - break; - - case "8": - - Valid = OSType.WIN8; - break; - - case "81": - - Valid = OSType.WIN81; - break; - - case "SERVER": - - switch (Token[3].ToUpper().Trim()) - { - case "2008": - - if (Token[4].ToUpper().Trim() == "R2") - { - Valid = OSType.WIN7; - } - else - { - Valid = OSType.VISTA; - } - break; - - case "2012": - - Valid = OSType.WIN8; - break; - } - break; - } - } - } - } - } - catch { } - - return Valid; - } - - - protected Boolean Start(String Service) - { - try - { - ServiceController sc = new ServiceController("SCP DS3 Service"); - - if (sc.Status == ServiceControllerStatus.Stopped) - { - sc.Start(); Thread.Sleep(1000); - return true; - } - } - catch { } - - return false; - } - - protected Boolean Stop(String Service) - { - try - { - ServiceController sc = new ServiceController("SCP DS3 Service"); - - if (sc.Status == ServiceControllerStatus.Running) - { - sc.Stop(); Thread.Sleep(1000); - return true; - } - } - catch { } - - return false; - } - - protected Boolean Configuration() - { - Boolean Loaded = true, Enabled = true; - - try - { - String m_File = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + Assembly.GetExecutingAssembly().GetName().Name + ".xml"; - XmlDocument m_Xdoc = new XmlDocument(); - XmlNode Item; - - m_Xdoc.Load(m_File); - - try - { - Item = m_Xdoc.SelectSingleNode("/ScpDriver/Service"); Boolean.TryParse(Item.InnerText, out Enabled); - cbService.Checked = cbService.Visible = Enabled; - } - catch { } - - try - { - Item = m_Xdoc.SelectSingleNode("/ScpDriver/Bluetooth"); Boolean.TryParse(Item.InnerText, out Enabled); - cbBluetooth.Checked = cbBluetooth.Visible = Enabled; - } - catch { } - - try - { - Item = m_Xdoc.SelectSingleNode("/ScpDriver/DualShock3"); Boolean.TryParse(Item.InnerText, out Enabled); - cbDS3.Checked = cbDS3.Visible = Enabled; - } - catch { } - - try - { - Item = m_Xdoc.SelectSingleNode("/ScpDriver/VirtualBus"); Boolean.TryParse(Item.InnerText, out Enabled); - cbBus.Checked = cbBus.Visible = Enabled; - - // Don't install Service if Bus not Enabled - if (!Enabled) cbService.Checked = cbService.Visible = Enabled; - } - catch { } - } - catch { Loaded = false; } - - return Loaded; - } - - - public ScpForm() - { - InitializeComponent(); - Configuration(); - - StringBuilder sb = new StringBuilder(); - - sb.AppendFormat("SCP Driver Installer {0} [{1}]", Application.ProductVersion, DateTime.Now); - sb.AppendLine(); - sb.AppendLine(); - - Installer = Difx.Factory(); - Installer.onLogEvent += Logger; - - String Info = OSInfo(); - Valid = OSParse(Info); - - sb.Append("Detected - "); - sb.Append(Info); - sb.AppendLine(); - - tbOutput.AppendText(sb.ToString()); - sb.Clear(); - - if (Valid == OSType.INVALID) - { - btnInstall.Enabled = false; - btnUninstall.Enabled = false; - - sb.AppendLine("Could not find a valid configuration."); - } - else - { - btnInstall.Enabled = true; - btnUninstall.Enabled = true; - - sb.AppendFormat("Selected {0} configuration.", Valid); - } - - sb.AppendLine(); - sb.AppendLine(); - - tbOutput.AppendText(sb.ToString()); - } - - - protected void ScpForm_Load(object sender, EventArgs e) - { - Icon = Properties.Resources.Scp_All; - } - - protected void ScpForm_Close(object sender, FormClosingEventArgs e) - { - try { File.AppendAllLines("ScpDriver.log", tbOutput.Lines); } - catch { } - } - - - protected void btnInstall_Click(object sender, EventArgs e) - { - Saved = Cursor; - Cursor = Cursors.WaitCursor; - - btnInstall.Enabled = false; - btnUninstall.Enabled = false; - btnExit.Enabled = false; - - Bus_Device_Configured = false; - Bus_Driver_Configured = false; - DS3_Driver_Configured = false; - BTH_Driver_Configured = false; - Scp_Service_Configured = false; - - pbRunning.Style = ProgressBarStyle.Marquee; - - InstallWorker.RunWorkerAsync(InfPath); - } - - protected void btnUninstall_Click(object sender, EventArgs e) - { - Saved = Cursor; - Cursor = Cursors.WaitCursor; - - btnInstall.Enabled = false; - btnUninstall.Enabled = false; - btnExit.Enabled = false; - - Bus_Device_Configured = false; - Bus_Driver_Configured = false; - DS3_Driver_Configured = false; - BTH_Driver_Configured = false; - Scp_Service_Configured = false; - - pbRunning.Style = ProgressBarStyle.Marquee; - - UninstallWorker.RunWorkerAsync(InfPath); - } - - protected void btnExit_Click(object sender, EventArgs e) - { - Close(); - } - - - protected void InstallWorker_DoWork(object sender, DoWorkEventArgs e) - { - String InfPath = (String) e.Argument; - String DevPath = String.Empty, InstanceId = String.Empty; - - try - { - UInt32 Result = 0; - Boolean RebootRequired = false; - - DifxFlags Flags = DifxFlags.DRIVER_PACKAGE_ONLY_IF_DEVICE_PRESENT; - - if (cbForce.Checked) Flags |= DifxFlags.DRIVER_PACKAGE_FORCE; - - if (cbBus.Checked) - { - if (!Devcon.Find(new Guid(DS3_BUS_CLASS_GUID), ref DevPath, ref InstanceId)) - { - if (Devcon.Create("System", new Guid("{4D36E97D-E325-11CE-BFC1-08002BE10318}"), "root\\ScpVBus\0\0")) - { - Logger(DifxLog.DIFXAPI_SUCCESS, 0, "Virtual Bus Created"); - Bus_Device_Configured = true; - } - } - - Result = Installer.Install(InfPath + @"ScpVBus.inf", Flags, out RebootRequired); Reboot |= RebootRequired; - if (Result == 0) Bus_Driver_Configured = true; - } - - if (cbBluetooth.Checked) - { - Result = Installer.Install(InfPath + @"BthWinUsb.inf", Flags, out RebootRequired); Reboot |= RebootRequired; - if (Result == 0) BTH_Driver_Configured = true; - } - - - if (cbDS3.Checked) - { - Result = Installer.Install(InfPath + @"Ds3WinUsb.inf", Flags, out RebootRequired); Reboot |= RebootRequired; - if (Result == 0) DS3_Driver_Configured = true; - } - - if (cbService.Checked) - { - IDictionary State = new Hashtable(); - AssemblyInstaller Service = new AssemblyInstaller(Directory.GetCurrentDirectory() + @"\ScpService.exe", null); - - State.Clear(); Service.UseNewContext = true; - - Service.Install(State); - Service.Commit (State); - - if (Start(ScpService)) Logger(DifxLog.DIFXAPI_INFO, 0, ScpService + " Started."); - else Reboot = true; - - Scp_Service_Configured = true; - } - } - catch { } - } - - protected void InstallWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - pbRunning.Style = ProgressBarStyle.Continuous; - - btnInstall.Enabled = true; - btnUninstall.Enabled = true; - btnExit.Enabled = true; - - Cursor = Saved; - - StringBuilder sb = new StringBuilder(); - - sb.AppendLine(); - sb.AppendFormat("Install Succeeded."); - if (Reboot) sb.Append(" [Reboot Required]"); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine("-- Install Summary --"); - if (Scp_Service_Configured) sb.AppendLine("SCP DS3 Service"); - if (Bus_Device_Configured) sb.AppendLine("Bus Device"); - if (Bus_Driver_Configured) sb.AppendLine("Bus Driver"); - if (DS3_Driver_Configured) sb.AppendLine("DS3 USB Driver"); - if (BTH_Driver_Configured) sb.AppendLine("Bluetooth Driver"); - sb.AppendLine(); - - sb.AppendLine(); - tbOutput.AppendText(sb.ToString()); - } - - - protected void UninstallWorker_DoWork(object sender, DoWorkEventArgs e) - { - String InfPath = (String) e.Argument; - String DevPath = String.Empty, InstanceId = String.Empty; - - try - { - UInt32 Result = 0; - Boolean RebootRequired = false; - - if (cbService.Checked) - { - IDictionary State = new Hashtable(); - AssemblyInstaller Service = new AssemblyInstaller(Directory.GetCurrentDirectory() + @"\ScpService.exe", null); - - State.Clear(); Service.UseNewContext = true; - - if (Stop(ScpService)) - { - Logger(DifxLog.DIFXAPI_INFO, 0, ScpService + " Stopped."); - } - - try - { - Service.Uninstall(State); - Scp_Service_Configured = true; - } - catch { } - } - - if (cbBluetooth.Checked) - { - Result = Installer.Uninstall(InfPath + @"BthWinUsb.inf", DifxFlags.DRIVER_PACKAGE_DELETE_FILES, out RebootRequired); Reboot |= RebootRequired; - if (Result == 0) BTH_Driver_Configured = true; - } - - if (cbDS3.Checked) - { - Result = Installer.Uninstall(InfPath + @"Ds3WinUsb.inf", DifxFlags.DRIVER_PACKAGE_DELETE_FILES, out RebootRequired); Reboot |= RebootRequired; - if (Result == 0) DS3_Driver_Configured = true; - } - - if (cbBus.Checked && Devcon.Find(new Guid(DS3_BUS_CLASS_GUID), ref DevPath, ref InstanceId)) - { - if (Devcon.Remove(new Guid(DS3_BUS_CLASS_GUID), DevPath, InstanceId)) - { - Logger(DifxLog.DIFXAPI_SUCCESS, 0, "Virtual Bus Removed"); - Bus_Device_Configured = true; - - Installer.Uninstall(InfPath + @"ScpVBus.inf", DifxFlags.DRIVER_PACKAGE_DELETE_FILES, out RebootRequired); Reboot |= RebootRequired; - } - else - { - Logger(DifxLog.DIFXAPI_ERROR, 0, "Virtual Bus Removal Failure"); - } - } - } - catch { } - } - - protected void UninstallWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - pbRunning.Style = ProgressBarStyle.Continuous; - - btnInstall.Enabled = true; - btnUninstall.Enabled = true; - btnExit.Enabled = true; - - Cursor = Saved; - - StringBuilder sb = new StringBuilder(); - - sb.AppendLine(); - sb.AppendFormat("Uninstall Succeeded."); - if (Reboot) sb.Append(" [Reboot Required]"); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine("-- Uninstall Summary --"); - if (Scp_Service_Configured) sb.AppendLine("SCP DS3 Service"); - if (Bus_Device_Configured) sb.AppendLine("Bus Device"); - if (Bus_Driver_Configured) sb.AppendLine("Bus Driver"); - if (DS3_Driver_Configured) sb.AppendLine("DS3 USB Driver"); - if (BTH_Driver_Configured) sb.AppendLine("Bluetooth Driver"); - - sb.AppendLine(); - tbOutput.AppendText(sb.ToString()); - } - } -} diff --git a/Scp/ScpInstaller/ScpForm.resx b/Scp/ScpInstaller/ScpForm.resx deleted file mode 100644 index 1b7b12b..0000000 --- a/Scp/ScpInstaller/ScpForm.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 140, 17 - - \ No newline at end of file diff --git a/Scp/ScpInstaller/ScpInstaller.csproj b/Scp/ScpInstaller/ScpInstaller.csproj deleted file mode 100644 index 61df668..0000000 --- a/Scp/ScpInstaller/ScpInstaller.csproj +++ /dev/null @@ -1,119 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {D5ED7E4A-0B5B-42C4-BBBE-942842BC4535} - WinExe - Properties - ScpDriver - ScpDriver - v4.0 - Client - 512 - - - true - ..\..\bin\ - DEBUG;TRACE - full - AnyCPU - bin\Debug\ScpInstaller.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - ..\..\bin\ - TRACE - true - pdbonly - AnyCPU - bin\Release\ScpInstaller.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - Resources\Scp_All.ico - - - Properties\ScpInstaller.manifest - - - - - - - - - - - - - - - - Form - - - ScpForm.cs - - - - - ScpForm.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - PreserveNewest - - - - - - Copy /Y /B $(SolutionDir)\Common\Properties\Info.cs $(ProjectDir)\Properties\CommonInfo.cs > nul: -If Not Exist $(ProjectDir)\Resources\Scp_All.ico Copy /Y /B $(SolutionDir)\Common\Resources\Scp.ico $(ProjectDir)\Resources\Scp_All.ico > nul: - - - \ No newline at end of file diff --git a/Scp/ScpInstaller/ScpInstaller_2010.csproj b/Scp/ScpInstaller/ScpInstaller_2010.csproj deleted file mode 100644 index 61df668..0000000 --- a/Scp/ScpInstaller/ScpInstaller_2010.csproj +++ /dev/null @@ -1,119 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {D5ED7E4A-0B5B-42C4-BBBE-942842BC4535} - WinExe - Properties - ScpDriver - ScpDriver - v4.0 - Client - 512 - - - true - ..\..\bin\ - DEBUG;TRACE - full - AnyCPU - bin\Debug\ScpInstaller.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - ..\..\bin\ - TRACE - true - pdbonly - AnyCPU - bin\Release\ScpInstaller.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - Resources\Scp_All.ico - - - Properties\ScpInstaller.manifest - - - - - - - - - - - - - - - - Form - - - ScpForm.cs - - - - - ScpForm.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - PreserveNewest - - - - - - Copy /Y /B $(SolutionDir)\Common\Properties\Info.cs $(ProjectDir)\Properties\CommonInfo.cs > nul: -If Not Exist $(ProjectDir)\Resources\Scp_All.ico Copy /Y /B $(SolutionDir)\Common\Resources\Scp.ico $(ProjectDir)\Resources\Scp_All.ico > nul: - - - \ No newline at end of file diff --git a/Scp/ScpMonitor/AxisBar.Designer.cs b/Scp/ScpMonitor/AxisBar.Designer.cs deleted file mode 100644 index 12ab21e..0000000 --- a/Scp/ScpMonitor/AxisBar.Designer.cs +++ /dev/null @@ -1,47 +0,0 @@ -namespace ScpMonitor -{ - partial class AxisBar - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.SuspendLayout(); - // - // AxisBar - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.Color.Transparent; - this.Name = "AxisBar"; - this.Size = new System.Drawing.Size(130, 13); - this.ResumeLayout(false); - - } - - #endregion - - } -} diff --git a/Scp/ScpMonitor/AxisBar.cs b/Scp/ScpMonitor/AxisBar.cs deleted file mode 100644 index e0388f5..0000000 --- a/Scp/ScpMonitor/AxisBar.cs +++ /dev/null @@ -1,143 +0,0 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -namespace ScpMonitor -{ - public partial class AxisBar : UserControl - { - public AxisBar() - { - InitializeComponent(); - } - - protected Int32 m_Minimum = 0; - protected Int32 m_Maximum = 100; - protected Int32 m_Value = 0; - protected Color m_Colour = Color.Green; - - protected override void OnResize(EventArgs e) - { - Invalidate(); - } - - protected override void OnPaint(PaintEventArgs e) - { - using (Graphics gr = e.Graphics) - { - using (SolidBrush br = new SolidBrush(m_Colour)) - { - float Fill = (float)(m_Value - m_Minimum) / (float)(m_Maximum - m_Minimum); - Rectangle Rect = ClientRectangle; - - Rect.Width = (Int32)((float) Rect.Width * Fill); - gr.FillRectangle(br, Rect); - } - } - } - - public Int32 Minimum - { - get { return m_Minimum; } - set - { - if (value < 0 || value > m_Maximum) - { - throw new ArgumentOutOfRangeException("Minimum"); - } - - if (m_Value < value) - { - m_Value = value; - } - - if (m_Minimum != value) - { - m_Minimum = value; - Invalidate(); - } - } - } - - public Int32 Maximum - { - get { return m_Maximum; } - set - { - if (value < 0 || value < m_Minimum) - { - throw new ArgumentOutOfRangeException("Maximum"); - } - - if (m_Value > value) - { - m_Value = value; - } - - if (m_Maximum != value) - { - m_Maximum = value; - Invalidate(); - } - } - } - - public Int32 Value - { - get { return m_Value; } - set - { - if (value < m_Minimum || value > m_Maximum) - { - throw new ArgumentOutOfRangeException("Maximum"); - } - - if (m_Value != value) - { - Rectangle newRect = ClientRectangle; - Rectangle oldRect = ClientRectangle; - Int32 oldValue = m_Value; - float Fill; - - m_Value = value; - - Fill = (float)(m_Value - m_Minimum) / (float)(m_Maximum - m_Minimum); - newRect.Width = (int)((float)newRect.Width * Fill); - - Fill = (float)(oldValue - m_Minimum) / (float)(m_Maximum - m_Minimum); - oldRect.Width = (int)((float)oldRect.Width * Fill); - - Rectangle Rect = new Rectangle(); Rect.Height = Height; - - if (newRect.Width > oldRect.Width) - { - Rect.X = oldRect.Size.Width; - Rect.Width = newRect.Width - oldRect.Width; - } - else - { - Rect.X = newRect.Size.Width; - Rect.Width = oldRect.Width - newRect.Width; - } - - Invalidate(Rect); - } - } - } - - public Color Color - { - get { return m_Colour; } - set - { - if (m_Colour != value) - { - m_Colour = value; - Invalidate(); - } - } - } - } -} diff --git a/Scp/ScpMonitor/AxisBar.resx b/Scp/ScpMonitor/AxisBar.resx deleted file mode 100644 index 1af7de1..0000000 --- a/Scp/ScpMonitor/AxisBar.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Scp/ScpMonitor/AxisControl.Designer.cs b/Scp/ScpMonitor/AxisControl.Designer.cs deleted file mode 100644 index f797697..0000000 --- a/Scp/ScpMonitor/AxisControl.Designer.cs +++ /dev/null @@ -1,82 +0,0 @@ -namespace ScpMonitor -{ - partial class AxisControl - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.axBar = new ScpMonitor.AxisBar(); - this.axButton = new ScpMonitor.ScpButton(); - this.SuspendLayout(); - // - // axBar - // - this.axBar.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.axBar.BackColor = System.Drawing.Color.Transparent; - this.axBar.Color = System.Drawing.Color.Green; - this.axBar.Location = new System.Drawing.Point(25, 0); - this.axBar.Maximum = 255; - this.axBar.Minimum = 0; - this.axBar.Name = "axBar"; - this.axBar.Size = new System.Drawing.Size(135, 15); - this.axBar.TabIndex = 1; - this.axBar.Value = 0; - // - // axButton - // - this.axButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.axButton.Glassy = true; - this.axButton.Location = new System.Drawing.Point(0, 0); - this.axButton.Name = "axButton"; - this.axButton.Size = new System.Drawing.Size(25, 15); - this.axButton.TabIndex = 0; - this.axButton.Text = "--"; - this.axButton.UseVisualStyleBackColor = true; - this.axButton.Click += new System.EventHandler(this.axButton_Click); - // - // AxisControl - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.SystemColors.Control; - this.Controls.Add(this.axBar); - this.Controls.Add(this.axButton); - this.Name = "AxisControl"; - this.Size = new System.Drawing.Size(160, 15); - this.ResumeLayout(false); - - } - - #endregion - - private ScpButton axButton; - private AxisBar axBar; - - } -} diff --git a/Scp/ScpMonitor/AxisControl.cs b/Scp/ScpMonitor/AxisControl.cs deleted file mode 100644 index 17892a7..0000000 --- a/Scp/ScpMonitor/AxisControl.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -namespace ScpMonitor -{ - public enum Orientation { Left, Right, Top, Bottom } - - public partial class AxisControl : UserControl - { - protected Orientation m_Orientation = Orientation.Left; - - [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] - public override String Text - { - get { return axButton.Text; } - set { axButton.Text = value; } - } - - [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] - public Byte Value - { - get { return (Byte) axBar.Value; } - set { axBar.Value = value; } - } - - [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] - public Color Color - { - get { return axBar.Color; } - set { axBar.Color = value; } - } - - [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] - public Orientation Orientation - { - get { return m_Orientation; } - set - { - if (m_Orientation != value) - { - m_Orientation = value; - - switch(m_Orientation) - { - case ScpMonitor.Orientation.Left: - { - Size = new Size(115, 15); - - axButton.Location = new Point(0, 0); - axButton.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom; - axButton.Size = new Size(25, Height); - - axBar.Location = new Point(25, 0); - axBar.Anchor = AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left; - axBar.Size = new Size(Width - 25, Height); - } - break; - - case ScpMonitor.Orientation.Right: - { - Size = new Size(115, 15); - - axButton.Location = new Point(Width - 25, 0); - axButton.Anchor = AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom; - axButton.Size = new Size(25, Height); - - axBar.Location = new Point(0, 0); - axBar.Anchor = AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left; - axBar.Size = new Size(Width - 25, Height); - } - break; - - case ScpMonitor.Orientation.Top: - { - Size = new Size(25, 30); - - axButton.Location = new Point(0, Height - 15); - axButton.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; - axButton.Size = new Size(Width, 15); - - axBar.Location = new Point(0, 0); - axBar.Anchor = AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left; - axBar.Size = new Size(Width, Height - 15); - } - break; - - case ScpMonitor.Orientation.Bottom: - { - Size = new Size(25, 30); - - axButton.Location = new Point(0, 0); - axButton.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right; - axButton.Size = new Size(Width, 15); - - axBar.Location = new Point(0, 15); - axBar.Anchor = AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left; - axBar.Size = new Size(Width, Height - 15); - } - break; - } - } - } - } - - public AxisControl() - { - InitializeComponent(); - } - - private void axButton_Click(object sender, EventArgs e) - { - InvokeOnClick(this, e); - } - } -} diff --git a/Scp/ScpMonitor/AxisControl.resx b/Scp/ScpMonitor/AxisControl.resx deleted file mode 100644 index 1af7de1..0000000 --- a/Scp/ScpMonitor/AxisControl.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Scp/ScpMonitor/ProfileProperties.Designer.cs b/Scp/ScpMonitor/ProfileProperties.Designer.cs deleted file mode 100644 index 5cb1fcc..0000000 --- a/Scp/ScpMonitor/ProfileProperties.Designer.cs +++ /dev/null @@ -1,97 +0,0 @@ -namespace ScpMonitor -{ - partial class ProfileProperties - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.propGrid = new System.Windows.Forms.PropertyGrid(); - this.btnSave = new System.Windows.Forms.Button(); - this.btnClose = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // propGrid - // - this.propGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.propGrid.Location = new System.Drawing.Point(2, 2); - this.propGrid.Name = "propGrid"; - this.propGrid.Size = new System.Drawing.Size(280, 339); - this.propGrid.TabIndex = 2; - // - // btnSave - // - this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnSave.Location = new System.Drawing.Point(116, 347); - this.btnSave.Name = "btnSave"; - this.btnSave.Size = new System.Drawing.Size(75, 23); - this.btnSave.TabIndex = 0; - this.btnSave.Text = "Save"; - this.btnSave.UseVisualStyleBackColor = true; - this.btnSave.Click += new System.EventHandler(this.btnSave_Click); - // - // btnClose - // - this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnClose.Location = new System.Drawing.Point(197, 347); - this.btnClose.Name = "btnClose"; - this.btnClose.Size = new System.Drawing.Size(75, 23); - this.btnClose.TabIndex = 1; - this.btnClose.Text = "Close"; - this.btnClose.UseVisualStyleBackColor = true; - this.btnClose.Click += new System.EventHandler(this.btnClose_Click); - // - // ProfileProperties - // - this.AcceptButton = this.btnSave; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnClose; - this.ClientSize = new System.Drawing.Size(284, 381); - this.Controls.Add(this.btnClose); - this.Controls.Add(this.btnSave); - this.Controls.Add(this.propGrid); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ProfileProperties"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Profile Properties"; - this.Load += new System.EventHandler(this.Form_Load); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.PropertyGrid propGrid; - private System.Windows.Forms.Button btnSave; - private System.Windows.Forms.Button btnClose; - } -} \ No newline at end of file diff --git a/Scp/ScpMonitor/ProfileProperties.cs b/Scp/ScpMonitor/ProfileProperties.cs deleted file mode 100644 index 3d31793..0000000 --- a/Scp/ScpMonitor/ProfileProperties.cs +++ /dev/null @@ -1,464 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.ComponentModel.Design; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -using ScpControl; - -namespace ScpMonitor -{ - public partial class ProfileProperties : Form - { - protected Profile m_Profile; - protected Boolean m_Saved = false; - protected PropEditProfile m_Editor; - - public Profile Profile - { - get { return m_Profile; } - } - - public Boolean Saved - { - get { return m_Saved; } - } - - public ProfileProperties(Profile Profile, DsPadId Pad, String Mac, Boolean Edit) - { - InitializeComponent(); - - m_Profile = Profile; - btnSave.Enabled = Edit; - - propGrid.SelectedObject = m_Editor = new PropEditProfile(Pad, Mac); - } - - protected void Form_Load(object sender, EventArgs e) - { - Location = new Point(Owner.Location.X + Owner.Width, Owner.Location.Y); - Height = Owner.Height; - - m_Editor.Name = m_Profile.Name; - m_Editor.Type = m_Profile.Match; - m_Editor.Target = m_Profile.Qualifier; - - foreach (Ds3Axis Key in m_Profile.Ds3Axis.Keys) - { - m_Editor.Ds3Axis.Add(new Ds3AxisMap(Key, m_Profile.Ds3Axis[Key])); - } - - foreach (Ds4Axis Key in m_Profile.Ds4Axis.Keys) - { - m_Editor.Ds4Axis.Add(new Ds4AxisMap(Key, m_Profile.Ds4Axis[Key])); - } - - foreach (Ds3Button Key in m_Profile.Ds3Button.Keys) - { - m_Editor.Ds3Button.Add(new Ds3ButtonMap(Key, m_Profile.Ds3Button[Key])); - } - - foreach (Ds4Button Key in m_Profile.Ds4Button.Keys) - { - m_Editor.Ds4Button.Add(new Ds4ButtonMap(Key, m_Profile.Ds4Button[Key])); - } - } - - protected void btnSave_Click(object sender, EventArgs e) - { - m_Profile = new Profile(m_Profile.Default, m_Editor.Name, m_Editor.Type.ToString(), m_Editor.Target); - - foreach (Ds3AxisMap Map in m_Editor.Ds3Axis) - { - m_Profile.Ds3Axis[Map.Name] = Map.Value; - } - - foreach (Ds4AxisMap Map in m_Editor.Ds4Axis) - { - m_Profile.Ds4Axis[Map.Name] = Map.Value; - } - - foreach (Ds3ButtonMap Map in m_Editor.Ds3Button) - { - m_Profile.Ds3Button[Map.Name] = Map.Value; - } - - foreach (Ds4ButtonMap Map in m_Editor.Ds4Button) - { - m_Profile.Ds4Button[Map.Name] = Map.Value; - } - - m_Saved = true; - Close(); - } - - protected void btnClose_Click(object sender, EventArgs e) - { - Close(); - } - } - - public class PropEditProfile - { - protected String m_Name; - protected DsMatch m_Type; - protected DsPadId m_Pad; - protected String m_Mac; - protected String m_Qualifier; - - protected Ds3AxisCollection m_Ds3Axis = new Ds3AxisCollection(); - protected Ds4AxisCollection m_Ds4Axis = new Ds4AxisCollection(); - - protected Ds3ButtonCollection m_Ds3Button = new Ds3ButtonCollection(); - protected Ds4ButtonCollection m_Ds4Button = new Ds4ButtonCollection(); - - public PropEditProfile(DsPadId Pad, String Mac) - { - m_Pad = Pad; - m_Mac = Mac; - } - - [Category("Details")] - public virtual String Name - { - get { return m_Name; } - set { m_Name = value; } - } - - [Category("Details")] - public virtual DsMatch Type - { - get { return m_Type; } - set - { - m_Type = value; - - switch (m_Type) - { - case DsMatch.Pad: m_Qualifier = m_Pad.ToString(); break; - case DsMatch.Mac: m_Qualifier = m_Mac; break; - default: - m_Qualifier = String.Empty; - break; - } - } - } - - [Category("Details")] - public virtual String Target - { - get { return m_Qualifier; } - internal set { m_Qualifier = value; } - } - - [Category("Mapping")] - [DisplayName("DS3 Button")] - [Description("DS3 Button used in the Mapping")] - public Ds3ButtonCollection Ds3Button - { - get { return m_Ds3Button; } - } - - [Category("Mapping")] - [DisplayName("DS3 Axis")] - [Description("DS3 Axis used in the Mapping")] - public Ds3AxisCollection Ds3Axis - { - get { return m_Ds3Axis; } - } - - [Category("Mapping")] - [DisplayName("DS4 Button")] - [Description("DS4 Button used in the Mapping")] - public Ds4ButtonCollection Ds4Button - { - get { return m_Ds4Button; } - } - - [Category("Mapping")] - [DisplayName("DS4 Axis")] - [Description("DS4 Axis used in the Mapping")] - public Ds4AxisCollection Ds4Axis - { - get { return m_Ds4Axis; } - } - } - - public class Ds3AxisMap - { - protected Ds3Axis m_Name = Ds3Axis.None, m_Value = Ds3Axis.None; - - public Ds3AxisMap() { } - - public Ds3AxisMap(Ds3Axis Name, Ds3Axis Value) - { - m_Name = Name; - m_Value = Value; - } - - public Ds3Axis Name - { - get { return m_Name; } - set { m_Name = value; } - } - - public Ds3Axis Value - { - get { return m_Value; } - set { m_Value = value; } - } - } - public class Ds4AxisMap - { - protected Ds4Axis m_Name = Ds4Axis.None, m_Value = Ds4Axis.None; - - public Ds4AxisMap() { } - - public Ds4AxisMap(Ds4Axis Name, Ds4Axis Value) - { - m_Name = Name; - m_Value = Value; - } - - public Ds4Axis Name - { - get { return m_Name; } - set { m_Name = value; } - } - - public Ds4Axis Value - { - get { return m_Value; } - set { m_Value = value; } - } - } - public class Ds3ButtonMap - { - protected Ds3Button m_Name = Ds3Button.None, m_Value = Ds3Button.None; - - public Ds3ButtonMap() { } - - public Ds3ButtonMap(Ds3Button Name, Ds3Button Value) - { - m_Name = Name; - m_Value = Value; - } - - public Ds3Button Name - { - get { return m_Name; } - set { m_Name = value; } - } - - public Ds3Button Value - { - get { return m_Value; } - set { m_Value = value; } - } - } - public class Ds4ButtonMap - { - protected Ds4Button m_Name = Ds4Button.None, m_Value = Ds4Button.None; - - public Ds4ButtonMap() { } - - public Ds4ButtonMap(Ds4Button Name, Ds4Button Value) - { - m_Name = Name; - m_Value = Value; - } - - public Ds4Button Name - { - get { return m_Name; } - set { m_Name = value; } - } - - public Ds4Button Value - { - get { return m_Value; } - set { m_Value = value; } - } - } - - [DisplayName("DS3 Axis Mapper")] - [Editor(typeof(Ds3AxisCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))] - public class Ds3AxisCollection : CollectionBase - { - public Ds3AxisMap this[Int32 Index] - { - get { return (Ds3AxisMap)List[Index]; } - } - - public void Add(Ds3AxisMap Prop) - { - List.Add(Prop); - } - - public void Remove(Ds3AxisMap Prop) - { - List.Remove(Prop); - } - } - - [DisplayName("DS4 Axis Mapper")] - [Editor(typeof(Ds4AxisCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))] - public class Ds4AxisCollection : CollectionBase - { - public Ds4AxisMap this[Int32 Index] - { - get { return (Ds4AxisMap)List[Index]; } - } - - public void Add(Ds4AxisMap Prop) - { - List.Add(Prop); - } - - public void Remove(Ds4AxisMap Prop) - { - List.Remove(Prop); - } - } - - [DisplayName("DS3 Button Mapper")] - [Editor(typeof(Ds3ButtonCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))] - public class Ds3ButtonCollection : CollectionBase - { - public Ds3ButtonMap this[Int32 Index] - { - get { return (Ds3ButtonMap) List[Index]; } - } - - public void Add(Ds3ButtonMap Prop) - { - List.Add(Prop); - } - - public void Remove(Ds3ButtonMap Prop) - { - List.Remove(Prop); - } - } - - [DisplayName("DS4 Button Mapper")] - [Editor(typeof(Ds4ButtonCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))] - public class Ds4ButtonCollection : CollectionBase - { - public Ds4ButtonMap this[Int32 Index] - { - get { return (Ds4ButtonMap)List[Index]; } - } - - public void Add(Ds4ButtonMap Prop) - { - List.Add(Prop); - } - - public void Remove(Ds4ButtonMap Prop) - { - List.Remove(Prop); - } - } - - public class Ds3AxisCollectionEditor : CollectionEditor - { - public Ds3AxisCollectionEditor(Type Type) : base(Type) - { - } - - protected override CollectionForm CreateCollectionForm() - { - CollectionForm Form = base.CreateCollectionForm(); - - Form.Text = "DS3 Axis Map Editor"; - Form.HelpButton = false; - Form.StartPosition = FormStartPosition.CenterParent; - - return Form; - } - - protected override string GetDisplayText(object Value) - { - Ds3AxisMap Item = (Ds3AxisMap) Value; - - return base.GetDisplayText(string.Format("{0} -> {1}", Item.Name, Item.Value)); - } - } - public class Ds4AxisCollectionEditor : CollectionEditor - { - public Ds4AxisCollectionEditor(Type Type) : base(Type) - { - } - - protected override CollectionForm CreateCollectionForm() - { - CollectionForm Form = base.CreateCollectionForm(); - - Form.Text = "DS4 Axis Map Editor"; - Form.HelpButton = false; - Form.StartPosition = FormStartPosition.CenterParent; - - return Form; - } - - protected override string GetDisplayText(object Value) - { - Ds4AxisMap Item = (Ds4AxisMap) Value; - - return base.GetDisplayText(string.Format("{0} -> {1}", Item.Name, Item.Value)); - } - } - public class Ds3ButtonCollectionEditor : CollectionEditor - { - public Ds3ButtonCollectionEditor(Type Type) : base(Type) - { - } - - protected override CollectionForm CreateCollectionForm() - { - CollectionForm Form = base.CreateCollectionForm(); - - Form.Text = "DS3 Button Map Editor"; - Form.HelpButton = false; - Form.StartPosition = FormStartPosition.CenterParent; - - return Form; - } - - protected override string GetDisplayText(object Value) - { - Ds3ButtonMap Item = (Ds3ButtonMap) Value; - - return base.GetDisplayText(string.Format("{0} -> {1}", Item.Name, Item.Value)); - } - } - public class Ds4ButtonCollectionEditor : CollectionEditor - { - public Ds4ButtonCollectionEditor(Type Type) : base(Type) - { - } - - protected override CollectionForm CreateCollectionForm() - { - CollectionForm Form = base.CreateCollectionForm(); - - Form.Text = "DS4 Button Map Editor"; - Form.HelpButton = false; - Form.StartPosition = FormStartPosition.CenterParent; - - return Form; - } - - protected override string GetDisplayText(object Value) - { - Ds4ButtonMap Item = (Ds4ButtonMap) Value; - - return base.GetDisplayText(string.Format("{0} -> {1}", Item.Name, Item.Value)); - } - } -} diff --git a/Scp/ScpMonitor/ProfileProperties.resx b/Scp/ScpMonitor/ProfileProperties.resx deleted file mode 100644 index 1af7de1..0000000 --- a/Scp/ScpMonitor/ProfileProperties.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Scp/ScpMonitor/ProfilesForm.Designer.cs b/Scp/ScpMonitor/ProfilesForm.Designer.cs deleted file mode 100644 index 0d03b05..0000000 --- a/Scp/ScpMonitor/ProfilesForm.Designer.cs +++ /dev/null @@ -1,772 +0,0 @@ -namespace ScpMonitor -{ - partial class ProfilesForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProfilesForm)); - this.tbOutput = new System.Windows.Forms.TextBox(); - this.msAxis = new System.Windows.Forms.ContextMenuStrip(this.components); - this.dS3ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.l1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.l2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.l1ToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.l2ToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.r1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.r2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.lXToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.lYToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.rXToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.rYToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.dS4ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.resetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.noneToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.l2ToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); - this.r3ToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.lXToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.lYToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.rXToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.rYToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ttAxBar = new System.Windows.Forms.ToolTip(this.components); - this.btnView = new ScpMonitor.ScpButton(); - this.btnDel = new ScpMonitor.ScpButton(); - this.btnAdd = new ScpMonitor.ScpButton(); - this.btnEdit = new ScpMonitor.ScpButton(); - this.btnActivate = new ScpMonitor.ScpButton(); - this.btnSave = new ScpMonitor.ScpButton(); - this.axRY = new ScpMonitor.AxisControl(); - this.axRX = new ScpMonitor.AxisControl(); - this.cbProfile = new System.Windows.Forms.ComboBox(); - this.cbPad = new System.Windows.Forms.ComboBox(); - this.scpProxy = new ScpControl.ScpProxy(this.components); - this.axL = new ScpMonitor.AxisControl(); - this.axD = new ScpMonitor.AxisControl(); - this.axR = new ScpMonitor.AxisControl(); - this.axU = new ScpMonitor.AxisControl(); - this.axTP = new ScpMonitor.AxisControl(); - this.axPS = new ScpMonitor.AxisControl(); - this.axOP = new ScpMonitor.AxisControl(); - this.axSH = new ScpMonitor.AxisControl(); - this.axS = new ScpMonitor.AxisControl(); - this.axX = new ScpMonitor.AxisControl(); - this.axC = new ScpMonitor.AxisControl(); - this.axT = new ScpMonitor.AxisControl(); - this.axR3 = new ScpMonitor.AxisControl(); - this.axL3 = new ScpMonitor.AxisControl(); - this.axR1 = new ScpMonitor.AxisControl(); - this.axL1 = new ScpMonitor.AxisControl(); - this.axR2 = new ScpMonitor.AxisControl(); - this.axL2 = new ScpMonitor.AxisControl(); - this.axLY = new ScpMonitor.AxisControl(); - this.axLX = new ScpMonitor.AxisControl(); - this.msAxis.SuspendLayout(); - this.SuspendLayout(); - // - // tbOutput - // - this.tbOutput.BackColor = System.Drawing.SystemColors.ControlDarkDark; - this.tbOutput.Location = new System.Drawing.Point(22, 439); - this.tbOutput.Name = "tbOutput"; - this.tbOutput.ReadOnly = true; - this.tbOutput.Size = new System.Drawing.Size(417, 20); - this.tbOutput.TabIndex = 15; - this.ttAxBar.SetToolTip(this.tbOutput, "Debug"); - this.tbOutput.Visible = false; - // - // msAxis - // - this.msAxis.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.dS3ToolStripMenuItem, - this.dS4ToolStripMenuItem}); - this.msAxis.Name = "msAxis"; - this.msAxis.Size = new System.Drawing.Size(95, 48); - // - // dS3ToolStripMenuItem - // - this.dS3ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.l1ToolStripMenuItem, - this.l2ToolStripMenuItem, - this.l1ToolStripMenuItem1, - this.l2ToolStripMenuItem1, - this.r1ToolStripMenuItem, - this.r2ToolStripMenuItem, - this.lXToolStripMenuItem1, - this.lYToolStripMenuItem1, - this.rXToolStripMenuItem1, - this.rYToolStripMenuItem1}); - this.dS3ToolStripMenuItem.Name = "dS3ToolStripMenuItem"; - this.dS3ToolStripMenuItem.Size = new System.Drawing.Size(94, 22); - this.dS3ToolStripMenuItem.Text = "DS3"; - // - // l1ToolStripMenuItem - // - this.l1ToolStripMenuItem.Name = "l1ToolStripMenuItem"; - this.l1ToolStripMenuItem.Size = new System.Drawing.Size(103, 22); - this.l1ToolStripMenuItem.Text = "Reset"; - // - // l2ToolStripMenuItem - // - this.l2ToolStripMenuItem.Name = "l2ToolStripMenuItem"; - this.l2ToolStripMenuItem.Size = new System.Drawing.Size(103, 22); - this.l2ToolStripMenuItem.Text = "None"; - // - // l1ToolStripMenuItem1 - // - this.l1ToolStripMenuItem1.Name = "l1ToolStripMenuItem1"; - this.l1ToolStripMenuItem1.Size = new System.Drawing.Size(103, 22); - this.l1ToolStripMenuItem1.Text = "L1"; - // - // l2ToolStripMenuItem1 - // - this.l2ToolStripMenuItem1.Name = "l2ToolStripMenuItem1"; - this.l2ToolStripMenuItem1.Size = new System.Drawing.Size(103, 22); - this.l2ToolStripMenuItem1.Text = "L2"; - // - // r1ToolStripMenuItem - // - this.r1ToolStripMenuItem.Name = "r1ToolStripMenuItem"; - this.r1ToolStripMenuItem.Size = new System.Drawing.Size(103, 22); - this.r1ToolStripMenuItem.Text = "R1"; - // - // r2ToolStripMenuItem - // - this.r2ToolStripMenuItem.Name = "r2ToolStripMenuItem"; - this.r2ToolStripMenuItem.Size = new System.Drawing.Size(103, 22); - this.r2ToolStripMenuItem.Text = "R2"; - // - // lXToolStripMenuItem1 - // - this.lXToolStripMenuItem1.Name = "lXToolStripMenuItem1"; - this.lXToolStripMenuItem1.Size = new System.Drawing.Size(103, 22); - this.lXToolStripMenuItem1.Text = "LX"; - // - // lYToolStripMenuItem1 - // - this.lYToolStripMenuItem1.Name = "lYToolStripMenuItem1"; - this.lYToolStripMenuItem1.Size = new System.Drawing.Size(103, 22); - this.lYToolStripMenuItem1.Text = "LY"; - // - // rXToolStripMenuItem1 - // - this.rXToolStripMenuItem1.Name = "rXToolStripMenuItem1"; - this.rXToolStripMenuItem1.Size = new System.Drawing.Size(103, 22); - this.rXToolStripMenuItem1.Text = "RX"; - // - // rYToolStripMenuItem1 - // - this.rYToolStripMenuItem1.Name = "rYToolStripMenuItem1"; - this.rYToolStripMenuItem1.Size = new System.Drawing.Size(103, 22); - this.rYToolStripMenuItem1.Text = "RY"; - // - // dS4ToolStripMenuItem - // - this.dS4ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.resetToolStripMenuItem, - this.noneToolStripMenuItem, - this.l2ToolStripMenuItem2, - this.r3ToolStripMenuItem1, - this.lXToolStripMenuItem, - this.lYToolStripMenuItem, - this.rXToolStripMenuItem, - this.rYToolStripMenuItem}); - this.dS4ToolStripMenuItem.Name = "dS4ToolStripMenuItem"; - this.dS4ToolStripMenuItem.Size = new System.Drawing.Size(94, 22); - this.dS4ToolStripMenuItem.Text = "DS4"; - // - // resetToolStripMenuItem - // - this.resetToolStripMenuItem.Name = "resetToolStripMenuItem"; - this.resetToolStripMenuItem.Size = new System.Drawing.Size(103, 22); - this.resetToolStripMenuItem.Text = "Reset"; - // - // noneToolStripMenuItem - // - this.noneToolStripMenuItem.Name = "noneToolStripMenuItem"; - this.noneToolStripMenuItem.Size = new System.Drawing.Size(103, 22); - this.noneToolStripMenuItem.Text = "None"; - // - // l2ToolStripMenuItem2 - // - this.l2ToolStripMenuItem2.Name = "l2ToolStripMenuItem2"; - this.l2ToolStripMenuItem2.Size = new System.Drawing.Size(103, 22); - this.l2ToolStripMenuItem2.Text = "L2"; - // - // r3ToolStripMenuItem1 - // - this.r3ToolStripMenuItem1.Name = "r3ToolStripMenuItem1"; - this.r3ToolStripMenuItem1.Size = new System.Drawing.Size(103, 22); - this.r3ToolStripMenuItem1.Text = "R2"; - // - // lXToolStripMenuItem - // - this.lXToolStripMenuItem.Name = "lXToolStripMenuItem"; - this.lXToolStripMenuItem.Size = new System.Drawing.Size(103, 22); - this.lXToolStripMenuItem.Text = "LX"; - // - // lYToolStripMenuItem - // - this.lYToolStripMenuItem.Name = "lYToolStripMenuItem"; - this.lYToolStripMenuItem.Size = new System.Drawing.Size(103, 22); - this.lYToolStripMenuItem.Text = "LY"; - // - // rXToolStripMenuItem - // - this.rXToolStripMenuItem.Name = "rXToolStripMenuItem"; - this.rXToolStripMenuItem.Size = new System.Drawing.Size(103, 22); - this.rXToolStripMenuItem.Text = "RX"; - // - // rYToolStripMenuItem - // - this.rYToolStripMenuItem.Name = "rYToolStripMenuItem"; - this.rYToolStripMenuItem.Size = new System.Drawing.Size(103, 22); - this.rYToolStripMenuItem.Text = "RY"; - // - // ttAxBar - // - this.ttAxBar.AutomaticDelay = 1000; - this.ttAxBar.IsBalloon = true; - // - // btnView - // - this.btnView.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.btnView.Glassy = true; - this.btnView.Location = new System.Drawing.Point(381, 348); - this.btnView.Name = "btnView"; - this.btnView.Size = new System.Drawing.Size(30, 21); - this.btnView.TabIndex = 29; - this.btnView.Text = "?"; - this.ttAxBar.SetToolTip(this.btnView, "View the current Profile."); - this.btnView.UseVisualStyleBackColor = true; - this.btnView.Click += new System.EventHandler(this.btnView_Click); - // - // btnDel - // - this.btnDel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.btnDel.Enabled = false; - this.btnDel.Glassy = true; - this.btnDel.Location = new System.Drawing.Point(151, 348); - this.btnDel.Name = "btnDel"; - this.btnDel.Size = new System.Drawing.Size(30, 21); - this.btnDel.TabIndex = 25; - this.btnDel.Text = "-"; - this.ttAxBar.SetToolTip(this.btnDel, "Delete the current Profile."); - this.btnDel.UseVisualStyleBackColor = true; - this.btnDel.Click += new System.EventHandler(this.btnDel_Click); - // - // btnAdd - // - this.btnAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.btnAdd.Glassy = true; - this.btnAdd.Location = new System.Drawing.Point(121, 348); - this.btnAdd.Name = "btnAdd"; - this.btnAdd.Size = new System.Drawing.Size(30, 21); - this.btnAdd.TabIndex = 24; - this.btnAdd.Text = "+"; - this.ttAxBar.SetToolTip(this.btnAdd, "Add a new Profile."); - this.btnAdd.UseVisualStyleBackColor = true; - this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); - // - // btnEdit - // - this.btnEdit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.btnEdit.Enabled = false; - this.btnEdit.Glassy = true; - this.btnEdit.Location = new System.Drawing.Point(411, 348); - this.btnEdit.Name = "btnEdit"; - this.btnEdit.Size = new System.Drawing.Size(30, 21); - this.btnEdit.TabIndex = 26; - this.btnEdit.Text = ">"; - this.ttAxBar.SetToolTip(this.btnEdit, "Edit the current Profile."); - this.btnEdit.UseVisualStyleBackColor = true; - this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click); - // - // btnActivate - // - this.btnActivate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnActivate.Glassy = true; - this.btnActivate.Location = new System.Drawing.Point(597, 348); - this.btnActivate.Name = "btnActivate"; - this.btnActivate.Size = new System.Drawing.Size(75, 21); - this.btnActivate.TabIndex = 0; - this.btnActivate.Text = "Activate"; - this.ttAxBar.SetToolTip(this.btnActivate, "Activate the current Profile on the Server."); - this.btnActivate.UseVisualStyleBackColor = true; - this.btnActivate.Click += new System.EventHandler(this.btnActivate_Click); - // - // btnSave - // - this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnSave.Glassy = true; - this.btnSave.Location = new System.Drawing.Point(522, 348); - this.btnSave.Name = "btnSave"; - this.btnSave.Size = new System.Drawing.Size(75, 21); - this.btnSave.TabIndex = 28; - this.btnSave.Text = "Save"; - this.ttAxBar.SetToolTip(this.btnSave, "Save the Profile Map to the Server."); - this.btnSave.UseVisualStyleBackColor = true; - this.btnSave.Click += new System.EventHandler(this.btnSave_Click); - // - // axRY - // - this.axRY.BackColor = System.Drawing.Color.Transparent; - this.axRY.Color = System.Drawing.Color.DodgerBlue; - this.axRY.ContextMenuStrip = this.msAxis; - this.axRY.Enabled = false; - this.axRY.Location = new System.Drawing.Point(410, 281); - this.axRY.Name = "axRY"; - this.axRY.Orientation = ScpMonitor.Orientation.Left; - this.axRY.Size = new System.Drawing.Size(115, 15); - this.axRY.TabIndex = 22; - this.axRY.Text = "RY"; - this.axRY.Value = ((byte)(0)); - // - // axRX - // - this.axRX.BackColor = System.Drawing.Color.Transparent; - this.axRX.Color = System.Drawing.Color.DodgerBlue; - this.axRX.ContextMenuStrip = this.msAxis; - this.axRX.Enabled = false; - this.axRX.Location = new System.Drawing.Point(410, 260); - this.axRX.Name = "axRX"; - this.axRX.Orientation = ScpMonitor.Orientation.Left; - this.axRX.Size = new System.Drawing.Size(115, 15); - this.axRX.TabIndex = 21; - this.axRX.Text = "RX"; - this.axRX.Value = ((byte)(0)); - // - // cbProfile - // - this.cbProfile.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.cbProfile.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cbProfile.FormattingEnabled = true; - this.cbProfile.Location = new System.Drawing.Point(187, 348); - this.cbProfile.Name = "cbProfile"; - this.cbProfile.Size = new System.Drawing.Size(188, 21); - this.cbProfile.TabIndex = 27; - this.cbProfile.SelectedIndexChanged += new System.EventHandler(this.Profile_Selected); - // - // cbPad - // - this.cbPad.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.cbPad.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cbPad.FormattingEnabled = true; - this.cbPad.Items.AddRange(new object[] { - "Pad 1", - "Pad 2", - "Pad 3", - "Pad 4"}); - this.cbPad.Location = new System.Drawing.Point(12, 348); - this.cbPad.Name = "cbPad"; - this.cbPad.Size = new System.Drawing.Size(94, 21); - this.cbPad.TabIndex = 23; - this.cbPad.SelectedIndexChanged += new System.EventHandler(this.Pad_Selected); - // - // scpProxy - // - this.scpProxy.Packet += new System.EventHandler(this.Parse); - // - // axL - // - this.axL.BackColor = System.Drawing.Color.Transparent; - this.axL.Color = System.Drawing.Color.DodgerBlue; - this.axL.Enabled = false; - this.axL.Location = new System.Drawing.Point(12, 104); - this.axL.Name = "axL"; - this.axL.Orientation = ScpMonitor.Orientation.Right; - this.axL.Size = new System.Drawing.Size(50, 15); - this.axL.TabIndex = 11; - this.axL.Text = "L"; - this.axL.Value = ((byte)(0)); - // - // axD - // - this.axD.BackColor = System.Drawing.Color.Transparent; - this.axD.Color = System.Drawing.Color.DodgerBlue; - this.axD.Enabled = false; - this.axD.Location = new System.Drawing.Point(69, 123); - this.axD.Name = "axD"; - this.axD.Orientation = ScpMonitor.Orientation.Bottom; - this.axD.Size = new System.Drawing.Size(25, 30); - this.axD.TabIndex = 10; - this.axD.Text = "D"; - this.axD.Value = ((byte)(0)); - // - // axR - // - this.axR.BackColor = System.Drawing.Color.Transparent; - this.axR.Color = System.Drawing.Color.DodgerBlue; - this.axR.Enabled = false; - this.axR.Location = new System.Drawing.Point(98, 104); - this.axR.Name = "axR"; - this.axR.Orientation = ScpMonitor.Orientation.Left; - this.axR.Size = new System.Drawing.Size(50, 15); - this.axR.TabIndex = 9; - this.axR.Text = "R"; - this.axR.Value = ((byte)(0)); - // - // axU - // - this.axU.BackColor = System.Drawing.Color.Transparent; - this.axU.Color = System.Drawing.Color.DodgerBlue; - this.axU.Enabled = false; - this.axU.Location = new System.Drawing.Point(69, 68); - this.axU.Name = "axU"; - this.axU.Orientation = ScpMonitor.Orientation.Top; - this.axU.Size = new System.Drawing.Size(25, 30); - this.axU.TabIndex = 8; - this.axU.Text = "U"; - this.axU.Value = ((byte)(0)); - // - // axTP - // - this.axTP.BackColor = System.Drawing.Color.Transparent; - this.axTP.Color = System.Drawing.Color.DodgerBlue; - this.axTP.Enabled = false; - this.axTP.Location = new System.Drawing.Point(333, 32); - this.axTP.Name = "axTP"; - this.axTP.Orientation = ScpMonitor.Orientation.Bottom; - this.axTP.Size = new System.Drawing.Size(25, 30); - this.axTP.TabIndex = 4; - this.axTP.Text = "TP"; - this.axTP.Value = ((byte)(0)); - // - // axPS - // - this.axPS.BackColor = System.Drawing.Color.Transparent; - this.axPS.Color = System.Drawing.Color.DodgerBlue; - this.axPS.Enabled = false; - this.axPS.Location = new System.Drawing.Point(333, 211); - this.axPS.Name = "axPS"; - this.axPS.Orientation = ScpMonitor.Orientation.Top; - this.axPS.Size = new System.Drawing.Size(25, 30); - this.axPS.TabIndex = 16; - this.axPS.Text = "PS"; - this.axPS.Value = ((byte)(0)); - // - // axOP - // - this.axOP.BackColor = System.Drawing.Color.Transparent; - this.axOP.Color = System.Drawing.Color.DodgerBlue; - this.axOP.Enabled = false; - this.axOP.Location = new System.Drawing.Point(432, 32); - this.axOP.Name = "axOP"; - this.axOP.Orientation = ScpMonitor.Orientation.Bottom; - this.axOP.Size = new System.Drawing.Size(25, 30); - this.axOP.TabIndex = 5; - this.axOP.Text = "OP"; - this.axOP.Value = ((byte)(0)); - // - // axSH - // - this.axSH.BackColor = System.Drawing.Color.Transparent; - this.axSH.Color = System.Drawing.Color.DodgerBlue; - this.axSH.Enabled = false; - this.axSH.Location = new System.Drawing.Point(233, 32); - this.axSH.Name = "axSH"; - this.axSH.Orientation = ScpMonitor.Orientation.Bottom; - this.axSH.Size = new System.Drawing.Size(25, 30); - this.axSH.TabIndex = 3; - this.axSH.Text = "SH"; - this.axSH.Value = ((byte)(0)); - // - // axS - // - this.axS.BackColor = System.Drawing.Color.Transparent; - this.axS.Color = System.Drawing.Color.DodgerBlue; - this.axS.Enabled = false; - this.axS.Location = new System.Drawing.Point(536, 104); - this.axS.Name = "axS"; - this.axS.Orientation = ScpMonitor.Orientation.Right; - this.axS.Size = new System.Drawing.Size(50, 15); - this.axS.TabIndex = 15; - this.axS.Text = "S"; - this.axS.Value = ((byte)(0)); - // - // axX - // - this.axX.BackColor = System.Drawing.Color.Transparent; - this.axX.Color = System.Drawing.Color.DodgerBlue; - this.axX.Enabled = false; - this.axX.Location = new System.Drawing.Point(593, 123); - this.axX.Name = "axX"; - this.axX.Orientation = ScpMonitor.Orientation.Bottom; - this.axX.Size = new System.Drawing.Size(25, 30); - this.axX.TabIndex = 14; - this.axX.Text = "X"; - this.axX.Value = ((byte)(0)); - // - // axC - // - this.axC.BackColor = System.Drawing.Color.Transparent; - this.axC.Color = System.Drawing.Color.DodgerBlue; - this.axC.Enabled = false; - this.axC.Location = new System.Drawing.Point(622, 104); - this.axC.Name = "axC"; - this.axC.Orientation = ScpMonitor.Orientation.Left; - this.axC.Size = new System.Drawing.Size(50, 15); - this.axC.TabIndex = 13; - this.axC.Text = "C"; - this.axC.Value = ((byte)(0)); - // - // axT - // - this.axT.BackColor = System.Drawing.Color.Transparent; - this.axT.Color = System.Drawing.Color.DodgerBlue; - this.axT.Enabled = false; - this.axT.Location = new System.Drawing.Point(593, 68); - this.axT.Name = "axT"; - this.axT.Orientation = ScpMonitor.Orientation.Top; - this.axT.Size = new System.Drawing.Size(25, 30); - this.axT.TabIndex = 12; - this.axT.Text = "T"; - this.axT.Value = ((byte)(0)); - // - // axR3 - // - this.axR3.BackColor = System.Drawing.Color.Transparent; - this.axR3.Color = System.Drawing.Color.DodgerBlue; - this.axR3.Enabled = false; - this.axR3.Location = new System.Drawing.Point(410, 224); - this.axR3.Name = "axR3"; - this.axR3.Orientation = ScpMonitor.Orientation.Top; - this.axR3.Size = new System.Drawing.Size(25, 30); - this.axR3.TabIndex = 18; - this.axR3.Text = "R3"; - this.axR3.Value = ((byte)(0)); - // - // axL3 - // - this.axL3.BackColor = System.Drawing.Color.Transparent; - this.axL3.Color = System.Drawing.Color.DodgerBlue; - this.axL3.Enabled = false; - this.axL3.Location = new System.Drawing.Point(250, 224); - this.axL3.Name = "axL3"; - this.axL3.Orientation = ScpMonitor.Orientation.Top; - this.axL3.Size = new System.Drawing.Size(25, 30); - this.axL3.TabIndex = 17; - this.axL3.Text = "L3"; - this.axL3.Value = ((byte)(0)); - // - // axR1 - // - this.axR1.BackColor = System.Drawing.Color.Transparent; - this.axR1.Color = System.Drawing.Color.DodgerBlue; - this.axR1.Enabled = false; - this.axR1.Location = new System.Drawing.Point(561, 32); - this.axR1.Name = "axR1"; - this.axR1.Orientation = ScpMonitor.Orientation.Left; - this.axR1.Size = new System.Drawing.Size(75, 15); - this.axR1.TabIndex = 7; - this.axR1.Text = "R1"; - this.axR1.Value = ((byte)(0)); - // - // axL1 - // - this.axL1.BackColor = System.Drawing.Color.Transparent; - this.axL1.Color = System.Drawing.Color.DodgerBlue; - this.axL1.Enabled = false; - this.axL1.Location = new System.Drawing.Point(49, 32); - this.axL1.Name = "axL1"; - this.axL1.Orientation = ScpMonitor.Orientation.Right; - this.axL1.Size = new System.Drawing.Size(75, 15); - this.axL1.TabIndex = 2; - this.axL1.Text = "L1"; - this.axL1.Value = ((byte)(0)); - // - // axR2 - // - this.axR2.BackColor = System.Drawing.Color.Transparent; - this.axR2.Color = System.Drawing.Color.DodgerBlue; - this.axR2.ContextMenuStrip = this.msAxis; - this.axR2.Enabled = false; - this.axR2.Location = new System.Drawing.Point(561, 12); - this.axR2.Name = "axR2"; - this.axR2.Orientation = ScpMonitor.Orientation.Left; - this.axR2.Size = new System.Drawing.Size(75, 15); - this.axR2.TabIndex = 6; - this.axR2.Text = "R2"; - this.axR2.Value = ((byte)(0)); - // - // axL2 - // - this.axL2.BackColor = System.Drawing.Color.Transparent; - this.axL2.Color = System.Drawing.Color.DodgerBlue; - this.axL2.ContextMenuStrip = this.msAxis; - this.axL2.Enabled = false; - this.axL2.Location = new System.Drawing.Point(49, 12); - this.axL2.Name = "axL2"; - this.axL2.Orientation = ScpMonitor.Orientation.Right; - this.axL2.Size = new System.Drawing.Size(75, 15); - this.axL2.TabIndex = 1; - this.axL2.Text = "L2"; - this.axL2.Value = ((byte)(0)); - // - // axLY - // - this.axLY.BackColor = System.Drawing.Color.Transparent; - this.axLY.Color = System.Drawing.Color.DodgerBlue; - this.axLY.ContextMenuStrip = this.msAxis; - this.axLY.Enabled = false; - this.axLY.Location = new System.Drawing.Point(160, 281); - this.axLY.Name = "axLY"; - this.axLY.Orientation = ScpMonitor.Orientation.Right; - this.axLY.Size = new System.Drawing.Size(115, 15); - this.axLY.TabIndex = 20; - this.axLY.Text = "LY"; - this.axLY.Value = ((byte)(0)); - // - // axLX - // - this.axLX.BackColor = System.Drawing.Color.Transparent; - this.axLX.Color = System.Drawing.Color.DodgerBlue; - this.axLX.ContextMenuStrip = this.msAxis; - this.axLX.Enabled = false; - this.axLX.Location = new System.Drawing.Point(160, 260); - this.axLX.Name = "axLX"; - this.axLX.Orientation = ScpMonitor.Orientation.Right; - this.axLX.Size = new System.Drawing.Size(115, 15); - this.axLX.TabIndex = 19; - this.axLX.Text = "LX"; - this.axLX.Value = ((byte)(0)); - // - // ProfilesForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.SystemColors.Control; - this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage"))); - this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; - this.ClientSize = new System.Drawing.Size(684, 381); - this.Controls.Add(this.btnView); - this.Controls.Add(this.axL); - this.Controls.Add(this.axD); - this.Controls.Add(this.axR); - this.Controls.Add(this.axU); - this.Controls.Add(this.btnDel); - this.Controls.Add(this.btnAdd); - this.Controls.Add(this.cbPad); - this.Controls.Add(this.cbProfile); - this.Controls.Add(this.axTP); - this.Controls.Add(this.axPS); - this.Controls.Add(this.axOP); - this.Controls.Add(this.axSH); - this.Controls.Add(this.axS); - this.Controls.Add(this.axX); - this.Controls.Add(this.axC); - this.Controls.Add(this.axT); - this.Controls.Add(this.axR3); - this.Controls.Add(this.axL3); - this.Controls.Add(this.btnEdit); - this.Controls.Add(this.btnActivate); - this.Controls.Add(this.btnSave); - this.Controls.Add(this.tbOutput); - this.Controls.Add(this.axR1); - this.Controls.Add(this.axL1); - this.Controls.Add(this.axR2); - this.Controls.Add(this.axL2); - this.Controls.Add(this.axRY); - this.Controls.Add(this.axRX); - this.Controls.Add(this.axLY); - this.Controls.Add(this.axLX); - this.DoubleBuffered = true; - this.MaximizeBox = false; - this.MaximumSize = new System.Drawing.Size(700, 420); - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(700, 420); - this.Name = "ProfilesForm"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "Profile Manager"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_Close); - this.Load += new System.EventHandler(this.Form_Load); - this.VisibleChanged += new System.EventHandler(this.Form_Visible); - this.msAxis.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - protected ScpControl.ScpProxy scpProxy; - private AxisControl axLX; - private AxisControl axLY; - private AxisControl axRX; - private AxisControl axRY; - private AxisControl axL2; - private AxisControl axR2; - private AxisControl axL1; - private AxisControl axR1; - private System.Windows.Forms.TextBox tbOutput; - private System.Windows.Forms.ContextMenuStrip msAxis; - private System.Windows.Forms.ToolStripMenuItem dS3ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem l1ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem l2ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem l1ToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem l2ToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem r1ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem r2ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem lXToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem lYToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem rXToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem rYToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem dS4ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem resetToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem noneToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem l2ToolStripMenuItem2; - private System.Windows.Forms.ToolStripMenuItem r3ToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem lXToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem lYToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem rXToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem rYToolStripMenuItem; - private System.Windows.Forms.ToolTip ttAxBar; - private ScpButton btnSave; - private ScpButton btnActivate; - private ScpButton btnEdit; - private AxisControl axL3; - private AxisControl axR3; - private AxisControl axS; - private AxisControl axX; - private AxisControl axC; - private AxisControl axT; - private AxisControl axSH; - private AxisControl axOP; - private AxisControl axPS; - private AxisControl axTP; - private System.Windows.Forms.ComboBox cbProfile; - private System.Windows.Forms.ComboBox cbPad; - private ScpButton btnAdd; - private ScpButton btnDel; - private AxisControl axL; - private AxisControl axD; - private AxisControl axR; - private AxisControl axU; - private ScpButton btnView; - } -} - diff --git a/Scp/ScpMonitor/ProfilesForm.cs b/Scp/ScpMonitor/ProfilesForm.cs deleted file mode 100644 index 1b3253b..0000000 --- a/Scp/ScpMonitor/ProfilesForm.cs +++ /dev/null @@ -1,311 +0,0 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -using ScpControl; - -namespace ScpMonitor -{ - public partial class ProfilesForm : Form - { - protected const String Default = "Default"; - - protected String m_SelectedProfile = Default, m_Active = Default; - protected Int32 m_SelectedPad = 0; - - protected Boolean m_CanEdit = false, m_Editing = false, m_CanSave = true, m_PropsActive = false; - - protected DsDetail m_Detail; - protected ProfileProperties m_PropForm; - - protected void ResetControls() - { - foreach (Control Child in Controls) - { - if (Child is AxisControl) - { - ((AxisControl) Child).Value = 0; - } - } - } - - public ProfilesForm() - { - InitializeComponent(); - } - - - public void Request() - { - try - { - if (scpProxy.Load()) - { - m_SelectedProfile = m_Active = scpProxy.Active; - - cbProfile.Items.Clear(); - cbProfile.Items.AddRange(scpProxy.Mapper.Profiles); - cbProfile.SelectedItem = m_SelectedProfile; - - cbPad.SelectedIndex = m_SelectedPad = 0; - m_Detail = scpProxy.Detail((DsPadId) m_SelectedPad); - - ResetControls(); - } - - m_Editing = false; - m_CanSave = true; - - scpProxy.Start(); - } - catch { } - } - - public void Reset() - { - CenterToScreen(); - } - - - protected void Parse(object sender, DsPacket e) - { - lock(this) - { - if (e.Detail.Pad == (DsPadId) m_SelectedPad) - { - if (e.Detail.State != DsState.Connected) - { - ResetControls(); - return; - } - - scpProxy.Remap(m_SelectedProfile, e); - - switch(e.Detail.Model) - { - case DsModel.DS3: - { - axLX.Value = e.Axis(Ds3Axis.LX); - axLY.Value = e.Axis(Ds3Axis.LY); - axRX.Value = e.Axis(Ds3Axis.RX); - axRY.Value = e.Axis(Ds3Axis.RY); - - axL1.Value = e.Axis(Ds3Axis.L1); - axR1.Value = e.Axis(Ds3Axis.R1); - axL2.Value = e.Axis(Ds3Axis.L2); - axR2.Value = e.Axis(Ds3Axis.R2); - - axL3.Value = (Byte)(e.Button(Ds3Button.L3 ) ? 255 : 0); - axR3.Value = (Byte)(e.Button(Ds3Button.R3 ) ? 255 : 0); - - axSH.Value = (Byte)(e.Button(Ds3Button.Select) ? 255 : 0); - axOP.Value = (Byte)(e.Button(Ds3Button.Start ) ? 255 : 0); - - axT.Value = e.Axis(Ds3Axis.Triangle); - axC.Value = e.Axis(Ds3Axis.Circle ); - axX.Value = e.Axis(Ds3Axis.Cross ); - axS.Value = e.Axis(Ds3Axis.Square ); - - axU.Value = e.Axis(Ds3Axis.Up ); - axR.Value = e.Axis(Ds3Axis.Right ); - axD.Value = e.Axis(Ds3Axis.Down ); - axL.Value = e.Axis(Ds3Axis.Left ); - - axPS.Value = (Byte)(e.Button(Ds3Button.PS) ? 255 : 0); - } - break; - - case DsModel.DS4: - { - axLX.Value = e.Axis(Ds4Axis.LX); - axLY.Value = e.Axis(Ds4Axis.LY); - axRX.Value = e.Axis(Ds4Axis.RX); - axRY.Value = e.Axis(Ds4Axis.RY); - - axL2.Value = e.Axis(Ds4Axis.L2); - axR2.Value = e.Axis(Ds4Axis.R2); - - axL1.Value = (Byte)(e.Button(Ds4Button.L1 ) ? 255 : 0); - axR1.Value = (Byte)(e.Button(Ds4Button.R1 ) ? 255 : 0); - axL3.Value = (Byte)(e.Button(Ds4Button.L3 ) ? 255 : 0); - axR3.Value = (Byte)(e.Button(Ds4Button.R3 ) ? 255 : 0); - - axSH.Value = (Byte)(e.Button(Ds4Button.Share ) ? 255 : 0); - axOP.Value = (Byte)(e.Button(Ds4Button.Options ) ? 255 : 0); - - axT.Value = (Byte)(e.Button(Ds4Button.Triangle) ? 255 : 0); - axC.Value = (Byte)(e.Button(Ds4Button.Circle ) ? 255 : 0); - axX.Value = (Byte)(e.Button(Ds4Button.Cross ) ? 255 : 0); - axS.Value = (Byte)(e.Button(Ds4Button.Square ) ? 255 : 0); - - axU.Value = (Byte)(e.Button(Ds4Button.Up ) ? 255 : 0); - axR.Value = (Byte)(e.Button(Ds4Button.Right ) ? 255 : 0); - axD.Value = (Byte)(e.Button(Ds4Button.Down ) ? 255 : 0); - axL.Value = (Byte)(e.Button(Ds4Button.Left ) ? 255 : 0); - - axPS.Value = (Byte)(e.Button(Ds4Button.PS ) ? 255 : 0); - axTP.Value = (Byte)(e.Button(Ds4Button.TouchPad) ? 255 : 0); - } - break; - } - } - } - } - - - protected void Form_Load(object sender, EventArgs e) - { - Icon = Properties.Resources.Scp_All; - } - - protected void Form_Close(object sender, FormClosingEventArgs e) - { - if (e.CloseReason == CloseReason.UserClosing) - { - e.Cancel = true; Hide(); - } - } - - protected void Form_Visible(object sender, EventArgs e) - { - if (!Visible) - { - scpProxy.Stop(); - - if (m_PropsActive) m_PropForm.Close(); - } - } - - - protected void Profile_Selected(object sender, EventArgs e) - { - lock (this) - { - m_SelectedProfile = cbProfile.SelectedItem.ToString(); - - if (m_PropsActive) - { - btnAdd.Enabled = btnDel.Enabled = btnEdit.Enabled = btnView.Enabled = false; - } - else - { - btnView.Enabled = btnAdd.Enabled = true; - btnEdit.Enabled = btnDel.Enabled = m_SelectedProfile != Default; - } - } - } - - protected void Pad_Selected(object sender, EventArgs e) - { - lock (this) - { - m_SelectedPad = cbPad.SelectedIndex; - m_Detail = scpProxy.Detail((DsPadId) m_SelectedPad); - - ResetControls(); - } - } - - - protected void btnActivate_Click(object sender, EventArgs e) - { - scpProxy.Select(scpProxy.Mapper.Map[m_SelectedProfile]); - m_Active = m_SelectedProfile; - - btnDel.Enabled = btnEdit.Enabled = m_CanEdit = false; - } - - protected void btnSave_Click(object sender, EventArgs e) - { - scpProxy.Save(); - } - - - protected void btnAdd_Click(object sender, EventArgs e) - { - Profile Profile = new Profile(""); - - m_Detail = scpProxy.Detail((DsPadId) m_SelectedPad); - m_PropForm = new ProfileProperties(Profile, m_Detail.Pad, m_Detail.Local, true); - - m_PropForm.FormClosed += Props_Close; - m_PropForm.VisibleChanged += Props_Visible; - - m_PropForm.Show(this); - } - - protected void btnDel_Click(object sender, EventArgs e) - { - scpProxy.Mapper.Map.Remove(m_SelectedProfile); - - Int32 Index = cbProfile.SelectedIndex; - - cbProfile.Items.Remove(m_SelectedProfile); - - while (Index >= cbProfile.Items.Count) Index--; - - cbProfile.SelectedIndex = Index; - } - - protected void btnView_Click(object sender, EventArgs e) - { - m_Detail = scpProxy.Detail((DsPadId) m_SelectedPad); - m_PropForm = new ProfileProperties(scpProxy.Mapper.Map[m_SelectedProfile], m_Detail.Pad, m_Detail.Local, false); - - m_PropForm.FormClosed += Props_Close; - m_PropForm.VisibleChanged += Props_Visible; - - m_PropForm.Show(this); - } - - protected void btnEdit_Click(object sender, EventArgs e) - { - m_Detail = scpProxy.Detail((DsPadId) m_SelectedPad); - m_PropForm = new ProfileProperties(scpProxy.Mapper.Map[m_SelectedProfile], m_Detail.Pad, m_Detail.Local, true); - - m_PropForm.FormClosed += Props_Close; - m_PropForm.VisibleChanged += Props_Visible; - - m_PropForm.Show(this); - } - - - protected void Props_Close(object sender, FormClosedEventArgs e) - { - if (m_PropForm.Saved) - { - Profile Profile = m_PropForm.Profile; - - if (!scpProxy.Mapper.Map.ContainsKey(Profile.Name)) - { - cbProfile.Items.Add(Profile.Name); - } - - scpProxy.Mapper.Map[Profile.Name] = Profile; - cbProfile.SelectedItem = Profile.Name; - } - - m_PropsActive = false; - - btnView.Enabled = btnAdd.Enabled = true; - btnEdit.Enabled = btnDel.Enabled = m_SelectedProfile != Default; - } - - protected void Props_Visible(object sender, EventArgs e) - { - m_PropsActive = m_PropForm.Visible; - - if (m_PropsActive) - { - btnAdd.Enabled = btnDel.Enabled = btnEdit.Enabled = btnView.Enabled = false; - } - else - { - btnView.Enabled = btnAdd.Enabled = true; - btnEdit.Enabled = btnDel.Enabled = m_SelectedProfile != Default; - } - } - } -} diff --git a/Scp/ScpMonitor/ProfilesForm.resx b/Scp/ScpMonitor/ProfilesForm.resx deleted file mode 100644 index 9862382..0000000 --- a/Scp/ScpMonitor/ProfilesForm.resx +++ /dev/null @@ -1,3689 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 206, 17 - - - 117, 17 - - - 17, 17 - - - - - iVBORw0KGgoAAAANSUhEUgAAAoAAAAFhCAYAAADgPRuZAAAABGdBTUEAALGPC/xhBQAA/8dJREFUeF7s - nQW8Hddx/2PHDDIzyCSZZFkGybZky2JmZmYGW5IlWWbGOImDThxosKE22PzTNNQ2jA1DAw22oTaJkzid - /3zn7Nw77+jsfe9ZSWMnGn/GZ+jM7l69PfvbQ/ssCfS///u/lfSnoVL+PTnmnuZ7KsduVefpng8q+bHV - 2dujvfmevvk8T85OuZ5TXXzOTrmeU118zk65nlNdfM5OuZ5TXXzOTrmeU118zk65nlNdfM5OuZ5TXXzO - TrmeU118zk65nlNdfM5OuZ5TXXzOTrmeU118zk65nlMpPqfc1l6+SHvz7c2X688qBTjnVLKVqK5+K2oV - n+frSO7OHL+z+dqLfybma2Xbm68tPdPzdTbP3nx788Wyjvbma9IfK1+dDOW+Vn6nvE6k3NfK75TXiZT7 - Wvmd8jqRcl8rv1NeJ1Lua+V3yutEyn2t/E55nUi5r5XfKa8TKffBjR7AUnBeoVXplOudpVb1n0ruUh1s - dfanQn+p+XJ/zLM339M/X3vUKt9Tob359ubrDO3Nt2f59tJe2lNqMwScU6s/0M784cbYPfmD35O6kUp5 - 6nJjz33t6dDTOV+pDuT23F+KjZTHO7k995diI+XxTm7P/aXYSHm8k9tzfyk2Uh7v5PbcX4qNlMc7uT33 - l2IjuT+Pq8uBnMdCbstLp6jnch4LuS0vnaKey3ks5La8dIp6LuexkNvy0inquZzHQm7LS6eo53IeC7kt - L52inst5LOS2vHSKei7nsZDb8tIp6rmcx0Juy0unqOdyHgu5LS+dop7LeSzktrx0inou57GQ22JZissp - xuVyXrrcimJcLuely60oxuVyXrrcimJcLuely60oxuVyXrrcimJcLuely60oxuVyXrrcimKcAcCYoDMU - 4/O6nc3lVFcP+1PJ2arOX1s+qDM589hS3b356unPmY+yvdx5TKluyVZHeUypbslWR3lMqW7JVkd5TKlu - yVZHeUypbslWR3lMqW7JVkd5TKluyVZHeUypbslWR3lMqW7JVkd5TKluyVZHeUypbslWR3lMqW7J1hlq - VX9vvvbpry3fn3QRSDzZVlTyx7p5nmgrUclXqpuXUJQ7Qs+kfNBTqd+K9uZrTX+ufKW4kq+VDSr5nVrV - Ldmgkt+pVd2SDSr5nVrVLdmgkt+pVd2SDSr5nVrVLdmgkt+pVd2SDSr5nVrVLdmgkt+pVd2SDSr5nVrV - Ldmgkt+pVd2SDSr5nVrVLdmgkh9Cr/M9Fdqbb8/oLyVfowewFBRtdUlaxaDX1Xs60B/73J7u+aC6nLkd - vWTLaW++RE/HfLFOSXbdKdehaIt1SrLrTrkORVusU5Jdd8p1KNpinZLsulOuQ9EW65Rk151yHYq2WKck - u+6U61C0xTol2XWnXIeiLdYpya475ToUbbFOSXbdKdehaIt1SrLrTrkORVusU5Jdd8p1KNpinZLsulOu - Q9GW1ynFl6gubm++vflyarMIJK9cShbL6Ifq4mNsjOkIPdV6ddQq31OxPdPyUeY2qCNxHbVBHYnrqA3q - SFxHbVBH4jpqgzoS11Eb1JG4VrbIdXZnp/Zs0VeyOzu1Z4u+kt3ZqT1b9JXszk7t2aKvZHd2as8WfSW7 - s1N7tugr2Z2d2rNFX8nu7NSeLfpKdmen9mzRV7I7O7Vni76S3dmpPVv0lezOTu3Z3J7LTlGGPC63Q9Ge - y05Rhjwut0PRnstOUYY8LrdD0Z7LTlGGPC63Q9Gey05Rhjwut0PRnstOUYY8LrdD0Z7LTlGGPC63Q9Ge - y05RhtAb28C0CnSKsXUxddTR+HgMpzoZai9vKR9UZ3+q9EzJ11mqq7c3X8foz5mvI8fwmM7EtqK9+epp - b77daW++eupITEeoM8fsCO3Nt2f0dMrXchWwE4lj8vyAeQmVbE4lW6Tcjx5tud4etRfbmVxOreo8E/K1 - l7Mzx9ybb3f6c+drRaXjtaqzN19b2ptvb75IT4d8e0J78+0ZPZPz7bYRdIn+FCfTXk73d/TYe5ovt7eK - j7Znar5IdfEudyRHpL35Ev0588XYunpRL/lK/miPfqgU7xTrQS5He/RDpXinWA9yOdqjHyrFO8V6kMvR - Hv1QKd4p1oNcjvboh0rxTrEe5HK0Rz9UineK9SCXoz36oVK8U6wHuRzt0Q+V4p1iPcjlaI9+qBTvFOtB - Lkd79EOleKdYD3I52qMfKsU7xXpQ7u8s7Wn9nPbm2zN6uuZrsw1MHeHPY1rppfhIHfGV8rWqV0elfHtK - f8xc0J8zXykWm9tdLsWVqBQX67tciitRKS7Wd7kUV6JSXKzvcimuRKW4WN/lUlyJSnGxvsuluJzyuJKc - l1CUI2Gvi3M5L6EoR8JeF+dyXkJRjoS9Ls7lvISiHAl7XZzLeQlFORL2ujiX8xKKciTsdXEu5yUU5UjY - 6+JczksoypGw18W5nJdQlCNhr4tzOS+hKEfCXhfncl5CUY6EvS7O5byEohypzt6KWuXdm699+mvL12YR - iBOys+s5RX+J6nyleq3yOHUkxqkzsZFK9TpqK9EzJR9llL1sZStRKa6jthKV4jpqK1EprqO2EpXiOmor - USmuo7Y68phW7BT13Ofk9lbsFPXc5+T2VuwU9dzn5PZW7BT13Ofk9lbsFPXc5+T2VuwU9dzn5PZW7BT1 - 3Ofk9lbsFPXc5+T2VuwU9dzn5PZW7BT13Ofk9lbsFPXc5+T2VuwU9dxXIo+pi432uphIHlMXG+11MZE8 - pi422utiInlMXWy018VE8pi62Givi4nkMXWx0V4XE8lj6mKjvS4mksfUxWLr0BAwVJcgErrzntIfI0ek - mK8ud8neEdtfQj6XKSOXbG7PKdpdjnXqbG7PKdpdjnXqbG7PKdpdjnXqbG7PKdpdjnXqbG7PKdpdjnXq - bG4vkfvymFI9t+X2SO6rqxvJbbk9kvvq6kZyW26P5L66upHcltsjua+ubiS35fZI7qurG8ltuT2S++rq - RnJbbo/kvrq6kdyW2yO5r65uJLfl9kjuq6sbyW25PZL76upGcltuj+S+urqR3Jbbc2rPn9PefG1pb756 - agkAo8/lunjszp2lWCev316+kr8j+drL69TR/M/kfPjyuDqbU5RzqqtbsjlFOae6uiWbU5RzqqtbsjlF - Oae6uiWbU5RzqqtbsjlFGYoxzk7RlrP7YwlFm7NTtOXs/lhC0ebsFG05uz+WULQ5O0Vbzu6PJRRtzk7R - lrP7YwlFm7NTtOXs/lhC0ebsFG05uz+WULQ5O0Vbzu6PJRRtzk7RlrP7YwlFm7NTtOXs/lhC0ebsFG05 - uz+WULQ5O0Vbzu6PJRRtznWU+9qL3ZuvLf0152s5BzDaXS7ZoLocrahUp3QcpzpbR+qUfDmVYjtSr46e - zvmol9fNbaXcJRuU14VyW6luyQbldaHcVqpbskF5XSi3leqWbFBeF8ptpbolG5TXhXJbqW7JVkft5Yei - 3l7uvfn25tubr57+2Pk6S3vz7Rn9NeRr0wOI7Ox6Tnl8e9Qqpr38ObUX39l8OXUmtiP0dMwXc7hMmeeu - s+UUbS7X1S3Zcoo2l+vqlmw5RZvLdXVLtpyizeW6uiVbTtHmcl3dki2nunrOTnW2SLkfclvuq7NFyv2Q - 23JfnS1S7ofclvvqbJFyP+S23Fdni5T7IbflvjpbpNwPuS331dki5X7IbbmvzhYp90Nuy311tki5H3Jb - 7quzRcr9kNtyX50tUu6H3Jb76myRcn8ddSQmp1Z19uZrn/5S89XuA0ilUkW3uy+WLkcq2fbSn5/yf7f4 - 7xR9HaVYx9kp+jpKsY6zU/R1lGIdZ6fo6yjFOs5O0ddRinWcnaLvqVCez6kuX1280958ifbmS7Q3X1v6 - U+QrUatj7M3XpL35EpXsuwHAVomhkr/OlrPbnaIcKcaW6kWK9vZiKOtingr9Jef7Y54HtDffntEfI5/n - oIxyLDtDe/PtzdcZ2ptvz/Ltpb30x6biHMD4B1uizv7xthcfj5fH1tVtlbO9fJGd2rO5vZXuNqg9m9tb - 6W6D2rO5vT09Um7L41zuSF0ot6FHm8sdqQvlNvRoc7kjdaHchh5tLnekLpTb0KPN5Y7UhXIberS53JG6 - HaH26nQ25958bWlvvta0N19bKvmjLZed66jkj3oul+IjlfxRz+VSfKSSP+q5XIqPVPJHPZdL8ZFK/qjn - cik+Uskf9VwuxUcq+aOey6X4Yg9gKTBSR2Kc6uI6Urej1NFzcSrFRz33l2JbxUOt/KXYVvFQK38pti4+ - 99VRXien6Cv5c4pxpfjoK/lzinGl+Ogr+XOKcaX46Cv5c4pxpfjoK/lzinGl+Ogr+XOKcXmdVr46alWn - la+OWtVp5aujVnVa+eqoVZ1WvjpqVaeVr45a1Wnlq6NWdVr56qhVnVa+OmpVp5WvjlrVaeWro1Z1Wvnq - qFWdVr46alWnla+OWtVp5aujVnVa+eqoVZ1WvjpqVaeVr45a1Wnlq6O6Oi0BoAdBuZ6T+/KYaG9V36lV - TJ7jqeary9GRfCV6JudzPcpQlCO1iou+VnGRWsVFX6u4SK3ioq9VXKRWcdHXKi5Sq7joaxUXqVVc9EU7 - lNtjmbNT1KMdyu2xzNkp6tEO5fZY5uwU9WiHcnssc3aKerRDuT2WOTtFPdqh3B7LnJ2iHu1Qbo9lzk5R - j3Yot8cyZ6eoRzuU22OZs1PUox3K7bHM2Snq0Q7l9ljm7BT1aIdyeyxzdirpTi5HGxTtzk4l3cnlaIOi - 3dmppDu5HG1QtDs7lXQnl6MNinZnp5Lu5HK0QdHu7FTSnVyONijanZ1KupPL0QZFu7NTSXdyOdqgBgDM - HRC2uortUV29qCPXxUWKcTlFe4yri29FrerUHacVPRPy1cVFX6u4SK3ioq9VXKRWcdFXF+f2nEsUfa3i - IrWKi75WcZFaxUVfqzgnj4lxuZz7W1EpPpdzfysqxedy7m9Fpfhczv2tqBSfy7m/FZXiczn3t6JSfC7n - /lZUis/l3N+KSvG5nPtbUSk+l3N/KyrF53Lub0Wl+FzO/a2oFBt1l2Pp7BRlqJXuciydnaIMtdJdjqWz - U5ShVrrLsXR2ijLUSnc5ls5OUYZa6S7H0tkpylAr3eVYOjtFGWqluxxL2LaBcSPUEblEdX6353709nJC - 7eV1eir5crnki7YSlepAyCVftJWoVAdCLvmirUS53/M459QRX6QYn/ugjvgixfjcB+U+isS714m23OfU - EV+kGJ/7oI74IsX43Ad1xBepLhZyXx7jcrS7HG051cW4HO0uR1tOdTEuR7vL0ZZTXYzL0e5ytOVUF+Ny - tLscbTnVxbgc7S5HW051MS5Hu8vRllNdjMvR7nK05VQX43K0uxxtOdXFuBztLkdbTnUxLke7y9GWU12M - y9HucrQ5RT33QR21Oe3N15b+mvO1GQLOK+aVXc/tUF73j0Gl4yE/1WOV6uX5OkKxrtMzIV97uep8Jfv/ - aT41RX8zjjL5/vCHPzT4ySeflN///vfyu9/9bjfGDhPj8W3zpnw5xZg6qvP9OfPV5YhUF7M33958Jdqb - L9HTMV9JrvPX0d58if4a8u32KbiOJHAitjP1o8/lPEdH60OlepQle04le6xbVw+qq5vT0zFf9HUkF/R0 - yOfsAO93v/2t/PrXv5Zf/vKX8l8//al8//s/kG9+41vy9a99Q770pS/L5z73Bfn0pz8jn/rUZ+QTn/iU - /OtHPyYf//gn5POf/4J85ctflW9845vy7X//jvzHf3xffvyjH8tP/+un8stf/Lf86le/lt9qbgeI8Rxi - CZVsJSr5/9T5Yky0OTtFOacYW6rj/pKvRDG2VMf9JV+JYmypjvtLvhLF2FId95d8JYqxpTruL/lKFGNL - ddxf8pUoxpbquL/kK1GMLdVxf8lXohhbquP+kq9EMbZUx/0lX4libKmO+0u+EsXYPC7ao68uDspjI7k9 - j8njc1/ud3J7HpPH577c7+T2PCaPz32538nteUwen/tyv5Pb85g8Pvflfie35zF5fO7L/U5uz2Py+OI2 - MJFa+XLKYztT16lUZ0/OrzPn8FTOtxU9HfPFHK3ylXzt2fY0H3qJ6bED7P3sZz8zwPaVr3xVPvbRj8t7 - /+H/yVve9Db5m1e/Th548Dlyww075eabbpcbd9wsW67fLtdt2qq8TTZt3CIrVqyRtWs2yk713XHb3XL/ - vQ/JI895vrzohS+VV77i1fLGN7xZ3vmOd8sHP/Bh+fSnPitf/erX5D++9307Jsf+/e9+3wYQQlHOqeRr - z/bHzJeXTujOkaItliVbJI+ps7vsZckWyWPq7C57WbJF8pg6u8telmyRPKbO7rKXJVskj6mzu+xlyRbJ - Y+rsLntZskXymDq7y16WbJE8ps7uspclWySPqbNHObfp/9rYbUTgyfSCmUYR0kjCk9WIQWRrC6r2gIyx - TGRaI3fTnijaYlmyOUV/K8rrRNqbb2++SG0AYF65FbXnh0p5nw7UmfPpzHV2hP7c+fJ49Nzvem53qpMh - 9Nzvem538hhnGtgnnnhCfv6zn8t3vv0d68V7z3v+nwG9hx96nuy68VZZp2BuwfwlMmvmPJk+ba6MGjVB - Bg0cJqNHjJcxKo82Hi9jR0+UsaMmysjhY80+afxUmTxhukydMktmTJ8js2fOl3lzF8mSRStk5Yp1snnj - VrlJ8z9w38Py0hc/Lm99y9/Lhz/0EfniF78k3//+9+UXv/iFnRvnGM/ZKeq53alOhtBzv+u53akkxzK3 - OUU99znldSlzm1PUc59TXpcytzlFPfc55XUpc5tT1HOfU16XMrc5RT33OeV1KXObU9Rzn1NelzK3OUU9 - 9znldSlzm1PUc59TXpcytzlFPfc55XUpc5tT1PN4+A//W40e/O538pvf/Eb++7//23r+f/TDH9vL3re1 - rWFkgJe/L3/5K/LlL31F/u0LX5QvfP4Ldv9/+Utf1ZfPr5n/W9/8lnzve/8hP2L04Kc/tZGIX//6N/Jb - zR3bhkhRz31Obq/zO7Xnz2lvvra0N1+idnsA26NYF9m5M5Tn6Ai1insq+f7aqPQb5WWkVj4o2vPYUp3o - g3mjBlj953/+l3xVG9kPffAj8vrXvlEeuP85ct11N8hiBWjTp82RCeOnKKibICNHjFVQNyaVI8bJcAV4 - yCO0HDF8dFWOlVEjxxsYHAMQVB4/drLyFJkwbqpMVDCIPm7MJNWnyHhsE6bJlMkzZdb0ebJg7hJZuXyt - bN2yQ+65+wF5+cteab2En/j4p+Rb3/p3fXj8zB4keYPvZaRWPija89hSnVa+nFrF5L6o19Xbm69Je/M9 - ffJhz+vTe5dGD35ejR58TT71yU/LBz/wIXnH298tr3vt38rLHnulvOD5L5ZHHn6+vfjdfed9cuftd9tI - wc033SY7d+ySW26+XW5X/c7b75U777hH7r/vIXn0+S+Sx1/+Knn9694ob33r38v7//EDmvszafRAj/XT - n/5MfvWrXxng9NGD/Nzz891Le+n/ktosAnEq/SH6H69ziersnaE8R6vjdYRK+WLZHrUX90zLV4rHVorL - Y+vicqqLaxOrIvrvFTz98pf/Ld/693+XD3zgw/KKx18lt91yp6xauV5mzZhnwGz0SAV8w8cZ4APcDR82 - SgYNGibXXjtY+l09UPr2vVauuOIaufzyvnJ576vkssuuUL5S9aukd++r5corr5F+/QbI1Ro7YMAQrTtc - hgwaKcOGjJaBA4bJwGuHyaCBw9U+QoYNAzROUFA4WSYCCJUnT5wm06bMlnlzlshqPa+d22+24eO/feOb - 5Z8/8i/yja9/w4aKaehrr1cp2vIyUl1cHlsX52Ud5/7O6jnn/s7qOef+zuo55/7O6jnn/s7qOef+zuo5 - 5/7O6jnn/s7qOef+zuo5t/X/we7DX/zil/Ld735PPvuZz8v73/dP8obXv0keffTFcted98qOG26UDes2 - y/Klq2W+vuTNmjFfpuv9PVVf/CZPmq4vgVO13ZlsPH7sJHt5HDcGniTj9IUROy+PU7XO7JkLZP6cxbJo - 4TKbYrJj+01yz133ywtf8FI75v977z8aKOSF8b/+66fyxG/Kowed0XOby5HcF/11em5zOZL7or9Oz20u - R3Jf9Nfpuc3lSO6L/jo9t7kcyX3RX6fnNpcjuS/66/Tc5nIk90V/nZ7bXIbaLAKJAXtCrXLWyTnl9XJy - 3x8rXx21l7Oz9OfM5zplyRfZyeVoc4q+3O+23Of67377O+vt+9znPi9vecvb5N57H5Q1Cq6mT5kpY0aN - V3A2UkHaCBk6WIGa8qABQxXI9ZOLL75Ezr/gIjnnnPPk9K5nycmnni4nnnSyHH/8yXLssSfKMcccL0cf - fVxik49X23Fy7HEnaMyJcuKJJ8vJp5wmp552hpx++tnStevZ0k1z9ehxsVx6aR8FlUNk4sQZ2qCvkpXL - N8iyJetk8cKVMnPGQn0wzNSHwBTrVeRhMGvmXFm/dqPcr+dOzyBDQswZyq83lpGiL/e7Lfe5HG1Oua+j - 9XIipr26JVsdEdNe3ZKtjohpr27JVkfEtFe3ZKsjYtqrW7LVETHt1S3Z6oiY9uqWbHVETHt1S7Y6Iqa9 - utEGc98xPQOg9a//8jF585veJs99zqNy445bZP2aTTZdZNqUWQrcpsh4BXO0MYwYDB82RtuaUdbO0N4M - 0XKwloN5IdSXQ5iXRbOr7dr++gI5cJjFW9s0VF9K9aWRF9TRoybKeH1hnaLtx8zp82TRguWybu1m2bXz - FnnOQ8+T17/ub21k42tf/br8l7Z9Tzzxm2LPYH5t0e9liWJMjMvt0e9liWJMjMvt0e9liWJMjMvt0e9l - iWJMjMvt0e9liWJMjMvt0e9liWJMjMvt0e9liWJMjMvt0e9lifA1AGAeGPVWPijmyH1O0V6SY93oz6mV - D+pIvqjXyVDuc3bdqSMylPucXXfqiAzlPmfXneri3B5lp87aoi/KTmb7w//aClvmzXzsYx+3IdWtW7bL - nNnz9S17QgPsjdRGmTdu5urN1oZ01rQ52ggPk/POu9DA3hFHHC2HHnK4HHzwIXLQgQfLgQceJAcecKDx - /vsnPsDkg+QA2OQDZP/9KsZPvYMO0RyHylFHHiNnnnGWgUB6FZcsXi233/agPPKcl8pzHn5M7rrjEdm8 - +SaZN3+ljBs3XQYMGC59+vSTyy69Qq7Ukp7JbVt2yD9/+F/kV7/+NVO/63+DGlv0Rdmpsza3t9I7y3n9 - XO8s5/VzvbOc18/1znJeP9c7y3n9XO8s5/VzvbOc18/1znJeP9c7y3l9/Z8BP2tPPvoJec3fvF7v1Xtt - fvDsWQsU6E2ytmS4ATx6/YcruKtKBXED9WXv6n7XSu/Lr5JLe/WRnhddJhdeeIlccH4vueC8i6R79wvl - 3O495MILLpYeF/ZSXy/p1u0COe/cHhp7iVykfMklfawd6NO7r1x1VX+55prBMlDbBwAjU1DGjp4kk7Qd - Y/oKgHDzxm1y3z0Pyqtf9Vr5p/d/wKa78CLM9JcIBu36quvNyxJHn8te1tm9LHH0uexlnd3LEkefy17W - 2b0scfS57GWd3csSR5/LXtbZvSxx9LnsZZ3dyxJHn8te1tm9LLH7dpsDGOX2KE+WU/RDeYz787ic3NeR - MnIrijF1JVTyOUeKtroSKvmcI0VbXQmVfM6R8jioJP8p4pB+97vfy09+8hP56Ec/Ji958ctlw4brZOqU - GfoWrg30sFEyasR4bbCnyIwpc7WhXClrVm6U6zZsky2bt8vqFWu0AR8mZ5/dTY4//gQDfwce4MAvcNAP - QjY+uAKJlMl3gMVWNgWBhx9+hHTteqY26L2kf/9BsmzpOrnv3ufLY4+9Tl722BsUCL5cbtx1nyxdukEm - TJipAHCYDS9feOHF+nDoaSBw0fwl8s63v0t++YtfpmvuwO8SS+iPHQc9VTuE3Nl6dXYIubP16uwQcmfr - 1dkh5M7Wq7NDyJ2tV2eHkDtbr84OIXe2Xp0dQu5svTo7hNyqHgx4Yg7eqhVrZfTI8dL/6oEG6q5hukf/ - ITJkIC+UY/WFcrL1zDGVg965mdPnyMRxkzS2v5x/fg+9/8/StuUkOeqoY+SILkfJ4V2OlMMP66J8hHQ5 - /EizHdHlaDlM9cNVP/LIoy2WEYdjjz1BTjjhJBtZsBEFBYkX9ugllyowvLrfQG27RsnoUZNk/FiGlqfK - 1EkzZN7shbJ29Ua54/Z75BUvf7XtPvDv//4dmzMIENQrbFynU50M5bqT2/MSqpOhXHfK89TlyOvnulOe - py5HXj/XnfI8dTny+rnulOepy5HXz3WnPE9djrx+rjvleepy5PVdL84BbI/yZE+VWp1gK6q7mM7mi/Va - 1Y3+3BcpxsS4vE70575IMSbG5XWiP/fVUSm+s7ZI7dX94Q9+KK99zetk9er1MnbsJAV9o20IhqHUKZNm - yawZC2Xh/JWyctkm2bR+u+zYdovccuOdsmvnrTbMOnTocDnnnO42jAsABLgddJCDuwT2kA8+MPUKHkzv - XmWzuMAJDFI/MY366aefoQDwYpsnuFAB6B23PywvftFrFAS+QZ6jAHDXTQDA9TJh/AwZcO0wuezyK+WC - Cy6SC86/SK7ofZXMmTnftqRhsnndb+AUZadWcR21RSrZ9oT25tsz2ptvzyjPhw5Q+uqXvyY7t+2Sa/oN - kB76Mta923ly+WVXWE8fc4cnT2Se3mJZunitrFm1WTZtuEG2bdkl267fISuWrJBBA4fIueeeLyeffKoC - vCPlkIMPtTYhvRzSTqSXRmtHtM2IL46RGY045JBD5ZBDDzOAePQxx8np+lJ54YU9rWdw3Nhp2q4wrWSj - nssamTV9kbV7kyfOlBnT58rqVRtsGszb9SXya1/7hq1QbswVbAcMdoQ8vi7H3nyt6S81X3EjaGfXvSzJ - OUV7Hl+qU4qPlNs6E9/ZfCX6S8tXRx6Xl5E6mguKeZ7Uhvqzn/mcbNxwnfTVxrD3ZVfKCAWAvA3TCM6c - vkDmzFkmixeu0QZyk2xcf4Ns33qzgr/bbcHFurUbFDCOtIbaAOChhyeAR+NrDXMTAB5ow74MB9NwH2i+ - Bviz2IpVP/igQ20I+DB90z/99K7So0dP6du3v8yfu1xuveV+ecGjr5KXvPh1CgBfVvUAKgCcoABwQBMA - nnd+D+mt8oyps+X1r/1bm+jNNf8xf79YRmqVD59z1NuTI0Xd42JsR+RIUfe4GNsROVLUPS7GdkSOFHWP - i7EdkSNF3eNibEfkSFH3uBjbETlS1D0uxnZEjhR1j4uxHZEjRd3jYizDv5/+xGdk/epN9hJ23rkXyFln - nmP3I3P76HGbYS+Wq2T1yutk08Ydsn3brXLLrrvk5p23ybpV62XI4KFtAOBhhxwmh9AuVO3LwVXb0Whv - dtO1VPDnPpO1TTlE8xx33AlyTrdz5eJel8uw4WNlhbZtt978gNx7z/Pljlsflhu23aa2zTJr5iIFiOxC - MFnmz1tie5n+7RvfIl/64lcSEPzD7tvKuF6yR3I9j4PyepGdogy5nsdBeb3ITlGGXM/joLxeZKcoQ67n - cVBeL7JTlCHX8zgorxfZKcqQ63kclNeL7BRlyPU8DsrrRXbaDQD+KSk/Vn4yUGfOZ0/zdeZYTn8p+Vz+ - v7DRUP/zR/5VlixeIZde0ttW6TJpmm1XpkyeJTOmzZfZs5ZYD+AqbRA3rUs9gLfedJc21rfLhnWbUg+g - NqbHHnucNbo2jMtw7v4HyAH77W/z/Gy+XzX/LwHABP7s7fzQQxU4wofJYfBhh9vQL8M7XY44WgEgb+sX - SZ8r+sr0GQtk58675JHnPCYvetFrDQDuUgC4ZMl6GTd+ulx77VC5XEHs+Rf0sHmJ9DhMmTBdXvWKv5Gf - /PgnHf5d/i9sT4Wom9ffm6/jtDffnz6fRsgTT/xW/vlDH5Xli1dJ70uvkPO6n28AsE+fvjJC25eJ42fI - zBmLZNGC1bJqhQLADTv1hfIOuf2We7VtuVOB4wabWnLeeRfISSeeYm3BYfpyeSggEBB3sJbIh6QXxSZX - IK/SDzFd2xhkegGND5Njjj5Ozj67u/Rgaom2GQu0fdt54z3ywP0vlocffEzuu+eFsuvG+2Tt2u0ye/ZS - Gaft4TB9MYZZjXzd5m3y5je/zfYozBeXQa1+Y/dROueU20oxTu7zXKXY3FaKcXKf5yrF5rZSjJP7PFcp - NreVYpzc57lKsbmtFOPkPs9Vis1tpRgn93muUmxuK8W0GQLOE5US5P5SjFPJn5P7S7EdtUVyX0frus3t - 0R9tkXNbpNwe/dEWObdFyu3RH22Rc9tToadaLyfysOL3n/7xAzJ/7iK5RN+GL7u0jzXQY/Wtlz332MiZ - t+C5c5ZqI7lKli5ZJ8uXrZNlS9bIgnlLZdLEqXLVVX3lXG2ozz6ru3I3Obf7hXIRK3d7XaZv/H3kiiv7 - 2XYwbPly9dUD5Nr+Q2VA/2HKQ2WgNr6s3LOJ2SPG2XxDNoamZNuXawcMlf79h8gAjWMV8FA9t6nT5ski - Pf6atVuVt8mKVddZIz1m9GRrzHv3Zg5gTwOAgNoJYybJy17yCttUdk9+9zrqbL5SvJ+Xs1N7OpTrkMfl - 8e3pUK5DHpfHt6dDuQ55XB7fng7lOuRxeXx7OpTrkMfl8e3pUK5DHpfHt6dDuQ55XB7fng7lOuRxeXx7 - OrSbrv/9+le/lve95/2yYM4iueySPnJut/PlzDPOliuuYGHWBFu17wBwzaqtcv3mm+SmG++S22+9T18s - 75A1K9dpuzBYzjv3fDnxxJMU/HVpgDobHTDmBbLq8VP7QQb4qhjkAA6RecFkhIJRBeYHMm2lZ89L5epr - Bsscbd+2brtN7rrr+XL/PS+SO29/ruzYcY8CwJ0yb/5qmTRpjgzXtod2iJGSfn0HyOIFy+Vd7/gH+Z// - /p82v0v8PXJ71HOqi4vxuT3qOdXFxfjcHvWc6uJifG6Pek51cTE+t0c9p7q4GJ/bo55TXVyMz+1Rz6ku - LsZHu/UAloKeKnUmV4xpr14pNqfO5IvUXgz+juRxeibk8/hYr2RzKsU5oZfquv03v/6NvOud79HGeK4C - wN5yub6tM4w6WAHZoIEjrMFj7t2VV/bXt/e0j9/FCuwuVIBHL9sFF/S0FXe9FDyy2q5vv2utPgBu2pQ5 - MmfWQtujb9GiVbJo4WpZtnS9rFi+UVYs26RAcqMN/6xasUnWrt4iW6+7SbZrIwzfuOMu2b79DrlObatX - XS+LF62W6dPnVW/iY2XgoBHW2wc4dL7m6iF6roPsHProgwYgeEWffjankY1iP/7xT8pP/vM/bYsH9iTz - 3yD/XSJFfykuj4dKcU4drddR2puvSXvztU9/ynyR+VLQm9/wNpk5dY5cpu1K9wYAvFpfMBUA0gOoL5bM - vaMN2Lxhh2y7/mbZse1WuW7TDfpCulCB1tVyztnd5fgTTpQjjzxKjjziKDnC+GjVj5Gj1AZjP1JtDBMf - fngX6cLoQZcjbCThsMMYUUgjCwkApp5DFoqceeY5tiCkb7+BNhy9Zcutcvfdj8q997xA24tH5IZtd8ma - 1TfI3HkrFADOtvNmFfFV+kLLyAL7Db76Fa+1Tef9uuNv0R6V6sR6ua89inEux3q5rz2KcS7HermvPYpx - Lsd6ua89inEux3q5rz2KcS7HermvPYpxLsd6uS+ndoeAvWJM0F6d9ijm6iyV6v0x8sX6f+n58rodtZWo - Lt+TT/5BfqVv6P/x/R/Ixz/2Sbnv3gdl9KhxCuCutIaNrRMuuaS39Lr4crlY35BZgdtDQR5bsdCzdoGW - F1BeeJHZ8DGXhtW3vB2zH9dwBWnjx09X0Mbn3JbKPG1ElyxaK0uWrFUguEaWLVkvK1dcp+Buq6xds1U2 - rN8hW667RbZtvUOB311y4857lO+WbdvukE2bdsmKFRtlzrxl1vs3YeJMGTFigm0Ofc01g+xt/CoFqPQw - Mqm7X99rDbTio9dw8ODhMnHiND3OBvtKwJvf9Fb5t3/7os3h8e0dSlT3+3XEVqJY1+WcS76cSv7c5lzy - 5VTy5zbnki+nkj+3OZd8OZX8uc255Mup5M9tziVfTiV/bnMu+XIq+XObc8mXU8mf25xLvpxK/tzGvpsv - fPQxmTh2irUh3bqdazsFsPn7AH2xHDxklAzXl0Tu4+FDx8rQwWnj92v6D06bx/fp29g0/sorr1b7QBk2 - dJSMY+uW8dNk6uTZMkPbAl4KpyvIhKdMnC6TKmbD6El6zzNCkfYXnKQvpRxnpL4oDrAXQ7aL4kWRtmLU - qImycNEa2bL1dtl54/2yc+f9slXborVrd8jsuSu0zZklI0dOsJdbejHZl5RFco+/7FW22tmvO/4WuQzl - ulMpvs7mMpTrTqX4OpvLUK47leLrbC5Due5Uiq+zuQzlulMpvs7mMpTrTqX4OpvLUK47leLrbC53ehVw - rAzFpE4lm1P05fL/lc11L/+abJH+FDb4N795Qr72ta/JG17/t7LrxpsVnC3QhnVEequ9HPDXR8Hf5daj - d/HFl2mZuOfFlxr3uKgCf6yyVb6wR097i+7Z8zJrsPteda0MHjRSG1RtqBWosUnz7NlLZMGCBAABfksW - r5PFi9bJ8qUbbf7P6tXXy/p12+X6zbfoW/edsnPHPXLTrvvkphvvk+033CWbFQCuWbPFeg9ZkDJR38ZH - 6YNgiD5E+vcfakM4PsTsILCvgkJ6A/vrA2XgwKEyZPAIe4CMGjlOpkyaKevXbpJXvvLV8s2vf6va5ytN - 5vbfKqc/va3592CkIiq2phUpi6voL96GObg6U9eqNv/Xqbo57bU1bZQwL1FMJfnZz39u3+v9yEf+WV7w - 6Itsv79r9B6kJ/7yy/n6zxUqXymXajvRixfMXr1tf78e7O/Hfn7Wjlyi4Kq3zRXkBW7okDG2CGP69Lna - fqyWdWu3yuaNO2XHDbfrC+KdsmvX3XLjjXfKLTffJzervEtfGm/ape2HlrfedK/cAqsO33Tj3VrvDrn+ - ups0zzZZqm3RXH05naZAcvKkWTLOPjk5w4Z7J0+eK1OnzJMpU+fKuPEzZOSYyTJsxDgDgFdedbUBQFYy - P/bSV8hPfvyf6UXyD/q7ZL9XZ3/TSHttf922p7QNzFMlDpyfUMkGlWyRWtV7Kvn+Gsh/m/gbtWdzKskx - zvl3v/ut7XT/3EeeL1MmT5f+1+ib8BV9bWUePX80atbzp+AP7qkAkDkyDPFe1OOSasPVHACmHsBevfpI - b32jBnQxfAwAnDJ5jj4EFsksPsk0b7lNtGYYmG0f2Ldv6ZINsmKlgsBVm2Xtmm0G9LbpG/iNO+7WhvsB - ZX0T336X3KBv4ps33SirVl4n8+av0AZ7gYwdM9VW7w0YODwN+yrgY5j6iiuvVlYgaCDwWvvMHPsH0rsw - ZMhIW4FIwz1h7FSZPXO+3HXnfbYIhrf4/Lugnefs3yfIdczx2FKifSbuDxb/1JnjheNH+ZnAf+Lz1X+w - IFfUxt+aSnFNW9NeiiuRxxHalJs2T+m2hkGpbeyfjvnb5Lu6H/inD8hdd9yj9/ZyGT92om3hcs3V7Pmn - 958COZtGcsXV0kfBIC+KlyjI4wWzZ09tZyqm7bnssj5yRZ+r5ep+g2TQ4OHW6wYQW6D3PVNH1q3bpgDu - Zm0XFPwpoLv5pvtkl7YXu3bepYAvyTt33GmjB1buuCsBwhvvkZ0K/rZef4ts3LBTVq/aYu3P/Hkr9QV1 - mczVF8uZMxfLjBmLrGR+4vSpC7UNm2vbS40erQBw2Dhr2wboC+U11wy075yzufVnPv05+Zn+Bmykz33m - v017lMe5Xmdvj+rq1dnbo7p6dfb2qK5enb09qqtXZ2+P6urV2dujunp19pyKADAmiJVKto5Sqzrt+XJ/ - tJXqlmxOnY1vj55p+drTnTpqj/of/vcP8uOf/Fhe//o3amO3QBvkNMxCg2wAcLfePxrlqtdP38zZaR/w - d/75F8n5FwAAe5qOj1iGanw4ZdCgkTJy1ER9k54lM6bPlzmzFxkQnGsN7dJqSHi57em3ZPEaW1hCL+Am - BXnM+du65VZt4PXNXhvz7dvuMAB43aabZO3qbQog19reYZP1LX3kqAkyaEiaC8i8vyv7Avz0IaPnATNU - c5WCQcAh3yVOvYHVghPbgFZB6pSZtunrS174MvnIh/5F/p3vgv70pzY8/Kv/+bX8+te/kd/8po6fKLDb - fyNPwE/8Rn5dxfOtUXpKeGj+VsEmD85vfuNb8oXPf1E+99l/s/LfvvAl+eK/fVm+9MUvy5e//FX7QP5X - vvJ1+cpXv2F7kH1D47/xzW/Jt771bduc9tv//l359re/K9/5zvfku8rf+67y9/5D+fvyH9/7gfzHf/xA - vv/9H8oPf/AjWwTzox/9RH78Y/g/5ccq03vxk5/8pwFgPoHFVjk/1evn3GD2TnT++c/hX8jPf/Fz+YWW - xr9IzCbbkfnea/Il+Ze/rFh/V37bxP9jzCT6//mfxGy2C/+P/vZMU0isv2Fk/Tf59W9+Xf3Wu/9bPPGb - 31qv7hP6QP7tExUjB2aValP/nYH/Nvz739vqzt+rnLjSW/KTBf69/ns7JzDPN7Zdbpc9j8rxGNg9JoGO - 5lQGyj8lczyOy+/+ne98R1772tfLwvlLbHh1CF/1qHjQoKFyrb58Xa0vYTZFgyHXqjfwUgV69ALSdlx8 - sb50qnyJtj8MzQL+Bg8apQBrgkyaOEvmzl0uS7SNYBTgus03KZC7U26+kd69++XWWx607VsAf7ffouUt - 91uv32233m/g8Nab71P5AeNb1b9T25St198qG9fvsHnIC+evtgUgsyrwB09XnjVzifJSBYNLZfq0hdYj - yJeGeLFlDvLgwSOMJ4yfYp+Ue/7zXqgg+EPywx/+yP5+/Lfyfw8vXc4p2j0uj3U9lnmMU7R7XB7reizz - GKdo97g81vVY5jFO0e5xeazrscxjnKLd4/JY12OZxzhFu8flsa7HMo9xinaPy2Nd9/KP0gOYH6RErWKi - DznXS7Qn+XIbVLJ1hJ6p+aDcVtLdFn3R7oROY/3xj31Cbti2wxpn6/ljzp8CP3r/LtcG+TJ9KzcAqG/m - F/e8zHr+0ty/XjZEAwP+EgBkPmCvBgBkZ33m1CQAOEIb7/EKAGfq2/scmTZ1rr5RL9CGFJ5vQy4MDc9S - UDhv3jIDggzvsthj7dqtsn79dtm08UbZom/rNNa88dtb+8otChjXK4BcYblYSThi5ERtiEfZcJENA191 - jU009/k9fVRGx96PrxBo3IBrh+g5DrMh4ZEjx8kYBZIMC69cukZuu+VOeelLXi5vfP3fyt+/7e3yjre/ - S971znfLe979D/Lud8HvkXe/8z3yLi2N35ns73n3e+Uf3vP/5D3KlO/9h/fJP/wDcrLDfHz+Yx/9mAK2 - 78hXFNy96Y1vlXvvfkhu3qUPNOVbbrpLH1h364Pqbrnttnvljjvuk7vuvF/uvusBuVvj7r33Ybn/vkfk - gfufKw8++Hx5+OFH5TmPvEAeeeSF8rznvkie/9wXy6PPe4m84NGXygtf8Ji8UEHti1/8cnnJSx63oaqX - PfZKefnLXi2vePnfyCsef4288hWvkVe98rXyqle9Tl79qtfLa/7mDfLa17xRXvu6N+mLwpvlDW94i/yt - nuPf/u3bjN/0prfZd1zf/Oa/k7dU/Na3/L3y2+Wtb32HvO1tif8O/rt3Kr/Lyr//+3fZJrrG73i3/qbv - kXe+/R/kne94r/52sP5u79bf6z3vl/e+9/36O71f3vf/PqD8QXn/+5T/8UPyT/D7P6wPWeUPfEQ+qPyh - D/6zfFhB+0c+/K/yzx/5qPzLP8Mfl3/910/IRz8Kf1J/70/aPNePf/zT8gn4E5+WT37is8af+uRn5dPw - pz5nvTif+Qz8efnsZ79g/LnPfUE+/7l/S6zg/AtfUID+b19S/rL8mwL0L37xKyp/xUr2hfvyl75qoN2A - +5e/piXgvQLwyl/9qnMC81/z8usVuP/aN+UbX/+mfF35G19XoF+VXwf0B+al4Zvf+Hf55jf/XV9Yvq0g - //sGzPmiD+AMAMLirl//mheYjnAC1Q6kDTxX7GAZGR/xP/vZz+RbeuwPvP9D8uADj+gL2QIZqy98Y5SH - Dx+j9+NwGTAA8DfYegCZknEl96KBvwoAKtizYWBl2g5eILlP6c1nM/dhw8fZvp4szpg/b4W1D+vXbbM2 - 4SYDf4kBf7fcDOi7L+kK8m4H8Gl5x20PNco7b39YbteSugwfb9b2ZdWK6206CvOTWZAyY/pCmV4xAHAm - PGOxtlcLZRIAkJ7AMVNk+IhxMkTbjrQQbYhd57Cho2XxouXyute90UAgALnUDsdyT2lvvj2jp3u+xirg - ziSsi+9MDqgj8e3FRP+e5utIfYg4j30m5st9Md4p2lrFQdhojL6vD4nHX/YKmTZlhvTrm1b0OgBk2IXe - P+be+Nw/H/q13j8Dfwr8znfwV3HVA8j8P+bzXK4NPI09PXJ8iH2sNpY04hP1LZ7hYHjy5NnWMzh1ylyb - wD1THx5z5yyx1YBLFq+V5cs36ps+i0K227Avb/z0DK5bf4OsXHl9Y9iGB8OkibO1QZ6qxxorA69NQ8H0 - NBgA1AcOQ9I2/4hezt591dbXegi5fl8gknoEh9tKYTbAHsU3QsdM1tzTFbjOUqA5274GMHPGPC3nKDP5 - fI7aFdiqb9rU2VXMHI1hyxz2TaTXE4A732yJ55l9zar18pyHnycP3v8cm9PE7wBAZrsdeBqsx+O3maF1 - Zs6Yr2XF+lvNmkVeZc0/23iRzJkDL27w3LlLZO68xPOU589bKvPnL1NmGH6Zffd04UJ4hSxaVPHClbJ4 - ceIli/XfYulqWaqAeKmWy5atUV6bWG2Uy5crr1grK5avS7xivf77bGjDq1ZuVFCfeNVqLY036b8vzLA/ - fJ2sW6u8jnmgCv7h9VsU8G9V3iYbN27Tl4EbjDdv0r+JzTv0b2KHXL95p74Y7FRAcKNs3ZJ429ZdcsPW - m2Tbtptl+/Zb9EF/i5a3yg7lnfDOxDfeyPyx220z85tuvENuUvB90y5K5ZsUjBvfpcBCAbmC8VtvvafB - t912j9x+u4Jz4/tVvl+BeuI7FazDdylgv+vOxHff9WDFD6ldy7uV73lI7rnnYblP+V7ne58j9xs/Ivcp - 339fUze5wfoCcN9z7SXg/vsf0b+jR+S5j7xI3vS3f2eAk97dz3728/IeBdbv1BeVd77jXQq23y3vekd6 - WYHf+Q5lBeHvUPs7sQHC381LyvsUdL/ftoWiN+tDH/ywfPjDgOyPmA4of6cC+Fc8/moFVnfJsiWr7Fu6 - 40ZPlNH6wsd3ffnKB1s79b9msH1qjUVhV16hL2V6L7JBO2APZsoIQ77s2cnOA70v72v3Lqv5mfdH28G9 - MXvWYgVWa2yh2PWb+fe9zXrxEgi8rzEMHEEg5W23PKig7znW88e3w++642EDgTfvule2b1MAuGmXrNIX - zqX6QsnUFHoB6f1jegmAb8Z0hoIBgEvUriBQQeEkbb/Gjp2mL40TrRdw0OCR1n4MGMA2VUPs2letXGff - EaaHO7XHu7fJJYrteInq7HW0N19beibma3cfwGiLPij6oFwvUXsxeb49pVI+ylLukr2V7nKpHlSyt9Jd - LtWDSvZWusulelDJH+PyOq3iGFL7yEf+RR+cW23PPd7G2Z0/AkD2y6NBNvDHgo+eFfiDL+xlYO98m/cH - 8GP4tzkEDFjkTZ43e4BX334DUi/gyAnakE+yOTQGBCfMtJXBE8azOm+mgkEFgoCf6QCbxfamT2PP9jBr - Vm+xCd8AwQ0btitw2GIAcJn6Fi5YrY3zYgWU82TsuGm2knDI4NH28GDOH/P/+lx5dQKAVY+DsT5sGO5m - gjnDwzyYeEAxHM48JZghK4AhDToN+8CqcXfbtdcOViZmsA0p84F55gP17w9TX+1qs54BjeuvPr59CuOn - Z2TokJEyamTa59BWQyroHMGKSLUlHmflyAZPaJaj2jKrF00ejT5RRunDGB4dysSTGjxG/01GK8gd0+Bk - GzN2kj7gVG/wFCvZE3I3HgdPtYnzJo9X2XiajNd/E+TxDVbbhDrWvwdYAfeEifp3QtnGNl1fIHiJcJ5p - TO8yzOR9Y/1bgtm8fPKUxFOmzNYy8ZRKh+mVNlnB+9SpczKe22QD+YByLxM4TwA9gfQmq66AvckK2KdX - PGNBYv07B8Q7z+QFAVBv8kIFG8ozGX6kxJ7KmbO4P7Ss4vwlwGKQNW7xwlUKDB+xXt3rN90gs/ScZul5 - zODlRM+fBRnz9EVhrk3HWGDzX3kpmaklLy28aFDy4jJPXyIW6IvDogXL9H7Ue1JfFpDnz11s9SbrvUyv - Od/35e94xPAx9jdN2zJQ/+65jxor8/tcrW0N92Hf6h6kvWG6CaMO3I9pqyYWj1199WAb+h09aoq1D3yC - krl/y5Zu0BcDdgm4yQDg9hvukBttnt9dKgPm7zJgx7xAFoZQwjfvusfsgMHUG/igAcftW2+3L4+sXnVd - AwCy1ynt0NSp8/XfHRC4wIaCZ0wH/C1S20L9O5qnf68z00vn8PEyZMhoGaigL93rg629GKv34YP3Pyzf - /MY3bcg+tstQlHNq5YPcvzdfmf7S8rW7DUyJSnXyxE7oziWK9WJMKT7G1lGMiXEdqQO1klvliPR0zef+ - Ulxd/Vgnyl7C9P5959vfkRe98CUyZdI06/268grm/gXwd2lvA4C+8OMiBX9s/QLAS5wAYBoGTgDQQCAL - QBQAXqQAkG1gmNcDuAIADhjAqtsxth8gH1sfo43m2LHTZbzyOH27T72D061HcIq+6TP8MnfuMllg8wLZ - ImazgUB6AxkaZgL4smUbZOnSjbaQZM5s5u0skskTZ2nuKbZBNAtCAF8cnyHf1AvIIpcEAtO2Ek223gf1 - sX8hYJANqgF1zCdkuJiybz8FiJVu28tobjaz5rN0+AF2gD5sV2EjBsCnYK+f1gVoMtwOs50Fx2XrHBsy - B4D2G2gTy4cOGy1DhypryfDSEJVhszXszvrAJb7iZiz2tr5GjLH7x1R64hQT6+Jvq7fiYQAABbEsygHU - GqutyZWv4uEjlE3O/eMqTvqIEeNsuI3YxMiVTRl/YrYTATQn4EzpfrYaSduNuC9wG9DtQBvO7ZET8E7g - u2LAdtQB4gbME7tubMB8krLmUKZMQB1wPtmAOTIxow2oR8YfdIuZrOek9fUeAwiP0H8PAJfNd9WXDV5g - UpnmvgLUWAzFqvjB+pJGrxVz2QbpvQOAo2TV/CC1p/hRiau6xioPq+zsFUpuXo649wz46b3Hgg+And17 - ep/Z/RZexOiVv6K675ijy6gBxxs1cpJMmsAXiBboPb7M7nXm6q1fu12B7S7ZuoWdAm6r+FbZpjogcNuW - WyvfrTZveNuW22THNhaU8c1yenNZJZxAIlNKmGrC59/Ykir1/inwmzpP26O5xlNYAaw8dWoChYA/hoHZ - DoZewBEjJtrfPvcuvYD+gsjvuWgRG0S/x+a8xrYZiu1zpFyPFHPU1auzlwhfe/Xq7CXC1169OnuJ8LVX - r85eInzt1auzlwhfe/Xq7CXCV6rX6AHMnaUyslP0x9Ip13PqSL32ckTqSL4S4S/FuL29+jk9XfPF+FjH - 5ZLNKdchbL/85X/LP/7jP9keeDwMbC5OY/g3zcVh3h9M7x9gjs8jAfwaYE9Lev/OYwHI+T1MjgtBLrpI - ASCr+KphYHrgruk/xB4OgECGaIcPn2AbqdLAp4fsRANu9AyyySpv3wxfzlMQSA8fc3P4vi89fvQA2P6B - i1bb1g18lm7u7CW2hQP7DNIjxAOTBplj9teGGBDIcDSrggGlAD0eQmxBAehlFaLtd9gL0Hq1LFi0xnb8 - nzxlvjXm9NCwJxlAkq0ghurbPr0UfBYP8Ango/FnVfIsPZc5ei70CDDcPX/BKpkyba7pgGsbYrcHIMdj - viRgu7cCwUsVGF6jYGdMA1QkVqBhnOQmsNHf0Epl/C43WAGPxQZuAKMKOLnNwBGcAFlDV4DlsgMx/GyB - AThrgDF07FUM/lQ/+Rt2vbbdbTk7EIxgkHopn9kBmg1wmZj5Zvmxdme1ax0DqnAVNxRWPXKbPG4zbtpS - Dufd4+u5DLSjjVwA6aina0754/EszmLH6ssWvVDDFIiMkAvP7ylnnH6mTXmgN9xeVJR5SQHcAdLspeVa - AKLWUQYsGoBh3p6WsPeIWy+3zcsbqpzm9PVXneFdXojIxcuRzfNjwZXeI4BAXnz60POn58Hfvi0SUxlQ - yOKz5ip9VugP17ZhrH3Jh1ECPj85R+8zvjzEtlFsFL1BAeB1CgDpBQT0bb3+5opTr+AWBXXXXbdLrtt8 - o+0ner2yAUAFfMz5SyuC79TYW23+H/uP8jK5QO9Vel1pRyZPnqPt0cwGT1QgOnHibBv6ZesptodJAHC6 - 3nuT7O+Te5zRDgfBlKP13rzz9nvkq1/5WmNBiFOpnYZKMXksurNTHuNUislj0Z2d8hinUkwei+7slMc4 - lWLyWHRnpzzGqRSTx6I7O+UxTqWYPBbd2SmPcSrF5LHoztCfZBuY/KBPhWKOP3a+OirF7Mmxn475Ynwu - O0dyPY/1ksaHSegPPfgcGTd2ovX+pcUfaeWvb/icVv4y7y8N+/Zw8MeQ74UK/AB/56Vv656nANCZFcEA - ROsFVBAIqGGeD6DLJnNrw85DiUUaNJT0UA2ueqt4kAEEHQROmTpHQdd8G9JKK4VZJbzKhoT5Cggyw0GL - FqyR+epj2Iu5btP0YUEvIkPLo/QBMnz4eBmkxwMEXs1QlD6w0ldM+hk45UFkQFCBL+dKz2U/PdcHH36F - bNl+t8yevULPc6w88NBjskhBKODujrse1QfEIlt5fN99L5Z7732xyrNl2vR58sCDL5Hr9IF0/4Mvte0k - tm67U+5W/9JlmxQQTbDfNfWypp5Whss5Jr2p3bpdaABw/ISpev0MWzIsPlMfOFoiN3QFydhcnoSe8ZQZ - MlHLiZOmG1uMsskTm/LEiZWP0oZXpyVW3wQtE6ehVx+mnVDx7no1xKvlOPdRH9mGg5OvTVxlb/IUG0a2 - ssFqD7Y03KyylZMrdj1n9yce4+XY5jD3mLGTZXRVJna5Khs9bRMbvW1jTE56GkIPbL16qSfP2WKtZ899 - ytY7WMmN+GSzuArwY7PeQdOb3IgPPoA/e2FecUV/BWH6t67Ai69n8BKXep/7Wc/gEn2ZWqj30Zw5y+2F - jF6upfpyxQII/sanKQBiI+RlKzbJ9BkLrVeeubqsnmdRBMOkTNFgOkc/BXkMV7Og66orr9UXhgkGhuiR - nKn3JfcjPXo271bvO17AmI5BryDDwgBGB5W0D9Q18KcvctOmzpPZCsi4x/lMXNownrmiaTrIJuXrNu60 - +YBblAF8yJs37LTN5Ddu3GHfFWZfUQOMm29WMHiTbFGguHXLzTavmFzLWQG8cI2NOnAtzMOdZO3IDP27 - mq48zcrx45m2MkP/drVU8DdeQeFYVgOPnmLXbW1a1QsIgIbpBWS4nQVTbA/j2xe1oro23CmvvzdfW/pL - zLfbHECn9ip6GWWn3FZXdpRK8diear72KOary92ZYz5T85VyuI2S1YBs7fHWt/ydAqilcm3/gdr48vad - ev8MBAH+FIyw6jct+qiGfa2HD+DXQ849vwJ9gD9legCTXgHARi/gJWk1sIIdhl2vZChUARgr+njDNyA4 - aKSCsxE2vMTcN3oyEgicrA+WNBzMPCtWDM+ZnXoDeRBQLpiXSh5C9A4w/MscKOZqTZnCG7o2zpqDITGG - /NL8nLRFDPP0rDdEH1y2QKS3P5RSz+CV+hCbpw+b9RtvljvueFQfiEvlBS9+g1y/9XZZrw+T5z76N7Jq - 9Ra56aYHFfC9XPlxuXHX/bJ6zRZ5+JGXy7oNO+Q5z32lzNOH5M23Pix33v1CBYPL7YsH9ntUwJOhr4sU - LHc75zw588xucsYZ3VKv4uwF+jBi+JvFGgp+jZcYo89nIYfp+pvMg1ngsdgY2Vh9czXG7Q2e63Wa+tx5 - i7RMPCeUtpikkmfPWdjgOUFuw3reLESxBS+V3PQxT21B024lOiA/2Y1tbhtz4ZSZE6dMjOu2kEaZl4MU - x7y1NHct2ZNO6cwcvKgnWzVvj1L9No/P5uq5TVlt06bPabLN/ZsjU6ONejYXEB8vAbNlqpYNZl6h1zO5 - rY95h4D9KdMST1UZO7nMrqDf5iuqPBmd0l4G8AW22FkG5gGAvXpdofdfH3vh4QXu3HMvsBccNkvn82YL - F62TaXpfbdl2u2xSUHTddbfpS8/LZddND8h9D7zUwN/m626Rh5/zCv29FsmGjbvsZYa/6TvvfFT/flbI - Qn0huv2O5+mLw2x9EXqRvOCFr1fQBpDcJCtXXScbFXDddPND+veyTIFQ+mJG2pj9Gust7NdvoL0Y0ls5 - ZJDe/wqeuP/5vONEfQnk/gdUzlFA6gDQFoYtY0HRdfa5yHV6z61fu1U2rrvBwODGChSis5co4G7Nqi2y - euX1xkwjwYZv3dobZJWeJyMKjDLQk8+8TGs/FHzSfjBVZYyCu8RMW5lWsfoU+FGOHTNNAfjkAABHafs2 - vOolTd8353vmO3fcLJ/73Od36wWMhD222yU5Up3dKfrr5Eh1dqfor5Mj1dmdor9OjlRnd4r+OjlSnd0p - +uvkSHV2p+ivkyNFe7EHsFWl3Bdt0Vdnb49K9aItpzq7U6wby1K9kr2kuy2WeRxUspd0t8Uyj4NK9pLu - tljmcVC0leo41dVlG4hPffLT9rWP4cNHaSN8tb6B80bO0G/qAbN5fwH89bgwDfUayFOAd64Cvu7nXaDl - BQ0ACPjDnsCgAsAKBDKvzXoBNScPHrZfYYiHN32GnVigwRw7AJl9a1jBmc0nGjZGG9LxwvwnGmB6HWiQ - p7NVjE2CT5PiAYQ8GFgVaF8X0dIm3+sDg0acrWXoRWReIYsQAIL0jjCElt7Q2ZqC4a70vWDm6VFyjkOG - jJFVa26Q66+/Qx59wetkiT5w7r3/xfrQnmfnxEPvZvYYu+059rBbseJ6+1boLbc8JLfc+pAd8/ott8m6 - 9TsUGD4g9973EgWHN+h1zDXAyRynq5QpGSo/o+vZcuqpZ8hpp51l57BkyUp9MLGKNvGKlayqVdZyJawy - 5QpW3cIq2wrcyCsrbthCfGDqLV+xRpYvT7ysKnPGvmz56opZ+aulsctV2cZXsdZh9bCz25u2Vfo7wpWs - tiVLKBMvqcrI+PmdvFxKqfbFKsPYFi9Z0dDdZvbFK2SRrXCu/NVq58RqM16pMayIVuCxOPFC5EUKfHyl - tOnJRrlw0bKqZEV1VaqtoSuoN3Z9ASBf2WypRF9oq7JV1jjzVzHzzb/UeH71cgAnG6u6lxqo76/31Hms - 0LdV+hfJmWd1k3P0JePy3n0NXL3oxW/Ue2yigTFeVu67/6Wyffs98jx9sbn++ttko4I9QMyiRWutd5ue - +7XrdujLzHNk+467FUC+0ObyMaf2ec9/tWxYd5P9jd92+/PUf6/cfe8L9e/9er0HF8jWrXfKDdvvFjZv - ZpiY+5/hZ3rGmJ7BSyD3OwBrnAKrSZNn2b3L/Q7PmsFCFV56+L3038emfSQQuHLFJgV1m21IeI0CuTWr - rpe1fEpSAd+a1dcrSFTWe3Pl8o3Km20xWeJN+jet963amUJiiz5oP6rRA0YgAHm0QQDSNE1lop5nKhnu - NR41SYEfTNwkGTF8vAFARhx4waV9cRA4WNsbFt+8+pWv0Rfx9KUQb5udo+6yl5Gdoh7L3B5lLyM7RT2W - uT3KXkZ2inosc3uUvYzsFPVY5vYoexnZKeqxzO1R9jKyU9Rjmduj7GVkp6hTNhaBRMeeUKscJV9uc70j - 50JMXX2nzuSroz2pW6KnQ77S79LKFgkTCz/YDPjljz0u06fOVJBxrQ0Nee8fQ5E+7Mt3Om3O30X05AH+ - LpJzz73QehAAfoC9BPgSCHQdv/cC8tDxoWAWkbChKw8fhoKZQ8ccJN7+AUAAL+YV0Ugy6ZwJ6DSivE3T - E8iKUesNmESPCb0yALz5BvoAhL6y0noAq9WVyGwLwzxCwCNMfeYT0bPIqlUabhp3hpviXC6Go2n4V+hD - Zf26nQoE1lpvy1J94LDqlM9QMQy9Qh8+lLYCVRmZh8zixWs0/2Q7D+YTLViw2vKsWr3NwCsT29kjDJDJ - PMLLL++rwO8MOeXUrnLa6WcpIB5i4G/9erZC0XPQso7XrducyqAbVza3ryeP8/oqpqq73utkvLZo27Sb - bd3aTbJW2fxrm3Zszq6vUX+0J1tbvS2zBdDGph7lwBazBn+SXXfZeXWmN+yrN9iWNG1sxmqv5KatYquz - Qf9dU5kz9uRbb/+eq1apbmUNe53cFuSVWvJCsIoXg0o2RjZ9nQFwetO7d9eXtnN7yFlndZdTTjldunU7 - 31528NHLd9ttz5XrNt8id9z5fP0b2CGbNt2ktkdsWgMLSAAvfJ0HsMdilTVrtsntdz5P5sxdLg88+Jj+ - u23Tv4cb5KGHXyZz56yUhx56XObMWWEvPa941d+Zj21Utt1wp7zgRa/Xf48bbJEI99kIhoc1J4u/eDmj - 15LjTptKjy6rmFltS09wetHznv805YNVyAr2bcN4gKBetwI5wByAcNWKzaYD9AB3yxavt3tzsYLZxGkK - CfOHAZRMLaGt4GWRe5n7m3YnAT5eGNPcU6aBMFQOm2xzMZl3Ol6ZdkR5GPsBjrbtYJgHCHC2YWCbCzjU - tpXavPF624eS/RS1dU6NtFJsz9tr03Mqt/t780F/SflqVwF7Uuc6ahVXV69kj7a6ep2hjuTr6DHxub+9 - OKenY746itfXilIMsX+wPaje975/1EZ4g76JDpWrFIj5Vz/YhoEFEP59XzZ6tgUf1vuXhnq7dz/fuNnz - l+wAw+4AQwCiAUF6AysAqNxcEdxbLmXIE8BpK2AZCupvq16ZLH61raT1L3OwCpEHxVjbPJp5ROPG8iH3 - mTJF387ZmsN6BxT0JU5DxMbWQ5h6A713kIdJAofqs7g0V4k5PrYP4aRZyjOtpPfB9yQEbALi2A7DhjXZ - U88eRqk3gq8R8LUA5hxOZZhajzt/3jJ9SC2XeXP02DMX6PH1XHiI8RUBPRfmCE6dMjvNtWOxiwJKekRO - V+BHD+DpXc+2BwbgZdOmrbJx4xYrnTdvZg+83e0bo5z5ot052jY5Ywu5Yyz5kTdg21TFUlYxkb3uhg3X - N2wub9iwe3zOxDbrprJxPiGncyM+5s6OY8fdzZbqcU2NHJmvTVzG6+EKYJf8G9anmCSnGI/3OlF3mzO6 - gXgFz5YnxHls1BMD6q+36Q89elyufImcccY5ctKJp8iFF/SsXnwmCHP6tlx/u+y44R7ZoOCPL+kwtMrm - ymyJw/01TUsA1zoFfrP0PuDrPHx2jXmnvPxs5TNqW++0OpP0xYrhVO4bernXKwhk4dNKfYnatv0O2Xzd - zQoSl2kcQI8effbJTC9qdl+qzCpft9HDz5Yvfu/O1vvOvxg0X8HgQoCggkCAIKuCWRC2ePFqA3bWQ6jX - gm/+3BWyYB4gb5nloD3gC0TMKeR+5P7mnLkXx2obA9D1F0LaIEYK+IqRTVUZyMKO4TaNBMYW5zKzEh8Z - gG31LN7nAVYrgvUFd/LEafLCF75UfvCDH1rb7OTtes4lcnsek8slLpHb85hcLnGJ3J7H5HKJS+T2PCaX - S1wit+cxuVziErk9j8nlEpfI7XnMn2QRyFOheIKlsrP0VPLhq/N31g49nfN5ruh3uZWNks9WfeXLX5F7 - 7r5Pxo6ZYAs/0tBvAn+XNbZ7SRs9p9W+adgXwNf93AT+DAAq2APwec8fsgHASjdgqPW8B9C/C+y9gAwF - 2ybMgE/m3ik3V/8NtLl5DAnTeNKYGgj0OYH+8FDQxsRw5gYCAHmAzGLz46qBZwI7i0EAaZH51Fwqlxmb - XR8MzCVE9knt9AjwMKSHYfnSDbJi2QYFZNfLmlX6cF231XoYGB665JIr5eyzz5PT6Lk77Qzp1v0C69mc - og/IpfowYrNjNjBeq/Wou1LzLF6kDyU99tw5iyogucx6Q7p3O9+Ggc/oeo4C4GHWqwXYa4ItAFAFgrQ0 - vbJvrsrIBhRdbmNLHP2NOPdXvkb+oNvxK3vDp9zGVpXEJlsCVe5vy55b/ZtVh01PTC6O4Vyq61z6HXIu - 50mcft8qxmxbtKzOz353Pcfqt2/WwVZxsCdOdeJv47G7/R6Vnp9bI3+wRb1NbmVA4datNwqbp195RX+5 - 7LKr5KyzuskJJ5xoK/Jttbz+3QGGAEoMlW5cq9e74QbZuF7rr1NdQd7G9TfIls03yvataXXtdSykUNum - Ddttvt0yBVzLlgKyVtvLznzNSckG7qyKB2DNZt4eQE3/5gGSfs9xDvS8LVK2e0/vt3kK7uylzVbUM58X - IKhcgUO+EMQ5z9H8bNECmITtE5J6D8NcF8dnNwDstAesHuZlj3aCUQB/weNzcvT2TWQxx7hpMmokwG+s - 9cinnru0jcu1TFPR9og5ldfA1wyRa9TOEDt25i6y1dRABYMwdW1OM+CvmmJi4E+ZVdaUTHNZsXytvP/9 - H7Avqng7Hdtsl6Fch+r8sSzJUK5Ddf5YlmQo16E6fyxLMpTrUJ0/liUZynWozh/LkgzlOlTnj2VJhnId - qvPvtg0M1J4cbTl11FeKa1UXyv17kq+Uq5Qv2ks2p5IebS5He8nmVNKjzeVoL9mcSr68hFrFQX948kn5 - yY9/Iq9/3Ru1QZwv114zSNh7zoZ+FYzZ9if2qbf0nV/m7dFTAIBjsUcDACqf60CwAQAvMHYwmACgsgFA - 3xKmlwFAPiOXvu3Jtit891OPfflVNh/uiiuvsblILMoAADJMxdAJb9fsd8dQML2AbBZtvXTaePPW7kNE - M/XhwJs8D465+iCYo7xwoT5gqt6BhcqLFq0xULd0KVvJKC9JW8qkuUGbFORtFCaVs7qQYSTmDzHB/LqN - u2yLCPYJY88xHlzMlTz+uBPk+ONPkLPOPFuvkWHvC+X007rKMcccp2Cwq7AlDHO8tly307alsK9U6AN1 - zWo2mqWHYrUBwtV6PHpcWB3JEN2ZZ3a3h4gBQAUfACMDEcbNHioHEQ5a6MVKIKACDA5UzN82NgKGNuzg - w3M1cgI0gkyeSm76y7YkV+ccfM6bDfCpn/wV+Gvjz3Rn+12qEn03UNe4fvVXx7ZjERdsMUd+XSlnM2/j - 94PVh9/iNZf/xik21dvtnCqO1+QxXrdUx+KxKxdz6nVxbTC9nLt23WEbIQ8dPNpWszMPkCFg7jG2SwHE - AfC2bblZ7rj1QXngvufLg/c/38oH7n2u3H/Pc7V8ntyy624FeutkxLDxctUV10qfy/saIGJzbV6KAIjX - bdqhoHGbgULuF8p1a+AtskGBpdlVbmzgvn6H+ddwr+l9xzw+tndiWJZePV6+EqBTADen6rEDTFYA0F7w - YLX5XODUs890jwT2Euijp32O9ezBrFRm7i69fLQlY5QZ5mYYmmFeXjYT8FOAp21kmg+szNY21VSVvn2r - Epv6YGLY3oo2i10GEihsgsPE2BMAhHnBGzd2stx9533y7X//jk3PiZS346V2HTnqraguT6yPHPVWVJcn - 1keOeiuqyxPrI0e9FdXlifWRo96K6vLE+shRb0V1eWJ95Kg7NT4FV0d5kpzcVoprr24rai/+j53vr4H8 - Nyj9Frmt7vfiW57/8s//al/8GDpkhPRjb64r2IuLFahX2Ofe2PaF4d+LLlLw14N9/tIQblrdWwG9CgA6 - 4HOg1+Cq58/Ztoxh9bAyw1B8Go4Vwb0uYb89FpwkIMiWEIBAhoMBgCyAAAQaAByUhlfYa47tLRi+oiFn - Hh+NO8O5NjxkPQ9peGghw0IKrtJw1gYbnmLCNw8bmJ3+bTNpAJ4+iHggsT3E+nU32EMqMt8eZksJHpjs - KcYmtF27niVHH3WUXl8PGTF8tJ7DPOFTagsXrJA5+jDi7f5MBYVHHXW0bZ49Ux9K69fSk6RAUB+4GzTv - yhV6XkvW2rlct+lG+/wbPRD8Tmee1V34kgBzvJivt3rVeptD5nPomAvGXDSfd7dKfeg2N0/1NavprVQ/ - 8/CIqWTm86W5drvP0fPhw3WF+X3uIw5/nD9ofj1HG+qkPr6KmVe4foPWhRv5UzyyDWe6r4qzIU0vsRNv - sdibw50eZ8chXoExNmeGidvqaRgXkGVD2HAYDrY4PUas4/EALI9haNXtkW0IuaGn+N1kcmY2B3CNmMpW - kk0HwCpYbZ5DWz/M73PLLXfL/fc9qvfKTH2BGidXXXWtXHrJFQpQBss99zxfdu28R26+8R656/aH5fnP - eak89uJXy+Mve6286uWvl1c9/np50QseV5B2nS0IO05fdI7Vl5qTTjzZ+Nhjj5ejjj7a7oOxoydbb6Ft - vLz1VuXb5Iatt6QvcyjvuOEO2WVf57hTdmy/wzZnvoHNmelR3LBTQegO/fvcJqzQ5aULsAkQ5MWN+4n7 - mXub3j/r5bdyQRPo8QLId3pNZkrHPJkyabZN5+BzdIwY2Bdoxk6zBSajq1W69PTZ/opDx9gL5hB90aTH - DgDHimnb7L1vcx9DtmWyF1W+YFJNWWEeMyMXV2lcY/SiarsAkFZWwDD1IlIqAKwWv9BOzJk1X/7urX/f - 2Bw6EnpdG+++yCV7pDqblzmX7JHqbF7mXLJHqrN5mXPJHqnO5mXOJXukOpuXOZfskepsXubs9qf0JZA/ - FsWTcYonF8uOUGfy5XFPlZ5J+epy5seMcdH25B+elG9969/l4YeeIxPGTdK3WW3Uqrl/BgAZklWmob/Y - 5v4B2BIAtCFg5QToFAQyzHuu9+4lkGcbQLPgw+WqTqP3j95E9hBUYMNq4CYI5HgKOg0IsiHylXo+FRDU - BrafvmnTaDJ8wlwaGmtW8NqK4ImzbO4eDwOb4zc7fS6OXgO+Xbt08TpZsXxDxQr6VjL8uqXaLkIfmPrg - oUcPYLcZ3rRLrrsufVt4A0CQie1rrjdwtkrrMrGcXjseRF27KrA74kgDy+z1Zp8ZY1hpYpo/OJ39ymYt - VDA3Xk4/vascduhhcrGCQB5Yy5etk1X6kFuxnAnpqxT0rbHc1ykwZBUjPRuXKDhmSJl5kKwAZaXr7Nnz - Zc6cBQpq06pUtkCZN29RY0XrzJlzbQUosaw+nT17ntVlNeyCBQyXpbqsuJ1vW8Yssnqstp07b6Hallhd - VuDOmTPf6i5nxa7GzJ2z0HLyjV9ysFWM5Vq+xuLIR12GsxYsXGpMXVYMz5+3WGOWyspV60xfoLGLFi2z - Vcecy0I9Z86DRQvkIHaZngP6kiXM7+I81qiejs2qWV/1zDktXtzU8ZMDMMxqZupTF7BMyXGIM7+eH7ov - qkgrkbXuKr5VzMvCajsP/OSn/grNCQhP+motFbxXizPQHZS7nhaI0KOsdfS4gHLi+S1WKdtiEnTNRx1k - bPjXrEmy6ep3H/kasi1MQVZmkUxYKMM13XjjbfLQgy/Uv5Wl+nfJlyxm6++9SoHPaHnB8x6Xe+96RO65 - 82G5R8tHn/uYPP7Y6xT4vUFe9zdvlpe+6NU2LeLUU7vKCcefKH0V6ACuFjE9YvZymTppjr6YDZOzzjpL - Dj+si7Ydl9vf9fZtt8mNfI5te9po+Wa+y8sn1+xrG3x+7W4FnncbKGQzZuLZq28DL156X9oLmuZhygUv - bUsXrbOhYqZlpPl7AEF6+lLvHm0AgM/m8jJfd7Leh2zUrG3EBAV9AD9AHws5WJiRFm4wR4/5eQr4bLh2 - uAwYSA9d9Z1ievXYGso2sa62h4KZrtLgtF0UbHsq0p5qDKCwr9ahhzC9yDKdJQLCtIF2WuyWvjc+csRY - /T12yec+0/FtYaA6GYqxuc8pxkB1MhRjc59TjIHqZCjG5j6nGAPVyVCMzX1OMQaqk6EYm/ucYgxUJ0Mx - Nvc5xRioToZ2GwL2ynmgU/TVxUTKY1rl/WNSq3ydOQdsznX0TMpXJzu1iv3Fz38hb37TW2T+nEUyoP8g - baRorGi80vDv5ZcBvqrFH2HD5/RNX0BcsxeQFb8APwCebQZtPgd86An0RQCYegHTMHDPiwB/rDSu5gFe - njaC5XzYCJbGMzWWNJB8wYC5M5TV/oDDxtoEbVYEsxCksQ2MAjOfV8R8JCZ/sxI39fKlnj4eMoA+Nnzd - cv0t9vDZtu0W2br1ZuVb1JY2g6VHYuXKTQoQ1iioWCPz5uiDZ2YabrpQQWyXLl1sjiSr/IaznczIcTJy - dPruLhvy2rCSPnD4bBVfWDheH6D0BPIwYeFKmh/FnCYFsNPTvoZL9Vg89HhA8xWW7t0usIfJpMnTbZ84 - NnSerMxecJRs0Gz61LRf3KRJ7JU4w2RiqDdlCvpM48mVnPaUS/q0aQqip/O5vcqnMnvYTba6CmRnsLdd - 8hM7Q/Xppqc8M2bwTVwW4yQfe+6Rm3OaoYAU3Y/Jvn6ma15ypf36mL9J3bn6YGfVtj7MK1/S2TNvlj7w - VVdQyrGnaW72Hpyjfqur58vegrMU4OInB3sXcrzp6gMoA1gp8c/WOPY95BjT9bzwAYZnVsf2/RTJw/Ft - D0XNhzxLQTVA2XVANfqcuQw7zrZ6gN856ifXfAXegHLOl/P0bVs4F67JtnfReLtezeXg2Y6r5wTAJX46 - 56W50DkedYlLfv7umccHGGa7GkoFypp786Yb5C4FeIsWMo9VQaH+TT/0wAts/u9D9z8qt998v9x1+0Ny - O8O/9z4qL3juy+QlL3ilvPgFr7DeaBaMnHLqafbNbsAdwGyx5po/V8EYc+8UjE3Tv+de+tJ44AEH2bSR - JUtWy5brbpQbtug9pcw9tlPBnn2Ldwel6tsV/KmNL2/wJY5t199qGzNbjzv36qr0eUcbGtZ7gvsZAGjz - B1lwVfUApl6/BAJZUEV7wLw+RgfGsWcfW7LQ06fAD9CXAJ/Py6Nd4SspzOdjqDcN99KLl3r92B0h9fjZ - d8ON0/6ggD6Teyc2MKggEJBouxswlYVeQcCg9QrymUjvGfStr6peQAWBbA7Nd5kfe8nj8uMf/bjYllNG - 2UuXnXI9p1Ldks0p13Mq1S3ZnHI9p1Ldks0p13Mq1S3ZnHI9p1Ldks0p13Mq1S3ZnFz/o/cAdjRfPKlY - p1S/VRxlZLc5RbmjFHP9Mejpli/Wj3la2Z544jfysY993LYcGDZ4pAKs/uKfXEoAkM+Q8SWKtPWLf+u3 - CQIBdQzltgV71jtovYQJ7PFFEAN66jcG8IWFH/T40fMHAKQnMG0pc4Gcc865Njmd4VJKFkH0vOhSa1hp - MGmwWfxBr1/aDBpQoUDDGvu0GhgbQJAeCx5cDCH5VwL4VjA9C5s37rQd/7cp8OPB4w+fHdtvl+03KBBU - AMhXAdavv8F6/Bh+YjiZISd6+PjqxMCBI+Woo4+Rbt3Olau18WayN+DUNq/m+6n6gBk8eHTzQaPMcFP/ - a4bIEV2OlDPPOEf41ioAscH6cGVoit4Ln8PEptD8hpcqSGbIiKHgAQOHJmYSua0m5EsJqRwwkJ4EdAXK - gxJoHkSpTDl48HAZlDE2s2vuhj4Ene/C6rUMgVndyCKcioeONB5qzLxM5WGBVR82jAU7fMIsyfZJthFs - q8MQvuoq5/oI++Sc2keqDNvn55RHJh6ptpGjAP7jZBRgGxtyxa6PHj1edT6Tp/bRTZ2ywWMomUuqrEBo - jDIxYyobOvbRYyfKWHjcpFSa3NTHaWk8lpIvimg5frLyJP1b5Usk9FSrriV2849LXy9JNr5yM1V5isWP - 13LCxKkK7PkyitZ13b6cwpcwVJ6UvsxCHZcT8FdWkJ44AXBeGBYsXC6bNu3Ql4uNct11d8jWbTfJK17+ - evu02q6dd9rcPT6fxlAsw7e33HSP3HXbwzY9oXv3C+TY447Tv6Ghdh+wipY9+NLCDAVgCr5YhJXm4c6x - tuKgAw+wnnwWNDGnlgVPzDHk3gPgNT/RdovdbxybqQ98kWPjuu2yRu+7NC+QPfuYqrHRXuR8KNgXZrGZ - NKvuOQ+2bbGV+noOrEpm303up9TjN9aGdQ3s6f3B5xv5vJxv/A5ASyAtlUw/ieDNASAArzfTZeAKAJqN - RWwAQAeBle9KlW3I2IaH01CxbXNlIDD1CDZ6AfunbWHYHHrNqg3yT+//oPz6V78utuk5ldp7qKN1ctqb - L9EzIZ/1ACLkCXIdKtmgvH6uQ630ki/3l2KcSvGRcn8r8tjIe0JPx3yxTi677jLMpOJvfuOb8sD9D9lb - vw/9pm/+0lglAHjpZb0LALAaBjZgFwBgxXF42HQFf8RTL30uji8OXChnnHG2nHTSqXLMMcfL4YcfKQcf - dKgccMBBst+z95d993227LPPPrvxvvvuK89+9rNl//0O0IfKQdbjdsIJJ8lZZ3fXc73CegEBffTOMbS7 - kg1dFfTZdhAKANkMlmFfehTsU1CbFPxdt0tBHw8eBX/0/G251R56gEK+E8rcv1X6wFq2bL3mWW29DL4R - LN9kZcjowgsv0fM4QR8gzP1JwzzWsGujbr0H+mBhDhCTwtP3hq+xlYKz9QF6wXkXybFHHyd8ZQVgSy+A - TxJPi1zS/oOUNh+zF1t36L9DBaDZQodeR9uXsbK7fCFD9sr4L7IhfD6/p7LVSfVMZnU3jKxMXlvxrf/m - F+u/PdyzV4rpWel8ms4APF+FuaR3BeZZyMM3ounJ7W2y6Zy37SPJIh/kPlYH5qsn/Nths43GVY5Mb3Bk - VojD9pWUy/XvVP9eTVdfb1at88Ua4vgbrh681itTycb0clvPDA/vpPtwnduv4As4xtj04c39of9uvk/l - VayUR1dOD/OM+8LMAUulzRuDka/W+43eJLOnz5zhA4DYHDNlHyZMXMnX4Nc4la+5Bj2V1lOlZf/+gxTM - JGY+37W2ujS9ABiYN/A+QoHtBFv4sGjxBrn1lufKdn3Zeewlr7G/v+XL1toCpEULV8iSxatsJa8NuSrg - ojesyxFH2Mvf+HFT7YUrDbPSg5u2d/FFWKyeZRoEvfInnXSydDn8CAM0vJDRQ7h4wUpZoXnZnJlFIBsq - QMh9yWfb+EoHPfMAQFtEogBw1XKNtS926H28dIPdj+zVR0kvIIAU8MewL+fDeaQ9PScriJ9kizlsbp/e - T0P0pcRYX2bYsmWQvsTxImcLPfT34rfjd0ygcEACgczxUwbcsWep9fQB+PhbM9B3lYE+sys3/t4qTi/Y - 6W8KIEhvIl87of3l3zgBwAQC6QUcSC/gwOEyQV8Q7r37Afn6V78uv//97xttOhTb9Tq7607RFmOgaKuz - u+4UbTEGirY6u+tO0RZjoGirs7vuFG0xBoq2OrvrTtEWY6Boq7O77hRtMQaKtjq769BuANBLp1yPFH11 - cqQ8xtkpr5f7oTy+xE5RhqK/roRiHFQXG+PqSijGQXWxMa6uhGIcVBcb47yEotwesbv8j3/8Y3nNq18n - s2fOS0O/1iBVALBqyC6rvvzBCmDm/zEEHAGgz+27wNmGf8M8P/xaMhfwrLO72ZDRMcccK4cecpjsv/8B - CuieLc961j7Kz6p4X7PtC++7n4HAffdRwGfyvibDxOyzz36yz7P2szrN+s8ykHjwwQcrGDvZQNJwbej5 - 8gGLNOhRSKsMt9s3QB0AsvKW3ofrFeyhE8enomy+nzI9hYA/VgrzcOGhwgbRgDK2fuDTdWzxcm73C+zh - 0atXHwMmBmBsDiObaPNh+ybTk0fP5/x5q/QBNEaO6HKE/U49FUyl3zzNe4TpaWAVNN9M7tWzt32Sjr0U - u55xlk20p4cURj/99DPttz5DdeTTu54p53TrbmAbmZhzznFd6551TtKr+tQ9U7mr+uGz1YetK/lUZ4U3 - vbGnc+wztW63cy0HsdQ7p9t55if/2eecazpfmOATdsQ29XMsl+kqY2MVeTfqK5g/Wxnd8qlMycrysyud - 1dDo2DkOcjfynVPp+m/RXV8yiMfGsdzPMXzluudldbr5lV2Psm9tBKev3fRo+io2vbJ5LPJ5lT/NlWUu - LKvnNQe62tGbvuz+qe6hVuy97U1O+3PC9tLFC4HeuwB6B+tpdX1/BU8b5P77H5NVK7foi9Ct+nJxmfAV - kLQiNn13eYL1JM6y1bBn6b/jiSecaCB2pOpjx6Qvc4znc2ej+RzaZJvqwOfaWDzB9Iyh+vd9lf79cl/y - ew9XAEbuqfoSxXCt75vJVjDcZ/TO09O3bjUrhG8wpreQObosCNmwVu/JFWmFMCuNbVHIglXWC2lbwiiz - XyAbRvs3v/lGL4s7GNrlRQyQxteMeAHi38D/jngxtd+0h/52+uLE/Fx2P+B3474FAPa9Mg0D21CwgkLm - JnM/OwBM7KCv2ftnLxjKfNvY2loAYDW1pTEcDLBXbgLAwbYn63AFqgvmLrY2+yc/aX4hpD3Knxs5d5a8 - Tp7HubPkdfI8zp0lr5Pnce4seZ08j3NnyevkeZw7S14n5mgzB9ADoCjn1F5cbkNvlQ/ymBjncsnmlOtO - 2J2dSnJuq9NzOZZQna1Oz+VYQnW2Oj2XYwmV5FjW2X71q1/JBz/wIQU3m7RxHi5X00tBTwe9IDRW2oDx - 2bfLbPi3t/X2JPCX5gA2e//g1APoQNABIA/frmeeJcefcJIcdlgX2W+/Ayqw1mQDegbmAvBr6DC9fklu - ADwFjMZqa8ZrqWARoPhsA41NUEnsIYccYiCGIUy2aGGjWnr4rt9cDTMp+KOnb+NGPgwPQLxBeZusWbPF - egv5ksD8+Sye4DNQ8+xhQm/c1dcMFjappmfpxJNOtt+HuX88gG2+pOrMC7zgQvZNvNR6CWFf8HLuuRfJ - VH1Q8bmtww493ICYAQX97XzTbMDGRRrPgxygBDBk1SDg4fgTT9bf92Q54cST7Hc+7ngtlTkX14/T8sST - T7U4fCewUvOkU7U8paqLfoqV1DlRZRgZPknruo98J59ymtW3Y2l9dOKPO/5EOVHjTql08uMD9Kd8KZat - RpL/ZNsK55RTTzcZGyDa83HOp6rf9ZO1HvGcz4maGx8AF/9JJ2vd088wPvFkjT/xVAO7p6mfc6VOV9PV - r7k4hzMUwJLjRPVzXH5bzsV0rQeoTblPS8DY9NONDbAqI5+qdfGRj1hy8rfG8U/S+hwT4Etu/ORGpy5f - dQF4M9WBBRXU5bhna/1TVEY/+5xulp/jnGq5uuv5pOvGD+AkJ/kA9IBaSuoDxFmVb+BdbcQCKM86+1zN - e54Czp6yYP5aeeihV1jPHb173bp1a/RE2lZLytey350yvVb8G/PSgZ9eMr5mYVMbBinYGzBCBlw7PL0U - 9Ruk7Ur6ZCJACUB4zLHHav2TrMeL6QV8UcdW7U9IAJOFJPTgMaeP7/kumr9allfbMLGp9LKlG/VlTO9J - LRcvXGOLufhqB8O/1LMtnrScO3eF3qcL7CUNIMVXi7qefpYce+wJ1hYdcMCB8mwbZdCXyEZbQxuj7Yq+ - aHrb8uxn7yf7wfvtby+sBx50sNVnG6dTTulqLxPcx8xVZuUv8/xSz2ACgBEEOvhLAJBhYBaFAAD54lEC - gAkEpp7e/vpSaSuCmeahPETbrjEKuDdtuF7b7g9rG56GguvY23unkhzLXM7ZfU4lOZa5nLP7nEpyLHM5 - Z/c5leRY5nLO7nMqybHM5Zzd51SSY5nLObvPKcq7AcC6wDrymFjX5WjbU4q5/xj015yvIzmJefL3T8rX - vvY1eeC+B/WtfaL0Z7jpKm2MAIC8pdpQBkNrCgAZprNhvjQU6ODPAWACe6nXgkUg9LKcoQ9GgMmhhx1h - DeezDIwlTj13OchTVjDYlhPISz16+8oB2vgC8FKO5APkNQCg1jFQiY2eQoaJrdcwcexlZL4dPXV8j5Mh - LVb0btqwQzZu2C7rbHXvNuvx44GzZMk6BYyrbW4R4I+h5YkT+fD7RH3ojbTGmh46hi6PPe54BX2XGgAE - nDHs3ewp6mEbQCe+UB+y/FYKkM84R0aNnqQP0VEGAAEpqeftrIrPtp40e2Cf3V1OViDDA4R5aWydc7Q+ - iJyPOjryscbJx5YcyXb0McmG7j6vn7iqg1/5mGOT/yjsbO1hssfiy+tXrLHUTXycbQvCML/5qryeG27q - qTz2uBM0R5WHLUaUj9GHt8VVMYnxnWgxbrNjVUy+VLdpS3VSPkr4uOPhE1MuO47rqb6x6smWfNRBtlit - 57r7iScfMuDXfdgB0/gafr1fLKfq+JjS4D7APDpbrSQ9gXOLV+ZvghJwYwBddfcn4Hxayq82gK+BbI05 - 2YDtOTJv3mp54MGX298gQLJr1zPsbwtg06PHpbYoqyfc83IFkBfpv9+xthm5gRoFLzYETg/1Ff2VFQT1 - 0Rei3v2sh5EFS4Ager+ZmnGygmv+fehJA/wwdE2POatvR41MWzgxn5e5u7ax88y0ih+Al/bqZBrH2mrl - 7yr1pZW/LPCiZLU9vY70wPPFnC7aBtF20IakNkDbln28XdjfQCC837MP0LbqQOP99z/Ippc4O/iDkRNo - TO0OjP1QBYW8XPE5PV4CuW6fB2i/genaripHAGhzCo2ZB8g0gPS1I1sQUg3x204HCgAHDRwqw4aMkqmT - Z2rb/bB86Ytfsc/Eldr93NYR3W25D+pI/Ujobst9UEfqR0J3W+6DOlI/Errbch/UkfqR0N2W+6CO1I+E - 7rbcB7VXv823gGMJlSrntvaolLeOOpsbalVnb77dKY9BL9Vj2OCnP/2pvPnNb9U37CXasAy2L370tcaI - oQrmr2hDxeIP5mVdknr/DPz1ZE5ZNbRUgT/b+kXBTrfu51lvxFFHHWNz+GggG2CteqN+VsVN0JeAXBvZ - uKkD5I444gjroeJhnoaNU500FAzYoyGuAKA18JET4PQ4egcdDPJgOFUfiFf3HWBzmBYtXJP2A1xOT0Oa - 68eq2/QptyXCNi2TJs0Svv/L0C87+zNPix45QPIxFQCkRyQNSZ5vQ5Uw+/adcaYyQ6Pwmd3MRq8OPSOs - aj7ssMOrXqLUY5U49UDx2/Lg5uFJzwCf32JY6qijFOgpJ2CVZAd+lEfqv4eDwSMrX+Lkj0xsjDd2QOj5 - gi/P7aDR8hwNq89yJn86frI3uHTMBqe6ZV/bui635WTP/UcdxbU0rx/Qy3W6buC4quPXDTfqN+Ka7NfT - sHHeFbet17a+/Zspm79xrc345vGb9ZrXFa/J6ya2f4vqmjxXkyvArbnpSZ0zZ5U8+ODj0u/qIdKly1EK - ArtabxlD9mmoPv39ItMDe9SRR8s5+kICqLvoIkYG0gKuHjaflGkiaU4qw6cX6Auj6fq3yrdwAZ3H6PGZ - +gAIBAxZT6LNdQUIpu/pMmeQYWi+wsEQLsywbtrihc8uLhS+8MG2SBMnzbR6LA4DKB904CGpbaD90BLA - 1gB5ViroawP+km//NrLHpt4/q6OyxQMGDzjA2g8YG+2Lt3f773+g/nscoy9u51ivPdM5bDeFiuNQMMA5 - zQP0755Xw8BVL6ANBVc9gcydHKJgeeTwMbaq+zV/83r50Q9/bG16q/a/9BxwauWLtDdfmZ6u+dpdBFKq - FONL/lbU2ficnupxcyrlKeXEltvr4mIJ1cXl9rq4WEJ1cbm9Ls7J5byEkGE2fP7UJz8tu268RUaNGCvX - aEPDyl96/+yzb715W03g77JLL5dLFfyxjUNPG/pl8Qbz/qrevvMusGEkQIwBP317ptFNIMx7+FKjCFtP - oDXMiRMQA+ilxnqffeihQ09MD16XI4/U/KdXw2EKgI47wYZvmvU4RuDK3gSa1Xmo3Rvo1DvYjN9fG/gT - 9O39skuvtAfPdLZesWGkZVryRQG26VggfJd0wsTpMmLkBGF/MDZwZUjMFkvoA4+HKl8ywUcvKL+NAb+z - zrG5cvTmndb1LGO+6UvPHsN2LPJgJeChhx4qDOXS62S9OyekHh56hejJscUy+gAfPmy0LFm4ynpW/AFv - PT4a50CAIVV6jPzhz4Oe80OmxE8Pm+vUB2wQ7z1NMTe/O//GKddJ1guHD5BxvOoGVPTYlNT1XABWq6tx - ACRkeusc/BHL9ZIX0IIOMMGHjXjPRUk+OxbxWvo1WSzHqvQjFKTgi7noTfS6MP48l+uNuiGWnkzPhQ9b - Qw91k191vR4Hvu6L8R7b6JX189R6TV8A3+4POpzqE49f9apuM959yW5sx+M3O0FmzFhqcwD79Rts27Vw - r51wAtMAqpcQLW1Y/WR6HvXf7sijpJv+bQPsmGd57rmpl9vL86r5jD7n8cILAIKX6EvTBDn5JADgsTY1 - ogkCr7ahTxY/sOiJT6SxYpx5gizaYKEJizjsax0K9tJXO2YKX+igl40Xo0MOOdzaC17w6LU7gN47A3EJ - yDl4M6568ZpTRtSmvJ8BRX2ZVLZ4/Np+NGNSyVSW/fen3D/1EJKz8lveql3ZR+szZMzfJL33vERzvfaS - bSAwAcHGUHAbEKgAMGwNkwBgWgwybMhI/U2myNYtO+XDH/pnm87Tqs13uRV5bB4X9ejP43Ly2Dwu6tGf - x+XksXlc1KM/j8vJY/O4qEd/HpeTx+ZxUY/+PC4nj83joh79eVxjCBjKnR2hmDyn6GsVl1NH4jxfR/J2 - NJ9TLrfS6yiv45TXz/U6yus45fVzvbNEXd4Uv/e978vjL3+lzJox1xoVGhwaHoYkbO8/hn57N3v/mBDO - /JmL9E0+gb/06Td6/E7rqsBPG3N6/Hw4hEZ1n2fBNIKJHeilIdgA3Bq+qsGsACBxNMRH6kP85FPTnCt6 - xmDmQLFvXupl1HrW2FYM0KzyNXPuDgA5TirpHeCck/8AfXMHKLFgY/iI8TJZAR9DvuwjxpYWPHT4RBRD - WawYZJ4TE7htUv3Fva2h56HGPmIslmDY9owz0mKK06r5aManJWYeFcNzg4aMsofgoYcepg9YwJM+mPUB - 7aADsAG4AyixgIavF2zauN0eEv5AN2ClD3PXDUhpfQcBAD7yIAMgDPAZoElgxAGf1dVcMACB+pwT+R1w - 8KUHB1acD4DQgRe5mrkVAGq9CC75t4ORAWnMJyO/nxdAl3M58qijzYaf3J4L3a+LIVcDsp5bZXTqoSPT - I4RsuVW3PRer87TfJMtN3BGW+0QDPt7LxjWcdPLJJgMK0anvuZH9N/Rj+XkDPJmj6OcJ6GIIlliYesQ7 - AETnRcByKbOYKf0myc9vxL+16ydrbq7D4u3fIx7r+MZ1kd9+//DvQW/gpElz5Y47nq9/T4PsHuCFCwB7 - rDJ/B+RIuoJR/Zs44ogjDfgB4myxjoJBFlCwKOcc4zTVwRbhKDOflc/MDRs6rgKAx9gcWVaop4UVabiU - eYLMQUybuysQZGh42BgZqfciWz3xcsZemiziuOhCfeHS89lvvzSHD+DlQ7XWc1cBsyb4g9FTj521U7QL - yoA57j3am+P0HmO1MozM/pz0zB9wQJqCQjtjbQYgEUBoOQGGFatsQNLaFR9t2MfOw3pX9b7nRZqewGYv - YBMEtukFrHoAbVWwMqM19AIO1t9lhP4uM6fPk+c/94XyjW9801YF57Snz4yc9ubbM/q/zNcGADrFCu2d - SIyL9aD26kKxfk65Dd25jtxXiin5kOvquK8UU7JBdXbIfaWYkg2qs0PuK8WUbFCd7ISNN8UP/NOHZPOm - LTJ82CgbZqD3j138rfcvzP2zbTnYooPeLRYysKqQOW36Rs8kdR4MBx98SNtGsQG22rI3gj4Hz3oDG7bE - BtZg9dGg0vB6zx8T5b1kojxv/AAieisax7HGPIE6A32NfJyXnl/DDzvQJCbFp4Uj6ToOOfhQO0afPlfb - sBVfC2CFIws/6JEYPmKczf8DAPLQTFuaXGEgAiBIDyAA8Ex9ONITSO8fAJAeTO/JJL8vEgAA8gA8/HC2 - s1EQcaQ+mOnB0gc6Dzke1oAGwBbMIhQ2z2XYjIe49TJprPdWee8aw7CmW0ziqCM7t+uPcvQhZ7HOeR7X - Yw+Vy84GVDI9j2n44Or3MR0QhFzZ3O7nAEgyW6W73+VcT4A6nbMBca1v16B+/l0cdMGe24/Fv5flQ9cS - sIrdrll1QFisCzDz62QqwbHE678r9X1uYcqdwGk8VgPgqUwJ6HU/4A0w6Tp107FV13h4zJhpsmPHvXrf - 9zVAxX3H36D9/ZFT6yXWeP27BACyQImFTExnOOscQCCLSpinem4DFDoAhOkdZKU7AJA8PS5kLnHamoht - gVgxz9YqrIal58vAj/UIshHySOVReq8N1jbo4gr4KSDbJ20HtZ8COHr1nq3nbkO2yjZ/j94/77kzIJhk - B34HHXSw5WIxDz34V17R3wAXm7PDHB9Qyn6b7O3JN71ZxWwvjNaOAPJSXhtmVubYjZfhir1NpL0h7vDD - j7AXQbZjYo7gbgDQFoIAAJkLCIcFIfQEDhwmQ7X9GauAeN3qjfKOt79Lfvazn1kbT9Nf1/5HdnI5LyPV - 2SI7uZyXkepskZ1czstIdbbITi7nZaQ6W2Qnl/MyUp0tspPLeRmpzha5uAo4ylDu8zK3R9nLaIdyvbO0 - J3VL9NeUz3OVcmKDeUPkc2/Pe94LZMrk6dqQDEpz/7TRYRUaPYCNhR+XsW0JX/5gbg/zei6xvftYQchc - NBowGj0atkYDFzj1vnmj5+xgL4HABmtD2vQp+NOGnIeer4gELKVSgZ82mklPDAg98MCD9Zh+DjTK1TnF - 4zaAX+L8mPsqAxYdAKYHy376oDvKHl4Mw7B9xOjRU2xVId8cNgCoDyf2cWOrl0suvdIe+uzPxwOLXj8e - hsz18x5ArsFAbON6WLF6qgwZOsZWDx7ehYnkJ8qRRxzdAIA2l0v5OAAFD2QFgLz579pxlwwcMFwfyBWo - 0geZA4oI1kzHn+nRH7lUt2Q3Vp/5a/Lh8yHQJFfxeWwrn3K0kyvaGz4ADrbK1+b3qOJascf5ELrlquwx - R/QBhtxex23iC748dxs9/G7RR89pG1v1N9Co2zgv1auYyOYD2Bq4PVZfaCbL5s23ysW9+hiIAgDa3+AR - nEMF/vQYDgC7dDnSNmRnQZjPE2TxA2xzBlnFrGAwbaviW/BcqPfMGAWrp9rxAX8wOWhnfG9H9l5Mmy6n - xREMDbO45IILetlLH8DO70+mbgBYHfwZGwBkaFa5AnzeM8dLHvc/dehh5vyYv8txeve+Wu/jq6z3n+8h - U16mOnZAoG0boy9pLOriHqVHsNHeaH4WlqRjVwCwMQpC21K1hxpLW0WbQ2wXBdKAT66fvSavZCEeIFCv - vwwAEwi0r4MoQB0+dLQtCLn7znvl85/7gjzxRFoQUnoOOEWfy63iob35mvRMybfbl0BaJY++urj29Eh1 - OTpCpTp7kg9qlfOp0NMxH/GRI6H/4he/kH/4h/fK2jXrZeiQEdqoaKNWAUAawLRiLQHAywE0tu9ftfij - x8XpDfiEE+Ug6/VrvkUnsJUAlNkq4OX+OgC4D8xQbCNe3+T1jZ2HHr1jaciUXrKz0rCpMkOm6Myfo/cM - pjE+0HsC7Xz8uG1BnjPnmWSNqeIM/ME03FyP5UnlgQceZBPXeSAwVw/wx/YvzFPiixts4sumw2wIS+8K - PaYMXdHzx9YePBBtPz49b0Cr9QB6T6ZeH4tbhg4bZ18RYHPdE44/wR6+PHS9BxBmOMqGho89TmbPWmAA - kE/hMVzJb2arRKmLrvXi8CY6x3GdfPhjLxG/o4MD5DY6uRVso3tuH95E9yFFZMrYQ8UxvS66DSnSm1Xp - HAcbsvlVj+dNrOfmvNE9F3EwuvlV9p4y8iN7vPv9vAxMV3VNV3udDvuq5oYOc14aa7rKntt1Sgdgrjtz - LS43clW62Wp0z+/sem5PXNna5GrK1AEADhs+UdZv2CU9LrrMXsDYtufILryEaH0DfhqnwA8Z8OcAEACX - FjPBTQBo81+tFzD1CtrwcPfzZeDA0fp3eor+ZkfbQjLmBrK9EcPAtgG4tjsJCKaNlSkZZj755NPl4INY - 2JGGXRlitR43AJeCueYwr/oNhCXw54s6EghM4C/dz6fIBRddLL30mEzZsK2aAKRstaQvvINGT5Kr9N5i - xIPfBH9PLVn0ckWfa6y3ku11GDaObVzqAdTjqQ17atsiAGy2ke4DSPL3z8s1w8JpZTBzIq9RAMi8SACg - Ar8KALIlj30dRM9viL6EjhoxTpYsWiGvf+0b5Yc//JE8mS0Iic8Dl6PuZW6D3F6yRTnqXuY2yO0lW5Sj - 7mVug9xeskU56l7mNsjtJVuUo+5lboPcXrJFOepe5jbI7SVblGEDgCVHpGiPfi/rKMZGqrPnVFc3p6eS - z+U6W7Tn1F5dp2iL9pzaq+sUbdGeU13d3N7wUyr//ne/l69++avy0IMPy6SJU6vev+prBNrQsCkpk5Kb - PYC+8fNltuqXPciO1ocJq9vaDPUqmxwbOZNp6FKZwJYz4C/JjcbQOOU88ICDDQAwh8nmcymwYHiLyejM - e0IGyNCLAAiBARCHHKINsR6bHE0AmNjPqXHcinlDJ76NLdT1c0LnocIDkMnt/a4ZLIOHjLaVvqwCZvUu - Qzj04AGQ2SwbAMiDMG1onHpEHMg2ejQNAJ5p4HL48An2wGMj6OMBMPrwpbfFh+Dg4xR8AAL4DRYuWG7f - TaUH0h78GmtAimHD6uHeAICVzu9nIELjKdsME+oxqe86MhxzGYgDCChHMOnn5DqlHdtzkyscy/7NVHcA - SF3TVfbzpA66naf6HcRRomOnF4y/FbuOKhd5yIcMMPbcds1ch8rkxsd54gfIkstyV78R9cnNdfpvQB4W - RPh58vuQz3Vk6vB34ucdf5PG76+x6D4H0I6lx2ZeJXojd9TJrTGNY3He6JWf8/TzpvRj4edY3Evu5/o5 - T+rRC2Y9gMMnKQC80YBOAoCpB9B7/gB+3ivdRf9G6bmiZ5xveQP20ir3qiewkun9jgAQwDjg2pH6O+m5 - aVtyvn0pqKet3GUxycW9/OswTD+50nR6F5k3x/3Hvfhsetn2bTvcCifwBwcAGOYA2jQVbW8Yvj1dX7p4 - qeVrNufbdlZ8Kafa31S5z7VD5cbH/1YW77xLQSpf1Emrm+mp7FHt33nJJSzk6GefY+T3SG0G7Vk6R29H - vE1MbVGznXG7xeh52bQTbcNoE9hxwQCgvpi3+TIIXwai969i9gVkmHqYtkUTx03VF8Jb5KP/+jH59a+b - ewM6RRlqzw95TGSnKEPt+SGPiewUZag9P+QxkZ2iDLXnhzwmslOUofb8kMdEdooy1J4f8pjITlGG0Itz - AEuUJ2qVuESlmLp6ub2kuy2XS1SyR1vur8vjhL9Vnad7vt2IeH0j/NlPfyZv//t3yMrlq2Xo4BG28tcA - oK3+Zf+u9OWPfPiXSdr0svH5pmZD6g1X4t0buybY2h3wqVxxqqv5yFmBSoaVD9I3fbZxOOjAgyv5YBvm - RT7Q7Vpi420+beja7JFssubdbTFKYtOr4zd7JL1xhr1OpVvsvnLwIYfavmlX9R1gvYGAQDbKtW0cFEgz - 14rFMnz/l2EvhotYLONfxWj2XgIGz7BNjAEVfJe0d5+rbW7V8celIWDrodKHdhoGVvBTrSrlYb940Ur7 - YD7HdlBAjD3UK0buMFc5Oswa78eFG8cu5DHQU4EPGN3BiQGUSvd4AIuDFep5vOdy2XN5T5rHO+giNyDJ - 4xu5lRt6lsuBJjqxrnusgS5yBz8yfmQ/tv17qU5OzoPSALTKXteAqeqWG70ByhIgj4APwOa50YmNOkDW - jqU6pYNkz8WxXCcX+wGmYymoAwCOmCQbNt6kQAwAuJ+wkTd/g0ceodcK+FPgF3sA+TulR4/N3gGABv7i - ULCCQBZAtR0CvkBBzHA9d14OjrW69AIyxcQ+HVj1Ava6pI/eNxcpUDzZ7nXuUWMFfPbyaWWzVy+t3G0y - ADZxXOyxj7YfB9n9RpsWv5JiAFBtFykIPV/tMzfvlFd+5XvywHs/IoMnzrRzYSsb5h7SY0lPIfXZ7gYQ - eJGCQubuWtumbQbtROLU9jj4a7aB3va0ZWwsYGGxDQvtAIHp83AD0uf9FAA6+GuAQNsWZqSMHDZO5s9d - LC9/7JXyve/9h/zhD082ngv+zHDOKdrymKjHMnJO0ZbHRD2WkXOKtjwm6rGMnFO05TFRj2XknKItj4l6 - LCPnFG15TNRjGdmpzRzAzpDH52V71NnjRKqruyc5nWIOlynz3CVbiWKMy6W6JVuJYozLpbolW7uk8b/7 - 7e/ki1/8ktx7z30yYdxkazgSAPT5fwkApg1Lvfevt73xnnrq6XLooWl7hWaPGEyD5WXFFWCKoK8NAHTW - WN+ixfJZo57YGvSq8bZJ3LzFq26NPW/zVaPub/Y2rLOvN6wpt+dvAD3YdD+PpPv5NAAg9Stb01fV0Xhv - qFl9zGa6bNwKAGTbCvvmr76tA+YuOL+nvqkPtU+A8Skp/8SU94ywNxjMcDabPjMcxbxCA4BHAgAVKDQA - YAIe7JvGA5+HNj1NC+Yvk5077mwLADXOHurKlDk74AIk7eavctTxbsdQ3W0u5+x162JyX5Kxleu6HOe/ - uc9YdXr2zBfs8do8zsGQ52rFbeqavruvrb+tvJu/KnN/jGn4CzGlOIs1e/LHfyevY5zpVlevBwBoQ8B6 - z+9vAPBUBXos9gD4aYyyyQoImwDwPANQBgABf8q86DTAn4I+VgXb5/qqRSDXXD1Uge1J1pudQFgCUmyd - xDAwvV/0HAI+7YVT2wfu/QQAQzsB2AsA0HsBvV2wNsTah/RiCLBiA2pWItOLz1Y18fN59PxR9tZ7+Z53 - fVBe/a0fyMu/+C3Z9PyXS68+fa0O4JAeT1u9rKCR3kvAIEPCAEMAJm2InTPnS9umx26+cKInewR+ibmu - qo3Vazr00C72O7AoxhbEaNtiw8ARALIi2OcCDhktE8ZOkRu27JSPfPhf2mwLE6n0TMkp2lymbC8Wai/G - Zcr2YqH2YlymbC8Wai/GZcr2YqH2YlymbC8Wai/GZcr2YltuAxN1l1uVzk55DBTlPyfl59oZKtV7JuQr - lRAymz7/3d+9XZYvWyVDBg+X/tqQ0KD089W/9vm32APYRxvlXgZy6HWzBpiGt2q8vCGjUfMGLAIqm9sX - gZ8Bq+APOfaNO/JbQ07jDehLwM+GeKqJ3bbaj/k+NuenWuXncWZLjWc6l9jwJvbzcUDXkCM3gCS+tteQ - rjPl55gnnnCyNdAMA7N1BW/pbOnC2ztz87or8LtQf0c2zAYM8kD0FZI8KJn8zZc+eNiOGjVZLru8rz74 - FADSE5QBQHr+6AHkoc1KxHlzlygAvMOGnw3EqJ1eH+9FghvDhNVDH3DqPV4ABPyux14idOslirnUR4zp - XrcCpDEX54JOXUrOiyFWerO4Hs6FPHZele69W9T1Y3tumFjLpbGU5MPuuseSz8AyudXnQM/rEuN6Lkd/ - 1Mnttjr22DobsusuR93jihxic1vMEUFxzuZ3n5Z5XX6nEQoA16270cANW6KceuppNvQK6KOHkHpHKCAE - mKU5gEfY9Ab+1nmZSeAvfbs5AkAWfjj4I5a/VxZK8Xdq8+4UcDLvDhAIiDrt1K6NF07amgTykuz3sQHA - yp5AX2pD0HMAaO2TxvM3w6rltDdh+t7yedXnKq0XUM+FLxjN03vq8a/+h2x7xRvkzr97r7zg4/8mk1Zs - SABQAV+TFQwamOxhYJAFIrzQcT7eTlqbuW86ftMW/JybcWV3Vp12ixXKp516prbLVyv4G2Cb1ac5gIA/ - tslhHuBQGTRguAwdPEpGDR8n82Yvkpe99HH57ne+J08++WT1FNhLf43UchGIs+t5Gf2R8thIHfFFwlay - O7m/rm5OMTb6cznG5HLJ5rJTLseYXC7ZXHbK5RiTyyWbU65DzP370he/LPfd+4BMHD/F3hr7X53eKOkB - tNW/BgCr/f8UADIkAyix4RdvkLShelZVNgCcgysDWwUwVdmsd830Kt7myHiDRyPNm28cws3rph66tqwx - BtS8DhOwU89A2qIhB3xNOefdz7fE4dwsN/MCn60PspOsJ5DtYFgQwgpfelHYJ5DvIPM1BB5yPEDQ0z5p - FRBkwryCwNNOO932OuMhyBdPGAK2FcAKPNh3zfZe04d02lgYMHaiLJi3VHbtvLMCgOkhDnAyYFU93B2k - uc68MHKiA2rwO7ihHjrgjlw8oB1MEm9z5Ty3xjB/DR0/ORiW9kUhHJN4O7b6OS87VpULmTlpdqyjjra6 - gE8HgABVPxbna3MCK52SeAeb1GvMd1M/x4WRfQ4gx0MnBp3zsdzVecY5gDEXcZyL/Uaq+7HwcZ7oMTcg - 2X4z16vcdizV4zw9jk1uZNiPTV7LrXnITy4/tp135Sc3OTye6/DclOjup6S++zlWBOQsCgEArl+/y8AM - X7ZgCLjL4UdZj58vBAH88WLSBIDnG6jrynZH9PxV8/3422bxk837M/CXvmVNjxk95VwPm64DAAFTHJP7 - gxcqFnM54PMXyyR729METLbxst7v6Z5POqDPFn4oACQP9+4hhx6m59fdjuEg8DwFfjAAkJ49wGyfAcPk - OR/6pDz4wU9K3xETFPitkxd/5qty0xveIVcpwLLr1fP1TzsakFTmGnv16q3Xdq3N4U3nyTkqMyeRdsmv - ycrm9TVsu3G6XnouTzjxFGHDd1YB81k42nAAIJtCAwAH6nkPGZRWBI8fO0W2Xb9DPvzBjzR6AUscqc4W - yXWPzTlSnS2S6x6bc6Q6WyTXPTbnSHW2SK57bM6R6myRXPfYnCPV2SK57rE5Q7sBQKdod9krRr1Utkel - uGirk506cpz28rVng9Dr4nN77o+lE3pdfG7P/bF0Qq+Lz+3R7+RxP//5L+Sd73i3rFyxRoYNGWFvkPY2 - yeTiBgBkCLivfaqoV6/LbNiXuXXeCHmDtrucgFUDODX0Z1nj1hbEJeCUGvLQ0KnNYzyO49KAM7ePfQYP - Pexwm2PDPES2n4HZmPWQQw6Vgw5mHiDf7kxb0jTOyfK2BYx+ji6XgGtDr/K47rZnsX9g2ESaxp25SjzY - hgwZZT17POhmTJtnPQrp01ipp4OHB19GwM5mucyNAgTSc8DWD6x8PtKHgBUY+Qpg2/zZNoNOABBwsGD+ - ctl1491thoCdXeeBb7bcX7DBHl/KZ74KQMRY56hzjnDJ77miDkBB99wlnWN7nryu+SsdwIWOHHWvi146 - FmCRcwYcxdyALjtepeOPdaOO7PWpYyCrOpbpnquKNfAYjoWOD6Yu7P9OADhbGFP5AZvU8XgDl6r7sSKQ - 9dyucx7UTzqgWwHgyMkGAFn0YMOlCk6PUAB4RJej0vYvgEAAoJYGAPUeBPjQY2gLPqp9AAF9zA3kE4j8 - nTP9gYUSAEXuC74bTF0AqgNAgBTnRG++gyMDUHp/wT6c2gRMAKoE8JqsoG/fA2zPP98axtobuz9Pqu47 - 5XMVkKpsINCY4eCL9EXsbFl+98Pyym/+UObuvF3OOPs8ubjP1bLpBY/LCz/7dVlw091yvt7DvMQRnwAg - soPAC+1lDJDIi2HzPJvn5y+7kdOiFpU1NrVfqZ7XpZ0hH72mfFsZEOgbQvum0LYx9MBh2r6nFcFzZy+U - x17yuM0FfJK5gPqfPxOc4rMjslP0RyrFQDE+slP0RyrFQDE+slP0RyrFQDE+slP0RyrFQDE+slP0RyrF - QDE+slP0RyrFQMg2BFyqGGWnPbFB2HNfXWwkj+lI3Y7kK1HdMaCnkvPpnK+RS5l9/77+9W/Kcx5+rq38 - Zb4IWwlYD6C+rTIE3OwB7CeXXdpHup5+ZtpuodEgJW7qARxV5b4NW+UHyKncFkxVjTcNnzV4ab5Liklf - /WDoh9W/3fUhwiKU/vq2O2L4aBkzdrJ9gm3mjPkyd85S++j7rJkLZOrUOTJmzGRbcMG3NgFQDJu0BX7O - 6Vx825fEuwPAdK4VVz5j1Q38eb5wTYBAQNm11w6TXpf01ofxqbJ86Trpo2/tPCCY25SGu9IDj4eiDQnr - w8KGgs86x/TDD+tiwI9tXlglaQDQQEYCgLax8FEVAFywQm7ceZcNPfNQBwRQulyn574Y4+CiYa/0hi3o - bYYcq3j3wZ4j6tHfipmTFvXG8GXFpWNF2UFVw5blMxtxBc7jGhzjQr6WdSr2eg7+2vgqfxtbFW/gj3pq - a9R1X4zL68X4wHm82/i+9ohRU2TdhgQAefliZfrhDgA15hjqVgCQvTEBgQzr8g1ghnwd+LGVyXkw4Ihh - X/37B/g1FnxcfLm1LwBMesq5P/i75piN9kHLBAD13rKS+yy1QYkToGqCK9oTAKCCP0AgQ7/WXu1jL4nc - Y7YYS+83QCtgjZ5AYwWAZ57RTfoMHiaPfvqrcs8/fEQu1hdieubP7naBDJwwTe7/x4/JPe/9Fxk8ebaB - 3AQaFfRVOTw3q5f79htoL8+8XLY5Xz2nZ+u5+fU1ACHn6ezXWtXz0QznY489UV/S+wpbwPhegNYLqABw - 0MChtrhv5FDmAk6W7VtvlH/9F1YE/2a3Z0jUkUvPmNwe9Ty+Li5Sbo96Hl8XFym3Rz2Pr4uLlNujnsfX - xUXK7VHP4+viIuX2qOfxrndoDmC0R5tz1F32spXtz0V15/BUbc+UfCX+71/+j/zj+94vG9ZtkuFDR9nc - EQBgmk/iADD1/rGPHQ3lwQcfqo1NHI5NoC6BPAeAADwHQZGb8XACTclOw+aLPdJwbxP8sTUDw5ocv/dl - fW0T5eEK/HibZWiUva7su6Aq80WOGTMWyMKFK2Td2i2ydcvNcstN98hNu+6yD8OzYo8GuAn8nDlWzhEM - Jo7X08an559keilTD6Bdm+aw69MGmjmT/RRcs8px6JBRMk1BKz189nH8aq8xVhJyjgA+Hpg8PNmWgm+r - HnjQQcKcP+Zc2RYw+hAH/NFb5AAQAAAAXGgA8E594AxoDJ1aL5HG2kNddR8m9Ad/3itkQ4wVCGDeHD1M - 3tPW6IFyXX0RVLjPcle656aMvVPIsS5y1L3XrOEPdRtcxUcwxLHc7+A02lpxm7pcQwfqeVyJoz+v575c - 361eprs/tzVW5Fa+6HeAaHLJ77KWzCtFBgAOHzlF1q67Uc4/nzmA9AAqADzsSAN9x/D3SD2VbUhY67Bf - JWCIDZPTcO+5Bq4AfXz2jd41gJ/z+WoHNLHyff8DDrA5g+mLHicYOHLQY+0E95TdV+iVzbiKqdjAn9rS - t3oTAHRgaCBS71fOtdHrfo4CVAV/3fwzdXqe8FlndpeVD71AXvHt/5Qp2qacri+SNk1Dr+vcCy+WuTtu - l+d/+muy7tGXy8X6osy1+pQOB4GU3NcDB460HnzaigRUE5BrAFZ6/GA7x3SeXEsCgakdoQ51EyPTfiaZ - ecA277gCgQb+9AV48KBhBgBHKAAcM3K8LJi3RF79qtfKD3/wI/v8517666PiKuAoR3J7HuvsVIqro1Js - Xq8jeZw6kg/qSM6YK5ddd8r1EuU5ouy6U66XKM8RZdedch36w5N/kO9+57vy4hc9JjOmzpZB1w41AGjz - SCoA6FvAsP8fDbeBPxpOazy90YXbAiMHgPgM5Bkowp7HNnN4o82cGOYSOrBiKPfss9kv71zrFQDc2Pwu - fcB0ObyLfeCdt3g+zXboIYcpHy6HHaq+Lkfqw4x5Vadqw3uB9QJOmzpfRo+ZrI3xBbYiry34awsGOb8G - AESu2M/dz89ig+w57HobvvQ70IvJg+2inpfbKslzzj7XehKw0fuXQOClNmxGrwFzpdhwl+FtfpsjFAQa - sDoyPXABgwBAvn7g32VlbiBDWosWrrQ5gP3039IBIHvYAdTsQa+/oc+l8x40Fqj43DlAGX4HatRjWA4Z - Ro5Dkv5v40CCfQwdbJKDaQOucw3EY0fnfCP4ZLjSj4XOeXlubOxB5zo5mI9GTnTO064r5I5z65Dxx/O2 - oVb1EYOf3I3fQHU/b0r/TdAByBzbz9OOpX5kbFwDbLm1DrKfJzk4bvyN/Degrh/bz5PrIb/lViYP1+p+ - ZHI5SEQnh/t9jp/pWuJvHAtd6/I3RX3qwf6bUTIEvGbtDhuqZWPiU6wHUO+xIzVe77MEAPXfnuFgjacX - kPMBMNJ2nA0A1PuO+sb0+MEqX3hhT9sDkKkOh9iUjsOkm8ZS39oE2gdvJyhrASB+tyk7wIINTDlgog1j - ju5+9u9Pz6MNUev9Rk+d87kKUs844yy5evRkefTz35Rdb3mvdLuwl5xx5llpIYsCQF5KL9V7bPtr3irP - /cSXZNKa6yrwmOY2OgC030DzX3PNECtpQ+z8tE1I8xErAFixgbvGdTjTToZrbBOTrpW4E48/Sfpeea3w - iTyAoAHAgSwESQBw1PCxMmn8VLll123y6U99Vn77xG/tmVB6frgc7bkt+iKVfC5He26Lvkgln8vRntui - L1LJ53K057boi1TyuRztuS36IpV8Lkd7bou+SLlvNwCYB0SKMU55bJ0M5Trktlb1cirVcepMvjyWMq9X - iollpFJMjIt6XRmpFBPjol5X5hTtTzzxhHzi45+UHdt3yagRY234NwFAPi6e5gD2reb/sbEpb/fe4HhD - 3HZoF056w26NdBMcEdMASBZPrhRv+aoGzEHjwQcdrA+IHrb9DA9HQJ6xAj522GeuHxsiH6kPG4aifA6S - fZ5KH+CcMysTAYTsC8gEbDaUHT1mij6EelrDm8BaBH/OCbj5NTg3gZ6z9/y15QYAtDrEpDz0ntDTcY4+ - cJiHxDmx5QVAlblSadi3u20GzdxBgCIPKkAgAMAezvrANdYHLWDFevYAgzzwjzragMaSxWsUAN4tfC81 - zePSBzQPeMoKJNSWFSM3QAM+ZY/ZjTXOAIPKxMR63ivnOWF0AxyV7Hav67aYy4/tftcNrIRYBz7o9ntV - 9TkXn/NnOdQGyED3XOj4AICUDqQ8lwMndGL57ZG5NuQIVIl1P3XwOQBEjz2wlAYAtZ77Ab5+HRwLv11H - dawIwPFhcx1gQx3qogPI47EArq4TFwE5fz8Omu130L81VqGvNQDY016e6M0+7LAj9DfV3wwAqCXgj/vO - pidoLl7e+DINUxjoFQMINXr8lO3LGgqosJ96+pl2PwOI6GEDSFtbU23G3gB5dh812X3WM2Zy6vEzu4Ei - QJbyPhXI0vyWS+9N5hCzQplz4BzZkJ3z5MXMVuSrfHb382TDi14lL/3Gj2XonGVyqgJfgB/3qn3ZxIBg - dxm9cKk88rEvyK43vVuuGjrGQB7gj178NOfxAgOLbAbPnoGpN686Xz9P2ldrAx3YEZNsbXr97Lo9vorV - kh5O2lR6TE85uav06zfAhoEH2RBw6gEcPmSUjBo21r4RvHTRSnnLm94mP/1p+kZwTrktf75Qlth9OeW2 - PJayxO7LKbflsZQldl9OuS2PpSyx+3LKbXksZYndl1Nuy2MpS+y+nBpzAEtOKNpLMW4rxZXi94T+mPlK - uf7SbdGO/NP/+qne/G+VRQuW2gqxgUwarnoA2Vm+X7+0BQxz59iXy4ZhtHFpNrxN9j373J56yypbBX4S - AKIEGCGTi4armZNG0YBWBZ5OO/V0GT1ygu05yMME0HeYAqHDDutiw09dDj+yMREdoGRzkGwYKrGDDx5Q - x2rJ5HLqMhdv9KipNmS6O/Bz8BeAW9DT9bjeAW6AxuoalXmAsrEtvQysqGSbClZUM/fpgP0PMgaw8lUV - QCo9ffR68aAGzNDTl/b9cwCoIMUAYfMBngAgcwAHNnoA8UUQht6Qg25xFbu/wdhK9owBD5Qxl+eLcl1M - ZDs3l7MY7NaDWdlK/lgf5vfwuBgb2Xxt9MqWxec216M9yqWYyFyHlVms67k997fRg99tDZ/HU/Jv5f9e - blPm3jmCxUb6dzVq1BRZv36nDcsyj/ZUBYCHKwA8+ki9v7QuANBevvhbUwZow7zEcc+efOppCqhYact2 - LwkEMkx61lnn6t8wGzofavf+CSecIKeeeoa1N7ZJO+3Ebpu1p3sqgaTUflDG+YCNnj8FRsbVcKrdg5aH - jZ8PtqFcgChfMgLM+SpleiBPP7WrDJ25UF78pe/Ille9TU7renbqsTfwl+bmwmzVdL7ez8sfeL48+rlv - yOI7H5YLLva5j2lVP0xdvmDCV0JST1513gbiEjd6K6vzT4AQW4oF6DnwawBAjzFbkmk3mLvow8AsAkkA - MPUAMgw8dfIMue+eB+VrX/26zQf3Z0T+rPAycp0tUoxzirbIdbZIMc4p2iLX2SLFOKdoi1xnixTjnKIt - cp0tUoxzirbIdbZIMQ7abQ5gXinquex6LDtii1Rni/Zcd+qMLdpdLtlK1NG6JVuJOlq3ZCtRR+tSOnOz - f+1rX5eHHnyOTBg/ycBfAwBenYaA2QKGnrfTTutqvVbWyFSNq3OjUUZ2m3Hq+Uq+1OjaHLkGY3P2OjRc - SeZYrNq97NIrZOqUuXK2PiQYGjr8UIZ3lRUMdnEACPjrouDvSHoAmYCeev1SzyCsIFAfev6h+sMOOdze - 8IcrsOSLHZxnE/Q1wV8CfdXDpgJxDkw9JnECjbvb23L6LbS0a93HHrD0BvB1A7bUOfzww21ojb0K+b3p - 8aMXxuYC6sODHprj9OFIbyEA0FhlbMcen3qtAIEMvZ104imydMnaJgCsegDplYHt4a7x1ptlD3kFCFq6 - 7iABwEmJbvmrusQCRL1nzf2ACAcPxGLzXK4jR8DR4ErPAUpH2EBLi3rmh0MMcrtcxXq8y845kPSYklxn - s9++YM/Z/Flu5zYxlZzb8tiSrQSiKfm3GzV6qqxes8N6r1lVf5oCQO4/6wFUP2z3WYPTEDh/w7y4sX0L - PXz2AqN/V/SEcrw0pzjd+8cdd5wwvLr/AQeGe0bZ70Ns6HYfpVEDj2kAJ2OfJ5dz2vYl5eGzb4fY3D8A - 4JnaFtBDR++7De2e3U3Ou6iXbHn1W+SRz3xDrh4/Ta/lZPN1PfNsPU8Hgt3lDC1PP+Ns6aug6pa/f5/c - +8FPybDZi+VMVvEDKOlNVKZOz1699eWvt55LdR16/gm4NUGdg1W7JjvvFMM1UNLTlxaIhDqwLSRB1jr6 - G/ASed65PawXcLC+5A8dMtK2ghk5bKyMHj5Oxo+ZJOvXbJJ/+scPyK/+p7kxtJdQK1uJOlq3ZCtRR+uW - bCXqaN2SrUQdrVuylaijdUu2ErWq22YbmFyOwbkcba2oFNeq3lP11dHefE1yH+X/6M3+gQ98SDZtuE5G - DB0lgwYMkUEVALy2GgKm94/GEeDlDUpqfEsAMAI5AJzbqFf5qsY79gx6fGKGfhP4Y8iGt3N6I6dNm2ur - d2msDfzRC6gAkBWxPICY6wcAtDl/PJAVABmbnJheQQAgk9UBjuwxdnmffnK6vtEzJNQEcM0ewAT2mg8e - tzV0bbyT3ASNcKqnbI17W3szTht0vUZ69a7iU056nVdd1d8+scc2O70uudw+eM+H5ZkLaN8DVpDIZ+To - 7ePhaeDvOBZqsCFz6hkEAAJ4eeguW7ZOdt3YtgeQYUJAHg91wBjHJ5f1oKkO2Ccvfuz4yYvO8CJDkg7q - yMUD3kGCzdOrhjuxkcse8ioDIPI5gM0hyLRliQ1/Vrk5f2yem9jG/De12Zy/6jrIYXP+Qm5yxfP2oVJ0 - ZNhzcQ3k8t8In+ciR9Qp0Q00azzH8vPi7w2//wYwfnKTF0b2XFwremNrFi09Nvq9LrrXhblu/q3cbwBM - Y1zH7zrx1HXZ/aYrU8a6yFyj+asewNGjZ8jKlVutJ4uhU+YAct8B9GwvSv3bow66scr8fny7ljm8LOLi - Hk6bMqc2woCN6occeqjei2cIK4QPPeRQvT98m6iKXbZ2IrU9ibV9Ubv3osFmM11LZ2z4nKsYA4B6TFYb - 8xlGAJ31Auo18gWeMSvWySOf+6asePjFcqrqXc86x4AeALCrgjkAnQNBhpLP7na+TN20XR7+xJdl42Ov - lUv6DlQfADBt6USdngr+zr8gDQH7de37rOrcK+Y3sqHqKoZrsM/ZZdzoNYSxUc98zfaYXtpL9CUzzQEM - AHDEeBsGnjtzgTz+slfKD37wg04tBik9a7A5d5b25vu/z9dmDmCrwDry+LyEPF+0RSrZc1td3RJ1Jl9d - bMkeKY9xuVQvjy1RHuNyqV4eW6I8xuVo4yb/wQ9+KK96xd/InJnzZMjAYTZHhO0CEgAcZJ+Bu/jiS7UR - P8YaH29M6jg1qEH3xk3ZevwqAORv7uazuT3UTWyx3phr48fQEb2R06bMsaGYQw46RBszB4BdrDfBmaFd - ACC9gAb+usAK/ir2oSnAIA0iDyY2eT3xpFOtsWwCv8R+7pyrn3+6hig3wVwqA3CsrtNjo99jKBn2Zc8w - QCDzdfr1HSBXKDBl2J1eCRa+nKUPDSbHn6KA6qSTAUYAFn342+IPvg+bQAbg79ij9aGu10pv4YrlG+Sm - XT4HMD30HTy43ma4UcsEAtBh5CYogPF7fQMJQc8BBXrsdQOAeDxlBC/8e0QAgxzzUdcBDByBk8Vnuc1f - 6eSJwAoZRoYBbK5ThyF1jm91VQfg+bHJBQBENgCosQBIy6U6uQCv+GHqejyAyMGm5dZcxDZAspaAaPvd - 1M8xAeD+e1IvLl4hN0DXdWQ2z7Z4PW9y+bHwM52C3IB9yjgHkHOwOYDVb8Z1OCC3xRzHnihjxsyQVau2 - 2bQFVtGfovHcdw70bEsiZQOBle04m6LAkO7p9jJ5bvcLpOvpZ+jvoL+5HpPfg0UWAL8eF/Wy3kS//6xN - 0HsrAb/qvjK5yc32IwE6wJC/dDaAUtWbloCggybkfeWAAw+UbuecKz0vukSBWgJyzOfje8A9r+wvN7zp - XXLnBz4hfRQ08ULTlZ4+Ps+oYI/NrZ3PODP1BHbVF8pL+g2UjS97nTzw0S/IlA03SPfze9qQMnMKib24 - V2+LbbSDVnK+zd67xOn8/VzTSmZsaS6jXYfqvml+I75i19ny5sQTTpGrrrjGdksYPnSMfRd49IgJMnbk - BJk8YZrcctPt8rnPft4+CZo/Y/JnCuS2aG8VF6mVLdpbxUVqZYv2VnGRWtmivVVcpFa2aG8VF6mVLdpb - xTnt1gPoel5CUXaKdSK5veRrj7xOrPtUc0GlfHtKe3I+Jfq/yoftt7/9rXz+c1+Q22+5Q8aOHp8mCNuO - 8U0AeGWfvjZp/ID9D7TGJza6JfaGOOmxYVNwBFegJ9mac3fa5K6AFDKN9YEHHGjbGUxjCFgbXHoi6flr - 9v41AWDiI40ZEk4AMM0NBPT5JrUGADWW4VO2pOAhC1h14OcgLT0sOCeAml9DOsf4QCK2yREAqlxtgxN7 - CtNDrFmXY/CwvPSyK+xTUVddda3t6O/fWWZ7inO6n2cPp9P4JvCpp9lDk16/YxUEAgQdALI3INfFRHy2 - 6FixfKPcdKMCQM1rvVv6cOXh7gwoiLIP/zn7nLe2thCf6S47YGnoFXsd54a94Defy5Uez4/rSd+0BbAk - PdlSvZjPbBXneuRSbM4Nf67XxMMxplVcHbepVwG0VnncbwAYvbID9hwUoyNbnSoWv9WvfKYfc6x00Zcq - 5sqOHTNd1q3dYWCNF5dTT2YOYJfUA6h/ew4CHfwBovnbpNeav1kAJnPl6EFkVf55519YrQRmMUhP6yls - tBvcI8iNe87vmwj4KPdRYOQ6rKCn4thjltqZKqaaT8j9R4+Zgb2eCQBab97Z3aynbtrWXfLwp78iM3fe - YaDvDO5BjT399LO0PEtO12vhnoS5Lti+3608dNYiufN9/yo3/d0/Sr9REw3wGUBUX69L+thLgbeP3h7S - 62fn3LiWtiCwCQADVz1+Hu/grwECqyHhAw84WF8ku9lQ8Ig2AHCiDQOvWLZG3vH2d8svf/nL4rMjt7UX - U1c6xVgo16FoqyudYiyU61C01ZVOMRbKdSja6kqnGAvlOhRtdaVTjIVyHYq2urLNHEAnr5izU65D0Zb7 - nDwmxsXYXM+pFFuyOeV6pNxeFxttdbmgZ0o+yl/84hfy7ne9R1YuX61vgyNtg9A0BJwAIL1/rLxlDlpd - 71+jh8/AkDMNmjdqwVY13s19AlODTeNlgMljq0bZegH1uExi5vNJ06fNs41jWf0bAWDiCvxZGecEsigk - zQ2ktInpbFGhAJAYPs8GAORhxTnaedix/fipUU0Pn+YDIzXW2GJ8kpOeQGBzQ+imPwHAChRWNpj5fqed - dqb0UbB7Vd/+csWVV8tll11pn4jjAclkdOYj8cChR4ieG3pnjquGfgGDaZgyzQvkGg0ArlAAuOtu61ns - wm/Ag1kBbwQBsefMdQMFygkEVDogobK5H4DgoMHjKSMAifGxx6+Nrzp2jAXocDw/LwMvQU+cjtPG1sbf - gr1eiPdcbfK1w3WxDrqMn0Je50adUNdzxXxFW8Wuu83KFvUj82/C/FH+LsZaD+ANtsUJPWf8jfEpOECf - 9dhqrPUCaolODx+9qQb+TjnVAB77WQKUmGsHEOQeZENotmBhAZTdI23aDG8bKpvKNuTrjO7ghzbFgF+2 - 35+1YYmRE2BKebkPOU++xMNehQBA9iHsPXiE7Hr7++TW93xY+ipAOl9fyC7sfaX06H2V9LjiGumh9+hF - V10jF+u91UvbzEv6D5HLrh0qVwwZLVcowBo8Y75s+Zs3yaOf/4Ysvee5ckGvy/W6z1Zw2d22e2JD+8a1 - KscePwewDd24Ou+K3W5Dxdiqa9sXncV61bUbADT92dZOXtzzchnGIpAR42TMSAWACk7HjZ4kM6fNlUef - 9yL53ne/Z9uD8Zxo9WyJz5M6X6Q8rq5OHgflOpTH1dXJ46Bch/K4ujp5HJTrUB5XVyePg3IdyuPq6uRx - UK5DHtcSAOZUsjlFX11cq/olapUnckepvXydpWdaPs1iH//+zne+Ky96wUtk2uQZtvp3sAPAAewDOET6 - sOWKNtq28KNqKHfjfVPDtTsArOSqsW403FVj7X4DV9ooNeoDKFX24VRsDAPz8ffp0+drA93Ltn5xAMhc - QAN9xl2qBSFHGPDjoQQnAJiYYWEbAj7yGKvDkAgPH4bt0hYw6Tz92P5AiasP8QHe7HyrWGf0fU1ugj63 - N/UKFGoOl9Nvs49dD3ujXXnV1QkAXn6V9NSHBvsBdmc/wG48nM62YSi+JWz7+Z3A0GWaE2gAUB+6AED2 - CDzl5NNl1crN1gMIAKR3jIe5AUd9KPPQR6dXhno87I/SEoDpQIyHPkOOAC8ACA9KG848JoGGNB+xOU/P - hjOrIUeYIUhyOJCwIcbqWNj5G8OOTj2GNE233CcbeMBHfh8qdZ26ft7UIb6RW8tGrio3ufw8bcg35CI2 - Hst6U8N5oxvQVZ2SWM9tevgNyGu/gerYyOO5XPfzdN1z+bE8l+leV9mAler4/VxcJwY/dcyv7GDfdT9W - w6/17d/W9crnx3ZG5+9s7NiZsmp1AoAHHXiQrQLmZYoFH/zmTQDo4C/1/PE3xN8VwIrhXnra2AKJoWTm - 39ETyHnYfef3v5appy7dH5GJSfek6nYv+n3KPevgKAEfB0oNAFiBK7u3q/uY6SS2ObXef/TunaPywtsf - kOd85qty+/v+Rda85NWy/qWvlXUve71sePyNsunVb5WNf/MW2fzat8mWN7xDtr3p3crvke1vfq/c+Pfv - l1ve9SG5473/LPf/86cVAH5d7nv/J2X47CVyxlndbVsY9vxML78JABq4M+Dm5w4D+AIoNFl/kza2JjsA - THm47rRApOFXH2DxpBNPtRGBUSPGGwAcN2qSjB89WSaNny43bNkpn/zEp2xPwNLzJtr8meS2VnIdRZ/X - ifXq5DqKPq8T69XJdRR9XifWq5PrKPq8TqxXJ9dR9HmdWK9OjmRDwHVOp1KM21yHol7yQ3lMTiUbVFev - TnYq2ZxK+SK1qluiZ0K+3zzxG/nEJz4pO25Ie/+xNQBzACnZLJQ5d8zTYdUejUZqOLWhbJQwDW9gb5xV - bvYMorucGvM0hFE1xFrSQFlD3iY3rABJSwAj84amT59nQ6JMDufNudkDWAHAQ7vIEVUv4BFVL2ACg2lh - SAMEVquCiTtZARKfe+KD9QmMcQ3V8WloOUc7r3RuTWCauAnqmsw1JznEN2zIERxWYLBiGu4TTjzFhoKv - 7HuNrQ5mq4gLL7rU5giylQTzk07reoYBQOYuHl8BsBNOUrCkcnMImEUSp8vqlddVAPDaNASsD1m+6ODD - pg4C/KEPaOFBjm7MAx0dH6CAh7yyf+bMHvp6TK/v4MZ1zs0BBDYDTviUAQsR7JCrAW6UIwjj3Mll/ioX - oC2dSwKy+E0nl8aZvzo2uSJIQzZAqDK6AUBlZHIZuNQcDpodXHtuB674TVdw6r2T5EJHJj95qW86562y - g03Oj1hymK7HMMBN7kqntxcfzHXE+YWe23XOy66j0k8OudHjnD+OsRsg5zrU7sfyfy/7/Y8/WcaOUwBY - zQFM28B0tV53rtM/RZiYqQlp6Jc5q7wIAACZx8r3dNluhbmt5+q9zSbQ9ArS22/3nt0niR3o+X2U7r10 - j6aXyepes3pwBfAM9CQAyPw3B0PpnvYy5aEeL5r0Zp6vL5vsP9hnwAjZ8KJXy41vBdS9S3a87R9k+5ve - Jde/7u2y6W/eJptf/RbZ8Io3yfqXv1HWPfZ6WavgcO2LXyOrX/hqWf2CV8iq579c+WWy/OEXyrL7nier - H3yxjJ63Us7mCyPatvJ7pXNPC10SQEtz9dK5p3bS28hUAv7SuTZBXeIkx3j/DZoxMG3ZwQcdaquC2Qpm - bAX+JoyZIhPHTpUlC5fLW9/8NvnFz37xR3nmdCR2b756+r/I19gHsFTWUfQj18W3l6dEnq+U1/U6e4k8 - j3Nucz1SK71Uz2253amVXqrnttzu1Eov1XMb/NOf/lTe8ua09x97QrUFgEOlz+VX2QrZ1CA3AdDu7EDG - G+xkt4YKvzXIHqsNk7IBQOTQWFlMpVus17M3+n1sZd7UqXOlT+9+1ktm+wBa718XKw9T8AcATNvDKBA0 - wKesDyYDgABBlX1RCEAQAMhcnm7aIPP23wRiPGD8mtM5N0Bg41q41mZ8ZM63qaeYNr9TQ471m3H0cAL0 - eiv4u+KKa+Syy66Siy6+TM67oKc9OFidyFwkNogG4LEYxECAPrgNpOhD3ICKPrBP0Yfz6lXXKwC8R/r2 - bX4JhIc7vaA+v+8IkxNAcL+VHltx9DdiMh/HKMZWpftcNkav4iN7rpzdX/RFOeQyroBN0Zex9Yp1MBYG - NDlwcj0eC52yTb7gc7/rjRhlwFRDV5/r5EKOfgClLYypdP4W4rkA6lynpJcu6vz9RJ3cbADtAHD8+AoA - nnNeAwDy4mWLj6q/PV5AqEfvNC8mJ51S9f7p3yz3MkO/DPfyYnf+eRcaCORrPtZ22L2WAJ/dL8rWC8g9 - 1+DqPrQ2grgKAJqN+7UJeAB+gKrmMKkvmGh7HO4/7j3m6HGPnX/x5dJ7yCi5TNvHS7VdvGTAEOmpL1EM - +17Qu69cwMr8i3vLuRrXXV/Quve4RLrBCiDPYcGHvrCdqW3LmXptZ3Q7T87i3rUXuO4GNNneyu9/P9fm - eXMNFSis2p7UVlYAUGUDh5XdQZ4BPr3Ohlyx6yk3vL/+G50gfa/sb0O/gL8JCv4mjpsqM6bMlkceep58 - 59vfkSf/8Af7VnwdxWeKs9ufCuW5PI+XnaU8l+fxsrOU5/I8XnaW8lyex8vOUp7L83hZR20WgUDtVfDk - HpeXUJ1cR6WY9nK0yvtU8u0JPVPyPfnkk/LNb3xLHn7wEZk4YYqBPgeAMPP/rPfvkMOs4UnMUAWNpTe6 - VWPbADOpoW7a2wJA5NSoJbbhl0aDlvJbo6yNU2rEq3wqk5thpsmTZtnqWIAb5wZoA+zZJ9+q3sAEDg9v - Aj9jhoIBgYlTTyALRbrYfBy2ZjhY8zkIS0AsvSk7KPVGuHnt6YFhsXp+/hv479DU8VcAMPxWZU75aNiP - Pe5E6dmrj/QBAF7e11YMXsiXElgMwtYUZ5xTAcDUCwgIpOcm9SSxEOQEWwXMfKs1q7e0BYDVQ90BhIEG - jedhjwzw4UHufvQYT5zHWnxBJ87BW34sj416o36UA+9WN/pg9Rtnusc0uJC7FcccuVynu1yylfyR83zG - le4+9+exrkcA7r4Sx/pRdp3SczUAoP6djZ8wW18qEgBkvt6pp5xhL1gAT/7uAH/G+jfkvZP0/vH3mnr/ - ml/aYCEJCz9YScy+l9bbZ/cagI57orrfqntud/DnPphV/G7zexfgk3r/0pYqaV5c4/6uXjDTvZdyM6eU - 4elTT0ufGeR7vZQ2nG3XlHpFna23l+tUO6uaT1TAm/gUOVnvTcAecx/peQUAA4QBmn7fcx7eI5muHU7X - 5O2lyd4WKUcfnNrTBPIc6CZOQDHJ6XdwIHjgAYdK93MusMUgAD94kvKUCdPlhut3yCc//kn53e+aq4Hj - 8wi5jt3vZUmGcrmO3e9lSYZyuY7d72VJhnK5jt3vZUmGcrmO3e9lSYZyuY7d72VJbjME3FEqJcpzRD3G - taJSDrfV5aizQ7k9xpbquD/6oh79kd2XUx4DRT36I7svpzwGinr0R3bfb37zG/nXf/moXL9pi4wcNroC - gMNtHuAQLa+8op82ZKfYW3NqiFKj1GiwGo1sapCb9uCrGrDUUFVM49WmwUqNWQJ9TQCY4qireauSYa3x - 46bZfoCAt0MaAFABXwCAvkF0FwWJPJSYA3g4YM/0qiewi/uO0Ia+m83FOfCgg+04qXFNb+R2TpwLDyaz - K1fX59fs113S0++hrPnymLbcBJ7ObIrLh+gZAu5j28FcIT16XCp8RJ5eQHoR6AVkGPgkfcDwwGFY8MST - FQDqQ8kA4FFs+dFV1q7ZIrtuvFuu0rf9LkfQA9h2TztAVdw/D52HlYMAABy5HXzRg0R9123oVG3IsIFQ - rUNd9DjESJ3G0GmVm/oAM/Q2w7TKyNgcBCWAm/YrtFyqM8fNzlN14rGjE0du18kDW27V7aFObpXJR11+ - O45FDL543sS7Tonfh3xd99wcG90BlPWKVXWJwe+5XOcY9AhGAG6s9qgnoFX1+BGvOraGX32WK8S30amr - ul+n1Q3+GBt1vj/Ni8b4CbMMALJYgv3zEgA80vJwzX6tyPydGBCyuX+skk1fzKD3r1t3VgFfaHNwD2/0 - /iVgY/daNYrg7P7UrhCT7sXEfn86p7jUnlSLIRhateFV1a29SXX8c5U+J5ceNLa9YvcDzvskvRd2Y73n - XAbcAvK4hwB6cLKf3mTNw/ZNyIdr+8O5pXs/XUvjmv36qvN3brSbdj1VW2ns9rZz/dJ1Bt2An3Ol77O/ - HHP08dYLOGHsFJms7WviqbJ04Qp521v+Tv77l//d5vkBxWdJ9EU5Um4v6V5GX5Qj5faS7mX0RTlSbi/p - XkZflCPl9pLuZfRFOVJuL+leRl+UI+V25OIiECcPjhVjgkgxpj1qlSNSnrOj9Zzay1dH7eWL5TMlH+XP - fvYzedOb3irz5y6UoYC+QfT8JQDIFjAXXtDTwFRqlGJjBJChTG/aNGBmq9gaavxVjDVcFcBLjU5qrLDF - xonG+VlVA06j5nN5IkjizXvM6EkyoP9Qm79nPYAV2Its+wM25gbyqbgj5DB9OCUA6Jx8AEnblLXr2bah - rV2DAb009OKNpZ9vaniTP12/staJ5wm3AX4VJ9/u15U4gD9bNbyPgW++CQzwu0JBIJtB97z4cts4Nq0G - PlcB4NnWq8JDhYcs86wAgLYq+DjmtlUAcG0CgFdeeU1aBax2JujzwHYAwlwtHvTolDy83QcgofcD2f0R - kDiYcZ26EZA4KGvo6neZep6L3MgxtwNABygN4KoyOQF4DqQoHZh6rggIyYNux1JgZsBVGR9sc+f8uqvc - /jt4bkrAIrkdyHpuhuD9OsnLvwmx+NHJZ7mr62jk1joNIKvnhe5zAInlmIBoO2+Nt2NrvOt2bM2HHnO7 - DniP4BPAwrEcRDu4t9wal1+X/4b87ZxwwikyYWLqAXQAyEIjAKCBPo21VejIWpcXybT4o2vaN6/aXoUv - 2px7Hr1/F9s0BqaaGJCxNiC1BfbyRRtScbr3qjbEGFu6pxIAbIK61AYp2z1bgSXuaQNGfM3I72fisntQ - +dl8m1v/Lfidebk64aQ0lM1vyz3GdRlXfkruP35LfxGjZ978Fneq/Y4A3Wc/mzaA41Cm86V9SedSnbud - v7cl6MRVQJBz92sybgLA1FalfFxrGvpuAj/7DVS21dEKAA844GA5V1802Qx6yvjpMlmZXsBZ0+bIcx9+ - vvzH975ffJ546TIU5RKV6uely1CUS1Sqn5cuQ1EuUal+XroMRblEpfp56TIU5RKV6uely1CUSxTrtQGA - dRVLySmdXXfKY1z2Mre1R63ioq+j+eqoVH9Pcj6d8j355JPy7W9/Rx55+HkycfzkRu+fDQErAOSzb6ww - 5bu0qUGqGiMaK9erRsoBTAPoqC011qGRtgananh9booPUaBbXHN4mQaxCYyc2SPvGBkxbKwMHDDchjYZ - QrGFIMaHVXMCnZO9MUysoA8A6KCQRhg/K4KZyM6bPg+g1CinY3Ke3nDuDgA5x2q4Sa83nmsD/MH2u1S/ - XYObsYnbPngioGS7Bnr8+vS5Ri63YeA++sC8RPhgPttI8CUCelVO0gcoD1mYBw4PGh6+rMoEAK5bu9W+ - BAKQdABo8/+U0xy0BFIcIMC57LrLdf46Pfe153e9xB3x5zGuO6hCB2hFoArQTcBH/ZXs8XldSoBZ9OWx - +L3n0nXzVzpsPrUZ6K10YkwntuKoU8/13XIrA+7s2Orj+MR6TyV+QC46ABDdwaLnsjmBlU5dPxZ/O4CZ - iRPn2pdAzta/QRYTAOCaAHD3HkB6w7jHTu96prC9Ct/Y7X7u+bbvHyvemabRFuzpPaY69xkvlA2bcboP - Y/tC+9Gm56/iBBBTHa/XAEJmS/He85czCy14meT721wXm2tzPQ4EE6ch7qgDoE0+ITGroJkfSZvFlJfm - Marzq9qXRttqJexticoWy0t285qbjC1xmyHfNuCvum7sKu/37APMj8xcwP7XDLaNoBn+nTx+mkydOF22 - Xb9dPvPpz8iTv3/Snh35M6Y9vT3am+/pk6/NIhCnqCO7Xmdvj/L6dXXr8rWyu6+z+eri3e5yjItypDzO - KdpdjnFRjpTHOUW7yzEuypGw//a3v5NPferTsm3rDgVUafjXe/+QWWVL488+Ugm8NBshAGATBDbBTAQ6 - 1li3aoyM0zwVi6PxUi6Do5SbnKzSHThgWAKA+oCm5wHQB8iDGRI2uQKD7jMwaD2BsVcwLSKht4U5SAx3 - 0thzLD8uDWWbN2dveJX9wZEaZefqN4DN1/Z3setTefcew2qOYBUfffvtd4DwMfzLL79KevfuJ70uScPA - rAZOn5M6W05VAEgPoANAGABovWz6AAfMr1+nAHDnnQoA+0kXvWYe5jzo0yrgtsDIubN6zgY+qtwldr8B - pKB7jxm2YqyW0U4vzW5xGQNwo9/j3Walsh3b7Hn9trljPed4DSW7yaHM40psdeEW8e6L/mhze0NHznT/ - fdrjHACykIOpCvyNMq/WQV8DACpwpHeMOW8JALL1C0O/5+uLTY/02bWuZ9u3gSPw4V5LAFBlBXXeRhBj - gIf2pGK7JysgBAC0OLv/PB8l9yyxzV6ydA/Hdqct+HPmnmR0gJdGXhYYieAaG/tuAgy534yRldmS6bg0 - Z5A6vMj5CEMzN3I6P28HOV//Nrq3tSnG25ZUNoGfc2pnU5tbtVtVG+uygb6qLUttGvZUHnzgoXJRj0tk - /JjJMnXSDAWB0wwMLl20XN7+9++UX/3qV43nh5f58yba6mSn6PMyxrhe8kfZKfq8jDGul/xRdoo+L2OM - 6yV/lJ2iz8sY43rJH2Wn6PMyxrhe8kfZCX23RSBQrBQp6h31IeexdVSKa69uK/9TydeKno75iPc6dfng - //7v/5F3vfPdsnjRsjTnT3nooBG2EpjFH/SINT/KTiPZBCSwg5sIZKxhMnsFAL1Ro0Gi8TGuGhxvnPZL - DbHF0uBpXW/wmsfThrJq9ABs7Fs18NrhClCPawLACujtBgDpITQ9LQpJANB7DA+3t3F6yJiDxEPK5hsp - CPRz8AYygcCqobWHhz5M+F1gjU0NeLoW0/kNKm423LFB57raXmMdACSeB+9FPS+zxSCXXHaVDQOfd35P - WyXMh+f5EoHNU7I5Scw/St/hZbgRAMh2Fhs2bFcAeLfNJeQhDnijp5BhYlb/cgwbFtSHNqAAP5/ssl4i - BVj0AMUhSPLTy+HAgN4OH9alrg05ah0HGTF3HN703DbkWOVmCJH8DjDJHXuoiEW33GpDj7l9SJh4ByT8 - vaCnB3czFzLHB/jBruOzeJXJ6To+76XjGK7jMz3kRvfz8rpRR/ZrJIfrDX/lSwAt6fhg4mIsvx1s8VUM - sut+HPc1jttJtjmACgAnTZorq1ZuMwDIpuwAQKZl8DlC+w31WnIAyN5/LP7gM2j0YLPwo0ePizXuBLu/ - 7D5qw1U7Ylzdd5XeADDKbYEQXMUrJ/CUAFWqi11tdq+WwF+8/9yWmPubLxIddthhBnbTNIr072IrnrU0 - XX8nvojC3qO0O4BbwFnMZW2ln5cDXG1/aCu45+3cGjJctbH7JEBqYLbB5GHKCGDvAGuvEuhLZc4JADZB - 4H77UucAOfmk02TY4FEybdJMA4EAwNnT5skLn/ci+dEPf9R4hngZOadoy2NKssc45xRteUxJ9hjnnKIt - jynJHuOcU7TlMSXZY5xzirY8piR7jHNO0ZbHuNzuRtClSlCU26OO1qvztXesztbD3ipn7nM9ljEm13PK - fa7HMsbkek7uL3H0O/Ht3x/+6Efy2EtfJlMmTVPwN8yA37DBI437XtVfH96sxvPFHzTCCcR4w2hABRm7 - yRWAacRXWxdoo2eNOI2tydgS0zjRw2i6NWCpbmqQm8dqNpr7yIEHHigXX3yZfSaNBrfZAwjQa8s2PGxc - gT9l7/nzIWIAIwCJTZX5bjDHB5imawC4hoaTxpJyP+YOuUyZGlN/OMHpAeTsDThcXSeNf+M6XU7X6A19 - 8/r3MTDOYpDL+1wjl1argc/n28DnXmBzqfh8la0GPq2rAUA47QuoYEQBFv6NG3baKuAGANSHVA44DMxo - 6ToPcgeA0W8yD/ioq4yN3xPd6obcgDIHHTwoAXjI+DkPB4/ogAbXYWLJ534AH8fz3ABZ1zmGAcDq2NgZ - gqOnk+sgbzw2sejIBiar4XPPZSBZ66BznuiU9BxjdyCLHz2CZIAr8f772ZAgesjN+Xhucvl1oNtefVVu - dAPk4VjEk9dy6zlHQI7s1wnH3OjkisfCH38zzi0ei3NHBwCeqLETKwB49pndEwA85QyblkGvGBtFNwAg - ewBWANC++nE2GyBfYF8XYkN3XjZ5SbN7yAENbYXdU+keagCW6l5LcgIvkb2+3YNWv3lPpvwpX/NejACw - xE3AFhmgxvH5BjJtkH2VSK/hsENTu3PQwQdbW+X7GbatT15tX2A/H9oAjWu2FRpDvYbetCcASJuars9/ - D34rtpThc53w/tpONdqujGO9Zhu3n7WJfXr3lakTZ8i0yTNtKBgwuGv7zfKlL35Z/vcPuz+H4rOljvKY - VnX25tud/q/yNVYBx4A6vS4m2nPK60ElW6RSfHvUmXwdIa9TqvvnykecM6Au6jk7If3+ySflK1/+itx2 - y+0yesRYGTpwmAG/4UNGGRC89JLe9nCzr3FoQ0ODlRoeGq2qscJGQ1aBlYbfGqlUwtZDWPm84fMyNXqp - ETa/xbi/GevHsrzaYPFQAwSyZcQhhygA1IY39fwp2KuAnZUAvQrw2arfw3xj6KOEDWvx0VgfcQQrF4+1 - N3sa9v31TdgfOtYwaiPeaDxpVAGAKsOpVzM1vgZyq+vxB5E9mMyffpd4vX7NptvvwTWnh0SSm8yx2eqF - 3r/LtYG+uBcLQRQA2krgbrathm0toQCQlYhMPk9zlaoewNPPks0bbpSbdjYBICCAh7sDgjo92qOvYY+y - x3gZYj2mTve6ZsviYgwlQCTqLpd0Nqr2zaobtsBu93rOuQ2d4zooino83+gHUGEDAKJHv8tWv6oLEKN0 - vwHqEA8wi72NADNkjzV/pVvPpdq8LrF27MrPfRTPxXPZAhStBzB1P3nNrzrXwgvipInzZMXyrXLmGdUQ - sAHACmBnAJC/R4Z/2fuPOYNsY0Tv38U9LzUgmr4ylO6hJjcBzv7693+A3neAGn8Jgxvgz2yVnHPjPk0A - sXkPAv6cU9uTXsTa3nuJI4CLTLtU5lK8gTfq2LFoJ+DUFiSOOaI9+LQt4fexaTVV+9NopyreH8ambRmy - /Qb6W1jvIDFVvTb1lfl9WdQzbsxkmTF5lkxTIAgIXL18nbz/fe+X3/3u922eJ05ui8+c3OZyLKEoO8W4 - yNHmciyhKDvFuMjR5nIsoSg7xbjI0eZyLKEoO8W4yNHmciyhKDvFuMjR5nIs2wwBRzlSR2OcnaIeyxjT - HnUmtiPUKt9TOdb/VT7sHeVI6E/85gn50Ac/ImtWrlPQN9JAH+XIocwFHC7ndb/QGvRGw1M1ik0gtk8a - 2lQ5NpLWmBXscMqVgE6yeaOYGt627PXa6j7kSgNGbwfz2gBvAMAE9JjbB9hLe/yxuIMhKR5KRx+pD2t9 - kBkz3KkMKAQAAhj5mD3XxeeV9t+vahhtWKR6eISHkT1E9DwcvDnY5Robb+0GlNPvkRp5Hjxw9TuYjTLV - S+zX7QAwPJjUzxAmw8BsDH3JpX2kx0WXSPdze+gD9Vzbx9B6AE89TUHg6QkEnpRWHtLb1FUB4HUbdzaG - gI+wbWAUCPDwhytQwMM+59y3W1zld5DjNpe9vs2tq3TKCIpibMkXc7uN0tl90Z8D0xjrsuvkj3odR38e - v1td/FEP3Kqu+xo2ymir7O53e4lLOYtMTMzpdSqwGZkeQP6+Jk2aL8uXbVFQd471grHQyACg3puARQek - 9ELTu2iffjvzbFv5y8KPnhddanPOGCpN91e6J4yRq3uOexDwd+D+B8qB+x1Y3ZMVmFF+dsUuN+3EVboB - R0BmAICN9kXvr4qbbQ9tXdPv9+WeM21hdfwK0DWOt4+3A+E8VE6/CeeXzqkJ/KrSfqd0rQZy8Ve/nYE+ - K+Fkh5s2ZQCgtnn2u6p+3DHHy5BBIxQAzrbePwDg3FkL5dWveI388r//p3qSNKn0nNkT2ptvz2hP8jWG - gOsSxOR5CeX1SjE54Wvlh6I/xtfV60w+yHO6vaTXUclXqp/rdVTyxfqRveevwz2AKv/8Zz+T17729TJz - +hwZVg390vs3cugYufaawQqszrQGs9EgGZhJDZA3ZKkxAqCkRqnZSDUbL+rSGBkg4q1VGxoaJQM/9hab - 8jvAiY1tOl6ej0UZqeGkwWLSOltN2L5+YX8/NnymFwMG7KWP07OqMfVqwMgM+QIADzyABwPHYmiH49Cw - pjdiB25NsMZ1NsFf4nT9Sa7OU2VrXBu2FO+NcDNnqt+4bo2NDwv/Tfi9OVe+HXo5C0HYD5DPwp3f07aC - AQCyEhgASI8K8+1sKwp98PI7dVXf5jYA8CjrnSLGhyDp7aEeD23XycVDHx07nxNznQc9w4IODJDJZX7l - OAcQG0OjNkdNdY7NEGXsYfIhRtdj7xZ5ART4YHzF3i3VKYmlxEcc+TguQM9190fZdPXH3PjQ3Y8c43eb - d1eVDtpibCOm0iO3srcBgFWOyGavOD+fhj/IOec+5BIoRgYAMtfUAOByBYBdmwAQMGd/F4BA/g1ZDHHi - STYl4VTm/511jn31g96/Xr0usy9/HHLoYXovpLaC+625NyiAJN2HTL9InO4bA4b6gobf7qGqrbB7DEAD - mKm4AQCVU/vDvMDUdtk9Z+2bv2wlW7rnsDlHH+z3aD03psWY7m1AYs+X2tTEzWtoG0fpbSvXzm+Q5vpV - 4I1rNGB8oOlNAJh+P2+HGl9eqtqepKsP/7P31fopN5t6977sSgV/s2T65Fk2HMxXQe698z75/vd/UD1J - ms+kSG5r5aujVnVa+eqoVZ1WvjpqVaeVr45a1Wnlq6NWdVr5IrW7DUy0tfLHMrdBbs99eUx7lMfneXJ/ - e1QXj5zX/3PlgyPgQ3bOfXAk9O9897vy4P0Py7gxExu9fyOGjrad4K/sc7W+AZ5gjYQ3PNbgKtMAeWPV - aLBomKqY1GA1/Y3G0Pa0K7MDJs9Dg5ca/8QJIHlj/f/Ze89wy47i3hulUZo8I2k0Oeec50zOOeecNEEj - zSiMcg4IMDnnaGOwMQbfa18M+AI2xgEHgu1rwGCccLYxzhjk22/9qrr2qt1n7XPOCIn3fqD3U0/nXmuv - 1av639XV1VUdfCSBCvJk0PFTPrDpZ9I/JH8m8evXz4Ci6iLJwAQQQSpBWZSz+Y+0Z6DUrqd+43/AfPN9 - ajj/7/gfa0gBJeUy0NV2lfw/GrP2/+7PounZNe6B/3ul7qCcNXtBmjl7Xpoy1QxCcyKIngssA6zutBRC - dwybZdgkA5AAAO+9+1E9C5hj9JAAAkwicKKcLgsGsOM6ZeQDfHh+xAEZdXp6gCkFCxIH0HmcfNVnA1jx - zuSagFN8gAblIiCM4JI4YFKvTdtC/E/K0Ja2LXH+C3lcg3fsgJFyxAGdSCFpN+q3kUecsLYt98m9sFOa - MsT1WpLHfWLOxP8X/983t/A/KMe9cE/EaZf2KUsacf43cZ4hcW9b71va4rlqPF/bl5G5JnF/Jnov0hZx - iHbi+1IQlp8JaVzL75v/xbXwyePaPGN9RrwPiVM/Xtv7Ss8MAHftOmpLwMNYAr5O+x3fImoHgD4FgEK2 - AWRIGjJshPbTceNN9w9VE3b/duMb5HtwMKKABFCD9A4QZ4DFvj//HiCk9Verfi8rAVgI4Eg6vuP4/dj3 - bG06IKI9A2ER4NWTAsQCNFbttyYDfwXPcNK24//JZRpxu++qnoC1BuAz4j+V96JSwSu5z/JemJRWvJzw - FUo8GyMmpwou5RmNHjVezwPev+eQbQgREHjPHfelP/jyHzTpAcbxpQw7RRfTI7nrKFyWxcX0SO46Cpdl - cTE9kruOwmVZXEyP5K6jcFkWF9MjuesoXJbFxXSopQ6gu1Zhd56GH8nT6nx3Md5ZWVzMc4ouxmPZ6Ne5 - unq4VmHcD6M90qBW4K9M97ATDv2/L37xS+neex5Q8y8KAFdv0JNA8GdMn61AShkugCgwDBiRMZHMrCjT - ACyRjOkAWFiSZQDEzArSq+Ejxqg0gEPiYdgMHFdeBZOHCQGMaBfmV7Xjy6revjNR8tBvAcjpkq74kB3x - 1qcCgEgK5XqAPo5oummAgJY+fRX8eTt27fxfxff0rpDfL3X4HwDTa665RhXBCRtTL+roAGD/g7qX87/8 - /4WwDkL6LIzYYYoZGI6FM4PQ02wnsDzXoW4QugEA7egtdlgOHz4y3XPPY7YJZE5b1gE0ANRbnoWCBA0L - ZQBRS0VelBIRJs3jXj7GG+leN4cjxTKxrrfv99CUl+Nlehn3MNf1azfSAnldyEGSlyUe8xTU5nwAk8bL - fOJShrDHaculjd4uQMvbx28C6FLGQTFEPUCfxx2keZywg0nigEPKeL4DV78WANCvRTkAo+fTFoCQfE6R - AQTv2ikAkCXgoaPSdb4ELH3JAKBdm3qAVDX/MnyE6pdh82/a9FkqAcScikqyACAKbJDYGbk0K/IC4qh6 - oPM6ZcqMNGdOm9quW7FybVqzZlNaLRNZTgmaMnmafvu0YXXtW3J+5t9fpPhNlnlKpGte/i6V/N7s+2wO - OzWXa/ALwg2y69t3b20bb7D7dfCn9575AfnsRh49amxavGhZ2rhha9q2bU/asmVnWrd2U1rYtlwlrH36 - 9FHLBtZ2npQKGQA0vqegGJCs4PjydIPwjLWrNqb9uw+nvTsPpt3b9qUTh29Jn/jYJ9N3v/vdduOKuxj3 - cCxbR2WZ6GK8rmwdlWWii/G6snVUlokuxuvK1lFZJroYrytbR2WZ6GK8rmxJtbuAcWS6Hym6Mo7ztLry - 7jqq18p5e06dua6UwZXtXWq4dORdahsxHB3pEeh5+FkBdTHd86Lv7j/+4z/SJ37xk+nk8VN5+RcAuF4B - 4CphohzIjlFXW6oUygzIgZ8zjwYjFSqZHksJnLIxRIBIW9uSdPzYmXTx4iNKd971QLogM8nbbrs7nTx5 - Lh0+dCrtkBnm2rWb07Jlq9Ps2Qt1gOBYNgZomJO1356x+sCAbS10jwB8LG0aAOytOoAKAgUA3iADGba6 - AH/EFfxpOwbguE6UyFXXNCB7tQA6NpywoQRpA4Cy/w0cC4bkapAArqE6ALLbFp28GdPnpJUr1qa589p0 - QKSN2KaTMn+uj6/3Uw0sOkhAOUx5/h82AGdmUzAGACeqKRhdBhYA2FgCHmjHU8HMRwgAvO+ex/UkEOwJ - KgDsI0AAEjDgIAG/JAcMDP74mIxRszFFfoNIy3mRIlgsycs04pliGU2nnPtCfk9dIa/j1JRWU6ZVHU+P - /5/78HuxsvXXhLx8ox3xnbqUn9MIx/wYx68F5FCOO2iO76pdWUja8baQWiI9HjhwaNq561g6feqeNHTI - CPk2uqsEWiWAKok0CaDr/wEAsVeJ7b+Jk6amWTPnKkjjOzUAYhMnNoPYRg/7Fv07YYKm15BrTZJ6bAID - AGJHkF3EtMvOYk4UmT17flq0cJmAouWqZwgor76/+I1VFHmbff9OlLdvj5UM+w7LvFBGy8V4TZ6TpOu3 - rSTXhfz6mdRyAs8CAKf3Ba+6XHkQ9hNXrZTJ+7otwmvWpQULlshznac2XGfP5uSgxWmhPIeFi5enaTNm - K8Cv1F2MpxA2Xi/gj6XhPAlHqsrRcOgBQkgAORXkPe96X/r2t/9JBqM8oGQXxxgPRz9STGvlYl6s436k - mNbKxbxYx/1IMa2Vi3mxjvuRYlorF/NiHfcjxbRWLubFOu5HimktzwLuLD2Suxh2F8t0pXx0Xcl/Lu2V - /nN1L2R7JTnge1bAn1MEgCV5O//4D/8oH/F71fzLGgEoa1atzwBwkx7/BlDQHXkwHmEOmH9x5qiMQ30D - f6pLoowwMzchzBAAikYIsx83bkKaPcuOMJs7ty0tW7oyrV+/WWapu9O+fUfSYZlRnr7lQjp7+s509swd - 6cL5e9Nt5+9Lt5+7KHRP2rnzgICpMR2Ap8wshZldc/U1MvjIINVbwJ8wRweALAUjATTbZEhb+qsunQMq - B36+wQTm53kspbCbeNCgwXZc1cQpafKk6TrwTJ02QwahmRqGEeNPlHwGJPSbFsxfnE7dclu6/4HH0rr1 - m3SpEOlgvH8fHKpBgDj/x/5THCiMXqT3zg7KmTLITZs2R64ZAeBIHYQZbFmGZODFXAc7YEcIOLzvnsfS - o4+8VAEg5yKj4M/yHNIeHdwl3pACyUDPwBmXGCnH4E5ZQIMv8Wlc8pH2RAkT/1mBTC6PtIo2/Vq+fOzx - WBfJk0rGJI/8KCkjHsP4XFvvO8fJ9zh+LA+I8TwolqWMk8ZDmgMnyjbyQ7yZQprne1vFderrd0DFdf1/ - NJWpobJMlJq2ql/mcU3dBDJoWNoFALzlnjRk0HDV43MACOjj3WJfEvM79CEmJrr8KyBtKpI76YMAt2uu - vV4BDlJApPls9kD6Z0DI+jwrBKhvcFYwKg+jRo7TYxshNqAwWcQW4ciRYzVMGieNAAqny0SM03NGSR7L - w9W3xzeGVIxvEkBkvKQBxJSqb6/6Nt33cEzPbef7bhf28vm7jt+9Xx/ga/9d2hQy3mRLvZTDtMxgmWjy - DaPKwXI6cVZZdJkdSatMQocMZUKK4W2e+1jhTzPTPOFJWA9QqavwVAeASsr74OkWvuqqq4XXzUi7tu23 - 3cAySd+zfX962TM/lv7kT/60sQwcx5fOXKtyMf1H7bV2P4z22kkA6wp15QLxRmL5jtI6crHepdatc7G9 - 6Dprry6ftBe6PU+Lkr1nBfR9//vf7xIAdPrmH38zvfjpl6RNG7ao9G9dXv5F/49ZM4yEGWGDMQQmAVOC - OdiSjYA/JIAN5mZgCsY/WQDQsGEjdLDn6DWUipWuNXtZ113bXcLXp+vFxyQL+nts1rix/4B084BBwriG - K8Nmls+GBcAkS6oVI3USpij3BLCCmdE+0j0FfgBAGagI95MBTAFEv/66ZALI8/tFLwhlaZVkSlvWpgBK - uR4SQ5ZSBw/BftkI/U9Dhg7TgW6IpBEGaEGEKaeHwOtZoAPTcCm/du2mdPDQ8bRo8QoFS35tZ+g6ICjZ - 81XGXw4ohOWe8AG6mNFAD5CNIJMEkI4ZM0mZvG0EMQAIKQAE0MnAjfmNey4+kh59+CU6eLghaAVlGRwR - Vz0wiTsAVP01CQMCdFlwwMAGIOBdNwChxFmedFAHUZf/7ICF5+QAkGsgneSaxCnHtSlHXPX08nIncfK4 - lsepy707iKFtB7IOXPV/SJx7inHahvx/cZ/+v7gf4vq/evfVZ8e1AZjkcw3ifi1d4pS4SsakPNeytvL/ - kHZ4B9wjz4F8iGV30sj3ttG95L78Pj1O25QlXduSe6Qt+jTPgLJ6L3JP8fkT1vv0uJSljUY+befnTzyC - aK6t707SiVOPtojTdwwAHpdJzj1q/oWJCSCPZVf+k56MIe2pdFzeDd8Oxp+R7k8XEDJn7gJNu6qbSftc - 5w+dPuLe9/kO+a7Y7Q7AQ2cQszOEsSeowE8miRYeq9J3aHQmvpWxYyelGTOQOM7QkzwMWEKAnrwxhO+v - QdW36d8k6dV3WZWzuJWnXcy8RNCn1yp1oHMZv45f13gtbWTem/mw3YdtAhs+YmSaPGW6/i94DZNTvnmM - a48dMzZNkonqlImT02SZJLL8yzMgz83vTJdJI2eBjxw5Wm0Y2j3bNQHDNrHn+lfo5p6tm3bpBpC9Ow7o - bmD0AH/r87+t404clzwcfZznO3la6bcKRx/n+U6eVvqtwtHHeb6Tp5V+q3D0cZ7v5Gml3yocfZznO3la - 6bcKRx/n+U6e5n47MzBOdc7Tyzqli+Xq8jtydW2/UO3h/l9tDwLg1QHA73+/GQCWQNAdZzn+5m98Pp2/ - 7Q7V91uzig0gG3QDCPH5ArYYVJwBmJ8ZkZAqIguzVP0c3STC7NmZoEmnZs2cI+BkngwkgK0eCsJYhnVC - QgCxZOsSut5s2hDq2b23GmoGHDJbZ5mWsoAcJGsYb1aGqoy0YrK+fAS4whYgu36tfQZwAIEMnpKGPqKD - RZc4uO6LMVpj2Cxfjx41Oo0WhsryLRJE2oH692fzA7pZDM4AIADAQAWKtgN3iMzAh8ngNlzSBEzJddn1 - uEWY59Jla1V/ye/byJ+fDSjNADCQ/u/L9X/C8Gey1NMAgBN18Bs6fGQD/DHoAnqw18YzVB3ABgCcX+kA - yjtRAjhDgAHeD89QyMGBhnO8KU3LV/FmqtIBFs15HRPlHfg04qGNGOe+mvKEItAhz+NaVsKQ/h8hgA35 - /t9inDrEaYM4vsfJoxzASduWfAVhAoCa4pKvdSWNstT3thsgLbcNeOIb1Lj4CuDDtRogWfo39RrgkrYU - eFU6gYSR9vB+aIP+oNfK+brBxK8l+QBfj1NOga2kO7BVMCpx+g42KRUAnrxoABAJoPR5/qMBbLl23nSF - SgIS6NFjxukS7axZ6LDOFXCIagTAz/T97Fu075NvA/AHcMFsTEPaBykIRPIHsDFSKaBKAjMoFICDD+gB - HLL7eNrUGSoRhO/YNeBv7PS/Sr4vlwQ6IMrfnX57zd+jAzaLl9+xh42fdEzeXm4zXxdyvutx+JqCaHkW - +m3Lu+G5jpH/tXTmzHRi/br0xJFD6fVnT6U3nDuTXn7L8XT3np1px7Jlac7UaWm88CCeBUa74RltbcvS - hPFTdGLuINf+v4WhG264WcaFTSb9y+Zgbjl6Jv3cR/5n+rd/+/d240sM42K+h8syuLKMu7JszPdwWQZX - lnFXlo35Hi7L4Moy7sqyMd/DZRlcWcZdWTbme7gsgyvLuCvLxnwPl2VamoGpK+xpdVS6urRWrixbtlnG - o6tLL9Pq6pdpZX50ndXFlWllfnSd1cURjwAPAvgZmRSwDgB6XYizHH/2wx9NB/cf0WPfDACaCRhMwaCX - A2iqbNdlAKhhA4GAJd1Np7N0ZxrGpG4Whr5+3eY0c9bc1F1AFOBPJXIygKC7BuNtAEEFg+Y7WOvd00Ah - plw4NxPpIcRS0lRh3iyzkg/QcyblzBO9IZauAYMARVsOFgAo1wCEAeoAfdwnAw6W8hXIMujk3X3UBezN - mDZLBqm5CppYzkLXT5eQMSMjcQV+DbKdtoOGAADRdRraAIAMQkMFrPXu3TvNmbcwHTh0Wgc07r8cBLiP - bnnpvYkRN55x9uU9IFXhJJDpM+amSZOnq+4TAx+7LCsJIIOEnQkMGEeKev99j6dHH3mJvh8HgKYHaMAH - cvAQyQFIK3KgpvVbtEUbrdp38nodkZWtwgri2uW3b7eh70Y8p1V1qnBzenO5WM/bimWqtHCtnOegK5Zt - 5OW4pzmgLvMaRHoOa5mQV1veiXcQ4o2yLQB/g2IagFD6DiBk1+7j6cTxO9NA6WfXyeSKvucAENUC/TYA - KtIfAWBjxo5XdQkmIDNmzNaJmX6L3ezEDL4/+jzfRbdu3dJQAA9SPAEtW1ftTke2nEgH1h9K+9YeSHvW - CCBZvSdtX7krbV2+I21Ztj1tXrYtbRLasGRLWrd4o9KaRevTqoVr02rx505fqMua06fOUkkg1+F7UgCY - eYAR6iUebk/+bdbl+Xdt9f0b74zs+3Y+CsFv/RpMhgHr8A6ky/AgjOAvnDo13b9rR/rIAxfTb7z86fSb - L38mffalT6XPvOTJ9Nkfeyr9+iueSf/76cfT224/m46uW5tmTp6axoweL0DQgHjbgqUCDCfqsrJeN/MX - vbZcF967ZNFyAX570s6texQAHtx7JL35DW/RY+EYXnxsidTKeV5ZJsa9jUitnOeVZWLc24jUynleWSbG - vY1IrZznlWVi3NuI1Mp5Xlkmxr2NSK2c58UyCgDLjI4aaeWoU1e/q23VlYtt4rraFu65tFfmu6tL97SY - 3qpM6erSPc3TPezg79mG9K9jCaA7wn/7t3+XXveaN6atmH8BALIJJANAzgJGYbr79T2FAUQAiG/LvYAT - QJMDOgMkNltFsjZWZvg7ZaY4dSrt9JCBwyRwgDEFe5AMECoF1HQjAKBt3OgrTMekgA4CAXz9pDzSCVf8 - BtAAQAFSKjnI9wcA1MFE0pAeIpFkyflaYaCu88JAo8tMDXMQMN4XaZ2bbhyQFsxfmFYLGJ4xfZYMWqME - QKEjd0PqLwOf6REOUAbs5ADQl2MAXqaHM1wB5MgRo6WuADAZAPcdOJmmT5+repIV87eBgpk4+lIYtYYJ - K/jTe2sGgJQHEGMCBhDYAIAyuzcdQI6EQwJohqB5bgYAR6cH7n8iPfLwM2mmAH0HgEh2GtIuKcd/aoA1 - 8ZEqOQCknEu3PI6kyIEBYV/iJc2XFAm79ItwmU8c39vyOG05oORajbiUIa51JUwdrUs+cepKfryW34e3 - rXVz257n1BTPZfHLtpxinHCZD/m1uP8mwBzKdIXKtmMbjWuE/JJ4Xkq5rJcv63qZRjzk2xLw0LRz97F0 - 5Ojt2m+R9iOhoq8BUvgmAIH0QfTQRo4ancar/t/MNG/uIuUR7NjX75HJGBs/AIDSv9nwQL9Fh4+l/snj - Z6SPvPIT6Q8/+Efp8+/6Yvr1d0JfEPrd9Ovv+J30OaFffftvpc++7fPpV4Q+8+ZfT5968+fSp97yufS/ - 3/TZ9PHXfSp95m2/np449wr5RocKH5mturPwCr2e8A//tiKII6ygrCmvMwL8GQCM6jEdk7WvdRwAMsmV - ODyNbw6ewmYupMPDhM/sWLQwvefCrelXn3k8feT+u9PTh/alY6tWp43zF6Q1c+amrYsWp1s3b05vOXtr - +pSAwF9+yRPpxccOpUUzZzaWxtFnXiggEBNRbNxTfi/34sb8MY6PPcDtm3c1ACDnAz/28BPpK//nK03j - jI81ZdhdXX50nh4ppnvYXV1+dJ4eKaZ72F1dfnSeHimme9hdXX50nh4ppnvYXV1+dJ4eKaZ72F1dPq7J - DEzMwHk85nk4Uqv0kmK5S3XPpc7z4Z7v63a1PX9OEQBG6gj84f77v59NX/3K19ID9z2sOn+rBfBhAmb1 - KkDghrRy+Rrd5ABgAngY+MukQEkAljBpgB8Ao7+AEGVawqwAfyyncqzT7t2HdMmTpU4GbJPA9Uv9BWzo - UqyQgz7Nk7hKGCRutvxsWZhNHAwQSAsBKUiyuO6EiVMV9AAeAFIAOwN0BvBIu/a661KPnnbKxxWSr0AR - 8Krgj4GGNMrDeG3jyiAZsNrmL1LzCStXrElz5y5I48aN1yVdFNB11y/GpCXM/XDUFWBJQVYGf4AuJCPo - Aw4dNlz1BlF81wFRyu3YeTgtaFumA0/F/G3QYNcdOnwDBnC8nYDAhjTEyEChSSkYhHkG05AAChMHAHId - loDNGLTtAjYAOEQBB9LIBx94UgEgp4j0AADK+wHAYiaG5d9+/WyJEZDBYA+I4rkrCJC4Lws6KFAwLP/N - QZhKJyTNgQJlaYM494AUw9vGN3Bqcdr25UzicTmT9slzAAnx/6hDnreFiRziXJPyfm3K+fKltu33LWGI - PL9vj3MtwtQhrteSOG0S75fjDMjcp7dNPZY2HUDpM5J8wh73tvkfhL1t2qAs1yBPr+XPIOdzbW+LfOr7 - M6Ed4g4wiUNen7DfJ+R1CXt58gnj8x89zrUg4roEPHhY2i79+fDh29IAAGCPHjLhQe+X947kuQKA9MlR - o8ekCRMmC4+YJZOsJdJvp8pkp4cAD9v1y8QSXsO30LtPH13qpB7vedrEWelTb/z19Ac/+bX0+otvSy+7 - /bXpNXe/Jb3+3renN93/rvTWB9+b3vHI+9O7Hv1ges/jH0rve+Jn0k889bPpJ1/8c+n9T380fey1n0l/ - /8l/Tu949P3aT0aNGq8qFGyWMMBlUvfmbzIDshyuiHIx3lwHqup5XiwTw17Ork1YgZ/ek+18ZhKNyRv6 - JysZg8Tfs2iRgL670icefzA9vGdXWjRlahosz5r3hO1K3W0v74H3OU54yo7FS9M7L5xPv/ZjL06vPXtC - QSBL8kxOmQyyIYfVGr9vuycmy93SZOG3WzZsTzu3CAAUEAgQvO3shfSZT/9K+u53/0vGmTzAXKIrx6cf - 1P2ovR/MeXstl4DdxXQPd/VmulKurv1Lda3auNT2vHxn7XW13R+kPdKcShAYQV9JXhfbTb/8y59Ntxw/ - rcAPiZ8CQKSAK9en5UtXp3FjJ9qRaMKQTPJnUj8AEyALYAagGCwAB+ZijMqOT2PJBh3CPQIAhwvDQoLH - 4KigjwEkEANUIy6gSqU6GQByDciNOgMiGUR0WVOuC7gZM26Cmj8BhDFD9mUk1ZkRxsWSBuADpXR2LCIN - 1CVfYWi6xEE5uWeYri41DRmqkj/MtqxetT6tWb0hLVm8PE0Rxjps+HAFeg4Ab0T3T5gwwAlikBs4KINA - 1QEEAA4PAHC05qELtmnz3rRs+Tpd0mkeCACA3VVSwv/k/wII9T5lUIxEef4TpjQAcgoABXCzC3iIPHdO - W+AeeE6cv+pLwA4AHxYAOH3GHN0F7BsVGDh8GZCyfm6uxZslTnVxBzu815ivErucxzvWCUHO03zpH438 - HCcMKeDw+jkvtt3YoBDiei9Sl2t4nDzqKhDK+YRjfQdhxLUt4vleaIO43xv35CDN21KQJuksM9OuxiVM - PnUpr4OytE2YNG/b43qfEgdE+71wDfqC/y/i2N8j7NcmP9437Xmc+/C2KU9Z6ui1Jc0BOPeGrzqCcg3K - A/5uCtemHcBnX5kkmARQAOCOw+no0fPyPQxMPTIARLLPdZTk+wD061LumHF6/NvM6XPSwrYluhv4mmuu - U+BnJBMy6dt8z3wzw0aMlGvYpqqpE2akj7/2s+kTr/vlNGfy/DR08Ig0ZsT4NHrk+DRm5IQ0btSkNGH0 - lDRx7PQ0adyMNGX8zDRtwuw0U8pOHDMtHd18Jv3xR/4yve6et+l/GjFirE6aAD/XX3+9flP2bVXfpPI2 - /TY7o/gdl3EPl+RlIwEAmWwbb+L61157rUpVBwnPhY/eIPxn1fQZ6ScvnEsfe+S+dGrdujRCeJfyU3lP - /eXdcIwbJq8AjLwz+Gt/mbTOFvD9Y8dPpM+97On0khOH5ZlO1FWKsWPH66YQ7DPCR7muTfxlwnz5VWms - gOWN67YKANyt4G+H0JGDJ9IH3v/T6Z/+6TvtxhsnH3fq4u7qwl6mpDIvxt3Vhb1MSWVejLurC3uZksq8 - GHdXF/YyJZV5Me6uLuxlSirzYtwd4aZNIDgv5FS6uvIduVbtRNcqv6N6zyWvszp1+R2lvZDteX0nB4FO - ZX50xL/zne+kD37gp9Ku7XvTquVrFAAqCFxhIJAj4FgaACi51M8lZd2uukZBGTN7zpkdhASwP6eFVMAE - 0AVo2r3zYBosjBtTLA3JmYNAARnqw6wyoFLAwaxVBhUjpH+2JNxHwrQBmOEEDF3ilGsjXWDXK+ZQAGcM - GlwfEMWSMEwMQEi7LE3B2AxMVYCKTRXUYTfvnLnz02K5dwzIrpJnsW7t5rRy5VoZIGbLdUbpiRoRAN54 - ExIlA3+ALHb9AgIVAOYlYEAgzJtde6TBpFev3iIAc4tucikHBaSVCnKpK+ARY9mAQNeLsgHJAGCPnj3T - eGHo6ABOnDQtjRHgrhJAuZ620QQATQI4SvIfeuCp9NCDL9al9B48X0l3MAEBAjUcAKCTbhAJ6Vq+8J06 - ihNuIukLHu6ofEdxBaA53YGX5VX5Xq+OYlt18Yrq0rpG5TON7QOyYl5H5IDM65d1Y5z3HvMAkDGfeJnv - YcoR92t5HN+XgNkEcuzYHToRQwJIf+cZcQoIRsgBswBA0tnIMUkAIBtAFrYtFfA2ViZmpq5BH9fvVvo2 - qwKYe2GpVgGg9OGp42cI+Ptc+sXXfDpNGTddv3k/6xrQakQY4DlYrw2vwjxK3/790vYV+9M3PvxX6ZV3 - vlFBEeoQbCrBXh7fi4Ee+c4yEDOqwFnrJeAIGm3pN8brKdaPaearuo08C6R/bKLBDFY/1dXtl8YJX3jZ - of3pU48/kM5v3piGy/NR0CfvpTGhZqUl+57nYHDmhEnpzeduTZ968aPp2Po1CthRU8FmKRJRVlzg6fo+ - IHkmw4eMTOvXbE47MgDcLv7eXQf0JKk/+7M/17HHx5g47ni4TI+uVXn3W+XH9OhalXe/VX5Mj65Vefdb - 5cf06FqVd79VfkyPrlV591vlx/ToSG9pB7DO1ZX1eOmXrlV6Z66z9i613ed6H63cC9UefqSOwB8UHfE/ - //NvpVe+/NUym9uiy70OAJ1Q9sW8AhsRkOgBmCADUmYqA/A3kGVOYZpIOsxkgQEUZqsrlq9VHUDOi2VJ - AfCG3lwTCBRCn44ZrQJAidtOYSR/Mtg0wJ8xMYAW4I/zbkfJLBVFaJaFYPpICtgdzNIlIJDZLoCvAqbc - n4ezRBMGi8RSymO4GWX0OXPmyyx4UVqyZIVKADes35LWrNmY5gowHDV6rICxQfp/dROIMFIGIN8AYhLA - wUqqAyjPx3UADQCOUmkgS9nLlnFawTYFdhXzN7ru+usVNCLBU/AojJlnji4l70GNwgoxSPAfx4ybmCZP - nalL4uhKsQuSTSAOIhUA6gDJ0WH9FAA+IuDvYaGpKMELs2cwR2LkO2KJ34AESXwHGI0lSCEAgEqUyBNC - muSSMsqoxFfIQQT5tOlxrZvDei2Jez5+rMskoSkuYcr4tTSPeJHv5T3s4EXjOS2GS3Do5WOaAym/dpnf - EXkdfWYhLZKnN+WFeJkfw03xzvJzvCTPQxIYn0dZDiJdl4AFfOzefSIdPXoh3XiDAMDu3bXPOwDkuwCQ - MSni+wXUTZ48Lc2ZPV9tZGI8WtUxFOxUE7NhQ+Vbl76qk025Bm1MnTAzffy1n0u/8KpfSpPGTtF+Y3l8 - d6Z2oZMeSVPSON/fKOnPN6W9646nr//MX6WX3v4a7ZM2kRwhk6gpqguI+oryjHagzKSA7SWBVX5VPlJH - 6a3I8o0/wXe7qVQOEIseNCo0W+fNTx9/5N701rPH09RRowQsw0ul3yO9l3ejutWBDATKdyb/WVctbhqY - trQtTv/r0QfT286fSbMnT9FnhTR23tyFym/gjZDxmsvTzQMGq574ji27FAS6PuBDDzyavvCFL6kOuo8x - 7pfhunikMs/j7pfhunikMs/j7pfhunikMs/j7pfhunikMs/j7pfhunikMs/j7pfhurhTy5NAcBSo80vn - jUUX42V+Wdadp9fll21Ed6nttSrvrqP26vJeiPZKigCwDgTGes8++2z60hd/L9178X7d+AEAdEIaiI/V - fMwrdBNmqMcDCVi6UkASUjSdTWdQoQwXACjgDgBoZTmS6Pq0ZvXGtHP7/jRAQIMCwAwQnHRQV2JQZTkN - 38JK7AjuxYke7OC15TYkYSOFEY4bP0UHESRdDT03YVgu/WJZFX0ZZs0mBTQmprp+UAaAqmwu+eglYsh5 - utBMAYHz5y9MSxsAcGtav3aTprFEgjkX2uX/mGmLCAA56N4kgAN1F7AAQN0FPEJ1jJhhsyOYe1u4cEVa - tXqLbrQpBwcA4GApz8CkS8jUE2Ipu9oYYjqAAMDR8r9ZBscQLPbVkGoogMwAEOmJSmHk+XFtlL4dALKB - BAAIaIr6bPq85XoAHF8W5Bk7GOD/I9VxAAh4bFpylDwHebxX2nKAqG1J33EwxbUZwL0u9QCshCkf2yZO - HmUIk0ZbvpxJnLZok/vGpzw++dSz5UsDkLFtlm0BucTJg+K1qEN+o+0c9//FPShIzm0Tb7Ql5fXaEndw - RRziupQh7P+DaxH3+yZOW/jcK9f2+4a8vD5TCdMO5Pm8V9pysEsedWibuNd10Kdlc5xyjXi+FzWfI74B - wGECAI+nI0duTzf0H9AAgEjweNZI4ngnfKfosPHtcv4vBuExYDxQgAWSeQeA9GskguPHTVZwGAHgtPEC - AF/zufRzL//FNH7URPkf6KqajUuuEYnrIh2kf6hdwv79FAD+0U//VXr67Cv0P3E/biCZyZDq3Mr1DfS0 - B2fNADB+tzG9zKvIJINl2WbS84ZZAtbvnB24PXXDGxs/WBkZOmBQemTXzvSZJx5KJ1etSP15hzJh5nnT - zyC3sODUt4+8QwGBSAFph344TnjlS48dTb/4+ENpz/Jl+ozhHXPmLFBpoxndr54F7xad6O2bBABu3i0g - cI+CwXNnL6RPfvyX9GSpcsyJPi6GcbG8u7K8x0sfF8O4WN5dWd7jpY+LYVws764s7/HSx8UwLpZ3V5b3 - eOnjYhgXy7sry3u89HExjIvlmwBgXcHo42Kak7uY537Mx9Wl1blYpq58V9qI7lKv6e5SrxPdD9Ie5bpK - pfvP//zP9An5WE8cuyWtXLY6rci0cpkDwdVqBHq4zL7NNp6BJZYqbxLGwywUQvEb5gpTBwwA/FzaxgCw - fu3mtGvHAbU9BgBEWsZSMWUdDLpEEEkgg48BwhyHqQkjwyeP+oCa8ROmpslTZumMHeVwJH+kw+QBSuyA - ZeMHS8AopKNTZEyVezPgBLGkDVC8qttVMjgMVckfRqtnThcAKDNgpKDoAWLKZu2ajalNZsucZgK4awcA - MwhEz4lBiqUq3QTCEvBQlqxNDzACwPnzl6TlKzbKs2oPAK+97nqpi/QvA0DxkZxAPB8GSldAv57zP8dw - pNaMNFYAoEpGMwDk3RgAHCL3Z+AUpXoFgA8JABSaKqBXTwLhmUvb+E5cywf9ungEEAoKQn3CEUQQdsAH - 8f5dEqbvXuKxrQg4tG6+FuQTiEY8ACXqILn08vgKbnKcchEYRaCkentSFnJQBsgi39si7tfCp6zfC3EF - ZRIH5FGPgZY8bwvSOPcpdT3O9QnTr4hzLUBNvDZxfL1vuRYgJ/4P8gl724AvzzdAXgFGADll/Nosz/q1 - +D+Aff+f3rbHvW3ivgSMBBAA2B8A2CObgekj15V6pn5g3wQAA3UNdv4CAGfPmp9ukvuiT18p3yTfJf1a - jzebNE37Lv8T3TckiVMFAH7iNb+Wfvalv5DGjhxv9yZ8ifsBCCplAKjXFlJdZeFXfQQAHlh/Mv3RT/1V - evz0M/Ke+sn3aGdmozM7ecpM7ZN8g0xouY+OKX63zXn1S8B19Sw9AksDgMajAIBI7NhU11tVYvqkqcLz - 3nXudPrZe+9IiydPVhMtTJbJV2oAQHnXCv4kLNQ3SwHpO/RLnumR1avTLz3xcLp39/Y0TN4Zzwn7iLwj - M7hfAUAAJPrh2zbuTNszANy+eWc6euhkev+P/2T69re/nUeZH8zVjVs/iPtRe8/N1W4C6azxH+TiXhff - yV2rdlulR3ep7bXKc1fXTvTL/Bivc2X50i/zO6NSCuj1cJzd+L73/rge/7Zi2aq0XGm1koHBVWlR21ID - gAKeFAAKKQAUQAWoUcmSSt3Qc8ubQIRBRACI7txOACCDjAwSccmUWbsBQAFS4hNWxpTJ9QN9+YIlD64N - s544iR2vc4RZz1CJly8Fw8TV+LEwMKzac1YvbXD/xlTt3mwpGD2jq9T+F0wOKR0SvokTJ6fpwmjnyQx4 - 8cKl+iwAf6tXr0/z5i1MY8eNVymk/wcDgBkE3iwAcKAtdZkxaJN4uC1AXQaW++NaMOjZMvgtXrJaAFy9 - BJC6AEBfBgb8EWbAtU0rNpBgdHfUaGyqzZL7m5xNwGBzcKS2weDMZgGTxAAA+yYOjH/koWfyEvBMadMA - oIMBJ+IxTaULOV7meVoMN8p6npCDwKb8HK6LxzR8DTPA5bDGY5g6MRwplGsiyYMo42mxTkyPeYQdkDXl - QyE/hr18U774Hi7zXGKn8ew7AcDwy2tBhD3uedT3OHUb5SXONxjL801726STH+OARAAFm5CYDO4BAB6+ - Tb7fmyoA2G4JeKhuQKpOAGlLM2fOUT6gOsbyXZoZlsv0emwUcd1VgKDavBQA+MnX/Xr60Iv/RxozfKze - J30bQKN9XMrQzzn2EAAI0AXMDh4k313fvunQhpPp6x/6q/Twyac07isIrGRMkAkgZpX4rgyQ8Z1V35pR - BdTKNKvjaZmaTv6oqxvTPZwnqcKjWIJlIx2Gq1EBwUj+QuFTH7n3zvTO225JE4cPl3RMZJnuNLxWv9Ne - 8h6bJID0HybX9u7gXazOrJ0zL/38Q/ellx07lMaoqavBap9xAlYgZCLKf3IACJBcunhV2rphR9q6aYcu - A2/btDPt3X0gvfpVr1M9wHLMKcefVmnuYr67WC6G3a9Lcxfz3cVyMex+XZq7mO8uloth9+vS3MV8d7Fc - DLtfl+Yu5ruL5WLY/bo0XO0mEHeEy7j7ZV4rV1ffXVfa6KhMmddRWXcd5XdWt869UO3hd5Wi+78CDP/0 - T/8sveylL1fJloK/pc20TAh7UDAdM8dQLZdiTgWmCrNUKaCAC4AXkj0YhOmMXKHLKCwB79l1IN0sTBlJ - noI9QJOAJdsQgiTGwR/LEhUIhEn1lTqEGbQgGDngBqOlHOXEAEKYDRBIwIYjCRwGQOJA+csVRAECAXww - cQV/MDNlsHafSAmRtrH8jAQQe38cSj9HmOLChYv1vGKWgVesWKsGa0eNQQdQAOCACgDqJhAdfJD+QTbY - +U5gA8x5NzAAVcJIAGfOWpDmty2r1wFEAih1Adc8azZ0IAWEgfMeeNb2vxwAZgng2ImqpwgABCwaADQJ - CveoAFCe6xgBzY8KAHzogad1aYlnxpJelKQxyCPpUVAgz59Bg3cICIAUFIQ49RyQaJx3JxTziTuIiWWh - WNZJwYmQ57crQzznR/JyXrck8httR8r58boxHMnTI2l6prJMjJdhpzItxvF16TjEy7DHnerK1OV5PKZ3 - Rjwv3mVcAsYMTD8HgMIXAAz2XSCRY7VgmEoAJyoAnKPngvNdsUrgABCbnHyjSEPZ1a5181IuaTMmzUmf - euPn0wef+mgaOWy07VBGAsg3KJNEwqgmGGUwCM8SXtWrT590dNPp9I2f+av04PEnNA4f05UMyWdCySTV - vkO+r0j+fZbxKq0WALajjuoL0JJnAPkqhdpUHTtBJYDXXXO9WkNYNnVa+oUHL6a3nD6Wxgy2DWJqKkut - Jdhxmmyea0gEdXlYvjkHgEIsA7NhZ+m0GenD996VXnvL0TR+1Gg1iQRPZYUF/sh/cp1I+PiSRSvUFMyW - jdtVB3DrRgGCW3fLZPKx9OUv/Z6qGLlrN/7kePTr0up8XAzj6srWpdX5uBjG1ZWtS6vzcTGMqytbl1bn - 42IYV1e2Lq3Ox8Uwrq5sDDcAYKsCHsZ5vEzH1aVdquus/qW2f6ntEa+r42meX1cGV6a3Kutpnt+qTJ2u - X10a5HVQ0v3CF76YLt51b1q1Yo0CHAV9S1Y2aKlQ24IlwqjRAeymTBlmhP4cejosWcKUAX66CUQYaAMA - CqNQ8CXAa+XKdWnfnsNqpZ6ZqS0BG+BrbAjJ1FiayMTxaroxRMJIA/v3tbNiR4waozbv2D04c9b8NHXa - HN35OnbcJAE9o2RQ6qO2/lhOwqyELpUGAOizedOv4cSQq1QCiL4RenooPyORQA9wwYJFaelSloHXiL9C - AacqpAu44+g3PREEAOikS8DYKBwoA4pJHbhnnpEBQANyADsA4KxZbWnWnLbEmcXNg4EDQJNKABzZ0MHg - rKYZ9P4rAIgEEQA4YcI03V1pO4BN+mdA1AAgwJs41x4ngPmxh1+SHrjvKX2eAHsAGQMloM5159RWn/gK - AHNcQYIQ75N2HUAwOKtOoIQBWAB2lf4CFCTuS4zk0xbg1oEY6Y22JQ7wpL7HFbzmtrl2o+2c721z35Sh - zxH3tinPNbXtG2z50q/NfTPoUQ8ij+t7nOvGZVnyvW3a5D4AuzFOPeL0dY1LWONST5dd+xrYskmRPBPJ - I05+3ISjcdrK/0vjkk7Y6+N7ea7veXVxbSuTSfAkL19by4a2Hahz355WF2fyAA/YveeEAMBzAi5uFADS - U/ogqg7NABBQyDc0YfykNH0auraLMwAckAEgR0tinulyVd/AUHTU7+PZzZm6IH3mTb+d3v/Ez6YRQ0fp - M7lRyupuY3k3DVIwaFJvCJCHtPLk1nPpj3/mr9O9hx8yACjglf7Bd8I5wWwiK79HB2iEuwbyoEsp5wSf - gt+yC/ryhFF7ACC6kDwvVFZY7l08aUr6+fvvTu+69UQaP3SoTrh7qbF8M5rPDl4FgE7CQ/k2VA9QdQGZ - cMO3BqRl0w0AvvL44TR2xMh0g/AJNpKNER6hEkB5FzoGyP31kee3eOHytHH91rR5wzaV/iEN3LZ5Z7r9 - 3IX06U99Jn33P7+r4427cu57tG8AAP/0SURBVBzCxXiZ7z4uht2V5XExXua7j4thd2V5XIyX+e7jYthd - WR4X42W++7gYdleWx8V4me8+LobdleVxMR7zazeBeMHSxYoe74or67VyXW3P3fPdXmfuh9keeU6tQB8U - HXGOf/v4L34iHTt6Mq1oAD/zMf2ydJH5CxcuUSVgPY4sA0AngGB3YUIwZAc3DB4wMFtexQzMNWmJtHno - 4ElVsmajgg52ApQc9JkUUJhRHojMfAHMiYHNgCCmSHzmChMH5LEEPGfOwjR37iIFgWxi4OgzZroAPrVD - eNXVEkb3j5mrnRCC5AwzE0g1XbcG6naVgEABgJiBQeq5aOFStU3Gku/ixUvTsmUrUlvbIt21CEhE10/v - zwHgTcZI1QwMm0DURwoIAER5HbBcAUAHYbNnL5B7n6U7q8tBwQGgLrVLPZ5PE/jLz5qyHGvHEjAbY0YJ - AFT9vwAAkViyHOZLcegAIlF4/NGXpgfvf1qlLLYL2EBCHOQd2DjFOPkRjCjACPn0CY+Tz0DtZT3u+fjE - HdBR18GLxwFThCH6kudDgLh4bd5Ho20pF/MdlHkcUEG+Xwuw6XFIAaCUIY84+XqvEuceyNf/RlviAzpo - 2/UJ2wFZiTfaAqgIEacOYb8Wcerq/waQSxyg6/+ba6KG4W0TB8QQ17blWn5tiOuS5nHa8mtB7FZX49kS - 5hr0H/+f+PRn0onzfPjf3GNPAQX00z0CAA8dulX7KkBEN4EI0LXvwpZikbahroHdPSZUfGOzZTLHffGN - IpXn+6Rv881PnTxDJ1JcS5+F8I35Uxemz775d9N7H/1AGjaY1Qfep7yzTLSlzzUDQOIARNrp1ad3OrPj - fPr6T/91umP/vXLvAl4H2QYpvlXUSQBPfFf+fRlVIM0AYMxrRUUZXQqOabEtJ+NXDR3AvAt41MhxadbM - +Wpd4XrhpTNHj00fvONc+pm7z6a5Y8dkANhbn3sDBPYwKaACwd4mPdalYHk/PFt7bjeljXPnpZ9/4J70 - 2L5daag8A3gadhp5T/Bxk8pyP5erBHDxomVp49otadP6bWmLAMAtG3ekzRu3p2OHT6YPffBn0nf+6Tsy - 2ORBR1yrsagkd2W8dHX5nhbJXRkvXV2+p0VyV8ZLV5fvaZHclfHS1eV7WiR3Zbx0dfmeFgnX4S5gd7FC - 9GN6K1eX31md/5fc833/XW2PtM7Iy0X3D//wD1n/b2+TxM/A3woV77P5YeGCJXpOJJIxGABMyKVnGhfG - hOQJ/RyWOGEmytAAVQCwbt1Umnb44C0qbWJJyMCfgUAGStejgyEZALSjwwCApv+XGVYGgShCA6AwdTJn - TpseYM6ZusxWURjnHpE+cs8q+dP7zQCQpRTd0YZy9+UKpuxUEJa2r1QQBtiFhss1li5eobYA0QtkKXj2 - rLkyaE3QzSK6hA2IFfBqS9r2XxjokHZAAEEd9DIA9JNBkIrowCn/b9bs+Sq55F6qQcEIfUv09pAAMoj6 - /2kaMHSAukwlMJjFoS2WyFUfEr0m1f0zyQn3wqCNDUPA53gp++QTr0yPPvJSBdC6BCzPvo9cywEBIKFV - 2MkBWy15GQlHvwxrPPhe19M0nbQO6sd0z9P6Od5oP+S3i3s4+02UyzeRpCuVaeJ7eZ6pPdeqDHG9Tkjr - KO73QLiurRgHoNG3PC/ml3EtK3Hulfb5NmM+cXzySOeb9Xzqen03A7Nn9/F06MAZnYgZAMxHwWXwBwAD - VGIKaZz0P10Clknc3DkL9PxglQDK92u85jKdBKHiweRJJ1TSRl/55tqmL0mfe+sX0zse+PE0+OYh+h0C - 6JVuwDcAj8+mFwX4QtQHAN668870Rz/1rXT7nrtST4kjmQQocn9IzgE9fIOcvtH8Xdr3ZsAwUsxvLlvF - Y3pdmoNB41lmdxUgLN+8XI97Z1WGpV54wwiJv/rIwfSpR+9O2+fPTt0FALJTWM9MV/DnZEvC2FN1nUCd - UAsxwR4o//vW9evTJx65L92yZqUuxbMhB5MzPA/bBcw9GFF38cJlacPazWnjus0KAjdv2C7hrWnv7oPp - TW94S/rLb31Lxp3KHuBzdXV1f9Re193z0V7TJpBIdS7mdVSuK66ublfaK8v4fTxf7eH+X2jP67j0L0oB - PVw60r75x3+i+n8b129WkIOx46UC+Az4GfjjA0cCNmH85HTdtdcpYOLjN0ZlDJqjyfBhSAOFqWMeQJmY - MCuYOKAGA8NHDp9O08W/Xpi5LukCnAJ4ggkpQ+on4TwrZXkCAGjmX4xgXMxWWQ4dP36KgKe2NG++gNQx - E/UeFHjKPWKqRhWnJWxkgwmMVu+rce6unQMM8FPjs1LHziCVuldckbDft2L5ajUEjf0/pH8oryPdMyDL - vcr/kft1aaaBWvQBbTewA8CGLqAQO4Kt/IA0a9YC3RTCEo8NANWgwC5mpKssFXI/9h98kHCy5Shm9hzo - zvKVbgDJ0j9d+hUACEjnXrgm4JPnOVGe4Y+95PXSF16fZssAbBJAAd/yfxwAQDrgQzEe84UiWInkwKIu - r6QIsKgTKaY1yni/yPEGePN8Tyec8zoiL+vtIL3zuio5ER8wQ5ovM8fyHvf2/Poeb5T39JDn+bzr9mnN - bfjOZG9Hy9SktaLnWtbDJZHnOoC7dh5Ne/ee0MkYGxGGDTFD0C69QxqNlJElYGzNwR+YJLLjfqjUZ5Kj - Kww64URqf4VKCpFoA9BuHjAo9ZFvbsmsFek33vql9JZ73p0G3oSEVAAgwM8pAEDzSTeTRVgjuH33xfT1 - D34r3bbrztSzdy/9Tlj2RCLKcjPXtm+r+h41rjym/AbtOzTyb9Lr1pURqpEEQkxUHQBWy8DGF3r27JXm - L1is39vVV1+X+sjzPbFiefrVx+9LT+7Zkgb276dSwJ7dBQAKRQCom0IAgD0AgX3VvBaE3vXU0WPS2289 - lT508XxaOGWyvlN0tuF1/fr10/+r98b9yH3Bp7EQsX71pgwCtzaIDSFPPf6S9H/+4A9VD9DHIyd3ZbzO - xTIeLsldGa9zsYyHS3JXxutcLOPhktyV8ToXy3i4JHdlvM7FMh4uyV0Zj04BYFm4zsd1JQ8Xw+46qosj - 7hRdV8qVcVxdOVxMj+R57nvYnadFapUOeZ77HnbnaZHq0gF7JQisA4DE0f/7nd/+3XTx7vvSqhXrDOwt - WqaAD70OJz5wrPNPmTxdbdTpkgRAKoMsGLSdTQswuVwVhbvLjN8ZmTPv0aPHpv37jklby3Q2zwAKM1aw - 1x/AZGFfAoZsCVhIQKGaLpBZKzNYGBdgCxA1euyENH7iNAFTI1XPDyaq4O+KbnJt052xezYmSx6Dx7Tp - M9OceW1p1kzOuuyr+Zz7q8fCCQDUpWEkgzoQXaYzYMzAAATZHQz4ZCAyEGtLwA3wJ2SSQCEJq96TSi1M - smASQCOYOUtSnN1LezwvQJ7fL8R9de/RvTEY+bNtJjNVAVhGAshzYbBUPcMhdnoIS1u6DJYBoEpR5Ply - BNeb3vCe9KY3vi8tXbZartVLwV1cFkQCxNIeoDDGCQOCGFzRtXMg4JIe2oGQPPK+yecds1ypNgZ5zxIH - DDigpG2eE2FIwareq8X5D1xP86U9ruP3qXGp24hLGeIuwaLfMPgDZMknnba4NnGAO3Upq3EJk6bXEgI8 - 0AZ5kEq/uG8J0wbt+f/QuOR7W/gRVJPvz1Ofg4T9PiDC3paXL+Me5nxXjYe6pHtbtN8uraBGWzGe/aqc - hIs2GvWEAIAYWt6yZV/auvWAfK8GOtQQtJRFl0+/BQGA9B8k1OiXqR1AmXwgBRwyaKh+d/Rr5THyHRMe - OBDDxJN0ORcpYZ9+fdOyWasFAP5eeuPd71T7gbwrpFa6/KskfUfeL9+8EteX909Z7ueOvfenr33gL9KZ - 7belHr16ar9j6Rs9RviC8oz8HcZvz8FQe6op25RWpbePR6oAoKdxTSSRrKiwKxcdymu6YeGgR5o1akz6 - 4PnT6eMPnk8bZ05L3SUNKSDqOZUkkI0heVMI56r3tMlMf3lvqNycWrsqffrx+9NDu7YJmOb74lvivObh - ytcNgMLTAYBXyLdws9qIXbtqQ1qXQeCGtVvUZ2PI3Xfcm371s79meoAMQc3DUGNcwo9U51qlR+dlYlut - 6rVKj87LxLZa1WuVHp2XiW21qtcqPTovE9tqVa9VenReJrYV67XbBBJdV9Ji/Uie5i6GS/fDLudpP0h7 - XU2rc12pGymCwEjuPPzv//Yf6Rd+/mPp2NETutPXAN8yNfmySECa0gIBfwuW6nIDB7WzecMBIIzZyZeF - KwlbRSoxFJ+6nHaxeuVGHTABgZzO4YCJgZNZKAOmpotvEkEZYNyEgfiN00AkHUv+BmLQibMlXZik3ouQ - Losq0zTgBIBi1+EiYVrsOMR0zIK2JWnNmk2qG0Q5pH56CgFLUPq/ML3A/3qR3Hf/1CblORmE5Vu7b+6Z - gT4DwAAC2RyCr8vAmdQmYAaADE7XXXu9/ufhI0dVTDZfrxocPFxH/qxfpEAbgILu0kgB3AyuLL25/p8a - f5bnpRJAAdzqy/9GovmG1707vf99H03btu1JDPA83wbA4B2IX4IXB1UeB9BpnLC+Rymf6zowAjDgA6wa - 7QsB6jxMPeIK+KQ8zwfwqOWJ01e4Fm0LUbYB2oTQcSTfr8X/bMSlLQWT+V6op9fKcdUZ08HPQA5lAYiE - SQMUk69tSR0kRg5suYaDTeKkAyi8bYAn9blnQDN9l7i3TRwiT9uWun4tnolKp/K1iPNeedaU7yf9DhBN - 235t2qYdyvAfadvz/Vr+P7mW/0/Iwb7ei/j6v8QnD5+65BOPz5DyAMDFi1enZcvXqyQKKSAn66C+QL9D - RYJJCNfgTGw2K7H7HIPDfF/Yx+Q7tO/Wvme+Y3Te2DDCvSKdw27fqvnr02+9/Q/Sq25/o/AL+S+9+yjP - QLcVYmOHhfsq2f+X/yT/G8sA9+x/MH3tJ/8sndxyJvXs3VPbNRWOQXqCUOvvraSyXEdU1sOvgF5F8E4H - gVV9+BjvgOfGci88pI8A7SNLFqdffuRiet+546YLeK0tBSP9syVhqAJ/fYWfqokteSYb58xJH3vwYvrA - +TNpzrixCuRZhVFALNfSibDck66kyPuAPw66eaiuGnEayJpVGwUIblRpoIHBLenksdPpIz/z0fSd7/xz - 7TgU4+48vaTSlemdlSupdGV6Z+VKKl2Z3lm5kkpXpndWrqTSlemdlYNa6gB2VtHjHbnnkt9R289ne8Q7 - a6+Va3Wd56s9bwvqDPy5I+3v//4f0rve+Z60c/uetHTxcgN+ecMDoG9RBn5t86HFaeaMOQrQHPRBDrQa - xDJFlgRWTItZI8DqSgUjs2bN180V7HaFcamtKhk0GCRUP0VIlyuICxnT6qXSR5Z3sX3VXYBSj+49Um/J - x8ZglIxxH3p/DSZqBDgaJeBvsTAsBpr5AgCnTZ+lGyDYeYhpFwAeAFLPulQAaAzY/i/tvEjvd7qAYfSR - kChQhwEHUNtYyg6gUAcTXQKGkHyYgjkDO0yZXccMSOxIdBuF5vvAIKTXtuu3pyqPQRPpCKejDB9hu3+Z - vZcSQAZ6lrkIM9ABFO675/H04Q99Ip05dUHub2geMA2YOEiI8ZIUNAq5lM7Lq7QoxzUfQBLyCXvcwzHu - 5TQug1XjTOKa/PJang8oiXEvG+NlfowDGhrhUMbbKCnW93hM8zjPChDl6Twbfz51cfqYPV9rK9aFAFce - phwDt7dBWEFzzicc44C42F4ExRB9husTphz91/Nph3yXqiKNnzpttkwsZqi0iskcEjfuie+BsrSPFBi1 - Bwy4s/sc9YOly1apXcBu3a7J37F9y/79AdDY5IVJl959+6T1C7el3377/0kfe9kn0zOnXpYeP/FMevT4 - U+nBI4+l+w4/nC4efCDdue++dH7PxXTb7jvTrTtvT+d23J5u23ZbOrbuaHr3Pe9KX/2Jb6bjm06lHj17 - qISS/+abP9p/Z3Yf7dOaqeI/sQ2kic3lqm/b+KSn2X9H0pb5j+ZV7WCwnu+WFZLrrhFeKhPqofIeHt66 - OX3u8XvT288cSYsnTUi9lXd2V2sNCgK799INIjqRFl42QHjVnkVt6ecu3pF+4b670o4F840n95JJhbTN - pIW27brwJvQRjeDnekb6CgGAKzcoIQ2E1q/ZmA7sOZje9ua3p7/6q79qOR55PKbXhevqOUVXV74uXFfP - Kbq68nXhunpO0dWVrwvX1XOKrq58XbiunlN0deU93KWzgGOZ6Md6Ho/pdWm4GO7MlXVLdylt4bx8Xb3n - kvZCtNcRlcu/Hib9G9/44/TMi1+q9v9cz8/JgN9iBX8LMgCcI8Bt4M1DMsAqgZ/tDGOpxqSAmZEFhgVT - Y0bNAKA7DGWwwI7V1Vdfq+YMHBA6odzMDBbmoyT5urycASBpPkj4NQyoEW++PuCTY9s2bdyu9giXLF2R - FrQtTvPmtSn4mzR5alq8aEVaK3noGqoUUdqJEs3I0JFqcCQVxP9BYmkAEOCHFNAGV9UDlIHV9J4EbAkQ - RCeQdAaYa+S/XyvMm+PcKmlDdZ0qHNOcyrzLVGEd8xYjR43RHdJq1BaleSRJA02S5Yfxc9/9kaAiJZJB - e+P67enH3/vR9MB9T6jdLwdyLjFyINFHBgUHRBbP5TJRr1E3UFW/OZ22y7RI5DfKZADYLj+Uc4r3EK/r - +R729Lp8pZqyugwKEc5pXibW13Ao05SvVNV18roe9riFOwblMQzVAd+Y1yre0D/MeYSb26raa1Bv81Ep - GDlqgoC/WSo9QnIEoKLPk4dEnL5HGptFkKSjHjJpwtQ0c+a8tHTpat0RrNLwyzL4UUBk/Z/vhL6N9LBX - 715pbdu29Mtv/N30+Td/Kf3uO76SvgC98yvpi+/6avrSu76WvvRu6I/Sl9/zdSHxJfx7kvb7kv/7kv+F - t/5++v33fiMd2nBcJYLcF+/GdG39Oyu/uxiOVKW1A3qSZ/qAdXlGEeQZ8DPe2lhx0TKUtXbgifAbeCJ6 - 1ajAjJDv+yEBgZ9+6O700bvPpfPrV6Y5o0emQcKj+siEGUnhDQLuhsv/XDZtSnpy3870qUfvSf/j4vm0 - p61NgKHZDwQg0jaTc9VLVp5oVhPg81ddebVuDmHjoB0bui6tXrFOjxNFIrh29Qa1B/jip1+avvqVr+mY - 487HoTg2uatLK11Z5kftVe6FbK9JBxDfyePuyjLuYrjOxfJ1Zcu0smxdHXfPd3t1rrNrvFDt4Tt1JAH0 - 8H/913+lz//mb6U777hH9dpc8te2ANBX0YJ50CKVls2d06aHsbNBogEAM4NyJuWgibAxNWeUFbHJAgkf - mz3QDVI9FSR616OvYmQzVQN6SP0ASJABw+sUNLFMG69RAb8KADJoAP5YKtm757DaIdyxbW/aKEBwlcxS - ly5dpUe6IRFkF+IambUuW7Y69ehhxpjrwKRb8qddzNm4pBIJHjtqGdQBgwoIZXZ9441IS7IUUIiBEKYK - 04aBXyOg7aq8fF1R/bOz9BrinuS/AooxrcFxeKb75+f+ZvAnYBQfSaQZr0Y3D/25m/Q4uIt3PZwunL83 - zZgxR/JZLpQBPw/2DAYsAwKmiCMx0uXMLI3SJWUBugYCzOyIDqYSpg6SRuooiMhxXUJkaV/SYtsqYZK2 - DGxkCdON1bKsA2zCpPG/tC3iQlzXpVXk63UlTh7XUMlXzte41LW2TaoGxWurLb7clsZpS8IQZf2+ifft - Z3ELV6AZMEWe3yfEPXpZBVtZj6/RFmmaJ+Vz2OOaL+UtzeJK+X1V17a4A9mOyO/L6jenlfW5n3hPECCx - v/QDTqBhcxbSe0AJS9d870gCXT0CEMhkBd1ANoKMHz85TRPgt0gmYnNmCxAR3uAAUKVkYRcuxx0ifeL7 - GjtiYtq2fH/aufxA2iH+7pUH095Vh9P+VcfSobUn09ENp9LxjbemWzafT6e33pFu3XZXum3HPen8rvvS - nXsfSvceeCw9fPwlae60xTIp66nvBKll83fXiorvMKQbWMvgtSkv1+M/5XQvY+WcDABW5HzI6kDwW/gi - gA3eqCBQeMogec7Hly5LH7ztVPrMw3elj9x1Jr3m8J704NYN6Z5N69NjOzanNx0/kD72wB3p04/ck94g - 4VXTp6ae8F3hw9gQtPfdL13VeBYZAF5pAPBqmXxPFNC+bMmKxHFwKzg6dNlaPT9+tYwpAMFNG7ami3ff - n379135Tx5xyXIrkrozjYpqHOyN3ZRwX0zzcGbkr47iY5uHOyF0Zx8U0D3dG7so4LqZ5uDNyF+NNEsBY - CFfGcXVlW4VLR16sH+O4mBf90sX8OnLn4dIvXVknUnSdxd3FdG/HKbqO4rFOV+hf/vlf0s//z19IR4+c - VLMvDv4c8FW+gL+5bWmeHtLepsraV19zrTKjCAB1uTTEGwBQmVxkfDZzRSoAgEOCBwBCcgVDIc4MH4PM - ACxmnszEWeLV5VgdCJqZIPFWDJL67GA7cfzWdP72e9PJE+fSsSOn0r69x9KO7fvSho3bFAC3LcTOX5se - RbVR0tDxqwwyF9cryJ6FbXThnjEdg2I20j0kmxjBRprBYMiGD8Av4O9ayTO7iq3bbk1+T0JeX3w2bzAw - DhsxSsEf0j0OwAdMAZogBYKQgFE2qQCOKAeA5agtjuzD4K6e4NAdYAsAANSafTWV/kiaxxkkAAjEAYEG - FgCE1jbAAMkP12yANgEXLOE5sCKfJWoAj7Yl6QBEBRpyLeqxtO3gBsCnbUscoi0D1nZtTHmwsYh7pQ0k - UQ68vG2ubbb5TEfTr82z8mvx3ynLvZvUy4Aq19b7zm35/+on1+Re/Fo8j5tukv8hoIK2eF6Upx2NS7tc - j7KkAVz1WvwPnpmUp23bhWzHHzb+h7Spm1nyfQP2uLY/I+4lPjOeB+CMMGncG20ThriWtw1xL7yXqrwt - FxPn2sTJ1/o5nQ0H/F9269588xAFC+j9KZjvZaf/sClKzSXJM+RZmDHosY2dwAvblqcFMvnEDFSDlzR9 - 29bf+Z70WUtf6t5TJosyGQMYXsfESieOAogkfn0PNqVJvhATO4yc66RN+rstdaIP11ueeV8lN/vSTBnM - 6WSwSvN7qeIWdvCnIE7DDu7KupYGDzEJZySraxNQ+Kk/A2/DCN6j4E/+s66SSPiaq6/TTSDThQ+cXb0y - veXEofRzd51LH7/vjvSJ++9IH7vnQvrwhbPpFQf3pj0LF6ahwgdYiQFM6qRWnhHqNdWzsP/DKg8TeN4L - qyDohWM9Aing8iWr0goFgnaO/Krla9O61RvT6ZO3pl/4n/8r/eu//KsMVHnA6sQxRnXkOssv3Y/aa3bP - tb12u4Bxl9LYpV74hXDP9c9HF9NahVu5F6I9pzrpX0mU+eu//pv0zne8W+3/sfkDO39I/OYL8EPa16C5 - C9M8jCwL+IM4jB0AowxLmEEJBDWs6Qba/IzaivmVjPC5EwxTgWG+njHHqm3y2P23c8e+dM/dj6b7730y - 3XvxsXTH+QfSuTN3p2PHzqbduw+mDRu2peUyawUEz54zX43Rbt68Q6VggNN4TSddypHrt9/dV0/8Z5WO - CkgEKEIGWOvL11HdTkQbFGyggDkzEJve3wiV/Bn4EwAjgy2DvW5QySCDQZkTL5CiMBADghhECCNF7HF9 - LxkQkMiih8nOwb5KvXr2k4FTAIxQT8ICVnoT1h3aFu7duzX1ohybeaBGurUDmFCgRRrXaORb2Ota2Ihy - ffI17V4ok+tLWO8rhJX0PxQkaZZu7RLu2QM9qRwW6qF6U1Vcn0dRtndvAXuex733wTZeVbZPIy732udG - jdMuccJ9+gowlXJQXwk38qUOcf2fUpa2kSjavdu1AO1+X/x/ynNfvEPSabN7d96ltdVHru//v3+/AZqm - cWkLQKgAkOvKPdxwA3EDiKSrvqGk671Ke9dd21MmNNfKN2egjskPxtQxlA4IRAKom6QEAKqurIBN+qXZ - Ahydxowdn6ZMnaEqJ1ge0OVjnVjaigN9vOQdgBBVuQDcyr0Z3VBZD5DvwYmdrrbhgfANqoLi8X76THup - BYDYfkUGgAzU+bfnZPmRtKzyJPs2/fuv8v2/dIWo1xoAQvBAJpy6QoI+4DWmQtOtG6CuRxp204A0b+y4 - tGb6jLRx1uy0Zur0NHPUmDRAnsHVV5sajq6wKAC0TSPoJle2D4W/yP+5Ut4FAJD/h47g7FnzGybDli32 - QwQ4QtQkgqtXrk8H9x1J7333j6e//Zu/bYxBPm65X5dWujLN65V1WqWVrkzzemWdVmmlK9O8XlmnVVrp - yjSvV9ZplVa6Ms3rlXVapeGa7AA+V1c22pHrStlYpqttPh/teX5Jda6zfFwsE6nOlfn4ALuOAKDnff/Z - Z1Un45kXvyxtWLdFl39N+gfgW6S2uCIB/ObMXqCEDT8Od7cZK5SBDYBPycIYLVUzKjpbZGMIzKuZaTVT - PWNzUrBF2wr4KlKAqW03M0fyevXqlebOXaBLvgcPnEznb7tXgeC99zye7r7rkXTmzJ3p4MHjaeuWPWml - MKqF8hxYCsY8TNvCxWnTph1qcgIpRrwXJ2Xiel92b+539l+eK/mgoYNQ4z87mW4UgzJLv3YuM9I/k14h - eUFqg4QHExekOQhEmsWAPGig7TBl4MYeIptuGERRGr+623VCSBZ6yODSUwYLwGFv868XgCigAgJcKFjs - LoClB6AIwhCwpWuZ6/toXa/TM/tKWk4ACyTlemg71AfEWPtcr7ukO2kZ9at2tKzU12tJ+es1TJt95dp9 - ZHDk3i0NvyKW0nrJQCh+TsMnThvXX0vdXkrXabi3EuHrcpg8fTZS3trx9izP2410HfdIWO+3+f6bKf8X - +b/XSxnaJN2uBXFt8eV+rG37P9deA/WU99dT79P+N9fkPfB8Bdx2N9J3piDSACNAskECbvFJ79mjv9al - jWuu6ZH7iB1NBhDBjiaGmlWq2JtdtxKWPghg0939/WxJmN3EnKiDmsbkyZzq06aAYvSosdoP4SW+ucwA - WPN3gaF3QAuARK0FZCKuJNdW1QwmGFAuxxFoWk77Wg9ddSjbrih/d/pt+3do4eobrOIVALR7vlx8+KLy - iFy3qt9MlKni3ra1aeG6+7PlYJ4XANBAINJAU5vpJhPZq7pdk64UoHeVEICPNJbnkRgqCfgDLEKsTFRt - c6+XpytZ/pV3YTz9CpUuIxxY3GZmw5YsWt44QEAlggIC0Q1ED/CVL391+vrXv9GwBxhdjPtY1VEYV+ZF - 11G5ujCuzIuuo3J1YVyZF11H5erCuDIvuo7K1YVxZV50HZWr3QVcVnAXK7qL4c7cpZTtyMX7eC5tlvU6 - a6Mr+S9Ee04O9NyV+f/5n99Nn/vcb6S77rwnrWL5E/A3P0v78lJvJAV/M+enWTPnpRkz5upZmaoILAyH - 5UtlcAqAjBQAKvjLIFA3hpAHQ2tmWhV1lAcZ0KQNkzgKIySuINBnx1aWfJaHUC6fOm2GLusi4duyeVfa - t+9oOn78XDp+7NZ06NDJtHfPkbRxw3Y9pm6ulJs2bWaaMHFyGjtuvNRbkJYsXakDVKUQ3hFFxl2X31Wq - a8MHDXvG+iyVLE4ZgBuAT3f9CvhjGZQ4oI7lWdMnY/nOJC8OABUEZskM0hjiDAYsxzNQoOx9xeUsVWMa - h+PzOCUFvUXJEx+pD4P/NQoQGXyQQnQXYjBBv5Mlb9/FnUkHGgOS3dWnnJCkU9bLed3rIcpqmpU38Jnr - eTkvAwhRMOTluI6VAUSpr/l1lOtAtEn5HO+uoEnAlJQxYOfXAfQADAFYVt/y7F5JU2CZ/esVNBoAI6z1 - 8r3pdZso3I/WpR0HlFJP0hV8CsirrmNEnUY4pPE/qnu3e/Fy1p6X5b/7PVXXvEbA5NUyGbjqyutlgsT7 - B0D0lLzuCtgAU7qsLCDBl+UBf4BAACBhwBiSOZaa2RSGDuqECZNVFxfbctOmzpTn0UP5h4KOrGZSx0f4 - BuivSLB0l6taEuitvoNAJcKkkd+T/9VD1TWYMGo7td8uaRBlLOy8rkqXeCQFe4Tx8+RYrqE8TOtburUT - w+RZ+9Wyt/nUA0jW36MRdZmw+uYylwYawHOQZxYUTAf5es3XJWR5d9TjWVdt2v/l/q+U5+/8HB9TPawS - LVyA/vhS3Ui4BCCoYNBAIEvCGIV+6IFH029//nfSf33X9ACji/E4Tnl6nV8Xdhfjnh/L1fl1YXcx7vmx - XJ1fF3YX454fy9X5dWF3Me75sVydXxd2F+Oe79QEAL2g+zgvWLq6sqVrlVemd9TGc3Fdae8HuWZd3Req - PXwndzEN+ud//uf00Y/+j8T5v3ykbYC/eQ7+FqS5AvjUFwL8IeafLeBvpoC/mTPn6pFwMBaYGYyhmTEa - 84KhKaOAeSvBAI3JedmKyXSFMgDUdvJgIEzocpYj9B6sPa7vRmc5MooTPNgRO37CJAGDGH5emJYuWZVW - rdyQVqxYn5YuXZMWCACeIf9v4qSpaj9Pj06TAQk7fZOnTJe8uTKA9Wu0D5X39tz+U6RYt64tiXNdfbYl - 2T0hBUHZXm3+CfAD/AHyWPpFkscgjN4TQNCV8HUZWAZpTMLo8pz4AMjBQkhuGFBh9gxkjYFOnreCfECh - vAcfwAgz+BtINKB45ZXodl6bgaEQA04TIaEwYgBSiYVcs0Gal8spaLQBDGrUy2Wvv9byPf06iUMu1ajq - hrRcRqm2XOkLGFPQZXG/T/Ldb5RTvwMCyMogbGGjCtySnvM1Hd/Bbi6j9QNJmud5uXoCaFqY5wRg12VA - AfHdrrpOQP21+t6uErryCgjD6EaXC10m7/cyec+XXQbJ+5f3fqVMEnjPSP2QKtHHVF9R+x1Lxg4AWZZm - WZwl79664x6dQPotR8JhkgmD0NgCnDd3kQJE+EacUBoPid9GRYAswCdLz/Q33oc9O3uGuqlM+tO116Br - zGaG5olde3Dl36J9e6ZvLMR3EKgdAMzALxLXMp4JGZg18m9I6hVk167iBgBzer4XKxPvOT8H+X/oVbsu - cgMQXmvWFvgWmeBdK4QU1ZZ2q7YUcHJN7l3I+Lm8B7l32kRnE11xVIcWsmyv9mPNhiwSQU6UYnzBJMy5 - s+fTxz/2yfSv//qvjbGpHJc8HRfDpYtl68KR3MVw6WLZunAkdzFculi2LhzJXQyXLpatC0dyF8Oli2Xr - wpHcebhhCNqdx8t0XEd5ONLLvFZlcWX5S6nrLrYRw7iyflmuo3x3deE63ym6shyuLlznt6IyH+kgNpne - 9tZ3pJ079uisjaVfB39zZs8P5OBvvoK/GTIzxxYgeoAwbmcMDQDozFEZlzAOYUKuNOzE7LKO2RkTq4h2 - lPkog7S2CFPfTueAAIEyW23URyfoOmFME9RYrEq5ZHBhl+ugIUPSkGHD0/CR6BqNUztj7DocO3ai2iAb - MXKsLZ3qrlmkZxyUz8A0OM2cPS+Nk/ZYXtH7kntRMJYZZUXN/8Hv6fkgZfRK8rzkOTQ/Oza7XKn6f5xe - YGeZsgPXQB0SP/ScVM8O6Yf4gEIHgAYCWRKW8vK89BgsaWfY8NG6ocQ2A6D/hnTIBg4zzdPdBpZrjRj4 - nVQKCLjI5OCIHYZIaKrd3nZUlQOSmEfcAJAN4l7WbZlpfa1jZa2eDfYAKG9T283k7ZZUASqr257sP1Tg - 0uLX5nQFfijhN5WxZ6R5Hs/Pjmeou9kbfiaVnjp5vpWx52pUFy79awV0K/DOgzybjhrplJM0le7yLcnA - rgbP81KrfdPld0lfjPFM0i+ROnGfgD1sYzL5cCkf5Mc7OiDs0VOeu7wL7NFRjl3q6K5yhCGn7MB/0APE - eDTHNdK/uYbxj/Ie2n8vEPwD/qM8wynzk/bn+pbUfA0DRvY8CDeDPXtWfIvwQ+LqC7kfv9cKBBLP5fS+ - KG9lyuev15T/rdcjP/ODqmzdfzC+4XyT58fGu4oMANvz4DpFXUm3ybuQ3KPycsICQuEjU6fMUJUhiDFE - geACbMhiSmypLg2zLMwy8OGDx9P7f+KD6e/+7u8b45K7uriTu47qdJSHI+7krqM6HeXhiDu566hOR3k4 - 4k7uOqrTUR6OuJO7jup0lIcj7tQSALqLcQ+XZdy1So+ubK+zOmV5d3Vh/Jhe52LZ0pV5rdoivStlu1IG - R3pXysY8CPDH8W9f+cOvphc/+UzasG6TbnxA+sfypwG+eUrY/Js9ywCgLf3OSTOmzVYdwKlTZyWMsRoz - dgYUmYgxLZdWwQR19ijlAWwqKfKwEHnOiCqC2QAeK7AHA7OdwVU7lOMaxoQvU102/tMUAammZJ5P4Rho - Bpg5C3cgNHiwSghNUmimUjBJYZIzt9dnIGnSlOlpmoBfdtg6Y2wPAO0/+/Nwpm/psdylUm5X2ywoP3fy - 0edhqbcy+WK2BjHzwqDbV5Xc+yrjZkBmGQ4zMIA/dpLyjFwvUKWBKiG82YCgDMxIZzDYy7NCv5DnZqeL - cKLJEEkfomAZxX2IJWjKmS7iUCWM/jKgDxk8XH3ipBNG/5D2tH29huTlfCUNyzWKtrU9rzPE3iUbELhv - fLuO+IQhAbRIOIexU1r+Fz4g1/MJDx060ojNNNh6lHCVL+kapo7VGzFipO40h2jf/7NfR/+v1rHnhm/P - Iz8b+e88O76pmwfkZ0iYvpjfjxsnVroRsp3KxNmswSYI9D8JexnO49b0TLZZwuxU+jIswIwNHiqZk7AC - NgFoLJf26gXlnbIaxzfyNMoymeBe7V0N0/ttgD+kf0K6ESMCQAF/gG3OquW62tfkuYwYUZ0LvHjx8jRp - 4lQB2dfLpK8CgHzz1aYIqO67ea7k36t9d3Wk36JT43usQJ6BOwd2zqfsviEFpYS9jrbj9a1e86YPJ7sv - ++4lHq5XB+Aujapr+H/Tew181u5d3oNMEgbcOEgFAqgIzRNCfUiB4HyAIGQSQQQM7A7etX1vet1r35T+ - 9E/+NP1fGYd8XHLfyV1Hae7q4u7X5bVKc1cXd78ur1Wau7q4+3V5rdLc1cXdr8trleauLu5+XR5UqwOI - KyvgPB7T68rVubq6rVxnZcprdqV8R87zSx9HuIx35sp2yvplvDPX3I7Vd/qP//iP9Llf/bV054W7dWbG - rE2lf0IO/ioy8DdzBjRHwN/sNHXqTGHOs1VfB4mCMz1lTE0A0JhIDCuzgpEogCuAnYQN7BnAI+wz1SsD - aR0GAp29ujTRgBezZKQP2PbjlA41OSFgxk7gkEHxZs6+lcFU6CaJI+ljMMb8CECGgRfJhYEiBlKpL0CI - MzdnyLPAxpkyyPx/q/9qvs3S+Z/GxG3ZlHwnZ7YdUVk2t6vPzwcJT7OyDCQMqAp0+W/i28YONn7caAO8 - AkAbuBmAGaAZdA3s5mcCCOR/639nWRgwaHHyeU48M11mloEeSaMCQOICphUAku9pGoYyiNM0DxuRjz+Y - MOUJA4wUABp441qEDaR727kNQGOjvJOVpy55Cgw1TtiAoQK9YZkU9GUCFHJ8Hv4wAb05DqEawOkqgGF2 - rQ4fLiT+qFFjlLBlZ+nUG6Vghu+EowcJ41dxT8vtZgJgolulcb9+E2XgSp7Xk7a4d2vD2h6ZrzfCy+i9 - ejjHuQ73KWHunfLkuR+va+VzXia9f00H+A7XbwdgqUBS+piCPwV+1eYPBYYAwB4GAJHkchwZ3yoAmOeO - qSm+X1QzABiURwrIJiebBOalZ+n3FUiK31AralUufnPVd1VPXE9IeUD+JoWn+XcPT4JH+WTXzxKvQFQG - VpTLVEkJI9GefevVtct7tTIKAC/pOZTkbcp/1/YAp9X92f8zAEgeO6WHDxutYwOCAj2/WYGgbRp0ieBC - GVsWyWScTSGbNmxLjz/6VPrSF7+cvve97zEsNcYoG6eqcKToYrzMcxfreThSdDFe5rmL9TwcKboYL/Pc - xXoejhRdjJd57mI9D0eKLsbLPHexnocjNczAQNHVxSNFV8ZxnaV1lH+p7eF3ll+6VmklRefxMh3XKq2k - 6DxepuNapRnZ7mDon7797fSRj3w0HT1yPC2RGTZKvPPmmr6fgb656vNxO/nyL8efYR8OCSAGQHUZGIYm - TKOxJFEwlEgVU4OMKVZgzwCfAj3idQAQ8Hc5A4DFFQA2mC9M8DIZ5IcmNnxMFNCmS5wDBdw0aJAAFqfB - UlaAhBDSQOJODGRKAoxYRmUwmiszWkxutGOYIWz/n/vw+3GmDEWG2xFRlnoeNmqAXKXm6zIwsrlDgRsg - TkCb6/0xGGNWpQ8AUMAfh8CbQv6NBgD1PxuQ4/ko+NX/z7FxFjd7gWwasY0jakYGCZNKGG9SsEm6kqYj - fWxPANK6dKfO8pVyGbVp10SAi4pMymV5XtfLVWme75TLNcqW5SwfujH7/ftbWS8Xy0A8D6Mq7OllWacq - r2yPuN2LUsjjfhr18nVuvFHeHf4NHpd89auy1FOJogB+K2N55gvxzjXMZCjneRrtcj25F4Cd6fch7QPw - 0cfc3Eqz1BHJoS/b47Mrl13B3ANgfaRuBpmi+sYLFy5X4I76hdkHNWK5GqDVmAQ2vpnnQtW3ZMuqId5E - XCOTXFMBGDp5GYwayPP7qvgSG8gwpoxZFTX6rrqH+TvO3zXACt06W4I3UGhkbbS/F+7b8pzs3jyvntqb - raradJBnwA9eazzaAan+J7kG6hjjx03SsQHd8Lmzst747GrjIEDQQSD6gJywdOG2u9Knf+nT6d//7d9l - cIrjUzWuxXBHzsvGcmVaGe7IedlYrkwrwx05LxvLlWlluCPnZWO5Mq0Md+S8bCxXppVhXIcSwOjj6tJw - ZRxXl9aZq2u/Lq10rfI6aq/OdVa+ru4Pv73qpf73s/+dvvUXf5He+pa3pR3bdquIHtH9XPT9dMmXD3qu - fNhQBoAC/mYC/pD+Af6EON8Tf/CgIcrMKgYUmVMzc2mk5bLGUIw5Ggi8UkGfAT1h8hkAGuirZqNuh8qZ - UxOjlfaQqKxcuU6PMgO4DBhk4I8NHUipADq6xKbAj6XLYeqrFNBJgA8gUUGjtDFp8rTUtnCFDn7V/7L/ - UwFe///mA9CUdDDJ/70LDNrynSif64TBQknSrf3LVfeq3w0G6BSgKUiwAVn1/jB1Ib7pANqynUpmch1A - noNHlg9VeigDPuZiAHiqF6hxfBnwAQBS1sO6oQRAQFsCOiADEfVUgRaLG/gAVDTnR6IsvgGuDLpY4tQ0 - /m8zYQ+vLh3yOt424Qo4NpeNoLI+X/xwrbpyfp14rVg2ktepy2MHbUWALYBWVS+WdfLyMRyJyQBkcekT - GjYJnl0jxIXw7bQbi9sSstST+gb8jAB7euqHk/Q1tbsnZZiIoKsJAQDZkavLxFIOKSCSTaSA8Jm2Bctk - sjlF+zi8oQECr2KDEbvSbVKomyoAKk1Lp+2/q8Z3meNVOXz73vimqjwjK+/plLFrQQ78nBdRBlWV3r17 - JyS2gFnOHJ8lk2uOuON/YSibpf8ePXoq/9NrSN2qLQOCCsr0Ovm7z3zA78upwRs83shr/u9XKPCsnou1 - yX0DNo2nwl/hu857FYjKf9P/J/XhL1PkPyAYYHzwsULHkJmMIyYV5ACBNgGBjDOsNh0/fCL99Ac/lP7h - H/6hMSbZGGWuLi26uvS6+u48HtOiq0uvq+/O4zEturr0uvruPB7ToqtLr6vvzuMxLbq69Lr67jwe0y75 - LODS1eV5vC69Fbkr08p8XJlXR+7KtDIfF+OeX6aVztPKsriyblmmLI/ztLIsrqzrhOj9D37vD9JTT7w4 - rV+7SZgrO+3sLFxf7jXwZ7t9ddfv9Cz90+VfkwBiqwsF4HFjJyoTd+bTYDjBeGjFhKo0Y2bUsQ0VrhNj - TCeDPkAe1JgNUy4ze2FKTQAQIl/Ks4twxYo1ekYlgObmBgAckoYMZWmQZcass5YBILqAbBJBEki+lUEy - hiRsoEoAFy9ZpZKy5v9SAkB/BjDs6n/DcI3p1j2PGmoqm9vkWTWYvDF6iGfFbkqXwilwk4HUJTIM1KbL - hRkMA4EwcHTKGIDQ62PnMxthGJTGszkm09ixk9KoUeN1eZAlPiSCCvqE+kkbnDzh5mMaAFDadQCoYQV3 - EegFAJjTu0IKLKV+BFOxjTLdyQGVh6v05nIOmLy8kwOlKh+/uUwkL1eVbw8Ay/Lue7irVF6jVb5T+V/q - 0hWk0XcyKaCTfgRwI4+JBWTpVk+BoPQr1/lrgMMAIJEMsmLABATzLLZhBwmgmWzBPAvl6ENIAUdwNNyE - ScqbkChxLV/+jQDQwZIuWSqvMH5hIMm+FZOi8U1mv5Efv7GKKFflGTW+O/0GrQ3jS8aHjP/ZyUN9evdJ - LK8zCWUz2pgxE4UfjZfvTL6l0WPTaOFRqJVMET4Kb2HSis1S6vq1mv5PBpp6D/k67e5PiXv0cEjjfl9E - O/BN46X6P7l/5b3GV52n6kTb+a+Wr/4jklhUAaZNnW2bAmV8UFIgaIQggU08SAUBgQsXLNbdwLt37E1v - eN2b0p98809r7QFGV45hpfO0zsq5+1F7ze65tteQAHalIulOz7frartdvYfn0l5Zp6O8Vq6jOh3ltXJ1 - dZzQ//uVX/5suuP8XWmFzMgQ0fORGgDM4E9mqTNnstt3dl76lVmrgD/0/gwAzhDGNS1NmjgtTZ40XZeP - YBTKZJVxtmdODWAT0pQ5ZUBjDDszqkw+4zQmCwOzcs6MIgA05oRuSjdVGue/oZMFeNMNH0IAPOwCGrHb - F10xkwpCFh9q0kBdFqWe+TBpTMYMGzpK77P6P+X/Ii/6ZbmukLfVOXEv7OpkEHZgpkttDOw6MAsAlIEV - CQ/gaegQk6zwPjnqDnM4a9dsSVs27047duxPO3ceSvv2HU+HDp1ORw+fTUcOnUqHDt6S9kvaju3709q1 - W9ISqTNL+gvgEH0tQLYDAqSFCvKytE6Bm8Qd+LUiL+t+GY71SS/LlWmRYr5TBEd1QCmSgyMn0iLIMmlr - Bb7K+l4+XjuWi3EPQ/F+nez/VP+prlxsI5Jfz/9DSXpGsZBPHmpJpX1Z6gcolLKYEEKizuYWQBv9i931 - nAM8duxkNRmFvqDq2soEwk4uwYC37bwGDAL+AI/0WSYSA+U7pG8xiWOyOXfuIj2DHN0zmyCaLjBgUHWC - HaxcVgEZ4ycZ5MA/mvgL4fgt+fdqfKlKz3xKqWrPlmjtWjoB1bIv0m+Ro+l4Fkgyee76vIX0u6SvQEyY - BOiicoHuJpMvNr4MkucIwKItrgcAvPJyk3LqdbMksP29NvMP0i9XP98vfgaQyqcd1CkZ/2zmraRJ2Uz2 - v+26vWSyOV6+fY6Ag1ALYnMgOuJOCgKzRBDwzjiDXcBN67elJx59On3xC1/Wc4GjY3yq83E+fpVhXAxH - F8tHH0c4ppd5dS6Wjz6OcEwv8+pcLB99HOGYXubVuVg++jjCMb3Mq3OxfPRrl4BbNRjDpesoD9eVup21 - gbuUMp1d06mVK/M7qtNRnrsyv6M6Xcn79j9+O/3Mhz6cjhw+nhbLB4mehhp51uVfl/zJRwxNNwAIsWzB - x84GkCkCACcDACdMVQA4auRYNW1hs0pnSFALEJQZrzEn8YUq8OjlyYMJwZSMMRkTyyAQhiUMX5lbBoCk - Y5IEcLN82RrdkQnAc2AHyAP4MTNXSaAAQpP2sYnApH+U1SVh3WRgNFCYNMZpV67cpNIw7qndf1Ly/+zh - Mj9QWIJx8kGkage/Y2IA5PgqH1j0lA8hl7oAnFDynyhgnUF0yZLVac2azWnTpt0C9g4rsDt65HQ6fuLW - dOb0nenWs/ekc7fely5ceFBPSrnn7sfS/fc+lR647+l0/31PCT2paRfOP5COHzuXDkj9ZcvWad/gebOU - zD0w6DH4RSAWqQSEDl7q0mJeGYe4DnEHmk517XjZCIg6Igd9JVHf24Lq6kbysq3y3Pf2Sir/Ryvy59ER - +X+I1zYiTJlwf5TLkjuAH0u5fCuAPHbFLxIewqRgu0weDh8+lU6cuD2dPX1XOnfuotC96fZzD0ifuphO - njyvhtf37j2S1q3dqrt72eU7cviYdJMAWt9hzH0BjPj+bFPLaLnWeC3LxJPlYqR/VwAAAXoK/gIQlDRb - tnS1FECP8ZAqjl8R35ECPPhSEyh0knJOjfbgNwbK9NuVetwbG9B4DwBc1bXNUlFd3gYw9zEgbVJUef7y - zarUXMDioCHDFfCi/9i9R09t0/gd4Db/pwwA9b7z/VZ8w8nSAIDtVgw8rv/B0+35aLzx/7huAf6EuA92 - p0+eOD1NmzKzQdOnAAKFGDOkX7AsjCqRgUCkgAvVNuCaVRvShdvvSv/7lz6d/u3f/q3dmBXD0cX86GJ5 - D9ellS7mRxfLe7gurXQxP7pY3sN1aaWL+dHF8h6uSytdzI8ulvdwXVp0LSWAZaWYhivzS+fpZX4Zd1eW - KV1n+aXrqDzxuvy69Ehlmru6uPt15WJ6GcfVxd13evbZZ9Of/9lfpDe94a1p+9bdaqtJN37MnqdSPyUA - n3y4M1QCaDRjxmwBgDLbmwb4E5osAHDSNAEVU3UZg80WNwhDY9bYnnlGygwKxhXSlTEpU4tpMCYjB4DG - xGFgEocZ6iyfNPKgyxOW7mfNmqcDjAI9dnwOw6jxMAV/LHeOGMnuScx3AAIN8NkScAaKMsABEDUNADho - sPzPqWnV6s1prB4LBxi1+67/T8aEq3AdxbyyLGEHgJ5mZNc04r9jy43BxaU2et6qDDRIIVhu4tSWBW1L - 07Kla1TSt279VgF/u9LWbXvT7l1H0v79J9LRw6fT0WNn0y23XBDwd0+6/fb70h13PJTuuvNhBXsPCPB7 - 8H4BgPc+mR6+/8Xp0YdfqmDwgfufkvBL0p13PJxuv+3etGf3YQXegE0G8AgySqACRVDj4MRBGwSIi+Xr - yNvw8nVEnrdPWXzuyzfCtCIHSpFcV87LeLuxTtSp87Dnl+RteTtQ+d88HOOt0ry+35O3Ga/n5GmermCP - PsS9S5+yEzP6ahqqD+PGT5a+tExPzdm/70Q6fcud6c4LD6WL9BHpF488/LL0+CMvT0889sr0+OMvT08+ - 8ar0zNOvT8+8+HXiv07ir0hPP/kqyX+VHsXIedy3CDDcsf2AfK8rdZKFxB5wxOYrdniz+3ikTDCRKMKX - kCCy9NuQ+GVgpH4O22TQqQI0FfhpRfJdNX3HTpIHH8q8iLIOmPSblDo9ZRLGu2C3PZutOIcZAKjPsFfW - uwVEZ0Co5nMAhvKtYqdTpYHoHQuvGT12vBqkBxA7T/RJLsDX76H5HiPvMN5EXfvfGSySJ749B8rY/1LS - /2PPyp+Xkz8f6sNfmfAz8YcYC6YqCRBUSeCsNHOajBksDQvvQaCAcIEdwow3K4U/HD9yS/rQT/2M6QHm - rcBxnCpdXXpdPKZ5vCyHq0uvi8c0j5flcHXpdfGY5vGyHK4uvS4e0zxelsPVpdfFY5rHy3K4WgCIqyv8 - Qrnncq2O6nSlvboyZRrxVml16aVrVTc6T6tLL10si8j99778++nxx54SMLBRbTXp8i96fyz7zjLRver+ - QYBB+ZBN/w9xvwFAFJhZ/mWpFaY9UWjUyDG6/OEMqJ6MQRnz8XiUfIV8mA5hIWXkWcJneTBDYfSSXjEs - Iw4wx6YhZ/oCAFmKGT7CgB/UMPshhE7bkKFD01DAIGFMhQixBOxLwioZHDhIjUWvXr1FGPMMVUJvf992 - 73r/7dIj1eXxn5rjjbZqJIUQ10DSoSY0FGy4xO9mW+KVdzcfEwyLVqrUb5kw3lUy+1bp3+adacuWXQIA - D6V9e4+lQ4duSUePntHB+NxZAOC96a47TALIQH3vxccEAArYe+QlMsAzyP+YgsIH7ntS0x964On04ANP - pfvue0KA44PpxPFzaf36LdpPAIIGTAEXFRhxoOJgxSmmleCmyqvqeFoEQx6OANDqmfQLQNZD+gmEPqQD - IidbniS/t4YdzEGNjTQM7OLTZgRRlK3qYyfPyjt5O4ADBQg5zf+Pk/0v+x9O/l+dyrRYF9/vK96fUfV/ - lDARBHCReweU2H/uq88OMy8zhT+sXr1J+sthebe3p7NnL2o/OX/bAzJJkD5y8XGdEDz0gIDAh16SnhQA - +MTjr0iPPfpjAvheLfQaib8yPf2UgD/xn3j8VcKDyBewKPHHBDRevPtxlRQyKVkoIBNj0A6I+D7RkeN4 - xjHjJqpBbDcEzySQU2caQDADQNs84WSApsFXMpix7ws/gCmNF2kKkOBHRg1Qxbco5TFojSQPkIcUkCPW - rB/YUXNqe1P7i4E+fCOXDtpSOiejcDYy/5uJJryWPlrdA5vljO9V92bkvNLuO9+vkP/v9mUlXctKmj4X - A5WRtK6UUb6rbV4hfesm1WmE90MOAvnWp2AeTIjlYJUEIkCYOUfHF8YZzI1hD3DPjgPpzW98W/qzP/tz - tUrh45Q7D/u45eHo42K4dHXl8GM4+rgYLl1dOfwYjj4uhktXVw4/hqOPi+HS1ZXDj+Ho42K4dHXl8KF2 - hqBLV1fZXV38Utpz5/U6q4vzMqUfnbdVl1e6WKasE+NlXivXqj4uxsu8Vq6uPoTI/TOf/hVh3Hfoh2jL - v9XGDz5WlQJ6HACo9v9sE4jqAKoEUECgfPiAQKSAzM5hBjfdOEAYlDBcZS4OVmA6zb4xIM+PlBlTZFjK - jNwsAcxcGJKGbfnFlkQAhJbHwAX4A/wYyEPyx4kWBvLcptkQB4KShq9pCgjNkLAZIWYJGB3AgWn0mHEC - oDamqVPnpKuvvqZxv+3/A+CsfdqlU33bTiztcJwTkhpVuO/bT4DqkDRp8vQ0W5gtNh3nzcMo61JdpuO4 - u9UCANet3ZI2btyZNm/elbZv36fnIB88eFKX586culMG9ovpwu33pzsFyN1zz2PpvnufUGLp94H7n0wP - P2iD/IMSfuBeAYAqHRR68GnJf0oG8kfTPQIYkR4eO3qrLg9yTzffbBJBSE2CAEoKkOIA5lLjJRhywBTB - nxMDsQH4y3XZEJDXr6+DoxtVcsPZxmziYZJBfgRwSHTIt35o+dRjwCefOFJZlUpLnwQIWn4FHjkVxTcu - cM6w/yf/L1D8b3XUKt/TIdpsgLyOSO4dQkKFFBDdNXTS5sxpS2sE+G3dui/t3l1Ji285cV76yh3p7Jm7 - 0vnbH0wX73pM+sJT0jee0cnBkwLqIKR9L3nxa9NLnkEC+Jr0EqSAAv6QFD788EsV+N1/39PSv55Uulva - gW4XYHlg/6m0Yvl63WSG1I9vEhWDiZOmyDu9SSc/ugQrz5Dn2EQ8e4BfI94MbhwkmUQPXpWBUIOqMmrr - z+tK3Mm/z+u7d9d+1qdXf1WDGThwhPDEBQai5V0DAA3sm68bYAJRBuLdLV22K61ddzSNHDVeVSlYdZgg - /xfTMVxP70H+j9+L36/yU0CcpFX/KadJ2MtV5XN+puZ8q2/A0cuZD/BWdZIJU3TSj29AcJrqSLOhBWKM - 0OVgGS9Qx5kl48qcOfPV3Bh6gFs2bpe+8ZL0+7/3f9L3v/f9PFKZK8cudx6Oae5a1cG1yvNwWR7Xqg6u - VZ6Hy/K4VnVwrfI8XJbHtaqDa5Xn4bI8rlUdXF1eu13AZSVcLFP60cVy7urKt0qrK4N7vstFV5Yrned1 - Vs7dC90eYWZaf//3f69b8A8fOKrW2RHLs/kDsKdb+SEBf9VuYAF/HAEn+Y1dwAL+DAAiBZyqy7/YgxrP - TrfR43SJwBlHxVRKANM+zUGT1hWGHRmSAkBl6oA9mJoNzgYAuRYMXupc9iIZ+G5ISxav0P81XECfSgGH - CfCTsBrQzcZtTQpoPqDPwSBh1QnMEkDXE2RDCZtAZs5qU3MU5f3rvdf+1+dKrdviWXXr1k3ARB8Ffwwg - 2EkDaE3nXQqIny0Mdy4AsG1papN3vXTpahlQ1ykg27B+hy4Ds+lj//5jusnj+LHb0qmTF9LpW+5It916 - ry4BA+aQAAL+WAJ+CPD34EtUsvPQQy/WQRypz0MPPiX0jA7iF+96NN1x/iEBBg+ohOjsmbtlMD+peoLs - hGSgU9ABOMlAzoEIIMrj+E51cU9zEFQCPSfPd5+B2PsVhCFilsu9bQCb6XiSzwBv+UhsuCZ+7Jso7CsA - yACQQZ6dqd4+56xyb7TtZZDieD5AkfoO2uJ9t49X6X6/Hi7TIX9OJVl+TOuvgJxlV3aD8+0sW7ZW+8r6 - 9dvSls170rat+9Oe3Uelr5xKxwXYIy2+7dy9+p4B+0gAH3kIUPey9Jj0CwAgy74vfuo16aknXpWefsIk - gY8JQHz00Zelxx99RXr0kVekB+57sda9TwAk0sTbzt2Xzpy+O5265a50Uvrj/v3H0/wFi02NQ0Agm0n4 - fjnKziR+gDz4gfAAJQASZJNCOy3I+IPxFviF8QzdWduINwMlT3N+FMv5d85EkA1iSN05zq6PAP0zt706 - vfu9X0lbtp7TYxkB/yoZlPyePQCChPtonHSWh5mArFl7KL3z3V9Or3vDr6X5bRt1KRxJ4PQZs5VPMbHW - ewv3Y33I7tWAbgBvmg6vrP5TpEZ+SKvy/D9WZWiffjiO3csy4Z8gPH+i+NiCVZKxYPJkaJouCbNixHgx - fRpSwLkCAOfpygxH+2EP8OJd96Zf/ezndFOij1Vx3IphXKs8D5cU88owrlWeh0uKeWUY1yrPwyXFvDKM - a5Xn4ZJiXhnGtcrzcEkxrwy33ATiBbrqOipf116M1+Xj6tLc/aDttSrjrsz7f6U90p599tn0J9/8k/SG - 179JmPku3ZY/V0CCgjyV9Dn4QyfQdgWjS+f5DQDIRpApsxQA8uFj34plYBgDIJBdbGoXUJirDnDKpEoQ - A3OpC3s8M7DMvJwJKWNqMECb4Ruz8vTLVFqwTMAOOovDZNDw0ww4AaFxusHQkRoeyc7EvCO4kgJm3T8B - ffi+a3iEAMDlKzYIqFqioKB+abb8L51Tu3ZaLPlGghljQFelBwIqWLoG/E3h3cg74si+WbPnpTkqBVyY - FixYojpWS5auSSuRAq7bljZv2q26V3v2HFbJzrFj53TAPXXLBR3Y75bB+CJLwBefSA8KyHvwgadVwgM9 - 8pDQwy8RMl1AJH5I/+4RwHjHhYfSBQGAF25/MN165h5p704BCxfSEQENGzfvkgFtjp74ocBD7h2f/2Cm - Q0xfzqkCKEakAaDKfIBPCZwiOSAyoHWj9hM/Zouze5FOAogAan36CkBDx1P6E8+aM3vRFbV8AZoy2Hsf - hQCA6Ik64OJ6pPkArSAh7walDPdoAJHrQ9ZnAZnU93uN91+SX8vLxji+P5/yObUiAAzfBZu72mTCsFzA - 38pVG9OqNZsVBG6WycJO+squI+nQAQGATBakn9wuYO2CAED6Cv3gYZkcMEFgMvD4oy9PTwv4Qw+Q5d5H - BRg+9QTLvy9PT4hP2sMPvyzdf+/T2sdo48L5B6Xv3SMA8K50/Pjt6ciRM+nw4TNp/76TumENFQ6MkwOI - AKycYawTwQz+FAwq+LP358DPJIAGmgwcSRieAWlf4Luq3qnyHK3nfCW3QbqW4xu8XN7FDdo3WBZFAo9R - 7n0HH04/8YFvpg/89J+nbdvvkP5kNg+ZeOgZ1qp6IGEAoUwWeP5Llu5Ir33Dr6Z3v++rae++B4QPjdO+ - Sn+EJ7HjvkfeFML96f3If2tINvN/UemfhuN/8nCMOz+N6dnP14hlIb4DNuUonx83UQGgTfwFDKpEMIPA - LAlkKRgQqLuDAYDCjzA3xhGdK5evTbecOJv+x8/9z/RP//RPjTGr1fhVulguli/rxnIduVguli/rxnId - uVguli/rxnIduVguli/rxnIduVguli/rxnLRNQHAuobc1TUYXWd1CNeVKZ2XKX1c2UYMt3JlO9F36szF - MmUdD3t6zGvlyvpl3P0yD0f8u//13fSFL3xRZuBPpHWrN+i2fECegjvd7GEAkGUftu3rzmAh0maxDDx9 - ri4B605gAKDM8iZMnNYAgDAFA4ETZdDpq8xJmVUTMzGGU4GeyGRMglYxOcJVXWe+xvCcoWcGKGVhyGxC - 4dzVdWs3y73OUBCnwG8kR3SNVV91AQXsIRkckc9ttaVhS8OvpIHDMgmQlLqLlqxKc+YtVvMV/l/ak/2X - 54fat8V/5QB/P8936JARaaIw3ckyeAMCAejT0dtEEijvd64AQJZe2hYuT4sFGJtkZ3PauGGHTATYCGIA - 8KgANHZqMvgCAO+64yHdAMLgfO+9T+oA/5AM7g8L8EMX8LFHX6rLwQC/e+95QjeIMIizfAcAREfszCmT - 5LBb+OiRs3qNXXI9wOjoUeN0EO/d24GKLY8SNn0pi0fAR9jzPA1iEI1AyOOAJcJehjgDKqCPjTxMVGjv - xhsH6mAMOEOSikK/nzfNfQHguCaSMiRQ2L20/CtkYOyuS++65CfXAQzS/6nLIE1fYTD3e+dIPAZ/VZWQ - vssyNPUVfOb79PuPVII//++RPN2fT/mcnEiHaIuNFmPlm2XC0Na2TNUFlixelXVGN+oS8AbpK1u3SF9h - 1/ie4yoxPiEgEJUBdvneecH0AB+872kBgNIvHnqpAsCnnni1Sv+eELD3pIC+Jx9/hQDAH5M86OUqQUaX - FKkxQPK2W5H+3SUThjtkQnKbXOd02rfvRNq756jqBi5dska/35vykYTXyXuoACDfPwDQ+IICJNKJK7+A - T0iahBtGlZWM35SkZbUtwlVZK/8i6UM2McAElr173i8S+RvT9l13p3e85yvpgz/9rbR7733yrNE5RQKI - 7cNeKglU6V/vG+SZb0mvfPVn0jvf/Ydp34EHZNI5St5LfzXnxGSDdz5FgBQTVv6P8kK5H+6t8X/1np1P - cp+RZ0QeYmVU56+pTKTYjoXpozcKyGWH8lhshY6ZoPZCx2UQqBJBHQemNJaCsRaBeRhAIObEMDGGwIFz - grEHuG/PwfTud70n/eVf/lVLPUCPl+mlX1cOF+OtypVprcrhYrxVuTKtVTlcjLcqV6a1KoeL8VblyrRW - 5XAxHsspAGyVWboyva5cWb8uHp3H69Lr8mI6ri4efXcdlSvTY9xdZ2keLuuXcXedpXk41vfwv/7rv6Zf - +uSnhMleSMuXrkrz5yzUj9J3+jJLY+lXpUacDCIg0IGgSQHnpYY9QPmwUVCeNGl6NhjMTHCiGmBGeRlm - hTkWA3ORjMm03PCQKaZZemDMSjDmSJIGU5RBYLgM8Nu37RNGs0R37zJgcD+AP3yWgg0U2sH9hHVpWOqZ - lHBMGgoQFAIIsuyET/3ZcxYo2EIXprr/krjnuvRLpbp2LlPgcL2ACgYcJH86+5Z7cuK9TJ06O01FCVve - L4BedQFZCl60PC2VgX3Nmk0CALelbdv2pJ27DqYDMsgC0E6cvD2bgrmoOzRdnw8AqMu/MmAjDXwYCaCA - QKSBDOD3AQDFZwmPJcHbb7tfJX9sGECSQ9uHD51OBw6eSgcO3JL27j2WVq3eqAMHJ3nYUlhfPWeZwRRy - kGL6U5xfbLsqPT+WgUpw44CyLAfgQdqF1M2PNiPd2wbsMRHArh2SMcAZwI+B+/rre8rAfLP0mzGajzQR - HyBFHmUAkUweWE7VpVUpw31Z/V5alny7Lhstblbpn/8nypYAz0FhBHiRvC7k/6OuXCQHw0wa5nBiw/zF - Qkt0l+9CdEZlsrNy5Xp9T+vWbU8bN+7Q72rvnmPpgEwYjh89m07fckH6CqZe7hfw/7CCQMwFqS6ggLyn - nnxVQwrIkrADP5aKAYkPC1jExNBddzwsk477VWJ85tRd2m8OHz6bDkpfwSYl5oq2bT+Qdmw7KPe1Wt8P - z49nedVV18p3D9g2MGSgzaWAkE1EK97RnlwarGWUlxhfqdqz9AY/Er7Ge+X50W+7y3tFsqd9VUAep+5s - 2HQmvfltX04f/KlvpT0CAm+4YZDkue4fk7cb0ty569IzL/1FAX9fSYcOPSbf82jdBELbTI5Uoi3Ai7On - p02bo2ofFW+Qe5P/7HrRDkw7pq6W4T9am/BUpJfwVSZtqPlglgcQiH4mtgtZ+UEI4AAQ4YADQN8ZjEkY - pIAsAy8RPrRt8870ipe/On3tq3+Uvv/91nqA0flY1iofV5f3o/bMPV/tNXQAO2qoM9eVC9W5VvWcynhM - q3N16V2pW5eGi/XcdRbHvVDt4TPD+ru/+7v0gZ/8qXRw/xHV/2NXlpp8EfCHmRe124TRTgWAnA0sJCAR - AMGS8KyZ1XIxkkDdDSwAEJMfWLs3AGjW7gGCA28eojNHZyjKVNQXJqPAsGI4DvyaAaMx3IpJZwat1Az8 - vA2WbDiXdNPGnWn9uq060ALgRo0eq7pNgDhAHgT4MzKTMOwy1IP1xWdZGKkfAAt9QD0/GMV4+W8M1ljI - r+7/h0f8V6R/DOBILlVJPJMBwOmN3XhT0cGRd4uUV0GgDPCqCygDKAP7+nVbdCcwy8AAMgDayRO3pbNn - 75JJwj0C5O5Pd931SLqYd3gC/FjaQ+dPl/p0I8iLFQAi+bv7zkd1CQ8AeO7cfenUqTsF/N2mS8tHDp+x - wXz/SbnWcaU9e46oJJJ+ZBI4lsScDPQZ2XKZ79r15TOVqOQyEdgAfjzs+Q6MPIxEjnfLdYmjB8jGDOi6 - 63oqOEISeNNNBsyuu66Hbuy45prr03VSliU/QCRlKAu4s7rdNQwwGTx4uIJH7gNwaO1z9Jlt+vBJB/fi - 94fv5P8FimCQuP+XSPG5xGfjFNvlfyERnzJ1RlbzkD4yWyZ98s0rCFxgkkDO02bneEMXUPrLLgFjAEBs - R546eV5BG0vBd2aJsZoKkn6CLuDjjwnge+wVSuwKNqngq3T370MC/h68/xmp87gCwNtvu0/auqimZZAY - Hz58WiXTu3YdSdu3H5TJyn65/l7dkII+61B5f9jV6yHvyzfUGGiBJzh4MwDY4C8N/hFI+Uczf2ElwaVr - DgAt3/gWQAy+MkjeP6oYdqIJ77anPW/eQffeadnyg+m1r/98ev8H/lz6/sPpphuH5slOf5mcrUpPPvPz - 6e3v+oN0+MgTwqvG6oYuBfr48q45dQVJILqAM4T38i0YLzD+qP+T/60STeeb7flGRV3JN7Lnw2rDNWr3 - DysPmH8ZPQpCEpgBINQAgJNlQmGrEQ0JoAJAxhfhRdLXWAZm/Fkv3/5DDzyafuvzv53+8z//U8eqrri6 - se4HcT9q79JdrQ5gdK0u4un4Tu46qlPmeTzmlWVaubpyXW2vTOusrFMrV+Z5vK6Ot1WX567M8/LMsP74 - G99Mr3vNG9LWzTt0Oz62mQBzmHkBBDoARPrHkuGCeYsVBLokEN1ABYEz5qlir0qZMghk5sdSAEsCY4Qh - YMKBWSJ6U8wgjaEYRSbjTMfzmvIDGFTGHqixK8/jmTkDIK+99lo1QYCtMnRSOKaMZTld+h1hUj5d6hVy - MIhdwBF5k4jZCBxpDF7qsQxjmy36qr0uk/5xXyXzLKkrZbpO/DdOOWEQcMkfwA8JrAJAdmQDADHSLe8F - fUAUyBngAYCc+oEUkFM8Vq6UQR0AuHVX2rnjQNongOzggZPp6NGzugx8+tQdag8QY88o+Dc2gmTwx4YQ - dALZHYzkh8EfnT9Ao4M/pDgs4x07dms6dPiUDuYAP3aT7th5SIDnQR3YARYsWbPrUQGeDKIGYnopWHLQ - RziSp0dwU1LMtzaNqI80rrsM0oAzdPIYTNmcAcgDrJkP9UjYnfPBFjDIO8CnLj67glUaI/WpS/sG+ACF - PQQwIKUysyXE/R64N/fLe1cg0SI9/o8YjnHIwHQVtuXsQTqRYZKArU/sRGLmZZZ8+7Z7HJ3RpbocjC3N - pUtXpdWrN6oNyc2cFrN9vy7JHj50i77j03nn+B0C/lnKBQAiBUQXkB3BSI0ffwxzL69Ijz78MtUBRH/U - DYujM4rE+Nyt96r0D31RdAzR/WP5F8C5Y4cBwK1b9qkBcwjzRkMEgPXp1Ue+C3v+CtYUuADaMql0L/AY - +Y4i71BS/mE+xFKrAkCWkHP92MZ1112nE4ABAwZLuLv0AyMAoPVhe+ZMLBa07Uyvet2vp3e/7+vpwEGk - fGNlAr00PfL4h9Pb3/2H6ejxFwv4G6c8BokxAJ33BOkxiwIAoSlTZunk0+5f7if8D9cldZ5T8VF4h4Xt - 3uW/0Y+1TsFfGnWcLted1oBs+CX60ki+HQByuosuBasUsBkATpWJBZI/3QQivBhijLFl4AVpofCh1TIJ - ZTXq47/4yfQv//IvjbHLx6wYd79Miy6mlWXLuPtlWnQxrSxbxt0v06KLaWXZMu5+mRZdTCvLlnH3y7To - YlpZtow32QH0DHd18bJcqzplua64Vm3hOmqrVV5H7ZWu1bUIezyGcTFculblYhsxjIvh0mlZ+X33u99N - v/s7XxTG+3has3q9Ajxf/gUsudFOlnvnCehbIAARAEg5BgRoDtLA2W0yUCyQQQMQODdvBkEKiCmYKWoo - FoYAc4BJjBw1Rhgh+nLGgJoZTEnOjNrnOWOGKrBnzE+ZmTI0awPmCFhjBsrpASyxYRvQ9HM4ycCW/Vii - g6Eyu9bj3qQcZmwAIna02Y0JsxjM7FGA5n9cI+ASXSO/TnXPLzxddSXn/faswF8mBYAZBEIsy6sUUEDg - NBhvHtxtYF+m+l0rWNpTyc5m9VnmW7F8rRqLXrx4hYDElbqRhrR1AhRZ+tu/75hKCM/delFA4YMC/h4X - YPiYAEABfgL6zp97QAfx02fu1s0kmIBhED986IzuAmYHKfp/HDVnA/oB3VmKBBIds+lyn7yTnkhTZOA0 - iYpJVZSypIXlb6gx2AoZ0DHAFAGQU5XO4BxBZB8FaTaIGiHpo7wv6QLYABLe7wCDLM15GfIBH16fXb9I - 6rgeIBMQEHf9YoIGKQ/5EbD5/TvFdA+X5P8jkuVZHQN/kiZ+b+n7SCT5Pk1CbKSD80wBgUgCMwhkEsjG - IQbqJUtW5P6yUSZVpje6a+dBAWdH05FsEsZMBz2QLrIZ5J4nsnmgp/MOcZMGOj3y8DOqTnBf3viBIWnd - +StAEvAHqDx65NZ08OApA4C7ZMIg/QXpH7R58x6ZNOyQe9mZFks/Rc/3egFhV3E6yGUOAiH4gwM45x8Z - CAXwFPmKgnzqyDduOoRWJn6H1O/Ro4euHqAXhykm+EMDAPIOMiEJBCDOW7AlvfQVn0rvfO9X07nb3pju - f/AD6e3v/MN04tTLZAI6MfWGN/UW8IfBaAH5+AoEUSGQSSfLwPBW/iv3fgX3J/dl0knu00Cd/ye/b8o2 - wo3/bunOWxt8U/9flUY9eB7msFgdGTGcTXNjlJjgM4lQEBgB4MQpuglEpX/TTfeP8YU+pnYBdRkYPcDF - abnwlyMHT+iq1N/97d81xrVWY1urPE8v81qlu2uV5+llXqt0d63yPL3Ma5XurlWep5d5rdLdtcrz9DKv - VTqunQ6gu47S6hrCEa6r93y556ttb+cHaS/W/WG1R/yf//lf0ic/8b+FUZ9XBVzMv7Ccy+YPwB/kG0BU - +scykJDpBRkQnKfSwIUyQFBXQGDeFIIRUOxATZhg0iiVAsrMEAA4auQ4XeaCSSqTEeYTmU49VUzICcbV - FM+MD+ZuTLCZSRvz6qUSPIgdejrwM1PPM3YHGDA5SEEHeUIwdAjD1tdmiRADO+3G6/ywiCVnJGODhw5V - 21uY3oHZ8swjGNQ0B4ECAFkG1h3Bs+aqFBfJDst8HOHFsg06kbZDlZ2KAljkeVx7HUud1wpdoz7PCCAM - kGYgYHffUulDgMJjR8+kW8/elc7fdp+Av3tUGgT4OyGgAGnioUNI/k6qhBHwh9QPSY5Kc6S+D+jE2ZkM - COF9YUrIpCpI2eS9BOIeG+k64GYwyPvN5EBPJTFZGkOavm/KC3CjvoIrAUd+AD9EWwA0gB356OlZvvVd - nglAygEi+abqQP7l0leuayzrcl18tzsIsXyI3iBtO2CrgFs9Vf+rHvRFsjJel3gvBaS62UO+TVcPYJAG - AHK6D4O1bgRj4xASYwGBSIzb2tg9zlLwurRiBSaENqfNG3emHegC7j2SDh7ALuApXQ5GheDQgZNp/95j - aY++6/1pu9AuNTZ+VO0Hnj59h6oYXLggYPGuR9Od5x8U4Hh/uv3cvWqC6KT0mxPHb1OVgQPS1t590m92 - H0nbBQCy9AvRZzZs3C2Thp1qymjhwhVpgDxvdlurEWjlCwCeDIryc3cQZPzD0ivwR7oBKiX5zu0sXOct - 5FffI8AaAMhmDXibSwCr/krf8P4p70Pis2avSy975WfST/30X6f3/cSfpDvvfKe0MUUlf7q037NvRSrt - FQAoIJBVlH7yfWKXkYmqAUC/z4r0Pynx/5xnNvORWlIw6HF/PraSwoSMTXVIAEcMH9WQAqI+YFLAKAGc - pIIAzm1W9ZMMABUEIgkUYpxB8MCxcNgD3LV9b3rD696k1imeffZZHavqxq/oWpVplVaXHl2rMq3S6tKj - a1WmVVpdenStyrRKq0uPrlWZVml16U0SwDpXVo7xmBb9Vu65lKsrW+bXlYmurnysU5fvLoZxMd/DMQ1X - l+8uhnEx38MxDedh9P/+5q//Nv3k+z+YDu4/nBYJU3f9vwYAVJDQDADbFixrLAXhz9clYUzHLJaybSpZ - YumOXadqEkZ1AafoIKMAUGaHI0cYo8CcCgzamVNkqMw8m5lVzs9lmxh3ZtgG+mD05hsDjG0ANi/Twba7 - zNZV+peptwAdDjNndo5kUIECABBfGLVRBThYBrQlQAaCqv0fCl2GwWeOt+uuOk8YhYXJAgIj8FMdzDwD - 1+VgV8QWRsygzlIwoBHGzWDJ4AQo0ecm1+FZAWKuvvpqBTiAGIAgPu/Ny3JPDI6kAaoZENhgwrFymOxg - 6fjkSZZ+Te9PB3EBBAr+dhwQ0Gh6XJu37E6bNu9KG2UAhwCBm7fsSes3bFc7hkhfFagLCNNBNQNzJRlo - karo0puQgvrwvhh0lRiEeZcAIw3Tlpe3+oAjTHew6xfTLfa/zGAzS8D0CYAv4Jh8ngMDMhJA1QeU+yNM - /2IZGSKMbqEDRPT9AAzU5xkTRvIcwRxlDbC1Jy8DuTQw1rP/W5Vppp4m+RPwxyCt4E8I3T8FgNlHUg65 - NBBegC4wk7+Fqje6SqXBbB7atHGHgMAdKhlGF48lPaQ+fOfsSKd/sYHBNuH01evzPgG9SJHor2w6WbN6 - o4JE3VF8/Fahcwr+2CmOrcFKZeCwAEmkxfts4iD+pk170kYBgRs3Sr+R8MKFy/U9XKnnAyMFhEdAmU8o - DzEg2LCjBy/JPMZAj5WHTAewAlaRX0HwCya2LNkqAPT+KH3MfZ69+tLHrr+up0yeJqdHH/to+uBP/XV6 - z/u+kS7c8bY0atRU4Ucm8ePd2u5gJ9LtZBAAIPrLTCz8nv2+jfJ/K+6zJekmPC9rbVQ89rJ0tfRV+i2r - DXoe8zAkgBUAVH1AB4DoAioAnGwbQKZMlwmmTCjoS0wqGGMaABCj0DIZlb6FPcBN67ampx57On35i1/W - U6pkBNMxK45l0fewuzKtrgwupke/LFum1ZXBxfTol2XLtLoyuJge/bJsmVZXBhfTo1+WLdPqyuBiOn6T - BDBmlq5VuruY/1zb6UpeR2VK15Wyz6W9juq8kO2h//f1r38jvebVr1f9P7bhc/ZvtfzLh5qZ/hz0/xYr - AOQ4JhgrM+y2BcuFlkr6UhnwF6vCuC0FIwU0EIjUCeYOM9BlYJUCjlfFYZgGukdqH02YTmReMBxnPkbG - lJRpK1M235ieMXRn7s7gTf+nngFSD7tuXBuFZqR6Dh7wr7uWMIO5hJH2oewv5WCCDPiVdKi53fbUlTJG - +l86Kc9/vvLKK/Rehg4ZJoBumurXcEaobvgQQKeSQIAfQFDBn5ECQHQBZTaOuQaTOAkIAcjKdQFxLGcD - bLB7N2DAzbrTGSkD745NPNj3AlSOGStAXt4fAwFL54CmbgIUaYP75Lmio8S1kBDt2388HUH6p0t4x9Ke - PUfTzh2HFPxhSgSjwoA/ln03bNwpAHC3AUAFgXvT6jVb07jxU/RECk5WcGmsvqMQbwrroJsJ0KhEXHyV - GFb51hblLI70xYxIm8kYwB/AynX4iCMlRRrC5o646QNCWgP4oA2ADmVIIw+ASJg6tmvVzLsw2HMNB3Aa - ljYhB3QmsWwmB4VV3ZhftaV1xUdyyyYmvkm+UQAgEwP6Bjb/eGeAQdJVZUBAIN80JoQwJK67xxcsUsPq - K5atUX1AQCH9DUkt0itAs397fCtXyaQL6TESJMARkwj6MJMxTOfQb1jC5NmzhDpq1FidgGJ2BoDHpOGg - gEImDqo2sFP6DtJEyUNdoNGPkAZu3S/9ho0h++U+l2mfcfBmvKPiEY2lYEk3PmJhlYCpTxp8xJaRGwCy - BljxnzAAzWYNwrEfWl+kz9H3euqEavDgsem2829Ib3/nV9LFe3883XP/+9Ob3/rldOutr03jxs7Uiaga - iVaypXuVPkvfQQePfoPtQ3zlDXI/eu/53ux/lPfZCX9phClXEXp//C+WftlEhwQQsKtSQAGAENJPTMLo - hr8MAOFFtvIwI01D8sdZ8qpjahJAPRkEqaCeCrJAzwVes3J9uuvCxfTLn/msnlLFuOVU5zy9zI/1IsW8 - OhfLROd1Sop5dS6Wic7rlBTz6lwsE53XKSnm1blYJjqvU1LMi65xFFzpu4vxunBZPrpYpix3qfU7cuRf - Snu4unKxjRgunefHvFbl3I/h0nl+zKsrh/7fb//276aHH3os6/8B3hwAGrGxg92i7PoF4LETkJk/xlcX - LVwphC9AsG255s2bC4hcmGYCAvNS8OTJM4UJTFPgoOZghJghwihgGJhXQZrCAGFgLjMvZTyRGRlA0rAy - 55ye6zjzZnbuDN4AILvhSibYnpx5MhC1I22/vKdLo4qxtqJWbcd0k8gBRgcPGpqmMmDLQM3sGhDITHuS - AEF8JIIK/GRQ1uVhBYhTlTkjaQIUMPDSJgM00gvA+MhRo7U+y4AzZUKAiRuV/CLxxWSM+NDCRZmkP6BH - CJAAFGIfEf0kACD3zDUAk7x/dhkjudm/L2/6yBIcBXmqxG8AcH0GgSj1I8nZJPlbtuxPy5dvEGAwXiVI - CtgZZAF8mWxzhpAMujoAS7gC9GEwBvAB/BiUdWC2vEZc02ypFyCID2i7+urr5H8BWgAw3TUd4IY9N8AW - 0j/yUQugPKCMfIgwdWiDcrSPVJDB23X/qOPgz0GbgYY6YAc1SwKrcs1+RT0UPAD8mQDokq+QTwrwMf9i - JjsqnVGzIVlNCFkRYBkYnS1UPbB7x39hYsR3wjdztYA9Owv3Rt05j8F03yCgG8M4IUjCNolgZ7SpHPSU - fggopB3aA/QMGTJCdRA3b9op4O+ISo63bxPQlwEgkkCN5zCmYbZKeNu2gwoG50n/Rbqv4E14gk0W4RcO - 5BwAVmTfXc57ETzEAGCjjOY3f7PcL5vLAGcVAKT/mc8EhHeCRP2mm4ams+den97xrq+l2y+8XfjiLPk+ - F6Y77n5Xesvbfj/dfv5N8s3M0X7RAIBQBoD9pc9wTjC7/rvLM3P+AKkUs+k/wdsqHhLvuZnKPGsP4Mx7 - gD/wrpn0Kcl7AQQiBTQAyGaQvBFEJoyYgYEPAQCZTGB9gF2/JgE0IQPgTwGgxBFAIIhYsXR1OnHsVPrI - z/5c+sd//Ha7Ma30cV3Jdz+Sp0Uf15V89yN5WvRxXcl3P5KnRR/XlXz3I3la9HFdyXc/kqfhLmkXcFk5 - 5j1XV9f+D+K62l5Xr9WqvbL+C9mevDaNo//3iY//Urr1zO1p2dKVumSDGN7BnwJA9P+E8SIBtPNjAYDL - BQCuTEsWrdKNA4vFBwyyNAwInDvXJIFxKXiSLgVPbZYCMlOUWb6aYBEmcsONNykIrBiYA646amZQTsb0 - jLE7CPS4z4q9bueAzKir5bpGfq8OZsu8GG9PADXABXpbAD8kMwA1leAwiAsQbJIIZhBIGIkg4AxGbidO - APyuVGkNOkTszmbQ570r6J+LbqABfqS8i+S9s1OYs4PZFLJ8mdDyNWnpstVpyVL6gUwGFi0XkLhEAQLv - GiV1BnPuHSDI0tgUuUd2YqPAb7pbBv42btxlABBTPQoAJb5RQKHQls3oBO4TILhX7melmlnp0bOXPgsG - WqMAACH0NPMgrIBQB2HyJN3DQgb4JA5AbBq0K3LgxqYN609XahzA5hI9fM8HZJAP6CLP8q+XZ4DKANKu - 9vlOCtTE16Vp4pom1NBxNDDXHtxVbVm5ZkKibYM4ZovG5b5jOn8u9YNMisygbROJxsYhpDUAQNUJXqD9 - 7eYBg6Vt+d9I1uQd866RHpte4UTte/RPO396sU4U4CNICzlZZL70L45zmyeDPn2GZeYpck3dSCH8gPN0 - 6fN8K7wX1B2og6oAgG/btn0K+tg4xM5xdEmVpG/t2AkdSjt2HdF8ViaQgLJpqsmUi6qLVGCp4hORKOem - YyIvcbLvE+AL0ERS1piU5P7D+1fJn/TZfv1vTidueVl613u/mS5ceGcaOWJa6ikAHqA3btzcdOHOdwgI - /IN0h/iTJi/S+zYAaNJAdACZNPB9IXH1b8wJPmj/ze6zPR+tyrYmK8uEGkkk4A/pHwDQTGEZCDQpoAPA - sbYEjPQPACg8h/7EN8/yr6kRsLtcACDgT/qfSgEzCGT8QQ9w6eIVac+uA+kdb39X+ou/+JbqAbrzsazO - bxWOrlW8zm8Vjq5VvM5vFY6uVbzObxWOrlW8zm8Vjq5VHL/dLuCuUFm+I/dc6nTVPd/t4cr26uKX4p6P - 9ijz7H8/m/7mb/4mvf/HP5D27zssg/tS3YUVl3+R4PnyrwLAuYsUCLD0C+hbsnh1wgL/kiUCAAQIqiQQ - EDgvSwJnteWl4Mo4NJsTAAaADZZ4bEOIgEBhIJhaYTkMCQqMx5lXPUUmRTmPE4aRZ2bdRJbXaCPPiJul - ejmvEQeoVeGOqbleJAN7deRlYrg9cY+ANRg9Gw1Ul0aYKLt50eMjrkBQBmWYrUsEfVkYyRxmawA/JgVh - Rt9LGTpMmoEeEImURXU9M/Bj+W358rUK/FD4X716k+76XLtmc1q3dovagVuzdlNavWZjWrlinR7Sj0Fp - mxisTLOFmY8ZN0F3LdqSuZ2TCoDDXEcEfyjvOwEAWQIG/G1Gn0vAH3pdG1XHi2Pj5uoubcAO7V3r+okM - uEJmm882rTgIVNL8ZmCIb0v95DcDwAZ4kutg0sXMahgAAMwhdcMcDDYCAXTe/6Arruim0hsHZuTTLz3f - 6zeBOMBbpHz9hh5jjhuFekp2n0pN5UjrnrpLOs8MKY0exyV9xyWAlRQ5A0AFf0bs5gcYquFeee4ARpb/ - 0Bd1/U/UBvrfcIOCASYaTP7mZsAH2GNiQH9gkrB4SbWbfAnHEKr9yY0SX6v8RYGhTCRpg345THgDeoO2 - THyFAn+kyWukD7I0rFLA7QcU7GEaBuPQ7BCGdu85lnbtYZf5UQWBnF/O8+BbiiBQwVIm3o3yBJWa+XdK - GvlZEkgfaPqmq2+VvtW7T195fwb6fALBdZGK9u8/KB059kx653u/ke64693yPqbqDncAnpo66t5bJslz - 0rnb3pze+vb/k+578CfluS9X/T/AHzqABgD7Kb9E4gjwtOvb/cDr/D9V9+h5Hq7uuaobw5StVgYA9Q0A - KEBc9QCFZ7MEzTvS3cBsAhk93gCg8HnT/7Pj31jOZ2IJAQJ1CRj+JQBQNxtJWPUAZSKwqG2ZfPfb08te - +sr0h3/41fS9730vj17mfNxzchfjZb77uBjGxbJlOY+X+e7jYhgXy5blPF7mu4+LYVwsW5bzeJnvPi6G - cbFsWc7jZb77uBjGebl2u4DLgq1cq3Ke3qrNunD0yzR3dWVLV1emrnyrcGeuVdkXuj3o+9/7fvrGH30j - veaVr01bNm1vsv+nHyUfJLN9SWNm7jN3Nn0sbBMmnsEfTBuJ0FIZ8GHmSAcdBGIehvq0qUvBeUPIuHHo - j01IIwUAAgIVAMrsEV0SloJYDmbgNiYE4w2grUHNjMrjKgGEHABGxq0MMbblbfwwSK4njPdylWY4U64r - 155g2AxYLC9xEDzvBibKbHqmzqZtRu1AkN2bDOi6lCeE/h4K49TnuoBIBg5AOJIelmWQ1DLg6oC8VMDe - srVp2XIDf4BABuuVK9YrAHRQyO7PFSvW6rIu9uA4EQJat25rWr12s9bBHAcSG66BXUXspPGfAIMY5sak - EMa5NyL1W7+9aflXJYKbAX97TLlfSMNCa1Zv0X7Ut9+NCvRUEojET4mdykYVMBSSazekfEqEjSoACAn4 - gxQEGngDqBE3wGP9h8EdPUDPhyzPAB4bhFj6BZwhraMckj/Lv0yBq5uFIY8NAdUSdDOAq8iAXhUuyfKQ - Otn9W1v46CLyfTEZY2IHAOS79NN7XAoI6HIASNzSTQLIoM5/wu4k75Ej81i2xUYmp/6weUSlOPJe4RUA - vkbfWbVBQRubezZIP1kjkwaOk+PdbyFt3TadRNC34CkLBTSiYoDaAZNIAAfSRkyxoF4AGFksE5NtCgD3 - KwDkWLjdu4+mPQA/8ffuPaEmY8w/qVJCJJpI4XwzRwR/LgVUnhPDmeAleq5ug5fYu4zfK0BVN4/xHuiP - 9DV5/txz7z43pgOHnkhve8fX0gMPfyiNGj01gz7pP1Ie/UzeI/7o0TPTrbe9Kb39XV9Njzz2YeGjKxUk - 6sY1AcRIGfmOkZJyXbtPuQf4jNyfmr7RyYr1V7+/Zh2/KlxJCb3cZXpv6AEPFADIEj16o9hYVHIQmKWA - 8HA1CO0AUJd/p2j/4f25jp+S8q85MonNIFAIHwEEeW3CM9YKT3ngvofTb/7Gb12SQejoLmX87Ir7UXsd - u3ZLwN4AfhmOae5iGXd15XCtykZXVw9HelfKdrW9OteV9nBdbfP5ao98Pqjf/q3fSQ898EhavXJdmq8S - OwMVtvyLsq4BQDcCyzJNBQBZCuT8WAEHAhYUMAjTRqoDCETxGsCI/thMaWP6dLMNaLqAU/SMUUAgDMMI - XUCTAg4dxnFZNwsjvF4YGUzXGZNTZnSZcUUy8JeZeYM5hzQlY3bOCBkIAAS6EQC9sOybJAjKYbkfmC1L - cTBr13Gro/bLxnIvMOYrbYmwOa81YeaFJSsG2oEDBwmQEvAngBxQPmcO72aenusLEEQi2JAG6rKegD9h - xkgLUOCmPf4nM3h2BOvgLsSZwOhzsfsO8IcpF4Ag7xugwDvUmXvuCzO5npDVW6rSQk4SQTK4XgZxzLZg - ykV3gy5bLX1ihebTHhIBloF5B0gt0JXChqSBR6R/GQAiAVRzHrYRBADI8u9mDP5KnB3DS2XyMWjQsNRT - BkSVAsp/awaAJgX0QbiZHOz5O45kwMnIJGqAOzZysIQKsKN9JioAOAZsytgmEE6fuFJAwFWaRxrtkI7e - oi2/XyXUTQdxwBSDvV+nAf5KyuBAJYA5zeJGVVm7b1129PA11+t9IHVF2quTB3mvbOhg4EUCYzt/rc+g - QlBJAE0XEICInTeAjUv9esh3gFF0Bnnq0I5KkOU9YyNwmfQlAN1KJMcK/jappG/16s1pzdqtJjkmXSYL - 2BFk+X+tlEGyvEEmA0wwkDqzwQRpNBNKpJOqLywAlEkEu2BZWmbDB8u+bA4B/LFLGOAHYW6IYwY5bWb/ - /lOqdjBBeBCbuRobOjIRj6BOeUUjDT5icadYNhL9EQmp9zX6Yb9+N6e9Bx5Kb3zbH6T7HvyQ8L9Z+jwB - dQ3Jbn6HDgZHjJyWTp99XXrHu7+Wnnji5+QbXC3fc3/9ptnYwrfERja9V70XrAPkncoqreRdNd8jvMko - 3nfzf+Db5B4GyLMexGlHAzIAzFJA+lITAMwbQeDl6P+NGztJJwQTJ0+VfpX1R4VHNQCgkOqbAwKzJNAI - czBmD3CVTARuPX17+sWPfULVlRi3IrmrC8c0d14vlinTcHXhmObO68UyZRquLhzT3Hm9WKZMw9WFY5o7 - rxfLlGm4unBMc+f1YpkyrekoOE+MLqZ5uPRL1yq9M/f/d3tlOvGY9v9Xe8T/+Tv/nH7xFz+Zzp4+p/oW - Dft/Cv6yPoZKAAUAuA6gfJQKALMOoOmBrVUzECuwB4a0SNIAhywT685gAZa6K3g6BqIr24C6IWTcxKS7 - gTEiqgCQ83dHKghEVw3AwzKlLx0ak3KKjKskYc5KDvScYcPk8WHizJIpgyHlK4U591dDzzcOGJBuvAm6 - ufIl7Salm5VYRhtwE8uPzLzLaxtjbQaANmgwcFYDR8xvT9wfUhaAHwCQGTiAnOU0BjzANXpVc+cBBIWZ - KhA0+43MtjlofRxLrwI6VD9L2kM3C90vZuRTkfxkXT8Ff0hbdIOHATqWlpnBjxozTt6TAHWOzBvFrm1m - +ONUqsg7RMJIWV2SlmszUaANPSJso4DBDdtkgN+ifYLlPfKRJCG5MN2uy1WSQTpSP90BLMAP6Z8RG0Mq - AMhGEJT7zU7gXvkvsxSYAdqv7mY7uVXq5yDwaolDDgIdEGKqpQSB4quJm4ak0AAgkjl8lO8xt8ESPNI0 - 3xXs4A1JHrt+bVewndxAvi0RVyASAMP/940hXp9lW/oUIMD9BilAiEAvUAM4SD295/x/AH/yPwCdDNxM - sGbPNTDvkmOdNEg/4J3o6T3yPifLoK3AT4gJAt8sgzzPT78d6Z/0K5MgI+FBb3S2Ld0JUFu+bJVMBsw+ - IBNEJoX6/ttssxCEzVDvx0xk5i1YrGoG8BAkyjoBkP6wbq30nzWbVd+UfPgPkmokTrxjgAogCh6FXcFd - e47oLuH9+29J+wX0ccb0oUNnlDhD+NChs5q3RSYWqJ8wwbJvsvo2q4kj36L4kme7gSHiuRzxXLYZTBmA - 4nnZO8AY9VVp0eLd6XVv/mJ65NGPpvHj5qpZKZ9MOnC3CUB+9/rOe6ThwyenM2dfn17+ys/Kcz0kEwds - c/aV/nND450oz1A+4+BP/k/jf7jvwM/vM96zl7N7h+/eJPzv5psHZgIADhEwaPZTFQRmAAi/9p3AmIEB - ALLJZ8JEUy1BwqzCBOFPzQAQgUNldQKexRhheoBtMi6tTIcOHEvv/4kPpr/9279Ts2XufEzDj2F3ZX5d - mejK8h52V+bXlYmuLO9hd2V+XZnoyvIedlfm15WJrizvYXdlfl2Z6Dy9SQcwuthADNf57sp4dDGPcBlv - 5cqyuJhW+riyfHR15TpL68j9MNrjQ/rrv/qb9OPvfX/at+dgWiQDduP83yz9c4VclfwAALMSN5I9AOCi - RasMAMKwBfyp/hcz9hXrVSKIBGkRO4N9KVg+dDsmLtsGbNIFBACOkdkuy8AuBUTBeLgyG2a5vnwJObjz - eCvSwSowayXScx6MziWMgAU2obDECujT00AkDNi7CVJwCPizdBhkXA7U6zUYbQaXmRg07NrkW9zKOfON - TNh25GIug6VaQCDPgGWRhQsB3+zANZDGbjmkLdBcBnYZSHVQF4bKwKzSAcCftM39svsacOingPBebVPP - MpUqat60GTow6pF38vz1/8t/ZwBQkycav1nDDAIwfd/RzXsbM268AUJh5NMFXCDhMcneTpXmqOkg6RdI - hWmDpW3eBcAIgLBJdQFNCoj0z5eAMQMD6GsAQMx8CCjk6DrACdI0k/pVS8EqAbwaEGhpSD8jCFTAxyCd - fZUW5jKWZiAKcGZK/Bb25d4GcMvkIA0D0k3ATtrw+pRBoR/yPCWXPHs8UAn00OWz5WKLG3DMZbROvm+u - J2mDB3F04VAFenPnL0xzHAQqAJyry/MOAAF8SPN8MxH6fwzyPFcHB5jFGTuWCcBE7S+oHNAeJmGQHvvG - oDnCMxxcYnwc/d/RY/Lmr0xsGGCCMU7aGjd2skxMmESw0sBxc+idrk0b1m9TWrMK9QP60ErhRUvSBJmA - sGP4cuk/ACn0BtH7UwAo4I8TQwB+R47cmo4ePZeOHeUkEY6SOyfpt0of2yl9Z6T2QZPKIp3371a+xYZN - PL7Z/C3LM4BfVAALMp7S/C2zFMzxfvLe5X3Ydzwubdt2UXhfW5b4MXm4vum9OwBsxPWdd09DBo8T3rlU - vpnhKjFkcmHSZrsnuw/M6NixgzrZzPdWkd1XBIAGCP3+sTDQLWEP1c4Zhg8KCOT7l8k4EkAFgcKPIKS/ - DQDIiSDCv0eNHmN9Y5yAP1YZ5L1zNKgJEmQsEeBnKwpGBgJN6GAAkN3Ac9I8KcO5wDu27kmvf82b0je/ - +Sfp+3kjSN0YWI6HZV5XynalDI5wV8p2pQyOcFfKdqUMjnBXynalDI5wV8rid3kXcEcN4urSoivz6+Kt - 2ojpdWXq6talRed5sYzXKSnmebh0dXlep6SY5+HSxbzvfe/76Y++9vX0ype/Om3asDUtmCczcj7ECABV - +sdB8MzW0AEUoCFM13aD5iXgJatVAsggvFqY8+pVGzW8fLmAQAGHgED0AXUpWNoBdLAUgMSAmSEMHCkg - M0YGA5UACgBkNgkAAQCyXImxaGaj6GnZEo0zr/bMrYobOfCKzFAZXgZljeUfyQcUIJ25eeBQBTwq6QP4 - COO7WRgf/oAslbz8crumDgoZ0Nn9GCOO1zepgeXFQaP5nmnLzF4ARFheNj25G+XdzJPnzQ7cFWmRDLLo - RRFf2Mb7WKx2s5AEujQQaRz/A/BHu0hIeL5Id3j+zMSR+tEOwF7BnwBzdDKZ1QMWYPYol98gwIyD583m - WCbCSjekG/rdqGBZ35PUYwBgVzdLz5iAYLMGR8qh37d27XZdAkSSAxBECgQI1Hck/517XiL9xqV/vtS7 - ZasT9t32CQA8kLa4FFCIa7DECfDyDSEGBiMANLoOkOeUgZ8BvggAkf5BDMIVCOyMFIyFwbuJaEsBWR7g - c7y2rFJzWw72DGTmcI7HMhZGpxE7c9erniXvZfSYcQKqFuuyPce5scNbj3xUZXy+eTYU5c0ggEA2E7HZ - Y9hIfZb0I4AS7wjJry77TpmmfQfJH/1xsfQnXUkQvoGqB+CO+rpjVEi/H6mvxyrK94yaB5OpgYPRLRui - k77BQ0aqbicbB9DVg/cwsWSJmPOGmRzAY+g/TEQBrPRv+g9LrouEL+1RCeBJk/4dPqPnTh8/ft7o2HmJ - nxdQeE7yT0uf3Kpg5kr51gBp2MM0npC/W/+mtY/ad2uTRohvHt9XKNoT3zHvG4kz0mjvA/7OtJ/ld2Z9 - ziYe1eTD3734AhTZjdu7Zx/VzbviSiSTfi0mtGxssXOleVft+YxRBQChKp/Nd3379E3svmb1g1UPfUc6 - GWYCmKWADgDRB5T3ynuDb5sNwLEC5Ceo2SmVIAsAZBLgO8ddncRUWKyvIGhAdQXdZj8lhLLwtw1rt6Qn - Hn06fflLv6cGod11NMa1cnEMLN2P2nt+2qsFgGUF4l1Jq3OxXOnjYlpMx5Vxd7FO9HExLabjyri7rpSL - 7ZV+6cr0unKkle20K5fL/Md//Gf6zd/4fLrvngfTqpVrdTColn+FGBCQEGUAOHeOgL+5HPtmAHBhmzB7 - AXeNJeAV69NKAX9sEAAIrlphO/qWLF4jYHGlKoQDIFkK5gOfOpVlpWkyQ+SMYD8ezowKqwTQAaAwFttx - NlQHMQYQdteZ7l17xlaRM27ImWAzGfPODFwBoDF9BjtmvnoGsAI/A4ADhdmRxjKqDQR2rWqgsJk0gwdU - XcPydfOHzNYpr9IFyTOyekgLHKz4sVUweZ4TS2rLl6Nvid4luyaN2GDBwIsEF0A3TwZ3ltMYdFlyol10 - FlmuRboHqEf6gwQRJWsYMcr9SGCGjRhpUk5h/izJAvA4hxSTFviYikEyYMdT2Q5ElgGx73fDjSxrDtBl - 6sEyMADkWW5EKjB27CQBnMLMZbBGpw9p3urVm+W+V6f5bcsEdMzRpVB9XvJseP8s+bnUD30tdnraSQ/m - Y/5DAaHkszQMQBg0cJjcXz8FdhgX9mfpxCaRUjqoYA9f8pQy+NMj/lgiVvCXB+bGYByBVkm5rII7DzdT - 02YTDwsZKAhpXie03wB9Gm4fj6ASsMHGAiQ09F89Z1UAYOMcbxlgSaMPzJo5X757A4JI89AFpL+MkkkD - kkneDZImJgVI/ZDcs/TPhM7MuSyRtm0pl/QxYybK9ztKvpchChjpUzf0vyH1p18J9Uc3UsgmFZKuy+I3 - aR/ie+PbR91AlxIFbCItXrhohfaLLQIC0ReF57AKQfpEAYtI1OjvnPXNZIMzpg8KwDty9JyCvhMC/k6c - uMPo+IV09Mjt6cjh29OBA6fk21qnS/f8RyZg3brxDaI/J99n/l71m9Vv3b93IwOAFT+oIyYl1Tv0d2Xv - 1ycbjb6Y+6VtUqrKAfQ5OQR9V6THZr8zXkd4iNxzZaw6rk7Ecu0JQMu9sWLA+2Di5++D9wcAtBWArAcI - RQA41CSA9s7GSf+YmPVCbQMREmakzYwlCv6EmDSoFFAmIQoAZVxw1RWkgXOYpM5fklbLe77j9rvTr3zm - s+nf//3fa8e2cpxrN+7VuLKdH7VXuR+kvYYhaBxhpxh3Vxcv/bo092M+rkwr/ejqyji5K9NKv849X2Xc - Pa/tSf7//e//Tt/5znfSL/z8x9LJE6cFpC0XALhAP8IIAHX5VwGgSf9Yclkw3wwAqz04JIC6BCzgT2bk - q1y5W0glgfLhko+uICeH6KAz120DZn0jYdwopQMSbDkIm4C2G3jYsFEBAA5TZsOAooOKMCSkcO2ZoDAz - AVoNxqdM25lgpFjH0gyYGSMHMLDMybUcBML40KWyMmUbVVs6aAQirsQgomlWTknSmKlzPZj+VVfasWow - bzZtwGR5P2tXy/NdtT6tELC+Ughfd9+yS1dAIUtvmPFhgJ80eaowc9tpS5vo7Cmgz7NqyqhCvbwLlmoB - 3zcPYpl7oAK5viiY96yAHxI/BmiW/RgIGBAYCFj2sXdBXOpKPoSEgEGBfKS7vEsGBAYB+hHqASwJr5KJ - Qpv0owXSN6ZMnaXPlntG55H7YqeoLf/u1Z2bBvzwDygQZCkYEAhQZHl5igDZfn3RqcM2YGsAqJTTDPD5 - wBvigXwAbgZlRTyTDeZSRwZTWy6WeNPOY+KebgQgbIDCSFqWvAg2CTuVYAK/IgCsLt3Ju8EeGzqe6OcB - 1lAZYLKA9Nd0sRiEUchnIDZ9Tr7LXgL2Hfz07tMnjR47LmFUHMkcUh3AJKoIDOyARr5fpPX0CyRG6Eki - JWbDAoaLISYNfcWH7AjGnCbAEBBGH7pZ+hQGhgH1gEF4ArZDuSagb/267bpzHD1TeAwSZe6JZ0wfoi6m - YA4dOi3g73YDfSfvTCdvuUt8zhW+ICDwDpUEohfIedToFiJJpD56gfQhvkebHPp3DI9gogiPgeAFzg+c - Sp5gxMYhNTYu76ox4XDA5/0vTFCU9L0aAQDp27xvk+6F9uX9qPSPpd98fxWfKu6pyaSVG9ruZd+5fusC - AAHsmUxSm9VhMhBUECjvWAFgXgJmwqf6fzLZ9LN/TT9YQJ3wHvoYfc1Wk0wPVO3OZgCoOoAZBGIbUM8F - ljFj+dJV6diRW9JHPvxz6R+//e303zVjXRz/yjGwrpy7WL6uXMx3V1fOXSxfVy7mu6sr5y6WrysX893V - lXMXy9eVi/nu6sq5i+Xdr90FXFcQV4Zj3F1dWkeuVfutXGdlutqe53VWvi6/o3J15aOry++onOr//fXf - pPe+58fT7l37VczOjMx1xyCWgvkAbfmXj9WWf9HLQX+LXZ1uA3BZVtpG8scMHVJbcatZDl5vytuLVyqD - RUeH9qbPmKcfOqdYMKDA3FmiYqMBp1DA8BUAysyyAoCmxwTjgQHBiJipogcDWNIZujC0ZsbXETUzQpho - g8kLARBgegxoDGYAIgNwJRXtNMU9LZa1MEC1m1yDI+auzhIHZuIwcojlHkxqsJMWYgflagGCa9cI0F5l - gHDlKnQv2YW9WgbB5WnuvAUy6A7QZ4FEEWkcUj/eKcwWqR96hCwDspuS5V4DdQOU8TMQO/AD9PGsVQ9z - 8BCTyghIZxevbuSR+jbgm4SJsryn4cOHpxtvuknrmUR3pC4NUZZrMutHerNhw3btJ0uWrta+wbIxgy7P - qG///tqvkPCZ1O+AhPdkaaABwO07DuXTHsjbJ31ype5UBLQg3VPAB+WwgcJMCgSRAvqgmymDvgr8BQCo - ZHG1Hegnh3ieAzclwFqR5u3luNsfbEUO7toDQA8HiuBP4oAHNcYs722ggPt50i+QGJstPgOBqj+qIJBv - HEmgDMQMxrMw2TRT+7wDDZZWR44ao3p6LLnaBg7pS+hyzkSKPEP7BvbgWOLlu7T+1E8BnkuQDehxgkV/ - PeqNfgfwAPyZTbubVCpIH/ZlYqTutEv/YUKBRAlpMlK+LVt2645hrBGgjsJEg/dM/2eTEwCQ5d9bBPzd - cgt0l4BAAYIn7hRQeKcuCQMAkRSyg5gdrEgB+c+0YeoY16pvEjUHfA4A7VvunC8YmW5v7kNImdWXuFDs - g9Y3SWvuC/w3v78GKc+QSWPmG5epuSso3p+XlTgAUAj1ECYevI9+8uyN+qvKh6p+MKGTCSHfsm1+s2Vg - SJeBBfypSRgFgHkDiL6jCcojkACi742OKWML+slI/Ww8MVIJtAJAVp/yErBKAW0jCCtTS6TP7t6xL73j - re9K3/qLv1SD0IxlcazraLxz1yru9ct46cq0VnGvX8ZLV6a1inv9Ml66Mq1V3OuX8dKVaa3iXt/jHS4B - u1+6ztLr8lulRSqdp3WUF52341Q6T+soL7rYTkd1OsqLjrSu1Ik+5//+0de/Yfp/67foQICkD5DA7F91 - xBQAZumffLDs5DUAaMu/AEDVAZTZN8QO4NUrsem1WQ0EMzNfu0ZAC0BQBvsVy9YpYKQ+7c2auUBBJgwC - UMCSEsdDoTeG3pCeDDLcACCW/xUAZikgQAPAASMCBAJgWF7CJAXSo64DQCgzRiVPc0kg9vKu1iVOrPd7 - WmNzR6N8+wEgKlm7b9IDW0qjXQDA1cLk9ZB6lm0yA4eulAGH/4UZjS2b2UCxLa0HCK7dbL4CbXm2AgLX - CChEKogkkE0epsh+mQ64DNYmwV1og//iFRJuU2DJrB2AyzFdfRmoAX8K/G7QJR6krwByGDnK3Do5yMwc - vR2b2c9R6R1LPZh8QP9nxKhRadCQwbokxPukvuqMKdBncJiiemMrZHKAyRjV55L+hGSAQcZ3So+XcmwC - 2QbYA/SFZeAdnB+cj/vaLgM36ehysWRoyvFmHNpBoAFAwg4CmwGgAULCDLo28CoIxGcQduBHGoRUD6CW - wV8F1oQEuDfFlRjIqZPrdUImFazqV2BPAGAGee3AYL4XwvwH1bWT94upJVcdwJwKmzQWOQhsW5w3EnHO - N/3EluR4j/xP+i7PChBPHwD0s0LAxiEmg4A/3hPf7M0C1JD8AR76Sl9iKRZVgf79bsxg7mbtU3zXSIr4 - 3jEmzUQBI/DomqFzBjBE/8ykTQPTwJulLwnAGCkAgzoqgZwyPc0XXoK5oY0CBFehd7xsrU4CMAvkQGvd - +h3pmIC8kyfuSKdP3Z1OChA8Jf7pUxcFFN6lS8EGAG2XMKsVSMOq75ZNLyYNZEmdDRJ8W8YjrJ/6hLE9 - CHQeUJJttFCAl/sVANAnCNbv8Hmf9l65vuvzNhHXb4C/q/Ik0ggQ2PQ/pCyAnnZor1ePXqkfS/EcJyfA - Dx9dX5UAAgABgkIAQDa/qaQ/r4RE6Z8u/8r70yPgZBJg3/hk5Qm22cwtSch4ohLADP7keyfNl4B9/NFl - YOEtbARh0op6C3rqL3vm5ekrX/mq6q/XjXXRkV+OfdHFfFxdmehi+bqyMR9XVya6WL6ubMzH1ZWJLpav - KxvzcXVloovl68rGfFwMN+0C9oxYwF2ZFuOdhcu6uDKtszaiI60sU5Yr892V5XCeFv1Inua+h3Ex7K5V - HSdPc9/DuDKM/b/f+a3fTQ/e97CAM/T/bIeuf4AweD5I0/0z8Mfu3/nzWWK048Aw7tpYAkYHUAAgS8AA - wHUC/NbJYMzMnDgEg1ajwAJCGDw4V3jmDAER7A6UQQWbXNiNUl1AGcSxN6Z6gDJg+EYQkwJmCaCQzkZl - kGDHLoMLBPNCSVoZpjA736VrzNkZpzFo0oyZe3pFMHYYZrULMKd7vUbdqq2qXHPYQN8VugTEYApzh/kD - AlVZO4M+GDg+aQwCSDPWr9+atmxhQwRLXtvT5k07jDbu0F2RFRjcoIM6Ay7X5bB9mDEgG/0uDDGz7Iu+ - ltkGHCfPFYmqbfQA/EEMvsOGs3Q7QQEdtuAAfXEzEPp86IfiA+TQz5o1C2VujgabrgMAEht0OydLfaR/ - mKOBoQMC0UcE+NOXrH9sSZwEgWrBBCnvZ5py2sNS6Vuc5YrUDwmNnvYg4E9pu8QBfwBBAYAsFXMf6BNi - rkVBXzcDgE0kQM/BoYE90kwq2JDC6ACcB2IPR3IwJ2EAVwRr9WTArgR5ZZpRrGc6fg2QR5qAAqVGGdKl - XgaA9C12iQLiB9w0UAdZ1AWQEgMAOfJx6RKZwEl/Wbx4mUzolqoReJcITp82U6W/1m8vVzDmJ8XAH5hQ - QEhyAfeAOSZn6M0qaJDnr4BCwMSAAYMUHABCebfYq6QeUmnsEDLYQ2aWaKa2B3gYLn0Q6ZLqoN14s0qy - 6UeADCSRtDdp8gxdjcAAObwGHgM/4vQheAB9aJjwkcNHzqbjx29Pp265S8Ef0r+GNFDCR4/dng4eOitA - 8FbtV6w8oKtr329FfJfad/J3C/Bq6PSiP9wEBJvr1hHPF6CKdBHzRddA9EXpl8ThD+jxtpP4NeoLjwq8 - Q3f/EgaY5vup+JBJH+nbnDgCQAf8KWXJH1JZfA0DAjP5ZhC3BAAAhP8OHtQs/WsAQOFbvEc2fwAAGVfg - QQr2Mg/RzWpInuEh8A/hMfCHCgAKcERlReqwarFGJrr3Xrw//cav/6aMX99tGuPqxrqYH52nl/kxXqa7 - H9PdeXqZH+Nluvsx3Z2nl/kxXqa7H9PdeXqZH+Nluvsx3Z2nl/kx3iQB9EQv4PHoYpmOXMxvVTa2FcPu - l2GP4+rC0e9qmrtWYXcdpZU+rlXYXUdp0ffzf8+cuk11x1QPQxiyieD9g7XlX9X9m8s5negNLdNZvwFA - DAUjTTBD0BUA3JTWyoAOAEQCqNJAIXaBLpdBiKUaJIhmdJoNIdgFnC4MI9sFZCkYACjMxPQAAYAGAiP4 - Mwmg6aUA/Fgy0p1r6K2oHtENKgFDMZxD1w0MwqwdnBm1Z9ZVujJQKQ+j1aWTnNcoQ1oj3eua74Mn0jgG - DKRIrqwPEwaAsNsQSYAdb5VJZu0MCCydAb537NgnoIdl0D1p6xakYbvTjm2709bNuwQI7hRQuE0A4CYB - ilsU2Pn/RHeHnb7MtM1IM7p2Zj8N3Rz0dQB/SF10uU6eFxs4kLSQj/kP7MNxRBhSPmbwqhagDHyhAj8F - gpKGXhYg0Imlt7HjJsv75MzncbppAMVw71/+ntllulD60Zo1W6VvbNB7nCVtDxw4VJ8Jz5KyvgkEPUA9 - 63XnYfMBhBkAIhXEQPSixatlkBqceskAhw6eDqwO/DKZNDBLBxlw86ALNQBfHejLZFI2I5X2tZP4uQQP - sjQHdiXA83agxpF0Te35Jo/YllFVJrQj98a9s/MX8MXgzNIvkuLlyzndpSKAILvKTX90uUoEkQSOGTNO - nw/P33aPj9VvFFMeDN6mxmE6fxwvyEQN9Qwkjuj76YYO+R75XllSBThSHksAuuMzE4CPiQS6qExC0RMG - 0Gk5AQSYEmHS5xLCkUKcG84Eg0kEO4WZQLIczIoD0sDlKzAavUYnknx70ArpW6bzd3u6Jev/nTp1lwJA - dAOPqxTw1nTwwGndEAKA5D3z/+v4AzuF6TPsmDVpuwFAgJdSO2lgrP98kPGkCvxBpvtn4M+Bn/Eh9BmR - erNCwlK8b/Ay8OfUrwEA8V36B29QvqoSWTaD3GwAMEsBWZ1pAEB5N/pe5LvnnbODnPfDeFJJAeEfQuie - QgDALAWkDMIHXwaGX5DOxGSFTF5O33Jr+l+/8LH0L9kgdCtXjnk/qPtRe5fmmiSAXXVdKVtXhrSYXpbp - qN2O2vO8skxdHXet8rrSXizjroy7i2Vb1Yll3BFH/+9v//bv00++/6fSvr2H0sIFdv6vSf9sBsZMTJd/ - ZTC2zR9Z+qcbQDiaCenBCj36zQFgZQomSwEFALK8p6dCSBhgSD47gzEhgxSQncUACE4HweSDng4iwGCU - AsCxuoQIczE9QAOAgD/V/1MAiAQQyR9SAgOAAB/dsJBJzZf066eMz6zyw7gBXjJjDqDQwZwxT2egJfAz - 5luSMWNbhkEyoHpDwnAZkNnFa+d7ch4s17dlRJMkXKNSQQgdRqsvzFrykH6g77dnz6G0c8f+tGvHgbR7 - p9Euie/Yvk8AISBwe9qEoeU1GxUEc4/UR3rITl90L5cvW6cSNqQvMGeAtSrqD7TlOmjQ4MEqYWFXNowb - 0AdjNv1BW55R6Z/0Cxi1Ld+Y1A9QCQEKHRiysxdJzni5DwAENh9t558t/esZoXItzopdIf1ihUweFsvk - gGU9JgOujI9EEyPSAEAI0Idy//btJgFkWRgdQJUACgBctWpzGjlirAJodEMZpHnOSAKVHAAC+iLVAcBO - QKCCMgdr6mcAp0AsA8VMqieYgVoEeAbcQru5DWvHy1mbTrFMg/J1uOce0s94t0jGkcRgkBk1gVWr1sok - zWglG4hUKhjA4OLl8l7n63dEv0edgm9OJwO8f4CaDMb49A/0AZmgmXmXQSot4ntjQsb3imSQMjNmzdV6 - 9B0A38wZ6HsxceDUEOtHWAlAOj1jBicGsfRn4AAgwbIvumUjpN/SR3ViMUYmFZLOcjASamwFAgDXyKQT - 3VHa49QV+tDgwcMF3N2Sjh89J+CP5eDzzQDw2Hm1DYgeIMvBTFwBssoX9BuvgBfEEqqCQDUufn26RvqV - TubkGybPVUSMjzgv8TbqqT3QrCflNUFdhGVeBX2ZuD5lkARyT/QHpKGqeynfRJT6qd6lUgX8dAlY6AYl - 46G+JM8SMBNuJlhmCmao8uZq+Xe88m/bJGQnx8AH6DtMJpVHRADIOyaM/mkGgA1TMEw8hUwPcGFaKhPF - /TJeve89P9EwCF2Ob7hy3PNwXVl3XqeuTJnu4bqy7rxOXZky3cN1Zd15nboyZbqH68q68zp1Zcp0D9eV - ded1vEyXdQDLNPwyXFLp6tLqnJeL5cu6xOvK1bnnsxx5P5T2JPjs959N3/zmn6bXvfaNCh7YZcXMTD/S - /LHqbE0Gaz5QZuPM+DnRo22+gD+ZbTsAZOedbgLRJWAGlPVZCojUz6SA69duNxDI2bACDhWMCChhts/S - MoOCLgFNZjNINgwNABw1TgAgG0EcAPryr80+VfcPCaADQCHVVQEEKviDkWXGlpkaZArnppSOrg+gkAGU - g+wBBYCEblcFYIYUQRg7s2jAmUns7GQOGCxlWXJjoObYJsxu9MJIq+6itZ20esangBEd+IVc8RvAAUDR - a9GuXIc4Bm1Z4tq2fU/at+9I2rPrUNq750jaxwkHuw+nPbsPpV27Dggw3Ju2q0Rwr27s6Ha16f6xfIPy - NDp/SH9cNwpgB6Nm5s6ArbqTwtyJI8lhuRcpojFhdHeEKSvgM/NAvCtAoW4U0IEciWCb9Bl0OQ00Uh6A - ABBEeogJG/4Ly0KmO8ZS4+IsPZqQJkr+/LYlMmivU2JHMAAS6RVLVjxzBg30AE33j0P+j6rvS79qF1DA - HzuC2Q2MWRsGNnYVq6SvDgBKugE/ew+EG8u/GYy1BoAOxgycsYmHeoB+JhdXCzhwe3J6bUknX4FgA9Q5 - WVu0qyCO9rLveU4G9vI1IS+vYanPfch/4b8zQLNkN29em3yLm1RKvG4d/kaJ842ykWi9fLdr0goBgBDL - wpwAQnuADTaRYKdTB29558YLFmuYvsLZv6hq8H3yHd54I/Yg7axhwAATAAhJnx07Z9I+G/jNVxuUTBim - zTZQMHuh3AOGpQENVl71DOU+HACyoxl+YZLkCQoSkW6vkkkmG0NM3WStAkT6EO+EHefH1BD0bQL6BAQi - CTyJ9E/An6QfPnKrbhhBDxDp8rChI+U7Ly0MAL6u0G8fqb5NGHg3dmwbPmnwCJ0QKiirJpgYq3YwWCdZ - bI6HdK3PtYWkXdUXzsDPJp6m28fE0/sRJ4yw45ql3gZJv3AACBhUigBQdwE7ryRcAUDbBFIBQMAfy/4c - 2clEHekffBs1Hvg41h0UAMp7hZ/Qh5x/GOiTd60gUMKSpgCQiabwHXiPA0AMRJse4LK0VcarV73i1emP - //ib7TaC4JrGusJ1lIfztn7UXr27lPaazMDUuZjv4bo6Zbm6MrhW6aXranu4rrTZ1eviLqVsV9xzak/q - fO+//it96Uu/lx595HEZANYpUDAA6KJ6W+6zmRozcwOAbQIAFy7AjMQKAROm/2cA0AxBqwRQAKDuBHYA - uEYA4BqXAtqGEMqwKxgAiSkKdIkAgJiEQcncAaBvBDEAmDeBDDbjowYAs1kCBYLGnJil2hKwSbWagJ8w - uIryEkhIR9KkJIzSzVVAgDiV4MksGjJpnvkNkCflVIfO6/WEDPxBAE0kgYBNACCK3TBqgCNgBKAAAIQY - UACnSGH37z+WDh44kQ6Iv3+fhPcfl/hxje/bK2Bwz8G0Y/vetFvAIJI2BgyWu8ePn6CnMKDzhe4Xel+8 - TwbM4cNGKeNWSaoQz5Cj95DyMKjDuDEMbHpZZgtuytTp2jdoA2mLvq+p+axhIYDeJAGO6P9pXPLU3qMw - f6R8SAW4BpJeJM70JSQ8SCkBgYDGJTKR4AQZAOBsAQcAiKuvsWXIIUNGqK0/zL6go8VJD/joBToAxBTM - xk1mJBhQihSYd8Pz1GVgAX8AtPYAUAZxleQEABiBH2GNG0jTAVYAEiCMMG13k/emkh8diAGtBlzxSYsD - NNdsAEGdEGRwB5jL6b7Jw/MMKFqagj36kJYLwJF7k//BZgLdQXvTQF2eWy59YP062zi0Yf3WtEEmYhvV - Rz2Db3WDAKZ1qguMBJBvjfsF/PCtIY1h0OZbVR3SeYtlQJ+rS31q/02uARhgMsF3iUSQfgah10dfYUcx - gzr9BEDA5AEeo2nSXwAGTDhV31QmCRgKpu8BGucK/2EFApA3ZjTLv7bESN+in3EdeAb3tEgmlrbasFkl - 3oDMnj3NQDRSqaNHzioIPH7cQCBEGADISSGHDp6W7+uUfGu3pKkyiaAvUJc+iA/wUsmavG/6D4D7umvs - 3fBtO39gIsg7oW/paoNKBqkr/QEQKQQArAeBRpqv4NFBHvVzO9LeVVcy+bTzqHn38Bd4DWZ1DPAZwHMz - Owb0MujTdONXhLHL2OCJQsozWT1x6d8NNsF2AGg7gOMJILb8i/kXTv9An5sVHecNvGcmiQYAGVeaAaAv - AetGEHn/lLeThLBbOkcBIobumbw8/MCj6Qtf+JKOY3EMbDUekt6VcqX7UXvmnkt7KgF8PhrsrFxHdaOr - a6f0L8W1aq+urUtt/4VuD0Oav/yZX0m33XpeZ/yq/ycfHoDDpX+2+xf9P3YGIv0DAC5rAMDGBhCWf5ca - AEQHcOVyAGDWA2xIAJsB4Gp0ARtmYTBEbHqADARsBuH8SI4VAwAiXdCdwCwzNSSAtnSpEiwA4AA7lkyV - lJEACin4g2BiBQjE0CnmJozZZaYYyZkns+QwU7ZNEvgwT6cA+DJDLQEgUigAYE+VAnKEmOl0MZADKhgk - ABFIAfE54ot7XSrg+vixs+nI4VPp8KGT6fBBoyOHblECDO7fd1RA4OG0fcdelfoxiHAt9Lh41nbwPsZy - l+sAydK6AmohPcKJAVye7YSJk1RKA1iD6aq0RvoCA7gq50/F5ptJBBl0kdDgM5jrUg/vTogTJKaztKfp - NvizQ3SCAHs9M1bC9C3rPyt1ts/AjDSHQX4p6gGLVqraAcdH9ehlivwMrCtWbhKwZzqApvdnG0PQD8RY - 9EYBiEj/IE6IUHMw8g4YnK++KksAGwDQpHIATAeB6isZMFcgCKjCdwCYgRrp1EESbFKZy+U61wsYGpbG - jhuv/XCASqVv0v7GO+daKr1pLM3JwJ13BBvok7Y9nMnCkpY3fDQAoJPei/kalvsECJh5pJsUeAP80BNl - w9DGDagLbE+b2UwkBCBcL4DQzAqtV5DHzl2eOffMaQ4ANQZrjL4jTeZ75Z2PGDk2jcjfp+7Opz8JAei1 - f8j745um7xDmCEiWdgF29C0n+hR9RicX0kfpI0wy4D0KDOTaSAIBBLZ5aazQOJMOSXuTBDSyRIzaAHXQ - 92M3OBYKOC6O/s7/4VveueOAAMBbBeydySDw9gYAPHz4jC4Bc0bw4UNnVCeyV4+eCuJVgieADADIJI3N - Gkhaeea8G5bcUVkwAJgnhT4BZOKogNB2ZjMRse/dVhF0oqAAz0Ge+dpXJO/KKzgLXMAeEsduBvbVHmBe - aVAQp2S8yWwrOmG4XQAh+crH3Heq4g7+SgBIP3IdwJtuzgCQyaPwYrX1ORz9vzFqAghprJ7/mzcM2RFw - DgDRK3cdYjaPBZL3bKsKpmpiADDbA5R3PGfm/NQmE4FVy9em285eSJ/6359uMggdXRzv6nxcWa+MR9eq - nVinrF/Go2vVTqxT1i/j0bVqJ9Yp65fx6Fq1E+uU9ct4AwC2qtyKYn5duHR15UoX0+vK19WL+aWL6R21 - UbqutOfuhWgPQm/i29/+p/SzH/5oOnTgSKrs/wkzlg8NBqx6GjJII6GZJwPx/Hno/nFqhADAtuVpsTBV - NoAo+NPl37wLWEGgLQE3SQGFGa9dI9QAgBt1uRgA4MrkfPQMFJMFKCgAFLCA8viI4XYsXCUBNDuACgBV - /w8AaJtAzGq9UQMAdigFFGoAP2GECv4yU4R5OuDLzBRGquDOSUGfpAmj7yNhyIFgBQBtmVklgAwQMjhD - jV2dedBWKZIw+MYALv9powzYp05yesG5dPzomXTsyGmjHAYUAgIBg2vXbhZAYvbBeBZstAFws/kGsG02 - /6bKs2Sn3lhbBoaB64A9XoAbyzV27itMl6VcNmj4sWCkORhkZg+gw8Argy/SGOITlOFbWRg4IGG6MHTa - QjoIuAQcAADoO/QFJEq0Txv0O6Q2KPCz4WiG9EGAvUvTkOo17P+x9CuE7T89Cm6zAMCNAEDOEN6pbWAI - mMGYs1brln8NAEoY0KcAELBn4M/DpsfnlIGWpF8tA7IBAzvsH8kxm2dYbp0xa46BP05GGQAQtP5JX6S+ - SXVMIsgyIm0D7tARNGmfkfcPqASAmp/zIum9SL9FEsf1kOpv2bwjbd2yUzcNbdm0U00KbWMzUdYf3ajm - hdiJvV5A1Ux9LgAeBn/eIbyAVQC+c0AR7xfJLRJA9PKiegbLs6b7Zf0AiTAgkP5gIGCuTRakDOkcPWhp - LBOaOgEgUUGgxBUwSjlfPmRiAdij/zJZnC19BtBAP2SXMtfkGLi1MunkVCL6E/0V9Q2+L76Lo0fPqj6g - nQvM+cC3mhmYQ6f12DgMQiMJ5Pth+ZOlfH1nL7pcT9kw3T8Hf7wLwBjftUn/fNLnIBA+AE+oQGHmC4BF - qcfSMZM+f99mU9LffXfJ87bt+DflR/ClwJsMAFq4YVhbyMoLwctIC4BPwWKgyBfhlao/DUk/AgCqGR8B - f7oLWADgoCEBAKr+HwBwokpjDQDCI+woQd0IIu9SVYsAevIuDdwXAHAW408zACSMxHi+gPtlMik+fPB4 - +tBPfzh9+x+/3RjX4hgX49HF/FimDHcUjy7mxzJluKN4dDE/linDHcWji/mxTBnuKB5dzI9lyjCkS8CR - 3MVwZ66sX1e3LOOurk5dWnRlfmd169JwMd3J4+5a5cU0d2VejLtrldeUJvSsAMBvfesv01vf/Pa0TQYG - tf83G92L5hk50j89K1QVs03/T23/qfQv7P4FAGIGBmIJGAC4wgFgBQLxMdUA+Fu9aoOCRZcAogPE9QGA - tgTMpoFxyuTZWeYAUKUMCgB9CRgAGEEgEhfTA1Tg5wysAf4KAOjgL0oBlTEao2wwzUDtwJ8DQE/LzJ2Z - uZOBv/YA0KU7MHqXQjEYUBbbaNu37UknBfydPH5buuWEkIRvOYES+21CHG11RsHfyeO3ynNcrIM2y3aj - R43TzTZqIkaI98OSLmZdMJ/Bs2W2zoDNdWDWLNFB4yeYkV1AmervCTBkE4HN5hnYZ2oYMMcADnO3Jd4J - 6gMAAXMQM3/K2/IwdabKtU0vDB3AlSvYmLJSGT3vnLLol6oC/4KlqgfI4MKyKRKcsQI4WOZlKXirgL5t - ednXSADght1p3brtqgPGsV4jho9RAMjz5NkCspUc/CkJmOPZOwEE0QnMALACgZU0EOkdUj9ARZ/effTE - CszOqFS5X38tF5cNeSe0jUkb7NnRl9mIxDIf0h4DgQ4mAHr40i8iyIvxRr8BJFR9SO9PiD7PBIJJUNuC - RdqPTE90j9LO7XuVdkja9q0CAjcKCFzPN7pOnvE4+W92z/QPBl94AaeHoE6AJBCJrUvhDADaLlD0wBj8 - keaiRkA/AQQwiDPJZClZl/WEJslEAxBIn6Gv2JnDJlGG4AMuYVbJUZZIAxgBh/CGCVLPNxUhDSROX509 - e6FMQtF33K4mhOhH6DIC2JESHkR6LgAQXb8jh40aS7/7b0l79hzXM4TpY5g54d2pdC7r/qkkzgGgvAv9 - ZvN3jZRfv/sMAA38wRMMAGpc0zI/kXSfODowbJTJpJPLXL7BZzLf8fKap2Vj+RwnrLyMsvjG5xqE/l+k - DAAbJP2JvgQARPrH5jsMc8OPVf9P9TKNr6BzOVb6AMvyegqI9APeLVYBkPKqDVFAnrzPdgAQI+Qy9qge - oLxrBYFaz2zSzpNySxYt0z78lje+LX3rL76l41lHY547T4vkrlVe9D3sztMiuWuVF30Pu/O0SO5a5UXf - w+48LZK7VnnR97A7T4vkri6v3VFwHTmv1MrV5XmdzuriOssvnZdvVe9S23PXWXuX2u6ltWfP6fvf+176 - wz/8SnrqyWfSWpZ8BHzNlg/S9P+EmGnLRzhXAWDe/IHOVhumXwz8NQFAB39CugS8YkMAgGb/z88GBvyt - WrleB36WjRUAti3NEkA+dsDFVAUqzQAw6gC6GZhqF7At/1ZLwL4L2MBfCQCbZ7qAPqQ3dQCwIQmEafa0 - 2baDPxhrJf0jnBmzhGHKSAIa1AQAq1l/3AmqYEMGb10u7tVL9ZwO7DuaTp3EbMXt6fSpC+ns6TuUzpy+ - kM5IHFB44uhZyTuvAx+Ao1u3bjoYIm3dIEBo08ZdKrnh+XLKCsRmDIAYz5Rn7CZfJk6aonb/mIW71A8p - H3lIB01yMyMzdjaL2OxegSJhAXDkm+mXvBMwDwBIBwGADAxId1kGYtlx3dpNyuwBhdQDYCC14YQJlv1Y - smYA5r8B+Ndi81AGdo6R27x5lxqJ5j9yvjBSH+wJ8t/pi5wr3VPeSQ95B4A63w2MpFQBoQLADPoAf1CI - lwDwOklz8IcUCJMnmM3pKe+12iyA3lZFlmaExA+j2gcOHk8bNmz9/9h7D4C9iuPc/7p3Y3pHgBC9iSYQ - SAJJCAkJUSV6r6L3YsCOHSdx2o0TO7ETlzQnuUnsOMWJ7di494p7b3GLW1zANqZk//N7Zuecefc77/t9 - Apzc/C+Dht2d3T3v+c7ZM/vszBaBReSPfvSjexCYAOAIEBxhQJ8DP+UDCgUAcSk/RdZG561sULZUC4Xg - k048uaw96ZSy5kRWlJ/iIPC4NWX1KvaT5OjGZQZ4ttE90RZn22CBdzMP9+9hi2Wt3cfaEYCNdwhoB/jz - jbLKlrZF26AteBthc3dvB1h/wkonUFDBn7eXPS3OQhEGHEwD8XyAIoNRdxH7sZHoCPL4fbaqwWJ5mA0i - D7H2wu9xLRaP4K7GDYwl+NDDjtAegrwPvAdr1pxZTj/9wnLaaecbCGR6xYXlDAOEnBt8yinnlbUnnyOO - U0F4/7FjAO//8dZuvF34t4urnG/auVoBjZ+RrIACaklH9GzpEZdxLZvCqTxw7REG5Dl73OWAUsLIg0cA - 4DPqlJcKAmmffkazWwOlX7f0IyDxwAgA2gCSAToDgRYA8t5513tITwD+DdRZe4oFRR0AJBTzrpmK1ANA - rQY2xtUP2GdD6KPt+37ec361fOqTn9GBBvRrua9r00M0Lj/q5vw2PUTj8qNuzm/TQzQuP+rm/DY9ROPy - o27Ob9NDNC4/6o7dBibSQxcYkgVNymtp0m+sD7XXebiuN0Tkre/11+96pB8oP/3pz8q73vnucuXl15TD - Fy6Rcvd5Fz7S1qpO+zhx//riD9/4GQDIvKrDkvt3EcfAmYJlBXDMAVwqAMhWMBUAVuB35BImmuP6XS6w - CIDE2sPmxDEHcB9T/ozu2TZipznuphQAZM5aCwCrBZBVjtoEugJAzf8bAYAV/AUn4DfCAnzuFumsf3Cn - RINNmUo2qnCdQ9G6su1BYAV/yQIotw8gUB2+LwghZNsK6rLnGvP/Ll13rUDfuouvLpetu65cdum1Zd0l - 14gvusCAoPFFF1xuz2gHddwsGsBaw0IIGAsgVjaUqIM/LHWA7D00b4eOFFeaAJz9JkDST/fwAQGWGi3O - AQQaKCSfjhtgyHUAA0rbNbCuSOFbiPLXPoAWsvkvc4Hk6rXfpZMAEOB6PO7YtWpngANtF2KdAx32QRUA - 7mIdCUCZv425aYtt8KABxbJjZOnzv/H4zuXHdjLaashALyCUzaBlAbQOm857FAAm968xnfoUAGjvBQYE - UM8n4D+2zNp2u7LjDrN1by3QazkDwo2sU11lwPXmm59XjjMAxj6VlME6xW8K4FVANwgA672Eu9DZ75H6 - tC23/m2ub+XII1cY8DulrF1zWjnl5DPLyWtPU3ztmtMrAFwrALh65fFlyRFH2jfim4gzEAGsMRjkMH72 - CeTcYOaJ8k5oR5zew4R/rdS3QRpgkHbBe5aLV4MC2oy1q938pB+1F2sT2vi9AkC1HdqIxWlTmkZgbZBr - cQ+AScChrITGxGkrO+4423TG3LLYBpOHmz7C8shv4DpmkdpSaw+4fBlk4ppmQ3cGbStXnlBOPfU8A3vn - GAg8zwZa55VTTzlXrt+TDfitWXtWOclA4kknnWH3urcsswB0X/nrc0Z55gJ/9v4BgP5du5sWZt6fuOqB - DQzkZT1BWrLKbjEMrjokyyuonMJWzt3NOW7XDD2l3+nL8tvuOvYBbbiBfcDrcV8Q0oNA9CcWwM20EfQw - AERX41UQALTvjsEcgzraSLiBsQIC6uln5O7F4ifLn1v/tAjEGBDYAkD0BVMR2BD6SNMB1151Q3n3u95b - 7rnHN4RWD9eEmXJ/2OavrxxCtr71xskhZOtbb5wcQra+9cbJIWTrU28EAOaMSLeyTG16Eo0rG3LCmV4v - l2vrRbyVt5TzI57TQTMpA7V5bTpo+jIu++EPf1j+/jX/oHkUjKYOso9P7l/7wPRh2sfH5sxsQKx9ubQA - BAB4hM//w/oH+AsWAKxzAGUBXGGd9Ap1wihgQB9bMkhu+VgM2TsQBQ2wxM3MaBB3Dx0GAINNg3Ex4a7k - PGBOBBAAtA6NkTzgb6u6AKS3drACuG4BEwCwA38V9IVSI96BvxqXAjSFidIU0HMecbVIqTqHwg3QJ8Xe - 5Xm+rHmmeEcAIHF1FgEA44QH3y+QI8xQ1vvbu7jkoivLVVfcWC6/9LpyxWXXG2i3uIXrLrnWgOF1Zd1F - 15RLL+E4q8u0Uo+Om2PceEc6Hss6Orb6QGnSifIsA7wxYqfT5sB2bfuCq806d7mDTfF6J05n7B061kFA - GtYZvSOAXQWAMEqfRTs7WQdAJ8z8sDkmw9q4i/0GFkA6c3UQc3aXK2+ZtY/Vq06ydrS0/sbeshCoXVjb - mzt3nn6HZwZ4etrTnqYFIrQtFrb4mdPHlmVHHWtA5xgdK3c41mVrZ6xO5z7kAraOmYUS3X6AAEDrxBVP - 8wI78Gcs4AcADBBo5QEALATYaKONyu7WRmlXWO8C6MHc54KFC+y+lqmNYjnyPAOJlsdv77zzHmWtgY0r - r7pVfysuRerh6nZLngO7AIAjILCCPZ1CUsvFQhJALm2ODnrjTTaV5Xzl0avLKWvPKKeuPbOcdurZBnbO - svAsgcETTzhFABD38InHn2IDsyV6xtwLfxvtgoEgp4Rwek/syQcoolOXVdfizCtlcMEggXzN+bP3qMGC - wJ4NFqhjAwMBQisTgwXktItdrSzvn9NisB4J8Fk7jfaF9QgZ7YFy/JYGDDZIOeKIZTboXCHdBfCgHgNL - 2gj6Bj1Guwdk8+zQVWypBMgD8J28FmYx1dmyDp54IqfMnG7A+UxrpwcK6NEmnvBYFmG49e8p9swdAAL+ - KgC0doo1mIUjPQAkdF3RsXQCbPoCrvpiGOj1dYL7gWVN8xuq7/MKkXV6SQDQ8ztZBX4xyJXeMrlAIOAv - rIAwOtR0KTo19gHUUXCmh90FvEOdA7hTBYC7aqoGOxKwfVBYggXcZQWshob92WbMAZ9WgFs4CgDd9Yte - km6yOPlMHTnCvu3zz724vPYf/6XcddddU/q8IRpXZjr5OJqu3jj5OJqu3jj5OJqu3jj5OJquXiufdhuY - B0OTrpnzIp7DcfEIIx6U05PKt/GgHJ+O2rK/mOv5ApBvfvNb5Y9e8rJy3OoTyyHzDisH8sEB/uqHyYif - XfADAMbiDwBgN/+vgj+5fw389QDQwR+r8FC+S5ZaKBAYAPAo1cH1q1MHTEnHAhR3L9IxsKVD3fRV4I+N - oH2j2RHrXwBALH8Cf+xBlgCgXL+MXnvwJwAYgA9FV0e8GgFn0GdgzsEfcVfAWJJcgW4kkBXKvFOqlV2O - YnZXEEreAWBvHQhLIFtF9JbAp0iRCwDaNZjwDPC7+qqby5UGAq+56hYxgPCyddda3vWyCF5x2Q3l3HPX - 2W8/wy1MG26kFb9YXVcdfUJhmw9WRtJxxg79uGrpKLGy7rYHLrm9bBDAKmx3+2LxoxOV8rZQVh1T4K7I - 9xfwo5Om4yZOJ+5WITbm9RNc+D2BPwNhuD0pyzsGYO6E23nXvQxwHFmOMQCIVQ+FzzW1ktPa5TxT9MwZ - 4jpYyfjbADqsDlY7OvxInSqzhAHGUgN/1uaYO7jI2uKCRTbAWLDYfntPPUueNUDJAZ8DQF8UkgGgWwUB - hnAH/oxJA9IAe7h6Z82ydihw1+4R978k+53feUG586OfLH/1V68qv/qrv25A/Bi50chn5eeWW24r6yYr - l5cvP6Fwag15Aij2ewHsHPy5hbgHgA4QBQKNo6zkVhcLMtMisDTy3I8/bk0587RzNOA7+8wLylmnnVvO - Ov28curJZzkAPN63EDr1lDPt215kzyAWEm2lgRnTQPhWYTrisOLtvQ9WnPkGxhhM7GLvFeDl4E/z+Kyz - x6IsK1BtI2wETruizcS+kMQFHI0ZbADuVFbyfR0IynpsbdLy1R4BngbocDliSVyw4AgD3Cu1oG13fs/q - 0+ax/qFrGLhSl3eIJY9BLeAuQN5JBvhggB+Li8THnmrP50wDKYcU9u/k2Ub7IR7vJr7fAIEOACvogxM4 - E1e5dIOlpTOkI7xMALvQFX16WKZrdb/hZfx3+/LKqyCvt0Ki33q9BUv/AQpNN8IOAE2HAgCN80bQ/RzA - BADlBvatYHD9yw1s74n3hXU3rLf0MwKB9g0EAAzwF4tAAgCij2hLTGvRPEB7rwtNv5285rTyp3/8Z+W7 - 3/3uevWNj9B/DU3ZCHoYlIyGuUybDhqSzZTauvEbWT4uPkRtfnstaNz12rJtGhonC2rj06WZL/HZz3y2 - PO+5v1qOOvJo+5iq+1cAELZRmX2UsQAkL/6IBSALY+5fXfwRzC78dORu+Vvl1j8DgD7vb2VZcsRyLfzw - 7V8WC/zh+mP+YYAPJn5r/tgcB4AACS0AAQBW9y8jTwd/W2tFmvb9q4qJvc9wfcEauaK8qsVPygwQWAGg - uzzC7duDvwCAPmnb3bFSpklRwp1CH2C3/I0qalkInor1rweAAoHGbOmAK3EDAzrsJ4hiZs+rqy6/oVx7 - NcDvmeX6a2+3+K3l6itvNhB4kwHDW8qVl99crr7i5nLO2ZfYtdxyEwCQBTgckE+Ii30XTlgxpSwXrynf - AIR00Fh6ULgoWwd+prCltL2zplPGQse7Aci5xa+68+x6WPqQ04nzG7w35hiST0cwCxfR7J1Uhs4BQI9r - n7Z03LEnWztZIZcfVkSAAatBDzTgwQrQXazOhhttLFDCWb2+UphpCDYYWWhtEfff4cvLQmuDpAF+uJCZ - rwYo5d05APQj4Xzen3fkvUXQASBWvkEAaPlY53i+WMi22WYbe2/ulm75sY99THnJH768fPd7d5VPf+ZL - 5Z/+6V/Ku979gfJHf/Qyu/f99HdsaO2QLVR2NaDC3xrH3rHS9PFPeMIosAvgZxygbwQAVlDo/GS1cRZG - 0YHz7E868VQDfKwUP6+cd84lmjN69hnnl9MMAJ6y5vTCPpKnnnJWOcNA4sEHzxdAxcXNNWgPcgEfsqgs - MACIa5WOHNCHRY48wB6WHzb/BdTTZhhg7LWnb/8hi5+1NfaFA9TRPnjPuIsBk25Ndssw7UiA0NoeJwIB - 4AERlJUlUW2zDkr2srZmctokC6AYFKCzsFJTn+eKFZA2xgCW+xGQt/fI3wHIY/ug44/jdJlTLM4ek2vK - McesKauNj1291sDxabKA8i3zbKlPW3EAaMAc96/YAWDMA/TBX/3+pQucpRtSnusLC5/al5nK6Vq4mOFO - bmG6pvRUV964K98DRH5zVI/1lsFeBzoA1CCZAbQNXgCBWgmMt2UL3+/RXcC+CAQAiJudeaOaalLfL+/W - 32ldDAKYq8YGphvJ8of7t7MGOgDEK9UDQF8tjkwbQh+6qKzWhtC/U778pS/LsBF93HQU/WJbNtJZ3pYZ - orhWWzbSWd6WGaK4Vls20lnelhmiuFZbNtJZ3pYZorhWWzbSEU7ZBiaoLQgNyYZoUn6bN901kecyQ+Wy - LJcdolY+qW4Oh+JQjkNDeUPhUBwi/vOf31Pe+573GYi4TvP/Yv8/Wf/EAMB6+od1wEysxkXl4A/3bwaA - bgFkt31O9sD6h5UPa58An8IKAE2+RFYbA39MJp+P65fjpPh9+9DtI+e0CMAInRbgQeBvB1b/VuufKZtu - 8YeBv7D+CQAa8CPE8sdcFW0BU92/m2y0aQV9iQP0NcAPzla/DABDcYbSjrk2nYtGZT1Only9SRl34M86 - iCEAyDwi5rgJANr98ayvuermcuP1t5frrru9XH/ds8sN1z/LwtsF/q69+pkCf9caODz7rIu7uWgo6cMW - HCFQBQDk+bPIJoAbq/CwauCGmz3HQIh1sFh2sLCw4jesOJy0ICufcQA9lDouXuYP7mid/mx7T3N2YWWx - jfwN2AHeYN4fK5Fl5dnVwSHbRNBRwABA3i+Di2NWnihrHoreO/m51gn48XKAB377GfZcAEdscM1AAXDH - EXdMI+DsYECfAz/Sh2vOF6vLaUtYR+igBQA78OeWIIG/CgAd9AUArMCvxgGAuHIfZQDv6QYAn/EMX1E6 - DAAfW17ykpeV733/7vKBD37MgMXx5XWvv6N881vfK7//B3+o98P7ZguerbSp+ayy2aZb6r4e9Si3EPLb - kwHgKLtb2MuzGhnrHW0JF9zak04X4DvnrAvKuedcVM43EHjOmRcYADzT+ZSzy5mnnWcA8Nxy0EEH6/5h - VisD5Oio/TjBxeqgeR+AMyyxWG54b3yjnCu9B+/PAJhAmrUvd/UC/JjWUduStR3aCnEsdYRY/HzAgCvY - 5Kq3j9pIgAi3Ihm4tPYRbRkLJ1ZA7lHziW1AifWa6zJ9gHbAvEU2g95nn4P0rHi+exl4PAawtwqwZ8DP - AN+qVSdqygTM4qkVy4+XnEEyVrxwvaudWOjWP2dZ/9I37WAQ8AUgMz0RjN4InfB0rIXVWgeQm8i1jq7p - esSBXcob4q5cAoByCYfOgqvc4gKCSRdqkKyV7T0ARM+GBVDbSJluZk9RdHVnBay6QFZAwL+1B96p5nAC - 5tTXYAH01cA+FzABwP2rBRBLsgCgM3XwGGE8WH6kbwj90Ts/NngiSKaQR5nMWR7xCCPeUlsmc5ZHPMKI - t9SWyZzlEY8w4i21ZTJnecQjjHhLbZnMWR5xaMoikAihLBuKrw+Nu0a+Vo4PUa4H5WvkeFCOj6OhMvl6 - mf4rrvfAfz5Q7r7rrvLa1/5LOfvM8zT/D0uf5lsEADRFCgDE/cscrHD/+ty/2PyZBSAB/HzenzMuXraA - wd3rDABERjkshFhrFuH+nX+43MuMrvnImfunSeHWAQAy5phSR/mztUQH/tRZ9kfAMQp1128FgLL+uatC - +1dxIH21/oX7N6x/bgEctfwJ+FXOSlEj+BrPSjOUcy/byMr15aco46qs1VE0AFBuJOs0uD/dgwDgEeW6 - a55Zbr7xl5xvek656cZnW/hLBgqfJQB4zZUGBK98Zjn/vHV2bT/tgNNRmP8GswfgcmOO78JSQgeLVQ0A - iEuMkTpyzv7FyscEfzrr6Gyx1DByd0uNddJWXq5eYyx5Ans77yqrDkpf19ttD09XEL/DbIC8WwiQ03ET - 55pYlpijuHDhYoE9gCUA0Fd9sg/hvlpAQieE5YwVzliJ2dMQNzEW6oOtHetoQmPAIJ0+eRwfBggFhAOO - fQ6gb6Y7Av4CANaTQOQGhmtnT5wyLP4AGG208cbladZ5+/nQUwEgwPAPXvzS8v3/+El5//s/WhYvXlL+ - 4R//pXzr2z8ob7zj7WXewYcIQLBtEa5f3z5mU8l4fzEPsAeArQvYwR4bUlMHppwAoJVzALilgeYN9U2d - fso5An0XnLtO2whdfOEV5bxzOPGCTcUvMF1woSyD51jIgJD7FwDcalvrfN1NJ7BtwJoOWADQOvX9DPzx - jOmgAWFYfmg3fMus6NVgztoHViHaCmkAPuBtDu1AQNBP+mHTdyyA5NFGGFjsxEbwhFYG4MCcMgCfLIjG - XBPQyXwzBjiHL1pq7YHTQgCVe8nViAVw/qHeHvbZZ549x6fZ3/Y4DWYE9I4+QSvIHfyxfZAfVwmzdVWc - KMP3nkE472CKBRCu4G8KAJT+GNUJrgdCL1h+1Q+j7C7lLm3X1MDSfidknT7J5YLTPfh9mJ7C3Rwy3ZP/ - NnlTLIEAQKyApjsZTMsCuEXdCsaYAfk2225vOrq6gXcAADIP2HSDvU8H7z4PNOZ8MqjACtgBQAak1sYc - /M3T3EAWguU5gAEC51qcfR/ZEHqJ9SmXXnxFeeub31buuefn6uOi3xvq/zK15QiH6g7JhqgtRzhUd0g2 - RG05wqG6Q7IhassRDtUdkg1RW46wlY0FgBEGkR6X91BoJtcaKjOu3sN5b0EP9zUnXY+8737ne+WPX/Gn - mhfEZNqYfxcA0FcAc/oHRy9Z55oAIJPv2VkfxgJ4xKIAfj348z0AHfQpvXi5rIMAQOpgRViA9cY6bu3y - bx88isBXn5riNoUB+NP8P1YWzqqLPwwABvAT+JP1rwJAAb/gzevmpbHa18PY589BX+UK9mDiPZCDXWFH - ugeBzq5gXTmPlouylg8nZeyKOziBP7F3HoDUuCfOSb7+2lttlPvL5Zk3PdfA33PKM29+brntmc9TeOP1 - zzYAaCDwqmeqU2c/OgAIv4vixC0GAGczWzpB3LN0jHTqvFdOV5C11TpYOmwAoOZYmaLmXWAFBIxror4B - PoAXi3Jw94nrSB9ACCgADNKZ0ynvuOMu9s7oGJw5Kszzd5I7ny1ucDsfuuAItZEF1i4AD3TqLAbgRBHm - fQH+qOdzAH2rFADq/gdauzUQCwCJs2kJ5x3sDEDk72PDa56rAJQBJAFAtvGooZ8OAicAGFa/sAAGAHzM - Y9Xh72TPgKkFLfCDWSDyOAMYLxYAvLu8/wMftYHP4vJ3r/mn8o1vfq+8/R3vLUuWHKnrYlHR+2YQYm2T - OWVsL+NHAY5aAOP+p7IDwHAJU8476i2sDTkAPOuM88vFF1xeLrE2wqIiQgAhoO/C8y8tF11wmYW+x+R8 - e3YBANkuRW4666AB6lhUcZ06iNvLwOJhBrYP13vE+kObwJqHu47fpfNnAMBWLZShPWl6h9y/Bv6svLZ7 - AgTat45M4JB8q4uL3AcMXl6gkvnBAqAARer6yTLzra0znxRr3R57mh6xfNorbYIBAVbvXXfdW88JAMgg - ZbmOwWPLIAd8An32rRAus5CV5pyQgoeEb1yAr4JAvZME/kYBoOkFsX33BrQE7OybZNDQg7kh0BZ6xfOD - /ZqjekO/EfmJ+/rOci13dd3ayO9IF6mMpzOjxwIIMhUGXekgcFOfB1i9LRy9ybGcDM79OLgAgLEfoM8D - 5H0xjQMrYGwJpUVCpvdpT/Q5/VxAB4S0OwAgfUPnBjaea3yA5fuG0EvKGaeeU179t68pP/6xLwSZRJFP - mOMRRhxq00M0VHdIBrXpIRqqOySD2vQQDdUdkkFteoiG6g7JIOLdIpA2I7ilIXmk27y2HDSUn+tFPNLQ - TPKgtlyORxpq45PygiLehlAbn5QXFPE2vP+B+8uXv/zV8vxf+01NmD6YThIAxscmAMi8Cz+mp1sBnAEg - C0AWLCmHL6jz/4z95A8HgEsOB/ytKEey+EMLPhwQUsbBH3sHso0M1j82nz7Efo/f9dW/dB6sDo0zgFlZ - yKgSELiNTv5g4cc2vuEzCz+05Uu4fdn4GXbwp5W/AD9TXFjVYlJzuH0DZI2wKbwAeMG9YszK0pUnCjUU - fCjWvuxUzsob7sGfM9fE1RKWSQD6tdfcKsAH32Kg7+abnm3g7zmyCF571a1yAcNXXHqdNmkFhGAFYgXm - AlOQzLdkbtTB1kFiYUMJsxWDLGfGgDuA3+4GDhmZA/SYiwcQVEcLuFNHjqt4D3X03tnvrBDXr1y7Fsdi - w/vb0ToBtpcR+LPOgS1Cdtje6tm73MnAHHVnzdpeHTRth30hY+6WrECAVGuP3Ce/z/UByFjHAE507tpH - TJ0Ge4fVjWSDbVCjTWWtbc+y38XdyjOh8xfY01YwFQBWS2Ac6xXWPwCYu4CN63xBAODWW29l385Rms+I - u1agz+4L6yTsQPBRBgBfJgD4PgOAixcvLW9601vKT3768/L6199hAHYPgTXaLG5a9nzEpQyYeIxdAxcl - v+ugLgBHtQBavZYdADoDSsJVB2gGHLFR+Dr2j6wA8DK2EGIfSQOFF194eVl38VXaRugiA4GHL1ysOXIA - QA77B4TTUbNRO65U3PJYhmGmiWBxxR3vqz8ZSODqrfP6rN0ABACMAAHm8gIQ3Dq0q9oJIYBwlrUffees - 8jcwwTun3cHoAgYBXDtkpB0scuTcvppWwhQTgCADCbamwcrEPR5o9625i9amaT8CgNaulhrAY5rKkexT - unSlhcGrNHBiYEIaCxQLrHi2GYg7IIQdALKgK77r/jtP338H0hJ4szIO0PpQXPPcmhhxY/1GIxvhrGc4 - dtLuRwvNnEfLepl8j9Jf6D4LBQBNL4YVUNNprG3RbllwxxxsnweIG9gXg3TbwQACrT0w0Iu5gLEYSG58 - 2pU9V20MLQA4yg4A6Zd8epA2qQc0WhyDxUEHHSJvFCvY/9AGW9/+9ncG+71HZP99simrgMcVbGVQG88c - FPEctrL1obZOTj8c13uo9FCvd+9995WPfPij5fprbzRAxlmrdQNo62w1Kdc+Nl8AUo9/YwGIjfwBgIfJ - BTx6+ofcvxUAAvhim5fgcA/7nn+s+mUjWRaTLLIRnANA9ndiThcWA7cO4AoCAOL+desfrPlSjes33L+b - blbn/FXwp1Vrpqwc/AX7go8e8FVLH2HEYVN8o2DOR8tS4J1FD2WNAq8Ks+b3dWoaxYqStXgo5lD6Hu9H - 4sq3cGOsQgYAuUess9dcfUu5/dZfEQC89ZZfLrcY8LvxumeVG5gTeO1tvhCEBSFX3qK9EgEgWLEYPbPR - tt6FgUBAt075sI4PhXuovUtWdbOwg2PgeN6MymWJNUWNwsaFxrugE6fjphPH6hfAL6y0221vin/HHWUd - ROn7u9vRZO76BfhpEY/mcu5gYGFXXQNACkA9cunRsjAx95DfZa4Qmw0z0R8QChgAAPG3YYEBUMREcsCJ - zh0GEMqCUAc09jeSv+02syp48o47wJwDv3AH++rf7P4dAYBPtPJWDwC4wTM2sL9rtjpJgF+AP83be/KT - rX1uKYD34pc4AHz/B++0dn5gueyyy8sr/vhPy7HHHmfvGUBq4M2YhSSyDG3gAAPrG/cEmBPQ6MAf9w8n - 0Gf1A/hRNgAgbYgtgWjjgLDTTj7HLX+VAYOXXnJ1ufLy68sV666zOPtJXlEuOG+dDd6W27WeZH/TYwxE - bmnvgDmAB2nAxsR7vAO0ITryAw88uC62WSxQJ4CnhT6c6sF83r3URmg/GihYW+Fc77AcMzCI+aBuOfZ8 - wBur031gYW1pO2tDVkZ6YUdfXMDmzJxgQ929DdhhDVqy+CgbNLGfpC92YpuaubQH433rdkKAP94Vgw9O - imFOMgvXGCRJV9UQGSvK2cWAwSnfM2APoBcgsAeACQTadz0KAKuugPn2Q3c0sly+Z4Bezw7m/HccCI7j - AIjU6bnLp25wyLgvuPNc9AAQ1u4JxhpcmM6NlcDaDmabbd3Kb+9CbYB5gPbueO/oA94but2nADCXkwGE - rwaOU16yEYK4Nosmrm/8gDoHsAJAy0M3Hmo64+ijjim/9rznly9+/ktaCBJ9ZNt3Z/lQHMryoHGyLB+K - Q1keNE6W5UNxKMuDxsmyfCgOZXnQOFmWD8WhLIemnATSFgjK8jYv03T1W5p0vZwX8bbsULqVBeW8Nnww - 9Iu43k9/+tPyxn+9o5x37oUCBMz/w73hHWkAwHr+L9a/QyoAZAPo+W79A/yJDVwckeYAMloWCAyrH8rU - 8lgkwh5vcv3SWRj4Y2GJ/7bv/UfHj0IGYKDc2UaAzoDOAcXSzf/LAFAWwC19u5cAf5u65a+f71ddF7IA - TgB9leW6lUJ2ABej4wBnzqE0vYwAXxfvuQN1oWCHuC1jihcL4EbP2ETKdx8bJV9x6fXl2bf+mkDgM2/+ - 5XLbLQYELcT9y4pg3L9XXHaj4nsbYAIk0cExp4r5mwBvQBZWGsA22+sA9Oi4D7M8AJTcwPbMsbDsjvvM - Onh+m/fC+6Czx2qHHICGa05zsSxPANDekYCesc8JmqX3Nos8A4K8LzoKOnzyAIdcGwsnbm7cv8zh8gUf - 7uKjo/C5YBxXt70AGH8b7439CFmFyukC2h4Etr9JHYq1Y202u8+B9hv7lS232Frn9qrTNjAF2JML2Ji5 - dm4FBADWLWBgA4I9+AMIIn9iPUv28Rpk0LkC/gBwe++9Tznt9DPL777w98uHPvSR8opX/En5/Re/tPzH - D39a3v+BO8uB8w4up59+RvmDP3hJ+ZM/+fPyspf9iazw55xznj3zPWQBfIpdj9W/j34MK539iDEBOwN5 - fu+VAYUV9E3h+nfShgIAAqhOO/nscvm6axzsXXR1ufySa8sNrCi3tkOcDcbXXXh1ufC8y7Rn4AZ2P48y - ULvhRhvbO/bj+Riw8f1iWcUdixzr6xF890tW2nuYW7bddjsDb6zixTK3q6y+ADQAHwAQaz4AgUVEsw0U - 0EZoM7MNNHKcGFMHaFcACCxKsjQD+uQNwMIMcNzF8nwBESAQcIHFesHCxaZnFhc2FNYKYWtftANcv6wG - 3sviWLEBgLxDForoJCIDjgsX2aDWvhHAoOYokzZGfvgRywSiA/jpXegdGAAMrvIenDVgS9+6h9Iv+ub9 - uw8gmMv07NfpARzXr5a8ylPAHaw8v5eO0zX8OsENYE36TyDQwJ97Teo8QCyAmgeYAGBaDKJ3zADR3qHe - l32/2hPQvmkstjEPVFZkazMMQPlmow9SP1QBoOKyEjoARG8BAgGFbF3GQpCl1v5uvO7m8uEPfmRkIUjw - OBoqNxS2PI6Gyg2FLY+joXJDYcvjaKjcUNjyOBoq14bdKuCWJsmG8lqarkybP6k8eZE/VC7nBw2VC8rl - h8pFfs5ry7V5kW7LQZGf89pykf7hD35Y/s9f/k1Zc+IpZb51vuyqzv5/vtO6f3jI3P3bWwABD6y2jP3/ - fPsXB38OAHt3bw8AyaubPqNorT6gk492HqsHDWgCOGPxh07/sM7D5/+x+bNbkTT/zzoDAKC2fjEwkVf/ - dnP+OtdvBX8CgBUEVpeqgz4DbAJ7Fpe1LrtwR0GcWIrRlHVVjISuMMnvrYM+mk/xpOTHctcZ+DUBoPwt - AFbuk1W4F15wWbn9mQA/Y1zBBgCZD3gjK4GvvKVcZbzu4uvKdQYAFy04QnPQsCJts/V29pwX6p0ddeQq - gXDebyhg5sexZQp77fncO6w0cwQCtZWLKW32Y2SyvjZuFjBnQn6deG8dPO43WXEs7a4f37PRO3aOBtuu - bL0tx4MZUJw9W66i7WsZVmEyp4zFH+zhRkfNfD8AIG5qQsAf1+YdA7742zbZZHN1JOpMrJyAoDr8YE4s - oWNhr8J9rO4WAnGAJ9ypPfjruQeB2QLYWwE7AAh4MNC4227Mm9zZQNtTyyWXXFre+74PlS9/5Rvlne9+ - X3nZS19ejll9rIG9Pyr/8YOflve890Pl2ONOKK973RvKq1/9mnL77c8uz/ml55V3v/v95Vv//r3yu7/3 - InueOwqU8N4e99jH1nt1UOeWpurCNgA7Avhg7q/G+TsFADVXywHgdtvuUE5Ze5asfVdfcWO58rLry1Ua - MLCA6GbtJckg44p1N5RLL76mnHjcybKmA25xIdOB0z7225fTQBbIwkr7YTCAC16nbRgAZC4mlmP2AuQ7 - Jk4bcXfgLnLFA/YAYViA+b6ZN+bfN4M8XL8MHGZZO/S2Q1sBUHCNGBwC+Bh0yFpY5QBRtj1ioQrzxLg3 - rH1Yl5gSQIjViTPEsdYCqvkWtA9pdWFTXzqOgSrTVKxNkoaZzgBYcqDnADwDwKdK3gPADlgBxEa+9VHu - gB88Jb+Cte569foj4K1n6kzNo87ofTk4jbxeLutiZa6FHmNQHBbAHgCajrX2wTxAdDEDcgeANvCrbmDc - +TvsiJeA+cIO0hkw8F6YYiIdIysgINDnhvKO3CWMBdBdwG7drwCQwR2DPAPu9FfMFcTay7zPiy64tLzp - X99Sfv7zn4/tByNOOE4etD5xwnHyoPWJE46TB61PnHCcPGh94oTj5EERn7IPYEu50hC1+UPlp7sGtL71 - ct5M6860zlC5VhYclONBIRsq18qCv/GNb5QXvuD3y8rlq30OntxlddTVAUCf/zfPQNohAECsf6Yk+9W/ - vvWLzv4VAMSNElbAqRZAjagNaGA90ERyrH8GPrD+8Zt8/Mz98tW/DgBRHMz/0/YvWP+sc8CyhLLp5v8Z - +MPKQUfHqNRdvz7vjz3WAvyhuFyJocySta9uvNqxAB0Az1nxqgzFTzPF2ckInR30oTBT2RlzXMfi1Ldr - +dzFTXWPAOAzTjtPc/5uuuH2cvONzy433vBL5YbrnlX3Ary5XGYd9yUXXWMd/E3l+GNPLk98/JPUefMs - ANhY1mTlMNYpDgaa6MCxkOEGZkEPo3A6U5jOfpdd6/YNBgBjzh4gBcsMHTkdtruFUfTuuuM9ubt+B3Xm - dNxuIdimbLXNNmW77bEOeB516LQBp/Pn24DAFPne++4nix+gEvCHBYl2sJ1dh0P86bhZhcvKVA0ULD9A - IFuIAPZYZYi1kjmNgMA5c3bXvM8OAD7RASCLLBz4PdHDzg3cg0ABwABYAoPsGehnAG+xxRb2e3uozZ19 - zrnljjveWt50x9vKDTfeXK659vpyjsle8pKXGgC8q7zv/R/Rqt9Vq1aXy6+4qrzgd3+vvP4Nb7Lyby8v - +cOXldWrjxPQeuzjHqf5f/wWHXI3/w+QYfeO9bIDfU/ye+stlM4jANC+DQY9nFXMmb9XX3mjACB7Sl5v - g4XrDAASv/qKWwwA3lguu/hauYY5LWRHe8dYWwFKWOGxADJg81OBFqijZiCBZW3hwqP83OXFR6uTBrAz - SHCrj08ZwGLMuxc4ANBVa6AsRrNma1/P2NqJOMe7qV1ZPdoWrl4GAw4m696g9jtadGJtGX3CIIJFT+iT - AIBYhAGpeBkAHHwTfBvoBQa680wfzTMdJ2+HgVvaIt4OBr2HED/UQ+YkApimAEClgw1EBSdAFd96gL0e - FDpok6yGWO68XOQ5YHOQ5mBO20XB9psh83z2EY2wyihj98s9xX1GWcBiLq94uhfXaTYwBgSyEGQDB4A8 - Q9o97cutgFvrG8cCKAAot7xbAeUKtvfVAcBdfBsgeRrsO0XX+HxANoj2lcECfIA/a1ti0sZhARQAtPeK - 54o57IsMrHOyzd/8n1drIUju81rKsohPkuUwlwvKsrYO1MpymMsFZVlbB2plOczlgrKsrQO1shzmckFZ - 1taBWtkIABwqOI6my18fyjc1dN0sy2XHUS4zqRy0PvnTlYUeyvX+84EHyqc//dnyrFt/qSw53FfLsZxe - cyxMoRN2K4ANALIK2C2AFQAa+FtoYMEBIO7fAIB1zgwAkNAAoTZ7lgVwmXUQgD+sf6agTcmy8tetfwfp - o0YBxB5hLCBwRb+T5rPhPsKtBPjzBSD93n+bauVvrPg1ruDP3b2x4MPBn49kA/wl0GfcgzpjgbDKIes4 - KeUkn2Tpc2U6quh7N8xoWX4TMOkgdlPdN+7LY1evKTdd/6xy43W3aUUwLl82gWaD6Ms5F3jd9eWyS64r - l158XTn37EvKZvYsovOmk2ZeHJY23pkWWpjixR2Dcl2wcFlZumSVgJgsNqaosfrtagAQUL7Tzj5/BwCo - 0fxsnwsIKMCK52DP3b0ofNLRAWj+pjHvTtYB5gnZu8R9xzvnnrCusEITxQ9o0LxCe/8eNwBgzLUBO/xN - uIF9DqGvQgYsYqH0laLuno4VooBBLDe8X8DRU54EAGQPuN7qBwDURtB2XXGNCwAKBFbARSgr4JNkicTF - ziIWVjbTec6Zs3M57rgTyrUG/n77t39HoPB5z/u18vVvfLO89/0fNoC0vPzpn/15ec973lf+8q/+ulx7 - 3Q32dx+maQlY/fhNLIuPe+zjvLO2a/qCjx4A9uCv3k+Ns1WN358zFikADt8E3wCW8FVHH1euvermcv01 - z7R2dGu5ydoRbem6a27RNkJXXnaj2hJnSp91+vn2Xe4roMRCEAZcWOfREfPQCTaAA+jRtgDZB5t+WMoi - CmPOjqZtzJ6Dyxagt1PlOm/UgBsDB9pUgDjer7cPTlbZxgGf1cVaxzfuluWdNRDg3attmQyASLvEKkRb - 0r6iBgiYCuDbjdTpAZZmwAMA4bmykpwNrtFz7A2I5RLWIhcL+Rv97zS26+LyZk/FDujxbngv9n5CxuCC - 9gV3ALCCrF4HGJtsJLQ8yk3Jb9J+vQrenmohrDS/F/fl5QKIKq17rPdpZQlVRuwyv3Zl/a7rowCAeErQ - RXhRYiP9zg1cF4I4AExTP+y79/ftVlreE9ZbBm58o4BzgUAGagKB/QkhDvjC+tdbAMkLAEi/QV9FH4ZX - iWMMX/wHf1S+8x0/EeTh6EuDHrneMM2kzMR9AKGcHrrgUL02PlQPirzIn1QuaKhMrh8c6XE0rkxbv03n - MNO4PNI5r03nkBNAODj7snVX6hidg5iDxwiLUZexAKCNqsIF3O8B6HusdQBQFj3myTBnxuf4CfQd4Xv9 - CfwtwvJX5/7JjeLuGbZkCOufPuq9/eQPOhNACa5GOggO2AcAYlFSx9ABwN79S+egVb8BAHFNVACYLX8C - fSOWvwB9lYmPAL9eCWqOjdgVZFbOMVIexwH2norlsJO5kp1SV/fg1kT2gwMAYr0hBLhddcUN1lHfVF14 - nAt8gwHAm9xyYx035wFfcN7l5ZKLrrbnuZfAUmzjgRI9wAA3nSTMBGqeNfNv6LyXLF1Vjlp2rIH9w8pu - egcs+tjZFLUBP+u4OZGFTlmgywAgbuAAe7jwfORvALBaB+m86aQBe5yD6+9vG3UMxAFrWFoOPYy5f0sE - AnH/AOTUqdtvcPoDbkKut5l1vszVY2Ut74vra1Vx7VgAG1gDaTti62jYQoQBBSBCljMDRnTaALjHxcIP - wF9Y/wQAfauXUQAIuyVObNdh4Yi7EZ+iBSZslkxHyj0+4YlPKCwYIX/PPfcqV111TfmVX/k1Axfzyrnn - nmffxOEGyjYUiGRBCdeiLkAO8BcddAZ6DgCz9a/Pg7MF8MmwlWcPSQYSWMGZVoBL85orb7SBxG3lBkAg - ANDC66+xAYUBQAeBN5SLzr+inHf2xfadH2HXc0syABIASMeLBRmLMp2xD9z2Fnji1J8VK46393qEOvbZ - O2HBd4uxtnipbcOteiz08EGErPv2bTNHNMADoIH2E/PL0AHerkwnWD1fTDRL5RikoE80tcTaFG1bFmx7 - /4BA2nisZuc6gG2eO7/tbsaDfOGQ/V1aSS6eb3+nM4Ng/m6+wx48VXAewAoW+LO03pWDsABk+t5rXIAO - Nln//Ue6ci5Xy3p9AFsP3DrO91G5A4XKq1zL+98wlbt77O6rejfGAcBNAYHZDcxAz934/s58SxjN67SB - nFsBMwhk2ykDgda2ZAUE3LHStwOB1fInNvCXACA8d58D1YdxWtLRy1eXX33e88uXv/SVrr+D2nhOQ0P5 - bZlMQ+UzDeW3ZTINlc80lN+WyTRUPtNQflsm01D5TEP5WTZoAcwFHiq115qUnq7sOBp3jUnXm3TtcXnI - gyMdNK4ONC4vrhX5LAD5x394bTn9tLNstFzP32WE1QFA3+/L9wDkCLgFZf7Bh9sHdrgp2Dr/DxdwBYBy - A1cACBCMOJZBQm1EjIuROTZ2DdzJjLC18XQFnqw43QP3XZ03BPgDfKiDEIjg6DfvJLIFMOb++bw/rH+9 - BTDv94fi0nmXzP8D/FXrX2+xqyCwU3qwK13iAnFVMaIkUcieRt6z6kU4wla2u57HOwAI6Ot+v7LJwmpD - yP3j7mCPtut08oef/hHHwF11+c2y/q275NpyvgHAiy+8WlvwACZiDhcd8j57H6DnfpiBLhb4IGOvNc5y - PcKAO/ugLV56tCy+gC+eu7uBfbI/7wUw6BZAt8rFfC045v4ACrt3tfXWZbMttpBrDxcwIJEOAYsKrjUW - fyy0AQVWFjoArH6ATLn9AApWFovP0+ydhfuXjjjciN7BGCjYEVdgAoN0NNaWAIJME3AQ1wNAAN8UABhW - QLmBnyQQx0KMWAwirqBLIPKxHAn3aHWy/Ab7obHyPFb34krGSghvtNFG9ttPFiDnvTzh8Y9XGeYP0ibo - nCnHfdLhstJXv5N+VxanxAKlNf+JAqh9WZiTZHhWtCPaGhYTFoFcd/XN5XprNzdee1u59kqLX32r2hMD - C+b/nX/uOu0NuHrVCbKsuyX5KWUne/dYaNARDOIASXTYPGfmbvL9r1q1tixffrwAPd81lju1GXsvAf58 - 2oCDP0ACbYNBxDZb+3cOiKBtYe2jfekdV0CodmRMPVaYYj2iLaGnmF7CfDCBPWuzDAQIAX4wbYtzkfX3 - 2PPzPSh9LzrNLRPIcIuTQKENUGFA4C5z9tCCrF4PDADAEbBFnPfqZR10OfAa4dADFopNluOU8TDq598K - Hr0HWSJH2O9p9F792nFvzi6L+3LdBQB0CyAb3GsrmGdUAGi6dlPcwHUxiADgVrjxHQTyDnH5+/tzAOiW - 3wCAfjIQllkBQKyA9u5wA/tK3wCArBJ2DgCo92blKHPgAT4vFZ3HQpCPf/TjgyuBcxhxKKcjnvODcpk2 - zOVzOuI5PyiXacNcPqcjnvODcpk2zOVzOuI5PyiXacNcPqcjnvOnAMCcCeV0mz+ubCt/MDTpdzLN9Lfa - cg/lHofqPuTr2b8f/McPystf9sfluNUnSFlq/p8BAACGWADQzwDuACDWv9gAWgAQF/DSEkfAhQsYV68D - QHcPkw9YlOvX6h96sG/7gkIF/LGyi4+YTUH9KKh++xe5hkxx4EbAYhQWQO3/Z4pGFsAGAMptisWjAicB - QJjzLI0BUgH+NKpFuQlwoegqkAvl2yjhkdFxF88A0OUZAMb1unrddZH35VzJOvALluWPhSwCgBtqpePp - p54ra80N1nGzBcx119xWrrM4m0BjEVx38bXlvHMvK+edvU4T/pmg7S7TJxhg2l5KkzkzAuAH+gkgbKKL - K4Y5UGx6u+qYtWXZstXWDg5y0DfH51oRlwvOwBgrelHuuGY7ILaDy9RB2zvayt6R5mfyjqyD4H0JABgY - YCTPcW2ACAAg863ofMOqSGcv6yLuVbs+liH+Bqx/ADRcTv1iAVxNWAO9k5GL2gCg9h7bxV3IPEPqBTAC - mOWtX+DsAhb4EwAk7GWAs27lLaDr8e4KBpgyHw+gTdtjqyH28+OIL9oWbQCwx3YtAgJy3VmHbAwApC7g - j79R5a2tCFwE0FPovxvzznq5h31ef39s46HB0IYGAK0t7rD9TuUCA3YCgAb4brC2dO2Vt9igwheCyPrH - NjAAwLMvLmtPOk1zcRlEYDWjPdFps0E4czfZCxC3PSCLY9kONj3BIOIYa0Psocd7ZTVwAD7ajQC6Md82 - zDcNM6Dg/pgLCOB3KxJzSGfr2wcgAvQ1wDAGWDKAOfCg+W5Jnu8nlMTiFJ8awEpkX8GONZjtiJ5oz5pF - RDwX7rs7lcLuX6tR4b0DFAI+HAyyBQ3fqsCTvR8BpgBUigePgqwun/eud2+6QDqBdI1LH2T9wOkhFkpv - WBtS2F+nBXyyPCKjPdGuLK62YSHtw8vlOPflOq2/N36jsv22349PR3F9yXYwvhpYVkB7fj4PECvg5tY2 - +rmA6ABcwQwKQz/I4qvB4876NrHWyxLIPE3jfOqQnx3tc/xGAGBYAK3P0Ip/e2fIeee46o84/MhyyYWX - lne8411TFoJkauU53cZbHqJWntNtvOUhauU53cZbHqJWntNtvOUhauU53cbhKS7gloYu0JYlPcQtDcmg - Vt5eI8ehcfKgVhblQj6UH9TmtTRU9uG43n8+8J/l61/7Rvn1X/utsuzIowUE5IYFAGIB7ADgwQJpDgAX - GgA8vALAxbLmLUwAEBevQB/gr1r9YLmHrUzM+6OjD+sf7mUWnbAfXbiQOCCeQ+TD/SsQwIRx6+AF/loA - aKCADgnwJzeEMQeVe4fnlj/toxcWwOr+dQDogCu4B4BJAWaFKO7zRwHgaF4obLmNq2KPvB7wZbZ7CI77 - sTj3y9/iFsAN9feuXMEcrlsM/N1ebrr+2WKOgmMVMG5gFoHgAuZYrzPPOM/e44EGTh4jgMI8MzpvbZ8w - 1628gC4sKHSOzONiO5ijlh+vDvyoo44zgLZQyhpLIB2z5vQA4uisDVjtaB253DzWsev9WDnAX8wD8veE - VcDndKHUcdUdbB02UwFYdQmzQpOVv5ojZteHfe4gruVZct3zNzzqUY8pT7V3hUt5621jTqFPOGcPQixG - uKC5joCg3R/AgecsACdwVEFdBX4B+jqrX2K5gyPfWJZAgSw6UwsNZFEvQCALOOh0aU9soeJty967MVMA - fN5W3+lSluuyqpjQ20rtrFMH779nnbcxVr9IBzAcZZcBALkPH0BsbM/gGWWTjTcva088XVbk65gLWFcA - 06auvuKmbv4fJ4Gcc9ZF2jbmYANYXI+BBPfHoiwAFp0vlkCsb8Sx4NCeAH2rVnGk2hobSPjRg7hocdsC - BBzY+6IuDe629sFdWPg93E7fOZb+AIhYlrbdlsGggwqsjoA/VukeeugiWf/YWYC2jT6Jc6p32WUv6RMA - IYORRz36UXpfW9dFRFqMAO8GGKxAZM+wRBnAML0IMATc8A0HWPJ3CODyd9mBvRGusihj7LqA8KmuJzo9 - QLxhlQ22Ot11A8hVK6QBQIWZaxuB/f5q3ELuK+7Buf6G5JV1D3ZfVSc5AOzdwAx00E++EMT1LyBQruD6 - 3njHsuSiN+z9ozewAvIu3BLI6UFunWX6D+9NABALIIBP/VF1Adc004UE0iujU9Bl9CscLXrGaWeXf/rH - fy53/+QnM+8Xm3JZPhQfR7lspqFr5Pg4ymUzDV0jx8dRLptp6Bo5Po5y2UztNQQAI5GpTQdNkkdejo+j - XDZoUp22fFtvnHwcRZ2hMpPk4yjqjKs3Th7E/kif+tSnDTTcbCBtqdyAcsPaSBdFBwcAxL0z76DDirZ/ - Afzh/j20B39i7ZMFCDxS1r8Af9pHS9Y/B4Da88/AH3NpwvoH2ASMdHP/dmH17x5lp9m7ytrVuYisA0eR - 0NkzsnT3r+8BiGVp0017BdS5fyv4k/v3GYC/ON6N1Wxs9RKdcw/+xEn5te4QgTmLq4zSLpta10FfJ1fc - 6xFG3S7ffr8HgGGdtHs00CNLpv6OjQTgOPbosnXXlptvAPw9q9x47e3l+uvYBBoX8LUdADzjtPPLqaec - VVasWK1r0Hlj7QKkAfjo3DTCtneNsqUThNk7bZGB+aOPPlEgcPHSlQKFe9vI24Efx3T5VjBYBWOUD8tt - hxvPfsNBoFvotttuR10bsMC1mO83H+BnHTadN5PuOR6MTgFrD+W90/COA5APOOJvACjhwqMNqC1gbQQg - 1N/CvRwgw3mnwsR9wJDO+LXQ4xXQ1fAJWPpk7auc0g4CnUnLlZw6V1kC7RqPN/AXYDsAHdcAPMkq01lm - 7Pe1ktgXe+BG5rre3vrOvQeAXi+4+23Le1IHAELWx/kdBiG0HVx3tP+nPWUDfZe+FcwN5erLbyzXGPBj - JfBVFr/kgqs0/49FRGecfp4A4FHWBrDm8vyxUtLBA5wE+KztMIWEDhprGu484kuXHlOOP+60cuyxp2hR - CIsyqMO74d1i4VNbkRXXT4/Q+9O3vr3AnyxJ1r54124BBBiiB3z+KOBv0eFHWns6QtNM8E7IJW0AgvYp - 0MdAYEdfNcwggWcXQBbXJNNM3BLljLWSzatjYQKABHDL9RiIZZ3QgTp7Bz2IslCgz/XHCChUmZap4wNF - dIOsfonjmmGp6wEg7GAuv++unVQZHOXEXbrea7Bdz0OTKy/0E4NRD6WTKgBEJ8kCCADEDZwAINZ5fZ91 - EMj75NnL+m/fJHM2ZQWsABCQ7nN1/bnHYhD0U8wFlGte4M9dvz07SMeYMM/6soWHHqETQf7sT/+ifP8/ - /mPavnJcPtSWydzSdPlQWyZzS9PlQ22ZzC1Nlw+1ZTK3NF0+lPOntQAO0VDZLIuLZ5rJ9SfVmVR/XN6k - 602i9ncj/Yu83r0//3l597vfUy48/xK5SzT/j6X2AmM+wkKB4wLuAODBBgAPqQAQF3AGgGL29vMQIIjr - N8AfTD3O+2XbiM76Z2BgXz5w+3h7AFjnmc1m8QfuX+vAcTWqY8ACWAFgtf6haLT6l02fWfiBO8LAgRRT - tQA6ANy46wA1kk0WwA6EwbLcOcjrFLMUL+xKus/rlWQXF9dynRK3a2aAiVKvTLrb/0v304O/ULY6uo6/ - w/4etkBBcZ5x2nmyAOIG1uR967w5AYRTHLDe4P493cqsOel0U4Yn2zPetzzGgAluPO4Fl57mXJqiRaHy - znX6SrWGMJcLoMZh+KuOOUmH4B93/KnqYHGXUUb7/tn74RB4dej2jngnAn7GdNgCi3bNPfeYq0UntI3D - rL2w5yBH0y1ctKTEsXT8NuUBBnQa7kIyIGngjntmnh3uXzq3zTZ3K8PmdRCAa3kLgcFqDbQ2g0USsEHH - w7NzwBcWQObLJZDXsYPDoTwHiJ4vVodbO17Nw4PDGmhA8FEGBO15AwZ9wYEvOuj40Y9VOc0DtHp9p57Y - 2pODiF7Wde6Kk4erGLdk7zKmk4/On3aZFz5hKWKFPce9XX2FgcDLWETEtjA3aXPoi86/XNY/jow75eSz - ZC1cvfKEsvce+9q94oL/X7ongLm7T/2caL5jpnAIGOKWPfAwTSM4/rjTqzv4GFkGsaRh2feBgr9nGODu - gwWAglsK3eoP4AP4bSvZ9jvO1grjRUcsKwsN/B1uvGTJ8rJ4yYpy0LyFuj73oCkkpkNoB2oP1lZZKAZA - x/rHoILtjARGDATKJWl1HJDwHfjiIV9FvrfuFxDkIM6/dQdm8a5g3peDKX9fnh7JE1cdUK/T64aprLJR - v/6O0rq+gzm1QbEDwJBFW8hlnaO+sa7t7L8VjA7z4+O4j7AAojsDAGJZZjFINw9wkwoA5QZGF4QV0Ady - mqZh75Dv3AGgbwuj8545+9med5xDLpe8DS7Utmq/JPBXWYt65Cp2xoDBQpDD5i/SQpDffcGLtNVZ23dG - v9jKWxqX/8j1Htz1dBLIUMWhC4VsUh7UlhuXlzlkkyiXzRTyzCEfR21ZKMtCPi6/paG8LAv5uPy77/5J - ee0//ks5Zc3p/QbQ7P8Xq65aANitAMZVxypet+AsrOAuAOCiBT3gQ8a8P5/7t0TWQ7Z9iXlnAQDpNPba - 00/+wAXjAHA3Aygob7f+4SJyAGhMh2AKBQA45eg3XL8V/PkcrACAyfUrYBVAq1r/krINHnXnoridW7lz - kgXg4xqAvo6Hf2eEu/uC4143rH9DBbKmeNnrcPmRKzVZXxv4XnVLuYJtYC69vlxy0VXWeV9WzqTzXntW - WXPCaeW41SeVJYuXSUnTeQNEiGPt0PYdAoG8B3fDI+eEEEAZVpXly4+zDnxNOfW088uJJ56pjpxTEVjx - yfvDerLbHmzlsKd1nChzOlHOfGXbGVYc+wIPjtrSNkDGTCPA8gcoZHsOFpToOC973w76tilbWOeBFWjD - jTbSoglZ/6zjZo4dAJBOBvAXIeVhXIdhPaTt4Dbk3WChA8j1oC2AXAJ1iQX2Klh0mXeyLLR4IvWt84xO - Vos1UqcrgAngfBzn6BoYtGfulkHYgN9jH6/5hlzXO+zohPs2xYCjG3RUoBedtiyDVi7KRDlk3EvXudu9 - cF0BQGPaFNfm+1iDG/jKW8pV1m44D/jyS7EeX6nFH+eedXE5/dRzrMyp5bhj15ZVRx+vubt08I+y98Df - wRFzdOKALdzBOth/TwNf1pnj7qVdAQKPPHJ1WblqTTnuuFPL6tUna1DBtBLmfQEEAQaAPr7tLe09hqWP - EIDooGG2VlnjJmTR0JHLVonZXmrp0qPL4sUrtDsBc8MAb4AK9yAAAH0qAQMT3j/3z7Ph+lgAZZFie5od - fe9Lpg1o7qjpIQajgFzaNAPNeK68IweAlQX0QkfACehZnlvXLKygL+czYPRBIDqi1ROW5t2qjtfr3q24 - B3UC/ymtdx/cya1OvUZnXSb9VLjeX8f8rrcrt/7ZvRhvgE4SANwoAcDqBmYuoAFA9DLfpS8I4XxgPAT+ - nvU+9cx9HqjPBXSPAs+atiTrq+ki3xLG5/o5EHTwRxgAMEAg/daBpm/o05bZYOC5v/S88tnPfq48cP/9 - tRcc7RMzRd84iYbyH7me00yuN7gIJFcausBQOWicbIjGyVvK5SZda32uN13Z//LrWdb3vvv98iev+LNy - zMrjyyEc6G5Aj4UY7v41EGgMAETOXC1ctg4AmcNX5wBWcLewA4A9I3O2/Dr3jwUkTNDF3czEceZr8Bt8 - uDr5wz54ACCdB+APCyCKWXPA1Dl4hyB3EJaeagH0FcAOADX3z4BNLJroAKApKwFAgUADVcn693TAWSja - qnRd4TUKvnKv4I1RklUmeU33yruyFGdOp3gnc+X6tAoAe7Daj7bF9jeRx3M775yLC9vBMGn/snXXlHWX - XF0uPP/ycu7Z1nmfdm5Zc9Jp5XjrvI9ZeUI5atlKU5r7ygoGkGKfOZ4dKyJD6fIeGHWjiAHiyFG08w30 - Y105ZvWacsJJZ5bTDAiectp55aQ1Z5QTjj+tHG3XX77iWJU5YjEd8spy1HLSnJ26Quencog+J0TI8rfo - SO33N9faF9ZEbfKt98zikW3dmmfvF/BHpwuQotPGegm44v1GJ9OzDQbC6mDtA4tRuJ5oE7Li4b4FcNk1 - AqQFGBQzry5Y+VVe2S0sMAs2nGWFi9A6eufUuVqnS9zBo4NJX6nr5d1C5G1OAK6GHsfaVMFdDb2teTlP - Y6Gph/yLo05tl9yDdfAbPJ2THKLdP0P3wybs7B95yYVXadNn2tAF511azjnz4nIm73jtmeWE49YI/C0/ - 0sCWgX4GB7wP2hBticEYYMstgWy5sqfcwnzPtCNAIBt7H7nsmHKMgcCTbACxZs1ZAoJH2cCCo+OYXsJ0 - E+po3q8N/NjsWeBLFqG9NIeQeYZYpY9ZdVJZYXWXWHuDmWrC4iVchNQBlHIN9AZTCQAcAEoWw/hClsdK - Vzgo8bmEWowS1inNH+33KGSBFEAR/eHvtII5e87O/t2PsgO8TjconXWKpet1+P59+oe9H0LTD9JL0hNZ - L3m97h4U9uCONurtrW+zwblcAMCOdZ/BcX+w/S6s33d9GQCQeYDoVdezBv5wA2shCMy36Udz8j3Kfc+g - rHMDAwAdcMsKaAAQPZRXa7vVNU4ICVevs4wGCfzJUmgh/Rd72bKocbHpmOuvubF88AMfKvfee693fbVf - jD6y7StzflBbrs2LMHNQzg9qy7V5EWYOyvlBbbk2L8LMQTk/qC3X5kWYOSjnB+Vy67UIJGhc2aBJ+eub - l2XEpyuTaSZlczrirWycPIdB05Uh3soJ/+0rXyu/9Ru/o+XybJ6p/f9s9MRcHl927+crhgWQUTwbvmIB - 5KgkB4AG9ir7ghAHgwEMsRC65Y+FIyz88E2fte/f/uz7d6B+S6DDRnp87CN7/9noXXP/TDljzXEA6O5f - WXoyANQcwH4FsFzACQAC/lBYHQAUsKoKrSpXFFzfiWalbnkWjoJB8o1NQZPuOtua31+z8hDgQ7GHXMqe - e0HGvdl9ygLoIFDKlr+jzgEEAG6+2VblaANdlxno0+H9F11RLrrwinLuOT5v69STzzZwdop1lieWFUcd - KysJ86ToCDm9AkAFKAJweQduna11nrwHKWFjnxS/Z9ljr33VAfNOmRe4Zs2Z5YwzLixnnHZhOeuMiy1+ - UVlrv3eigcOTTjyjnHzyOWXtKefKZbzqmDXlKLtPAOKSJUcLTGI53Gfugdax7iELDcAeqx+gXpZdLAcG - /uhE6MxwodJxA1q1KIZ3jLWBeZ9Yf3n/FQh6h7ONBgoaLNj1eL6xlQsWt+gI3WJSO0HjttMUp3LODvJ6 - AMh7f3oXBvjq2kgnG88O4J5h7cnCYMlGWYDQ2kuX7sBfy/HbfZulrdP2vSN/hv62rbeaVc4843wDgNZ2 - Lri8nH/uJeXcMy8pZ59+QTl17VnlxBNOKatskHjUslVlsebzMr9unlyn8U6wHPF9snKbbxdLLt8zq8ax - 6rCynBNAsPpjrVu9em058cTTy8lrz7GBxIXWVs4ta0+ytnrCGZa3RoME9AuLynAfrzjaBxfHWD2mIhy1 - ApfyqWJWGHNmL+3JFzHtLqsSgE+gz8AGoIP7YzsogB9tn8U4bKoelkYHis4dAAxwYroI1ubP9hxpJ/6N - 9892JuxtbCCPgaa1z9BHPVeZva/QGV6nAjVdj1M9aMtN+6W9Nu23A3/iqF+5XjNAaugxGL0n62TVVa47 - fYAqKyB61p7tJjAA0HizTVgN7N4Ztn7aXK5gpoQAuLHMZwDoi0G0Wtvaj1tcfVsYLIAOAKuVT8DP5/91 - 1j/rP8QAwL32V1/GiSCHW99z8QXrypve9GZtedZS7g8jninLc/5QWSiXHSqT5Tl/qCyUyw6VyfKcP1QW - ymWHymR5zh8qC+WyQ2WyPMIRADhU6RdF+bfit/M9tPkRZnmmtnzmkA1RKx9XnnSWtflBQ/VyGEQ6ZPff - /0D55Cc+VW69+fZyuCn0g0wxs/+f5lcAAI0Bg8iw1IUFsFsFLBdw7ANYASBcLX8CfpUPm++WPx35ZgDQ - wR8rf/33mLwr6586iZj759a/mLvjitznBmm+0FZ06gYCcf11LuB0/NtGvgBkCgAU+ANYJfAHV+UqBZu5 - U4CWJ3blG3J3kdS4ONWp1+u4Kk8x11Lcf7u7j8p+JnHmXtmyihNrIIwSZmL6maedK6vNeedeah14P28L - 9+9x1mkCEpctXSnLHBsAA+wBkVhw6MBZkYoVhHlQuNmwvtKB8z52xyJLp7rTHI3KOVuXFcGs9l629Jhy - 7DEnlzUG+k43MAjoO/XU83QfZxiAOPbYk2UxjFWgWGlY8bvf/odU1x/vF8uuW/zkyrX36fP6DNgbCMQl - RYcdrl86XVkceL8C+rC9d+Z/GhCkvq7B4AD3sQ0WNrZ85tfJAtgBQDo+t9R5Z+od9EjHaezbasC107R3 - C2ALEJh5KqiDDYwpPgrOPL+XAfoBgITBo3lT4wKMSd7Wk9x+hzZGmwRQBACMtsffxCKwiy5gy6CLDNCf - W04/9eyy9oTTdAbwsceuKcvZE3Ixrnv77u39zZs3377TXfUuwiq7wTM21ICNzpxOXdM3LB4DCQYWWANx - zzJ3mKPijrG2c/IpNlA57YJy9tnryjnnXFbOOvMia7vnGDg819rSBeXMM9eV00+3+7JBxsk2oIBpV4BI - 3MmAv7mmT3a374CV6FpZbABu21kG+rRy3F3ITJnwzcNt0POEJ6q9sGG3Fg5hBTSQKP0S89RkofJtiAJQ - Moc4Bgvxjfv3bmnpAk93emJEN3j7ioUVmV0XjAJArLW9foIpF3X4fdqit0s/2s3vK7fdYeDn7djzvE5w - XLfnCgT126GzjK2NhU7q5gHWvVbRvXIBAwJtkIBuDiug5gWPWAF9MZlW6VcQqLmA1QrIwBOvhIPAfaR7 - HPi56zfO+navBSBwX/Vf9FsHWz+zYP7h5YxTzyqv/tvXlB/96Efq+x6h/17SHMCWsizibbm2TJufKfJn - Ui6HUFt+Ul5LD/V6pNv8IVmm6fLafBhz+Lvf9Z5y+bory4JDFxU2zwQUYI3jAxIINEUNSOOINlbrzssA - 0EDdAgOBrOoNELhwgS/4EOg71M8JpoxW/R6SFn7YtfabG6d+sPUL1j9cv1id6CTYK4zOA+ufAwQ4ACAK - JADgqAu4HgFngCBWpblrIgCgu4DZBNoBoDGKFWAWbMqtU+RV2YUFh460U9pWJhRjKMpglH8P8BInAMho - uvtt4lXpO/iz+wIAdkA1KVs2sDYAyEIWQvI222QLWXGZ73emgTDAH3sErj3pjHLSiaeW1VhMlq0qS444 - SostcLuy2haXFpYbOsRHP9pBINthMOcSpcwCEZ+Pw2h8N3WGs+f4hsyz7f2gmPfe+wDNDWXeFR2xtv+x - 3znKwN6K5cd28/04DYLtXVjJJ7egXQ8LANYXAb/aSQi8qbMwUG+dx5Pt2WJl8nt8tDq1mHOkzmZDf88B - +GP+EXVpFwBArsdzZcVuAECu08/Xss4vvcPcIapTbNIA0uyWhTMAHAJ34ziDtuBJecEZKLagsZfbNUa4 - tjUAIG3N7pE0ru7ttt6hnHbK2RpInLLmjHKy8YnHn6K2s2L5alnkDl+4TFZ8vmGs93vutY/aCxtnx/vh - O2MAwak9TN3AskvaXbK7aHse2hSdN+0GCx/z9latOlFWwDNxOxvYY+uis8+6xNrzJeXii64v55x9WTn1 - lPNVDtfvkUuO1pnV7DUIGGDxwI52fRaNhBUvFooBOnwKwZPK/zKgyjzSZ2zwDGtrsU0JZawsbLolXMLb - bredtVE/zhCmbfK9+4ChB0Tdt295SiNXvsu6/CGudZwD/PGtw1Un6Hrk12t29StI69pmAnfWvmPRh1us - I69nl0ddvw7Xa78H/Q2V/T7snuy+MgD0rWACADIXMKzz/TxAreRmWoYBblkBK9Cmfbi11ThbAWUBdBCI - zhAIZEueCvqIYxl0BiDuLSDIgDgWgnAiCCuBX/7SPy7f/vZ3ai/YU9tfZoq86DPbskN1h2RBkRfXassO - 1R2SBUVeXKstO1R3SBYUeXGttuxQ3SFZUOTFtSI9dhFIUM7LYS6f41CbbinXHyo7k/otre/1kA3VaWU5 - DyLdyqAsz/mtLOdBpH/6k5+Wf/6n15WzTj+3LgBxABjgTwBwb04COUgAENB2UHIBd1vBmBIO9rl+dWI/ - LmJYrl+sf+z559u+aO7f3IMMYB6gibyM3PjIOytBuH8NAPrkbV/BGRPCO2VtihsQiNWIDl8A0BhrUAv+ - 3HLmblM2MB0dWVcFbGAsRvCu+FzpjijCiFcGQHXxGnKtbkVvZoHM9HtJ1s31URzAV61+iblnV7gOZjnZ - ASD41Cc/Xef1nmhg75RTztLB/Scb+JPrd+XxZeWKY8uRS5fLdcc+e8zB1H5t1gkDrAFEdOBYcZibhqKW - 210dqW+4y6kPPkfH52bpBAeLS1mbokZh464JhcxIXCEDCmtXc+b4kW4oea4Z1r4tqrXO2ToKe4+AeoE/ - uxdW/Iof/RjdJx2jA3mffO7Me+Z9OxB0K/BmZVO7Jr/DXEHfE88tgGH9y9ZadXrdu4xO0OLqGL2MytFZ - Erd2o7ZinIHgTIBfD9BGAVsvHy03U3ZgF/ENxYpXjrYXbT/uHxlWTk7nOf3U863DPMXA38nl2GNOFIg/ - ksUVBuQX2LfN98/CLQZvDNxY5IMVFrdqBwLtm+M90040r9PeN+1MQEqDByb9c7TfHnaNuVppfsCBh9rA - 5Ihy5LLVBvDWlmNXrSnHH3tqWXn0SeXoFceXY+2ejrY4p4swCEVf7W7tS8cD7sj+k35OMMzKc44Z1BZR - W22lvUF9/uijtAKev5fpIZtVa3FMI6GtUAfgCMeWNDqBxPQOg8cOMKkN2LfON5ueY6QFlDru2w/cAUPq - V9aAUN9+ZQHA+t5oC+J6bepWgKZrxz114M7iWK2r5TqDPLVrxb2c57FCnOs5TwGAibu/Md2nXMD1WxQQ - 5DvsAKANxviuec6AQHu+WFw7AIgV0PR7WFrZT5T2EQBQbuBdfW5yWAFlMDDevVr9mHOqbXrqgqO9rF3Q - d7GrBX3bqhXHaarTV7781Sl9YSbygiMdNJSX00PUlsllh/JyeojaMrnsUF5OD1FbJpcdysvpIWrL5LI5 - b2QRSKYokKlNQ0Oyloau9WDo4bhGUHutoWvHfc+0bKZxZYIzcQLIK//sLw0krNV+cpwIgcs3VljBsgCa - oo85gB0ANFAHtwCwswZWAKhTHeT2XagTP1j4oSPf9FsG/gxkaiRnHy7gAfeiu3997p9W4hm7+xcAyKje - NxeWBdBY1j/AH/O/wgVcLYAZADpoMFAlF7Arr05ZV44OsQN6kke8hiNsihLQQF7HfWfAPl6+l1ekLbTf - 9IneHldaytTjDvR6lhWQzlxpn78VAAgAqE7egARlDj740HLCCSeX423Ee+zqkzRvi73/jjyS85iXCvwd - ckgP9nG9My+LDjMWheDOw02G8qbj5jg3LCJSzqakmZQvtnfi7mLfVgN32Q6zHRj6nKldBQBmWZ3tdrAO - lGsB3k35x7w+sb0zAb/KvE8AmzpsA37aQsU6be6PTkf+mSDlAAD/9ElEQVTPI9z4lWMi+obJGigAWCei - 89zoDLGKaBUvlhG9U3tXuYNOYL5nyvRpWXZCrnfogAvANg78tfKoM47HlQlQF8Buav5omZafZoMKgUAr - 52DQ/o7aPgEDgO/Vx6zVdkGrVh6nBR9LFy8vh8uCu8gGcAukC9ANfLNY8mTVM3DHO+E9BQhknqrcqFp5 - a23E3r8vrgAEustPbcbaB2BwtnX4u+y6l3RCHLvGMWws6Ji7fz2b15iOHSCAm5AFGW61szZl7C5G3yg6 - wNxGG7PtzxM0uKE90QaYOoD7l3mjgBP0h6zPslJ5PekYA5HbbOtAkLbkgOkpskrTfvRd2zfbtSPSlbsB - YNd+KsDimZNOYZR3PeDfuJh3Kna5l+G6qW69dg/s7Ddq6JxAobEsgQKGIc+c6tW/UYMf+13/DurfVHUV - bS7rIzgGY3zD6OFNbTC+WbUCAgCZ1sGUjH7eZbUCmo4IEKgVwaY/GDT6XEAHgLvt5nsxMjUlLH4wsmBO - pWHwyRQmBiqH2GD3KBvA3H7bczTl6YH7H1D/N9R3tv1kxIfCXA4aSrflIj4U5nLQULotF/GhMJeDhtJt - uYgPhbkcNJRuy0W8DSeuAs7hUF7Eh2ioXMSzbKbUXiPiEUZ8JtTWy3WzLMuDJsmG6mVZlgch++Y3vlV+ - 9wW/r32SMJXvz/5/pthjqT3Mnkts0dJZAHEBsxWMgTpcfgBAnwfoJ4I4ADTG7XsIW3tU16+NwubZCB/w - p21fsP6pE2H0xr5/vvJXW7/YR4/1DxCx4/ZuRcB6wAgfZj4PCt5H+L5BLEBi080N/FUAyOgTBbTxRtX6 - lwCgzwF0pSolJuXr8QBuUs5VMUcnKZay7S19oXiJSxF3Zet1q+L267iS53diYnco0q6ccQaAsvypM/B7 - DpairW5gdfpWjvlrgKcli48S8Ft+1DHiJUs4ku9Ie08G/uYv1FxPB/pzbcTsLnese1jiYm+36MRZLYmF - NTboxfWu+TuyssSGy+4yi7lTsLZ5oNO3zh65d6aAdbbs8dW5Dv62UMfgVhi3AG7w9KdrexoHo48SAMR1 - 1z/P+nz4u/U8Kgjk3WKBMMAvEEjnY502nT3WEzovrdxlZa89qw448e7t2l0nV+PxzkatL9Em/F3BGawN - AbyQtfKWe5A2HB/meA5DeT37QKEOFgwExjOMTp2/l2cLcMDyzwBihbWdI5dgNWYgx7zdgzUglLVe2/y4 - S5dOGyDGN8l3xPuKNsTgiPbBICG+W7fSMSfPLfmkteBC1kKuBQiYY9f1wYRAos6NxRvgAw2OGQQ4aMGQ - XXMrrkeaeAVvfAtsE8TWO9GesW5vaO2k26/O2ocGCsYMRHpXpYNAzq3GEoiMb1ZWZANKT9a37+2jA3pw - lXXtQ3HKuoXZQWCvJ7w9eZvSoLC+Fx2xRtuu6dAPDv7qO9M99OyryP03MhiUzEJ41OXbAL4BANhf339T - YJb7rXpL+or7lF4NEOiD7u4ZGwCUFTBAdn226A9ZASsA1IIQ3r29d98WZleBQJ+CEvswAgKdfWVwBYAd - CHR5AEB2r8DwsOSIZeWaK68r733v+8u999070ifmfjJzUJuGJuVHuuWgNg1Nyo90y0FtGpqUH+mWg9o0 - NCk/0i0HtWlo2jmA09GkstNdJ/Jzuf8KGdSmof8OGQdjf/7zXyjPefbzypE2wj+obgANKGMZvXgvdl83 - ALiPAcC5WAA5C/gwWQG0GbRcwNUN3AFBtwQCDnETY/nzPf/qti8GJLH++VxDVm/ZR7ubAz8+cubx8NFj - AZTCNwCIUtAoEWCxjSt9t/45+JP71xR3twIY968AYG8F7AAgnSGdYlWqvZIOHlWqPZsylHUoK8WhtIVV - oYu73yCMNCH5LnfFnzmUfma7bwszIOTvib9FIMKuw5wfnhtbrixj2xWsN4uWlkMPY9K+77uIpZcj93DP - olSZyM/ka6w0PEe2R8FaEp04pz08Y8ONqlXErS0dW+fIewiXmSwxAntu6dMKXIB6fU/RuWIJ4LcAgZtv - ZjKLM3+I00m0oMCA36P+16Pd8vdEjkSrz85Cvbf67OIZ+3OxZ2IgZyNcUdb5bMREdGsPG2+4qYAPq2YB - fk96Eh2l1Y3npmfXxzvAVtMOmkzO74r7sgGwWgZw5TK5Tlht2/LBUT6n2/wsi3grH+IAgSpnzDN0IGPP - 0HhDy9/Enh2LhJYtWWXfuJ+pO0+DhrnSC1jq2QuPNuOAzd2jgC9fab1B5w6Gsb4x145FPl7Oy3KaCOUF - tCoD3Pq2NJr2OX2+ETTfPZuOb7kVgwlvd1xXuwOYDDAHgAH0MeePAQXgjwFNN0AINj3hrkrjsAgad65h - 4w03ZNNs3zaIbwyrGM8swF8PAlO7TJwBm3SMdETVE6YLAHacRtR92+IeBEbbH+EAZJ3+gUMnOYALlhWv - grx+LiDpDAgp64NbcZWN6jjjTr/594D+iW8PlgUQrs83gDaW+LDwa+629IS1CdPtAQLDIuyrgvvj4QCB - OiEEEGjsC0NicYi7hgkls/ieu7MQZK76NE4EYduiC89bV974r2/SSmD6w7ZPzLIcTpIFTSfL4SRZ0HSy - HE6SBU0ny+EkWdB0shwOySZuA9NWgIhPV3ZSPpTL5jATsunycwhNV36obFCbD7Xplh6O6913333lwx++ - s1x7zQ3l8IWLNVdCK4AHAGC3EfT+BgCrC9hPA4l5gIkNBMr1a3md63ceddz6x3Vi5S8fqKwJ9tFq7t8u - /eKPHXbw/bt2oIMxYDKy+IOOxpQHHQZgQgq7uoBZAdpZAFkUABAQALQO0JQTigolmwEXisw7QdgV3IjC - E7sifFoNAYOd23BKubhWBSsdmyylR+6hi3NvPfu91nhNy/2ZRtzkRacTv8+oGKXHik06cI7JmmvgG8vr - 3ntxlum+nbsd9xtu2njGPEs6AOZKRSfuQPDx+l11vrXD5vnHSt3olD30hRebs/UDeRX8weTR+SOjUwD4 - ZcsjJ3wAAFntS6fbdZQd+9+a2Z+RARuAsr1jOiEGAnTim2yyuVZuAupwxYb1L4AQdQKchSzSWMscOJnM - nv1IvcRRJuIth/WPfA9Hy+t8auO2Xsgjz8ONVU9HGg7UyUyZIXmw2o7aKyAay5iBIftemJu18NAjNYG+ - m+/Ht7rrXpqbxTwtrH5+ZBuAjikZ9k6NcSPTlh0E+kCCAQVzL3EFuhXQvuFqwc8gUAs2ggF3JmMKgs6U - NkDIt06bk0UZcKhyXANQYW3MdADfCItSGEDg8n2stVtADwBL89Ts79NiBQMn6AbAyghQYSBpHKdY4EkA - 9I0AQPs+tFcf36w9O3kQRri2TZ6tle1YbTk42m4FgHzbtAfebeUhfRVWwOAMLjN3oK5hAT7TE+JId1zr - pvquU9K1u3u3tqNnQHtObmB7xnques7+XGM6Rn8ySH3f2wDw64pgWQHrghCsgDGVhBXB1QooNr3FIKQH - gcHVOljdwCwE2W+fA8q8A+aXRdYvnXHq2eXvXvX35Uc//LF1irUjNBrqH7NsKD/TTPrbR643Sp0FkDD4 - wVKu215nuvQ4inJt2NLDcb1x8Un0UK/3s5/dU9721neUiy5YZ4DtcG2aKbfgnj0ABKA5AOQsYObfHGIg - zi2ATMI+5GCfBwgIFHOeq4UO/JznyWLojAUxwJ+AJgDQPlQm+PoqUwN/9rFr4Yd9/HL/zOrPgqWjCctS - dBgok3AjCgBiAcTqAwA08Aero6zKSco0KdQAZuH2c0bJueLrQV5ShOSPpLMCJh7Kue8MRn8vK3PYyoot - bvfm+Q74IuzY8rtOIv4mAEz9He4NxY4cF/7BBx8mqx/zp5hLhVLUM99lzzJnp90014YVv7jYBbBNGdMx - 80z5DY4yi+1XgnGp8Tu413jmboF1cCfXGQCvvh8BRN4RIF28pepsvPHG+juxLoa10a1+zNN6jE7GoBPy - 52jPr4b+rOvz1nuKMv3z5Bnx/tneA0vDpptuIYsgwCvm4gn82N+XQVgGZUOc63QAqsbD4kgIO2hzeeYh - wBbX9Do92AuZ1+P6tGuY54dr238vyuf6Leffa1kduD2TDZ/OHm6b+vdk74gtmWg/fK+sumTLHrWZ2X5G - M522f5OAMHvf9t71jg1w41IFwDBv81GP7q3Jj3n0o+3dPUXXlwvY6goICMxZ2sIYSGDd8wGFDyo0R9Ta - UtQRm9wHEpsaQH9aak8+dQAgCIihjdAuYsFQLFbw9EbSE3GCRecSRo9YmjamU1oEAmH77u16em61zQUA - 7MBgfNPoAtpxsNprtFkv49eo3zaDO3tusdVTDwDb36r1jTudwzeROIO62N4oXMEZAGbXcVe3Yy+Xr5u/ - ObHujfvv9SzTUwIAdnMBAwBiWbX3KD1B29GAwF3BcEwHQP+7K7hfEaxFIbvCzAn01cFuEQzrHwBwLx1D - yEIQACDerQU2CD7phFPKH7/iz8p3v/s99YtDfWPIxvWbQW05wqE6bblx1JYjHKrTlhtHbTnCoTptuXHU - liMcqtOWG0cTF4EEjbsY6aFymdoy0PqUGyrb0oO93lB+Gw7Fg1rZUH4btvG77rq7/OM//HM5/dSzfJTP - ogwDewKAdRUVYIH5QAKAcw0A7gcAPLTuBYgbuF8MEps8x15/DhCr6/cgq3PgfJ/7JyujW//oVGLbl10w - 8afFH5oPZLxdAEADJ25pwMXjHYDAhSmTEQBoihtlI9eOKXUmI6PgO7CEkjVlFUDMwZYrVClSQlNwoRAH - AeBgunJVyr2C9NF9/M5U9vwsU1mUfr1XZ+sIYHUIPWvem4X+W34PKG7mumEBlRtELvcDDRDu2++zaAqV - SfiaU2XgD0tO51o30KT5eQacUOI8i8c99vGypkRHLsBmHe1jrcOlk6eM3GsbWWdq4A7eZBNX/uw1yN/C - 1ilPfNKT1ElzLm57LYAmv/Nk62wd3Pn76J5nes7xfohHfjw/3jcWRgDKVlttV7bYfGsBJjqqAH8BiiYB - pABmwUNlYIDY5vYbm23G4hUHaJtuCiihbbqM+JZbspAAMNoDxXydkAWoCybt18RNvql4k02svdtvjKsz - xPxGhJn199mz2eQZ1knb9wPQ4vnRFuhUWaW7q32nO2nA4HP+6Kj1LXbgr/8WtQqf79Duc0MbJOBuxJob - QB8GCGKVYxAB6OL7FZirYC9b+N1lCNBzSzLfP78DOAMwAWIeV+f5eVvivOXHahER7cTbhn9Hblmz56DQ - gZaDQdcXmjeMxcreGXqE9sTWQVo0xCKiCp78ew5ghiWM789kYr731G7F1k7VViuP6IQAUPX+7J56rt96 - lKG8fsvqp7bvaXRYfCP+fYwAwMiTLHN8T/XbqvJY+U5eV7ey/2b9m+u9ufXd75nniu5wF7s/07CuYiGO - dxkg0K2ADgLx+KCXfFuYWFCWXMGyBjoIRJeNuoQdDKLnmAeIUYN+5zDrk1avOqH83gteVL72ta93/SGU - 41D0kZkiPa7euDhEekiWQ2gmcYj0kCyH0EziEOkhWQ6hmcQh0kOyHA4CwLZQvsi4vFwGIt3KgobKBkV8 - qEwrg6aTRbwtN1SvJcoM1Ruq+2Cv9/3vfd9XAB+3Rquk9tvXF2Vg+ePDgQGAWJH22WcqAGT/LoHACvh8 - W5geBAIA51Xwh+uXybgwK3/d+revVnLx8WrunwESXL9YF2T92362RoLMCdH2LxWgZADIYgIBlc3dXdO7 - fk3hiH0UGiN+AUBTUr3Lr4Ktyig1Bx5Z0fXxSSxworJJIdfOoAV407Mp0w2MRwAgXDuD2nl53P4uC6mn - +7f7CAWO1YLOOE5XiQUfbNsxu67eZW4lipfnqnk56mh5tt6Zs1KSZ8lcJDps5ujRubZgMJg5V8y3golT - Lnf8PSNjaxfvrAF+I1uzxHsQ544t2Ds471DtWdcOlWeyhbULVpvKQrXNLP1duIEBOrx3wFK21gUQasHR - EFhCFvWCAXhbbAEo2Vq/QxsEEG699faS8VuU2WqrWQoBgAHk4j7iuuQji3SU4boBJpEDKPmNKEMIUy/q - RnxYVuPxt1nbAgDhomUxkCbob+0rNH0V5p6alM+gTOBP1ju3xMd8TgAqGy37IMy+Rf5OLEF2fd4PQKoF - gjBt5fFPwE37ZJWj7TNoiAEEzxNLEvPwWCDEe2fQ4VMUuFZYjv1oN6zHWOpagJS/sQCD+obs/mLeWq87 - mDfKMXlsGcSekU/uXKW0Sf82ra5dx8GPXVffe+Wapn0S93twfeIDQm+vAnVcy1jgL1nRxHGP0lvxW8Z2 - bR8cjf6N+RsRaAPEVfA3AuL4OyrHYMqBnv+N+jsFAGs81c2/6c+zvy/uU+CP55ktgBb2VkCfXxkeA9oR - czwdAHIcH4tBWBHsAFAbi2tVcA8CHQCOgkBxtQoCApmygLGB+etsBbPiqFXlV375+eWzn/18uT+dCTwd - DfWfM+l3x9Ej12sWgYyLry+1dUlnDlmE4+RB42RZ3sZzOoczoVw/aH3qtzTuevA3vvGN8vsvfHFZuWK1 - toBhsizWIln+kgVQAHDvA8q+dS9A9vA76MBDDdwZAIQNCM7v5gM6+4bPvugjLH/s+edHvnHqB8e+uTVK - H7IxFinAn7Z+qRvHCgDWjpxOx+cAAgDd9eMA0DqdKdY/By0O/nBHOKNIO2VlCleKWewgTQrUlJs4Kbwp - 3OZ3aRRwr4ylIKUkU+dTOweN5EfY78fzuD+La6salGrl6AwSe6dBHCuEdwBsUUFnBbOgY9NNtnDFaYoS - Fzsja19VDUByUO0deZ2nlyw5uNbUEdvzpFNmdE/Hw3wuXMECeh3Iy5yBnnPMyWJhh0Df456g+9O8qtzJ - 1HeQLX5wdGLekXmnpXLxrO0ZYLXkb/O/zxnXIuAkrHgBmoIDPA2BpnGgD476WOcAgAAyt/o5OAOwuQt6 - SzEAkDzAXF+XQctUjnyY30IW16c+fw9hvo98b5M4/z0R5+8EsGkPRvtbWOXNoiuYb1Abslu7GQF/9rep - zVh78bZi36DdJ529z7+1++J3DAQCbLyNPk1th/mkPpBw8JbbDGnaFG0LwMimzYC9qQMJQN+jy2Mf/Ti5 - epmuoLZE+0jtInP+xuLbAWi5FdAAIFYrnofdKwOSJzzB94wM9y/tEH0h0FYBoL5XrhvAT+mqXySLuN9T - ZyHsyjJw6a1/6CpNHyA09m89runlnf1vylby/L3om6lWPOf+GwuQ1313gMQunfOC83WM4/nyd9W/I56F - 9C3timeqtuDtQQDQdDSDdfR2BwBtsKEFPNvWbWH4freHZ4/MBewsgTubLtsl9gis8wKNHQiGazgA4H46 - Eg4jByvab7nxtvKRD99Z7r33vq4/zCE0SdZSK59Ud0jWUiufVHdI1lIrn1R3SNZSK59Ud0gWJAtgKxxX - gXikc9jKMrX5Q2VayuUz5XRcK3gSRX5bLqfzdVp5pvXJi/S4OqwA/sIXvlh+9Vd+XR8FK/wCAPLR9Gwg - MADgPgcIxGkhiIHAeQfWuX32YQEA+xW/vuWLbzTsW75o5a/VZS6R5v0J/O2teWhYF5jgC0DhAwf8aeNn - +/g76591QkwCx5qj+T+4iGSpqm4nWR8qANyETpVOcQgAVgWqsAd/rpidQ8HleJt2YDIEFqsytnCq5Y/f - DACaZVPjfp8WtxDlH+EoI3OOjow63E8exWO1Y9uTTez54LpDmcrlq+fpc666ZxmgzxQ0iroH1FhG3DrC - M/VOyd1e/BYWEjpfOmEseTDgEH5csHX4T6idNABAFhXusz473TP3Xu+/f6Yw5Wp+jfd59Xnb3471abvt - 2FLEz3H1QYTPVQMsAXIASm5RGs8BwAIgwZGHbLScM4AMcJdD8j3uaXcLO3Ajj9DBnIctx330v0dZG/TI - EtjfT3CU69O9rM3LjByL4Mb2d2D9pTPebhsHf1p5T2jAj46ZQZgWb+CaxYrD98ffZvfLdh8O/OyazFkk - pL083QEgbTTattrOk2yAYgCLdvNYazOPMSD3mEdzRi9gL6zHPXNSjQYPxliXaWdPeBwArR1AOBgaYQEu - Z4DaBuybad8c31KALlmteN92j6wYBvzRVhmkkGZAhc7wb86/O+rr++RawfobjRX237bfS3zvoRs8jzps - T5PBqNjA84bcY/MbXjf0V+Luu0jcAbleFvrBmXQv60BfF3edN3Jt+xbjucbfEX+7A9nkBrZ2IABo+gS9 - Qnt3K6Av6PFNu7ECBgjk9BUGcXlbGLhaAuckS2BYAwGAGQTuysrgfeRpYvoLRg4WxV152TXlnW9/V7nn - Z/cM9pPQuH4TIj2ufBsG5fRQ3rjybRiU00N548q3YVBOD+WNK9+GQTk9lAdPcQFPqgSFbFxe8P9EGvc3 - DdFM/sbprof5+6Mf/Xi5+ebb9FFoC5h9HACyKjfY3cC+FyAAME4EOXD/+VandwWz2CO7fLEQwoBF3L5+ - 5Jtd30ZjOsLHrg0A5KMVAJT7lxHeHC1I4OQAPn6UABaHsDp0liqsf7JWucVKADBbAAUATXma8gnAMjKS - DsWcFae4V3CtIh1UrCrvCrKXpetVJR0KcpSrDMWu+3GZ35/XIa57trxR0JfjSWbl+F2BpE65OzOHCUAg - y84sn7yvfRTrs3SgUp9h9xyNNXrvn+WIO91+s3+W1hml5+AdCh1zZe5JzyqeF2krE+VTOpeNeMtRn7o8 - O1yX6jgMAAJwcQHHdhIMIgL8AKqCMzDK8jYvl3Eg5yCuBWkBpnh++VpwlI16Lcc1CQNA5t+iboBNXMgA - thbExT1GHG7zc53RPA+x6gnsBQsEYg3k1IY6VWAr/+7owGUp5r6trTDnT5091wQAAqZqO4lBStdea3un - vYb1iTb6xCcAvJ6ogULHlmY+3xOf6IOHJ1WrHHWivcG+4MK/Y33L8T3nb7Jyttbp/gAs1q65L8Ce/56B - P/2WD1iol/8W/T1hBax/lwND/57j7wRs+m8FWOrj5FMe8Mf2RbjLBfz0rTkw1b3xW+n3vD5/R/O36Rm4 - vuq+Rz2n0Wflz66X67szGd9qJ2/KRKjr6hnbbyUAKOZv5hngxu/+Fr47twAKBNZBJjsEsPcngwnNA7S2 - pa2CaGv2zQYAjM2hu/mABgAFArEEGgB0IOiepACC7CnL1jB4sdjGjK1gFi1cXC48/5Ly+tf9a7n77rvV - J+Z+cVK6jQeNKwNNSrfxoHFloEnpNh40rgw0Kd3Gg8aVgSal2/jYOYC5UNCQbBLNpFx7/UnpcdTWCWrr - RzrLMg3lt/FxPERD+Tn+85/fW97FGcCXX60TOw5kmwdcswb4BM5s5ARrLqBWA/s8wO5IOAOA4QrGBcy2 - MABB+ED70AB+nDQh8LffQQKAOvKtWhjZogQTfbh+OTBec//k+q2bwQb4qxaI3lXJKsF69BuuJ9wJdEIC - gHSAxtVSFYBFAPDppkyNNbfOFBbKKytPj7ti6zqOquik7FI857MtTKdoSQOEuJYpxgwA1RGEkhRXeVWY - IfcyyKvCTxydi6etXBfv8+nYuA9X5m4BFFcXFpPyfe+0asWpABq3DPNzeuDnz7Hr0O1ZBpCOVdX8Zv/3 - +H3TKcUzdUDdg7anPMVdaB2n59iBOu67lh+taxxWCvKeaqExvwn4o31sFwCwdh64i5gPhOU4gE4AspYD - iA3lwYAyb5c+JSE2tM4ALTgDtyFu84lzfRjrG8z1YQCZpjoov86dkivYVzaHhTJcuQH0uA/CAHmRl9Mh - y8xv6nQXNlquoC9AYLYa6z749rDm8DfTudf2EtYrd/vW9lnbSB+6rPtejAFqU9tEpHO8spXtBxAeAoD8 - Grl8bpP+rQsAEtJm+a6qXnC3L4DTwZ8DwCfrOgI2+s76b87/DuL+Lbq1znjkb41vo3Kd3tFdT5Y/A4AB - mOARANg/RwedXI97d85/mzN6KP72xPb99On0fdXnGN9Z5HX5FQjGMw7234q/y/9W4hvYs2RxTsyrZDAu - DwJzAU1HBwhE72gxCCDQBva+GjgAoLU5BnIAwLACAgDrXMCYD+jsCwh9rurunSWQKUZ77RFnAh9sfd0R - 5awzzi2vftVryg9/+EP1hdEvDvWVhJkzDcmgkOW8LMucaUgGhSznZVnmTEMyKGQ5L8syZxqSQSHLeVmW - OVMHAHNGxNsKkc6yltryLU2q+19JD+XeZlp3uuv95Kc/La9//RvLeedepNVRBxioAwDK8lfBH9xZARMA - jMUgDgKZC1hdwbABQoChu359vz8sf531T+DSl+szeVfWPzZ9to/ZAeBO7vq1TjYDQDpwOkW2gAkL4Gay - WjnwC/DSW6ysE5oCAF15hsVK4MwUWAaBsDqPrDynbP48mbtrSTmHcqwAkN9HScr9RAdgebUjiJWY0VmM - di5TWfPZ6HR03cr6nWpVqffTAUCx/y0oZxRwb8VhRG5KGcufgYAM/qJDcqsfHZV1Rhb6PddnaZ2AOgIx - f399Hgr7TsQBoD/L6Gyiw+k7GTg6JGPqqS5hTVPH3osf5r+FtREmkLvrCJ41a3utcN53Xz/tBPAEuNmY - vy8BscwByoJznoOiOTYY2kcWCNok1xwFWd7WAlTRFgNUedrBYcS5LmH8Hr/BXKiY8uDz69wdGyAQK92B - B84rl1xyaVm2bLmuwTcQ11YbMs7XzxyyuKcMAKPMpnY9OlU6UhZiAfpGeBv7HrknuzfAH25f2kxY/7D8 - MedPwKXO+1ObVbsOrm3e4lMAYNduPB5WPcnXi72dBXffZcMOxnxu4pOfBOAbBX8wbS6+ydAj/TfH30ba - OfIDAHbfZ/27428PjvKdBVB6i2+P784BoD/L/jf6aw2BwAr+9AyD/dvKzyNk8Q3qm2rkpKfmV9ZvpOdY - /zb/+/w+ZQGselhzK639uhXQQaDPAwwQWFcDAwL5jm0g11sBfVsYBiZyA1fWYQGAweoOziAQS6DPA9xX - U48OtP6I3S5OXnNa+bM/eWX57ne+W3tDJ/rM3G9GvJUP0VB+Wy/irXyIhvLbehFv5UM0lN/Wi3grH6Kh - /LZexFt5UDcHcFzBcfEhyteYjtoyQ3VnUgYiPZOybZmgXHaIIy/CVtZSW7blyPvRj35U/uZv/q6cesoZ - ZT5z9VidawCQj0Xgj/MWjf1MReZR1P0AAYEGAPdjTh9WPlkBDQjK3WuhMTLtGaitR5zZeBhTPNfiCClG - ZwJ/cv3WuX/a+sVPo5i1HUxH6J2hwJ91jmzpEfPV2HiYzkpMR4T1qs7/yyAw3JWhQLtOyBR/7nyCe8UZ - nVEoQudOAXbsCpO4u59CIbpSHO0EUN6uwEMW9xP35h1DKtPJqryLw1y/V7w9u6UQpcvf6feOEvfOgfuj - k+7cMTw7FnugnDtLjivuvhPyTorfjefHb8nSyXPjedW/XRbREeDmc7SyO5hnFsA0ysRzhEefd72OZL6t - x0YbbmTtYAsbHHCmqFsOtsUKaIOGHXbY0drcvmXBgsNlPWBhQqwYJxQbgAFgdWwgC6A1wlrYsZUGIN5G - 56gdcnIJ8wmfxBy2Jz6lPOEJTy6Pf/yTFJJ29vOG5da0NGWDfYEOgIM5ZfauDDgCVA8/fIk6On4vBj3c - B4Dcf+8pBkL3LhdedHFZuHCRvhWOZ8MiB7iDuS5lAYYuc4AZFka4BbjBAQ7Ze/MgA5q777aHnmWAP6x/ - 3Nd23J/dG98hgwb/1gB/1l604MOtf7C379G22YGWaDtqP/GuE1c57cnff2of9gz7dtHLvQ0Fcw3nAEZq - n/a7LvNvlN/B7SvXMqx5f/CTZTXnXtXu+ebs/v3bi28xAGHDvFcLPS+XN+Yaug759fsC/FUA6IMvvr0K - pI3ztac+U/s7+LvE/ncGQHN9lp5H5Xhm8fz8W4tynqd3ozLOUdd/B90ZcZ5p/37j7+a+9XfF32Ss1cCm - p301MHsCulUbECgroLXlsALqSEnrAxwEzpYruF8Z3C8MmR1zAgUE69xAA4G4gelzWAiCQWL+IQvKCceu - KS/+/T8s3/z6N7v+MPePUI4H5XLBWR7U5kM5HpTLBWd5UJsP5XhQLhec5UFtPpTjQblccJYHtflQjgfl - cvDYVcBBIWvLDcmhnPeLpPwbD8fvTbreUN50vzmT67ER5stf9ifl+ONO0uRYzgDmIxEA3M0A4K4OAJlD - IQC4575lL8tnJIU1L0CgNoaWu9ePeGPBB+5fAKBW/RpgBFhyJiPXAFAyKtN5v2H9YxRXO1ef+zdbANAn - n9Pp9ACQzpBJw/28PxgAY4x1RwAGRRPgJQHAqkRdeaLMBwBgKDkpzdG4lKCUapvnCnPkOsahnEPZdxaB - qsSdSVe5AUPuizTKU53NGO47AO9InS1tfxNWOpWxe9jSFOuONnpmrzXy4764Ps8GhYzrrgXPenZ6fg78 - OoVe79mf3zOk9PPf7B2Odxo8kx4ABlcAWOUAoZEyFsa8o7bTUVkL+V3eNfvUbb311gZE6DCMt8Z6tr22 - t9lt193LmpNOLqeeeoYBpSPK4sVHlqVLjypHLl1ejlp2dFm+fGVZseKYcvTRwceWVauOL6tXn1hOOH5t - OfGEk41PUXz16uPLkiXLyrx58zV1gT0p2R4FEAVwA2wB4uJ+A9hl8AcwdJDoQJFtSgI0ks/ehADAo446 - Wt8C7T3aPIDsCVbucVaHVdPU3WCDDfQ8DjrokLJmzSkqxzUC4PHd0BGGq4xryrpu35a7sWNw5aBu5Pva - nG1rNrPv+cBy6MGHlt122a3saB1vdgEzjzTiTCPgfQgAGvgLAOin7rRt1QGCgB+c2059z5nz+3eQ0nN8 - d95WCHOdyLM4AzjjEWBkcn5f36DdE/UBerh6fcUvCz68nVKnH2TZ9xdcvwW4n5YR34kPOJly0n83Ub4P - BZAEkur3BlDC+gdY4nla2gdfPEuu5dfjG4h78fuK79D/xu5b1N9v6fw8Gu6fJ+nx5YLDItsCwP752N9n - of7ukb+vB4CaD2g6ZwQEYgU0AMgUH6yAtEm5gq0f8FXBbgnUfMAEArH0077lEobDJYwreNc9yp7W5zCF - CSPH/IMPK8esPK789m++oHz5S1+e0qfmcCgelNNtHpTrRjgUD8rpNg/KdSMcigfldJsH5boRDsWDcrrN - g3LdCIfiQaRHTgJpw+CgtgzUloGGZNNRe81M011vKG+66w0R8uA2nWUtDcmgobqZv/a1b5QX/O/f0xYw - B2kF8AG+AKRa/1hBJTawJjcwAHDPagXUljC+L6AsfXMN9OESBhAiE+MqZl9BP+83VhdzbfZq4uNk5e9O - s936N9s+5N79y8bP3jl5J1Pdv9ZB9Ys/HACiPDj6rQOAHYipCtUUT4A/B0bsA2eKK3F2AY8oO1NuzuT1 - Mik9FGGNdx1Kdx0UY9NhoPC7uHcAIwBPedExwDlOXrADSq7rk9gr+Hv60+3ve4aDXQN7jKb32++AcvaZ - 55RbbrqlHL7ocLno1KHYM4GxMACYeW6dFdCeXXREbs1BgUen5ord7y2AdO1o6t/uVlPSPJOmswbABXd5 - 9bl2aS8beeLq9qXD5r6wvvmqQWcBQGMGDLN3mFP2NpB21ulnlb/9m1eXf/mX15d//MfXln/+59eJX/e6 - N5Q3vOGNOg/0jW+8o7zpjW82tvBNby533PHW8ta3vL28/e3vKu8wfvvb3qWTct5s8te+9p/LK1/5l+VF - L3px+ZXnPb/cdtuzy3XX31SuvvqacsUVV5Z16y4rF154cTnv3AvK2WedV8444+xy2mlnlpNPPq2cZED0 - hBNOKscdd2I59tgTy8qVq8vyFSvLsmUrypFHLhcwBWCSf/bZ52lQdvSKVQKri49YWuYfwkkcDM5YNMUx - idbhGcjFyrHSwCsg97DDFpYjrCy/ec3V15Wb7J3feuvt5Zm33FZuueXWcsMNN0l++eVX2b1eXi65+NJy - 0UXrynnnXajfPOusc8uZ1lZOt/qnnnJ6OXb1CeXktaeWCyx/wfwFWmnJ6nwAdlgnw93ucwLdHUwnL5Dy - tLBY9QDFQYp/EyMAUIAi2oFzvPte1rePjtWW+jwP23rGMYWjfqeE3Fe0c+7zaVZGAxMDgYA/7pW5st7u - /bvz6Q2V6zcoCzxcv4v4TvQM6nfTgUDS6KD4ntBJDLCqhQwW8AuuAFDfId9sAoB6troH7sXZn2foJb7D - XkdJT+Vn0rA/s/qc0nPMz9OfsV87s759/T7PBr3k96Xnob85AKDrnPj73PtQQeDmPh0F/Q4IpD31rmAH - gAEC6SNGrYAxL9AXh/jCEOMKAOnTAIC+FcyhZcWyleW5z/mV8ulPfUa7YQRF39jGoTavpbY81NbJ+W1e - S215qK2T89u8ltryUFsn57d5LbXlobZOzm/zoMFtYDK1F4gwx3MIDcmGiPxcdqh8W6alLGvLTlc+U643 - RA/39e6//4Hyuc99ofzyc361LFu6onAG8Nx9KwDM4K8CQKyADgL9VBD28eNcUM6UBeTJGmjs4I80bl/m - C/qefwBAACTX4fxG5mbM2dnP+/V9/xz8xZm/MQeKj1/WiWqh0OIPrT50AIj1TwAQ4CLwxxwmlGaAGHep - uAvFla6UfSgrdUR0Sr0iczaF13Gbrh2JcVauWSEKANbfgAXaKpDzTsM7Ruf+vjrFbqz5fZQNVifj7Aof - ucfJo7OCmZQ//5BDy3XXXV/+5m/+tnzsox8rX/zCF8urX/3qcuyqYwWU/FkZUEYJJwCoeYB6lp4noCgA - aBz3V+/fLRAo/P656RkKANZn1XUmtWOxDttBoHcmzv781MmQH3KVc+a6vEvuD/e/wJ8NBgIAbr0Nq1Zn - qf3su/e+5cp1V5S3vOkt5T/+4wc69P2nP/1Z+Rn8M+d77rlnDP+8/Pzn8L0eWlryn92j69x111265re/ - /Z3yzW9+q/zb175WvvLVr5Yvf/nL5Utf+lL5whe+YN/V58pnPvPZ8qlPfbp84hOfLB/7+MfLRz/60fKR - j9xZPvzhj5QPfegj5f3v/2B57/veX9797veUd73TwOY7DGy+/Z3lne96T3nve99f3vnOd5e3vvVtAqZv - eP2/GnD9l/L3f/8P5VV/++ryV3/11wKif/7nr7TwL8qr/uZVyvunf/pnq/N2+62PaXunL33py7JwcF9f - 5N4+b/f22f7ePvXJT5VPcn8f+3i58864vzvLhz744fKB93/A7uN95T3veW95yx1vKc991nPLwvmLym7W - obol0C3zHdv3icuOd8HAg3mKI22k8ug34m1lBPypzQTQyOxtqW8zfduAp5Ydz/wue1kG8EBf0L51fwxm - rMwO229vOvEA/T3ojdAhavtWPyyZ/l07+2AuvmO+l17nuP6pDKg0ub4pgF8FRmItlMBCxhQM/wbDDTwE - AH1LqXi+zGH0Z9zNwa2swWp+Bk0ajucaz7EDfzzf4FpW9fUb/t1LRpr7EEDmWfjz6ACg8Yh7m7+zuoEF - AO3bdgAYp8BUAEjbsjbGrgUCgAKBswUAwwqI8SCDQABgrA7G00S/Q9+Glwtv17Ily8vNN91aPvyhO3Ue - PhR9bO47x8ky5TI5r5XldCvLlMvkvFaW060sUy6T81pZTreyTLlMzmtlOd3KggYXgUBtwUk0k7JD1w9q - 45mno6GybXyozBBF/qSyWf5Qrkej//hHP1FuvvHWsvjwIzU5du6+zNHbVwBwdwN+cIBAVlLtHlZAA4BY - AVnRK1dwnePHKSLZ8jfX8nXcmzGWQ60stmtjwfA9/3zun+b9VQDIth185P3Cj2pdMEWwJe4pUwoCgJv3 - 7l8tAqngDzCDYtF2FqZoULDBroxdMaEsQ3GiNAPAdCAGpVk7oxFuZK4EvWwoxFCEwaGce8BnbIo7gz3i - mUN50uHEffbALzofvxZ/E+AIiyeWoQvOv6D83av/rnzxi18sP77rx3rXbPnDirc73vTmcunF6+yd7qaO - Wos/quUvAKBzBdamoAHTen66t7gvOh6/t/ibvbOJZ9A+v9qxYK2RxaaX0elQtutskFU3MR0y75F73Mo6 - hs7qZ+E2NQ7w2N46ByxiCw5ZWJ59+3PKBw1g3fXjuzS6j/b/C2f7LX4vM8/9PmPC4Pvug+8T33vvvYMM - +AzgCWD9KWwA9Cc/+Ym2rrj7rrt1jONdNX733T9RPvXuv/8+++37+3uweP79EaZt6F7yfcV9+P3xe5/6 - xKfKC//3C8sxR60se+66R9lp9s4aqLl7zr/RmIMJd9ZAAy20075NRPtw0OAA0OSKtzwKSCLdyTpg4uX7 - st6WuuuoHfoggnbM2b5d298MveEuSZi2dugh88tv/sZvlL8wcP3MW55Zli5ZWmbZ3xnzYjcyPRLfZXyD - Yla91u+j+5Yr8Om46iIBIXFYxHpQBCD1aSzVk2H5AQA5FziAZHyHcQ89AIxvsj7XGnqc590+c3+OAtMW - d67yLm3fY013z1XMe/R3qd9EPwEAO09GPIv4+00n179Xz7z+nQEAfUGID/AFADW3twLAagUUAKzzAR0A - BgMC68KQ6gaOeYBaCWx9F/vczjtofllyxFHl6iuv0y4YfDMPB6EDHk76f+F6Iy7g4Ezj0jMpC82kTNCk - vKCZlAkaVzbLx8Uh0pPyg8aVacuTDhkWjg+874P6CNgXicmxnJfIR8LH0ln/dkkAcHdfHexbwsx1KyDz - ++rK4MzIcP1iLfRNn6tb2a4jANgt/Igzfzn2DQBYXb8BAJkDkgCg3AMGBPzoN2eAC0DFFXQLACujNKWI - QklX8CKXiQPA6JiCA+xlMBPxUKAjZZXn1oER8CcLQf+7zq4Uxd299SzlbpyBamauwd+iVYP2d9KJzd13 - bvnl5/5yufPOO2WpooOPdw4DBgAQH//YJ8pv/cZvlUULFglA9dvAVPCHK4Z4sMkA2DxXPccAf1L0MH9v - fm798+g7iiGuHUp0PpV5voB1XNF00tofjM5AVr+eme+n1b7WVnY1RX/8MceXl//RK8rnP/dFA0336O/N - f///37jwL+JGI3mWqXiEM+HmGpmxhH7tq18rf/3K/1NOX3ta2XvPvTXYYD6WT9EYBYBakW0h74kNoun0 - aSNqGwCQ2lac0/eU2kcPOHoOcJIHCzGoyADFy3mcNiqLn7VjP3GCk1m8zdPO1dZNh2xtbeykE44v//D3 - f1/+/Vv/Xn70wx+Vr/3b18qb73hzuf32Z5VDDp6vOnwLfHP6Tu07YF5vN7BM366+ZWvH+mYAP8YZ+PXg - rwLQCoYyx1SWPBcwACC6Q79lv6/fjm9SnJ6vPQPpL4uHnotnLOY5VtZzi3T3PDOnepX792hszzr0Xn4O - Wjxmf7frY/v769+teYCw6e/QPZtt4SDQLYD+nft0AwOA1jeIDQTGquDgHgASBgD0ley777anTrbab98D - tBfgEQuPLJdcdLmmf+AdmCnF9xDxTOPkk+j/9etNtADmEGrLQEOyoLbudNcaopleY32v14YtTbr2UF4b - ttTWwarA3KZLLr5cqyRZrbvPXr4CGMCn8xR3cXYAyGIQACDnA8/1uYAVBGqOX7X2ASLZbykAoI57w6po - dbXwg7l/WvnL5HRnuX8r+GPhBx96dv8CAnEFxLFTKAdZqBjBGwsA2ggSRbKRKUxt/gwArMoGDpDVj9gd - xAQAHFFidUSbQR2cgU0oVZ8IXeUmQ/GOAsBqrasdRPy2Oof1AIDh+nV3k3U4An4b2d+8iXVIm9rIdr/y - 27/127L6YTniHWcOIk7+N77+jfKaV7+mnHfOeQbO97Bny5ybtB9gBX/RQTqbvD5nOi7ugeepZ6jnGM+o - f065o+jZO5kO8Nkz5O9kXhQdHu+WlaUs8AD4ZaaT9hWCvi/dDtYZzDvg4HLtVdeVf33DG8u3//075V4b - 3LR/d1D7LKZLT0fT1W/T09F09dv0dDRd/TY9RMgf+M8HZA1k24w3/usby3VXXVPmzztEKy6xvrDlDoAv - A0D2Y3TrIK7hba39bGmd/qZq1903Vlnfkr6nXtZb8SowSXme3wMStaXUrpDxnaAHmC8agwhv536CkPbB - pE1ZfM899irXXn1tee/73ld+/OMflwds8BQW3J/85Kflq//21fJXf/VX5bhjj9PfxXcQ30B8r/2iDL6L - +i0DfOz7Dj0UoK8DQJUD8GkgG4NZvrNURlsM2bUAkAEEXU9U8Fd1hXSOfYOht/rn2uuppz6lej3q88sg - T89PzzC4LRNp5+7dSY+mgW99Fvr7K3PPgED/+/0ZxN/duYFNz+AK5v3I2m9tB3YAWHkW8wCrFdD6DoFA - 60ccBDpnK6AWghgAxCt10P6H2OB3cTn37AvLP/3DP9v7vqtr5y1N+iZyOESPXG/663UAEJrJjwzRTH6Y - dJZFPIetLFPkD5WbqSxT5Lflhngor6Wh/FYWzFAftw47oZ9z9gVl/vxFctkCAAXUKvBjnp52VDfQJhC4 - u4NA3xPQASD7+mHlE1d3L6uEAYPa8gXwZx8e4C8AINY/9m1iLycsf37mb3X/alWiL/7QKRUGAAX+rNNn - /h8AUHv/oSQAJFinZAGsANAUSsyj6Sx/xr4a0QHLqLJswB9cO6dQbB2YSZzLOgg0mdURAIQr8OtYwA9L - gXcKAn1wlzYmXhV68Mg1jAGALPRAgcaomc73wvMvlOWPTvo/H6jvuVIbh+nYcA9/8pOfLC984YvKihUr - NbcrQFe4yDL465k98SwfEF6trzxzJrMD4mJrGNjBYfM3aKGKAVjekxQ/1wtLn438Gf1b3JnO2uPcFyt9 - ARW0j91MqZ984snlj1/+x+Vzn/u8rJvZ6hcU8Ry2MmhS/rhyEU5Xrs0fVy7C6cq1+ePKRThduTa/LReM - a/nuu+4qn/7Ep8ofvPDF5dhjjiu72zeN+30H65ABRwKBdU9GH8QBCmvIt2zvdPNNt5BVC8uZvrEKLhzU - 1ThWPXEP7BzcRX6krb6V43uk/dGu+C5oo0wbUJuu7TrYLUtbW5vf3v6GY8orXv7y8pWvfKXc8/NhyzHf - yw9+8IPy+te/rqw9aU3Zzv4WgUD0jX2L8d2GbgkAyJw9gR8NRp2z5c/dvT0IcsYtXQdalqdy6DMAIPV1 - vao/7O8d0mkahIaO6pjnnDjS8QwzY1VN6d4l7Hou5N1A2K6P5TEGvv7NVwAYz0D3SzgKAPU31r9bIBB9 - AwDUN7+NBv70A5pr2gFAXwziABBXcL8qeAQA7mQA0ECgLwTZWwYKDjxgM+jTTzu7/PVfv8req28G3RLv - PVO0hUw5PZSfaajukCxoKD/TUN0hWdBQfqahukOyoKH8TEN1W9ngIpBcMIdD8aCcbvMm0biy63ONTA/2 - euQPlRknn46mux57AL7m7/6hnHrKmTqzl/l7AoAG7sL6FwDQubcEuht4rqx7gDy3BgIAKwjk2Lhk+dPC - D7vmsOvXgJ99wMzp0LYvWvyxg6x+7vpFAVTwZxx7/7n717d/CesfisQBIEqZ0xFC4XioEXoDrKYqyaoo - W2UJhwyFJ9Bn3AHA4FYJ9lY7OECeuII+rbCt8SgX3Cv0DP42kssISxmd7Ny5+5Xf/M3fKt/5zndG3nv7 - /iOvYwOK9953X/n+979f3vmOd5Zn3fassuCwhXKpquNsgCDzpRz8VSCozVuNt3T3MbIAhgKH9m40osei - V2W+11cFd9UV51wVfu2sezmyraobyN2Ku+y0czl6+dHlN57/m1qs8IP/+EG57977ur8rqE1DbRrK5XJ+ - lkNtGmrTUC6X87McatNQm4ZyuZyf5VCbhto0lMvl/CyH2jQkmbUb5k19+9+/Xd74hjeVG667oSw8dGHZ - Zc4uZYcdZ9v3jJvOOmwBv8q8P6w5deFOADHeL+2Gjh8ghKu2AzXVMj/y3VVg49ZwnwJBvc0MPGxh1/F2 - 5G3J2463JxjrcdzP9tbGDz14frntmbeW977nPZofe+99w4OnYIDhd7/73fLiP/iDctCBB+n6gEC2UNoY - cIc1X9Y/+3Zh3V8FP1jtAgBW8NeDvgr4AEAVBOl5kGd/G9865X0url3DAFQHqNAZ9bfE6Ap7Pu6F6PVS - zNMb0Ws5Ls5A0OIAww5wBwgcZQeA/e9I79l7c50Vz8EH4N2zAADa3+Fb3djfCPMs6t8tnYEu0furFkAN - IHzl+ehcQD/usZ0P6ACwnwvIQhAAICvpme502KGHl5PXnFr+7E//XO/U3nD3viMMDmrTM6EoH3Vz/TY9 - E4ryUTfXb9MzoSgfdXP9Nj0TivJRN9dv09AIAGwzJ9FM6uQ84kNlQ97mZXnOGycPGpeX5ZHXpqHp4jnM - 3MqChuKE3//+98pfvvIvy0knnKK9zfbblzOA97OPxADgCPjz3dRhRlG+IpjTQTgeDgsfQNBZINDAX1j+ - YMrutmsPANmtHfDn274AAA382UguAKBcv/aRb4mlQBzgD5eNAZLNtx4Bf9n65wDQFSynG8T2Cj5SrspS - ChPXqiupUFzuMkGZTVVy4pDXMtTxeFJ+4lHwl+f/Ye2gc9N8mMQCf/X+AgTG/QUL/Jmc8oycN910U1lZ - GN2yXQirROmU4/0HZxqRWdCVs46Nzg8AySKRW256puYH7midebiGwz2MYnYXsQPAzOSP465TNvDnq/x6 - gJe5t9hYaL/NHn9iawO77rxLWb3yGM1f/MD7DPjZyJ1FC//5n1OtftCQDMrynJ9luUzQkAzK8pyfZblM - 0JAMyvKcn2W5TNCQDMrynJ9luUzQkAzqyhtYYjrBv/3bv5VX/e2rysUXXFzmHThPAH0nAUG+Z+u47RsW - +BMABPz1ABB2a5znS8YAgHZi7UYDDQYftLkKDHoLcW0nhLRRa2MeVk6/ofmiAL9Zs8oB++1fLrvk0vIv - 9s18+9vf1qIXvoFp/15jLOx3vOmOcsJxJ5adDGTQNhkYbbwxeqcHZTEnsAM9pofQSwJ/AwAwQF9mB4DJ - CtgBwHpN9EboNNjAVsz/cxDY6zfnpN8ISXc6LoCeg70OAE6Rj3IHACvY7HUWOsxYz8Hvj+ku3bOoQHgU - DPvfrYGj9AvvsLabAIFYAcMVPGv7CgLdHYwrmDPkAwDGcXEdANzNACCbQe93cDn0kEXlhOPXlD/6w5eV - b33zW2rL4yi3iaH2ETQpL9Mj1+tJi0CCW5qJLNJZPkmWaahc0IOpOyQLGpL9dxEdJpOcX/ZHryjHHnN8 - OeiAQzQ3Ym8Dbiz2cADox+n4kToO/pz3FAiUFdBAoLaGwSUMEBQzRxCA6JZCrH/U92sB/nyz5zzvj9Gc - JvZi+TPwF/v9ie3DDwAIaNDqX210m+b+CQCaggQAolQEArEmuNvEASAgqypJsSuqPEoOJSnlVhXkEAcA - jPI5reumEfCI69fYQV9S4C3X8nGP/dw/B39a7WudDZa3nefMsXd3ULn+2uvLZz/72c51lWlSu8vtFaY+ - HRxA8K1veVt53nOfZ+3jWE34n7Wdjb4FyL2zpQNWB90BwB7sTQGDySITaQHA6MhR9OrEvaPuQJ/Fce8c - dMC8cu7Z51h7fZm2LMF6jUvugXrf+W/Mf1NQKyOcSTloJjLCmZSDZiIjnEk5aCYywpmUg2YiI8xx3MI/ - /elPyhc//8XyV3/xV+XSi9aVhfMXaGEOgwgN8uwbx6IvkGfs4M2BfQf4G/a2EW7cmh6JR7vyAYaX6wcb - sVCIzat3mr1TmX/wIeWSCy8qf/NXf12+8uWv2IAJdy8LpUa/m/y3RZj581/4Yrn2uhvKfnP3LzsbyOB3 - N92kWukYdErfOOdFH27xcoteuH2zxQ99JgBUQ+b2AgLlHhUIdMDklsT4HcCV6wtZ2yqH/uj1VB8f0WUC - cBavgG4E7NUy7mrPZYK9XP8bxvW3sxXQ7w3dho6ruk8AkAG7PxNZAu3vZGAbANB1BXof3WDthPZTrYC9 - OzgvCpntewN2ruCpFkBOo2K60yEHH1ZWW9/3wt/9/fJvX/2adF9QvOegnB4nhyI9Th6U0zMpN04elNMz - KTdOHpTTMyk3Th6U06187BzAtmBLQ7JJNOl6pIdkQRGfThaErJWPKzeJcn4bfyjXY7TLJtAv+r3fL0ev - OEYHZLNwgwOzNU8PALhzBW1zAG7VGrirb6oJCPRFIQ7yHAQad6Bw77Lb7riLuZZbEX3bFwCgz/nz495Y - 8bujfch0Dm75g2X5qwAwgz8UwqamGPzc3y3q/DMHgN0o2ViKpSrKftuEfkFFuJYc/Jkiq0pxiiKsCjAA - ntJSeFXptcrP2JVeUn4V0AUA7BSg7imUod9fKHNX4P11AIDkOQD0LVG2t2e21x57lSVHLCkve+nLDBT9 - cGwbmdQucrlsFQRg/fAHPywfN8CFpfi6a64vK45aYQOFuWWOKVc6Vdx5GqGrE/dO2cFdD/Lc0ucdvHfW - zoC96KBlAdrGLTRst7HznJ3LwfPmlZPXnFJ+9VeeX97w+jeYkv43LVxiMYLuN+650sjfMYGGyg3Ve+R6 - w0SZtlzIYN7RV77y1fLaf3xtue3mW8uq5SvLvnvvo3fKcXJs16N5gvrG3fqnhT20iYF2orZSOadjbmjI - w/qntrSttSMDB8xp3cd+e+WKVbJq/+Pf/6OAn9pRDJam+ZPj7+rJp8+87GUvL0sXL9GG4/wWoMV1j3/P - AdBGAGDVT7HiV+AP/dWBvwB+gMAeAIprPQ1wKwDsN2h3kNVz1kHousrdVBXXa9JtVZ9J57Ugr5bxBTgZ - 7HnYAsDW6ki8B6NVB4be42/IAFCWzgoCN/N5gFvU6SJaEbwlAwd0Re8K1hFxFQTKEggANB4EgHUOYAaA - q1asLr/5679dvvCFL0nfBbXvPOKj7WAqDdWBiA/lZdkQDdWBiA/lZdkQDdWBiA/lZdkQDdWBiA/lZVnQ - tAAwVxqSBQ3JgsjLPCQLeUutfFydVp7zMmX5pPKtbKbxzJmyDOWHkv7fv/WCsnzZSs2JYNFGrAAOi52O - 0hEADEugcQcAHeDxUe1uStDBoDPxWPDRAUD7CNmhnSPf+EDD+hfbvmDadwuBs4NAd/8yAtzclLxv/Fzd - vqYgw/rnSsQUCGEFfzH/r3OPoCTr4oQ8Gs7KUGwKTSPeTrkZ11BKMSk8z4u4sQHKUILiDvy56zeDv5Zd - MWKhTEBV91uvAQC0vwlLABYOLBr77Ll3Of3U08s73/lOU2A+B26IxsmDcn7ECWHays/uuaf8+7//e3n/ - +z9Q/uov/0957i/9cjnrzLMNfC4VIMQ1y1FzdIRy+Wmelbv1nH3+l0IBve0EIFk0MGennW3AsEeZd+BB - 1lGvLFdcdkX5vd/9PYE+rJp0tu7mHd+uh2icHBq6TtAj13N6sNcDoMOaI/jtb5d3vOOd5YX2Pi+58OKy - bMkyby+mB2ZbRz1rFiu5rS1Ym4BpI3LZVlDXAr5w9QIY3ZXM3NDaruw6tCfmIe4/d/+yfOlRZd0l68qL - X/yS8u53vVseDzb5pj13g4hEM/17CWmPb3vb28vJa08pe++5j75F7hPwEvpHIM2+6Q4AmsyBjrOADgAQ - 0IdO06C2B4BuEaSMgSKBo163yX1aryvdETou9EZln4oyCsqCu0Fv1WfSbR0AdN3XcT1GT+U7rvW53hQv - ijPzELNFUm7g0IPcO3+H/U0BjAUC+Xvtmbi7HwDog0mMAO4ORr9UENhZAbc33ROu4H5BSLcQxPoe+i1c - wExT0mkgBx1mfd+q8rzn/mr59Kc/MwIAofy+Iw7lODQub1w5wpmUg2ZSjnAm5aCZlCOcSTloJuUIJ5Ub - AYBQrtAWhnLeUH6moTLj6gzJQ5bziLdlJ9XNFLKcR7wt2+bnMNNQHvG2bJtPY//C579Ynv+rv1GWLV3u - AFBbwDBfr7H+AQIBfwKAMReQBSG4gisQlKvX3b1i+9AcAHKd3XxXdqx/9jHK+gf4UwcAaGDRB1u+ZABY - wZ9G+SxEcPCHW2AEAKJwO8tfUr7GKEZWBHbAL3iKMsxKLxSfA8B+5Ot70wVIHKmb01XZdhwAcAO4B3sx - iTtkrhSd84g52K/hnQiWAUAWFpUD9jug3H7b7eVrX/ta994nvfshauu08Z49jYv4Rz/8YfnSF79U3vmO - d5VX/ukrrR39ern+2hu0EnntmpPL6lWry4qjllvbOrIsWby0LF18pMWXlaOXryirj1ld1p60tpx/7gVy - XT//154va8o//9Nry4c//GEBTTY0lkum/mZw3FNQlmeaJIs6OR2U5ZkmyaJOTgdleaZJsqiT00FZnmmS - LOrkdFCWZ5okizo5HZTzxPYf26mwUfVXvvzV8ra3vr289I9eVm687qZysrWTIxYdUQ6Ye0DZczfTK9ae - ZzMwZEI/VsLtKjg0pr0TYh1mKgL5O+6wo30Dc2QFP+jAg8vSJUeWM08/s9z+zNvKn7ziT8rb7bew9rHb - AfdgN9TdV0uTZFGnTXPyy4033Fz223d/gU7uEauVwBpgTyCtB2rdql9juX8FAF2XyZsBALT6AoKAQgFA - B4PuLra6gCWuIwZAVf0BsBIDtkL/oDschPn85p4BfzktRu+NcfMqLxidZ+Howjd0IHkWr7/nA2F4g7KB - 3MF2P50+9MGsPx9/VvxtPDu3hsY8wB4A+vnA1WJs/UM/H5B24gtDuiPiNB8QS6ABwLofIEYI+iqmKTHf - /eADD7MBydHlWbf+UuHkHPRafr9BkV5fWQ4jDkV6fWU5jDgU6fWV5TDiUKTXV5bDiEORHifTHMDpKAqP - o5wX8Ry28XF5EU7HuVzEIxwny5wp0jmcJMs0JM91ImxlAEDOQHzOs3+5LD1imQGJg7SCF3cuwG7nOQbc - AH47GXjbKYBgWAENAO6yp1v3jMMSGOAP4Ce2PFkS7TpzTEGyHJ9Vv5qnwYeqeX++398oAHQrQLh4MP8z - EoQ59SMUxBQAKOWYR9/u+u1BIAoxlKNxKK9OuQUAnAoCe5CH4nMwGMrP84xD0dbrx7y9UHhSeoA4WKNf - U9w11HmjKuPldb8d+OP+XVmy2TMKcXt7dnQ6Sw1c/cVf/KU6ufyeMw3JgibltUTR/jc8BKT9/J57ZKX7 - 93//dvnyl76io88++IEPlve8+z2yTL7jbe8o73z7O2WFef/73l8+/KEP6/gxOmfmGlKXTZtpk1wvfkO/ - M/Pbe4T+byW9R3+fnEjCnnpMur/zI3eW1xrof+kfvrQ875efV6656upyzlnnlJNOOKkcs/KYsnzZUZre - cMSiw8VLFi/RIGLVipXlpJPWlAvOP7/cdMON5bd+47fLn//ZK8ub3vgmHW1Hm2IAQXsaaUcPU1uKa/7o - Rz8WmD18weGa6whwRWcB2Hx7kwxuSLueihWvsvJtwjzmCv4CAAr8VVYZ13NTQWAAQNMrGQDWQa7rD8IE - yKSz+gFw3gdwBOQlHpJH/Z5dB2Zgye/2YLDek91bWAE7AIi+1t9TASDPBh1fn0dMJZE1mAU+CQTSX4wA - QAYP1rd4HzMVANIv9QDwUNOfy8tNN95aPvCBD8li/VBJba1Sjj9Y+n/heoMWwExDPzLpx2ZSBiI/c8gy - ZXlbJpeN/Mwhz9SmoVx2iDNNl4ZCFvVbhnBh3Hnnx8ozb77NlOtSbQIdABBQ56CtsoHAnQ0Eyh0sS2Bv - BewsgbtW0IfljzgAEfAnK+Ju+gg5q5GNOgMAutsX8OemfN/vj8UfuHzrYoEE/hgN4hoIABgKFY45f1Io - xppfUsFfD/yqQlLcXSMoKo1oYSk3A3ya8Ozcg0FXcM6jALDjdG3YgZuzz31xAJh5dJVyKPDKgL8KANle - AgXJ340C3H6HHQ1s76EOE7AVnV1L42RZntNt2NJQvZ6HZA+eg1rZuPw2HtTKIh2ycfltPKiVRTpk4/Lb - eFAri3TIxuW38aBWFumQjctv40GtLNIhG5c/Lt7zA9q6h70b2YYIK/ZnPv2Z8qEPfqi8+53vKm+5483l - 9a97ffnn1/5zYbXu61//hnLHG+/QYOLDH/mIzlzGrftjA2K4djPgG+KgnG7zoFYW6ZBFHB36lre8taw9 - cW3Zfdc9NK0FVzTncMsKKL2UASBcQSBAR+AOkOcWvwCBAn4RdgAQK6APdrsBbtVxrjdcv/gA0qeQdLsQ - wKafegAY7Dos9Jt0XA194BvyqgPRkV09T0e8v2a+dp+ne8i6LfRh/Ts6N3AGgMYAwLy4jCNAsxWwA4BY - iwUA3Q2sbWGYB5gBoPVFu1rfxDx3AOA8A4CLD19Wrr36Rhusvler2eP9Zhp69y1lWZs/lA5ZjmfKsjZ/ - KB2yHM+UZW3+UDpkOZ4py9r8oXTIcjyoA4BtRks5f7qyUPxYW3Z9rxM0qWzkrc/1JtF011nf32nLcwzc - +9/3wXLdNTeUhYcdXreAmav5ewJuAn/utt2ZjTQBgTEXkHmAAoDOAMAMBqnvi0h83l8AQCbl8lGG61eW - P03m9TkdAf7k8q0AMLZ+CMWokbCsfr7xcIwcewCYwJWxAKApn9iWRaAvsymnFgAGcw5tTqPMsgKM+r3C - Q8H67zgA7OcfdtsftNyBP4tbGZSi10mKstZFQfIcmEO34+zZ5YD99y+/8rxf0V5svN9JbWJcXsgn1R2i - ofKIkD8Y9vrj7+HB5D1yvZ7+b7seUdJDrDl6xgC6++6/r2PmuA5ZiVv26z+0+2upzSMNc+rODdfdWPbb - Z7+yk+k39Jn2KUVXbWygTYBvFPwFAGRuHyBHA9qq4wIIdtNcKvALpi56zk8EMX0XOkR6wkEVIbrDwV8F - X1jg0E+ksw6resvBH2EGhBX4KS9kxlZHlkOFfX0vV+NxbWT6Xe4lAUCLs1+idJvdv3S3QGD9W9HzzH/U - vqNuABAQpF8w9rmADgB7EFgXgxgDALUnoAFAzQOcs4v1R7upf+IUK50GcuAh5YhFR5YrLrumvP2t75DV - OFO84+Asi3iEk/KDIq8tk+MRTsoPiry2TI5HOCk/KPLaMjke4aT8oMhry+Q4NGURSC7UUq6c40Ehz3k5 - fyY0qfz6Xgtan+sNlV2f35zp9RjtMDn78kuvLIfNX1jm7suRbXPlwu3dtgYADfw5AwArYwU0ELir2EEg - m0TDseBDYQWAfHzs98fHqKPe7OPUvD9TlgKAzZw/FCjgT5vDShn6aFDKUK6QUISuOMLtiyIBKOURcbYA - dgBQCjCzK6tOwYl74BeyqXVS+ml+DblXOmUXYK5XdM4+cm8BoFhl4VCW/B3+d/J380wY7TL/D3fYa17z - 93qX+T1HnLB9/+NkQREfJ8tyaJwsKOI5HBePcIiDIp7DcfEIhzgo4jkcF49wiIMinsNx8QiHOCjiORwX - j3CIgyKew3HxCIc4KOI5HBeP8MHw+tYNingOx8UjHOKgiIf8hz/8UfnDl/yRDaIX2Te5q+m17aXDtEUV - ukqADx2VAKBcuQ5ytMhjEAC6zpP1j7K1vOoLLDHYdZYOmaI3fPpIBwJNR2UA+HTTVU+XznL9Nar7pmF0 - ZeKsO3U9QsUj5Hfz/dj9Gfv9Vp2ov6k+nwQC/bn4FlNuCQxXcF0RrMVmDgBlUAAEam/AAICsBt6psCH0 - LtZ3OQDcV6eBMG900cIlZd3FnAd8R7n77p9Meb8RDwr5dJzLDsWDQj4d57JD8aCQT8e57FA8KOTTcS47 - FA8KeeaxFsBJ6XF5012jpaF8ZFk+FB9XJsuCxpXN1Mra8tPltzRdeUY7bPh70QWXlPmHLHAAqD0AsQAa - cNPcvwr+ZifGGmgjKV8QUoGewF4NKwAkn3LwTmz4vMPO3apfwB+jNV/K7+AvthPpXL4oUCnCGA07AAzl - 6QCwVYQOrNyKVpWgwtERcSg9Kb5OSfku9+H27Rd/IAvlFpyuwfVQqum6/A4reeN3UXKy8HUAsHKVZfAX - 9+3sSp2/jY6EZ8BWF8z/23P3Pcv5512g+XZhEYl3277roXCm9Iu4XqZx6Zle95HrPXK9HE5HD+f1KMPC - gTff8ZZy4vFrdBweq5BxT2qxmgarFdSYnnJw4wBHoUCO6zW5e2EBnl7nud5zMBRAMK4X+s91iIM/AUDp - H8IMulxH9QDQ450eM/0mXZd0n+u/PuwGw6YDFdZ4BoDykFjY6sbuPmSJTCDQ9KR0IX+H/h5/PvG3+vOI - PUYxDAAAfX44e0kCAP2IuAoCwwqIC3h7Xw3sm0LvLOMFR0fuuec+2vHiwAMOLgsXLC4Xnn9Jed2/vL7c - lc4Dzhw0U1lLuUwuN1NZS7lMLjdTWUu5TC43U1lLuUwuN042ZQ5gUBTMlVrZJHnIoFYeHHlBrSzKBYcs - KMumy48w50PjyrQceUFtXlBbNpcLZrTzL6/9l3LOWeeVQ+YdqhGRTu3Yzfftc/DnW7Y476rl9BzhJreu - wJ27gh0AjsbJkwURC6DVY88/zvrVUW/b+qpfn/NnHzDWvy1765/m+2UAWJWjAKAUp3N34kcFf+7+bUbB - WvlLGIrQFVAovgCArH5rlZ7Hk3Krim1EccJxXSm6Xvk6ALT7AeglDjd1BwqJV7CnCdz1fh0AbqQ5RChD - 5hax5QUb67L5M0e/ff/7/9G906A2Pi5vEj0c14uybR0o0m2ZLG9pqFxQpNsyWd7SULmgSLdlsryloXJB - kW7LZHlLQ+WCIt2WyfKWhsoFRbotk+UtDZULinRbJstbGioXFOm2TJa3NFQuKNJtmSxvqS0X/MUvfqlc - c/V1pkP303nIbHGEBwMrnoCbQN8AADTuAWCAQF/9ymK3DgBuateoYFIAsJvuYmEa9HYAEB7RQ6H7Aoyh - s5L+Qq91Oq7XfeLY/kW6MPQhFkOv2wHAjvvrdkAT1u/3Ojj0MzpOOrAyf5eeC39nAECmAXUbyzsApL8I - N7BWA1d2CyAA0EGgbwczWx4oPw94d+10sS+ngeg84MXlvLMvLP/49/9UfvTDH+l9xrtuKcvi3WduKcvH - 5QdF2cwtZfm4/KAom7mlLB+XHxRlM7eU5ePyg6IsPHERSMSjcMRbamVDZTLla+Wykc4yqE23FPlt3Uhn - WaYHK3+o12Pi9N+9+jXl9NPOLPMOmq/zEX0LmKkA0I9tMzYZrDxAYHUHCwjWMLaN0Xm/XV1W/jL3zwCg - fZS+6jcv+ti2aLf3LXoA6MeNuUL0idD9fJhQoAEAXRlmRWhASsqGidCmjHB1SPH1SkjuYFNMWbHJAtil - e3mEMbINAKjrdMrNFeyo4q0AEDcHYC+x7tNYcSyEKluVdQ0FCi1f5/5aB8CJCNokeeddysqjV5bXve71 - skDwbofee5aNiwcNyVp6sNcbl9/KI53z2hDK8aBcJyjXzfEcQjkelOsE5bo5nkMox4NynaBcN8dzCOV4 - UK4TlOvmeA6hHA/KdYJy3RzPIZTjQblOUK6b4zmEcjwo1wnKdXM8h1COB+U6QblujucQynFLSJe++A9e - UhbUs5A5Y5j9CdFfAdwAbQH63IvhIEc6DR1XB7tyA1cOACgQ2AFAv1bovNB7zDd2neK6I/RfBl2ho6T3 - AGvSbaHfxnCUGylP/XqdBARh4qPsAJHfDv3m7BvbO4dOHAWAMH+7tsix/oA+QSCwWgBjMYjvMTowFxAr - IADQBszMA6TPom/jsAIBwAPm2Ts7opx1xrnlVX/zd+U//uMH9ZVOfdcj77wSsjY/l5upLAhZm5/LzVQW - hKzNz+VmKgtC1ubncjOVBSGDR1zAuWDE27ClofxxsuBI5xDK8Uy57FD5LB/KH6Kh8hDpzJnadKbIG6rT - Mofns6Evh2EfdNAhdRPoAIC4gHftrH877mggDq6AThtrCgg60AsQGABQdVXfACMrf2PhR135u11d/CHz - vX282uhZ4G9r+8irBVAAkFGwKcIAf5VHACAKsFrRRhZRdMrPlZAUVlaCoQil6EZdH6H8PO4KrAN/nWLr - gV9/XQd/oXhd0fn9xP0ptPtF2XUM0FO5rCD92DeNijfaqLD339Y26mWz5T332LNccfkVsjw80Bxcvz40 - rt4v8noRn04WNJ1sqO6QLGg62VDdIVnQdLKhukOyoOlkQ3WHZEHTyYbqDsmCppMN1R2SBU0nG6o7JAua - TjZUd0gWNJ2MOKuB33zHm8uJx59Y9th9D3cDm07THGb0FaAtwF8wYM5AHXMAtZ2VgE4FfuH9MJnYrhHu - 5BYAdtNequ4b8YB0uqjXTz0ARPeFXvPQwV3Vf9KZicmLUACwr+f6Fe51Y3Doz9CNzlVX6j4dADr73yNr - qZ6ZPR+ekf39cgMDAg0AciCAtoUxANhbAfNcwLwljAPAHRMAZKeLffZyAHjYoYvKaaecVf7ylf+nfO97 - 3+veabzjNsyUZW0+6Vw3x3OYKcvafNK5bo7nMFOWtfmkc90cz2GmLGvzSee6OZ7DTCEbnANIvOVMQ7JM - Q+WHwodCXOOhXC/XDxq6Xlsu0lkGjZONhh7/7ne/W/74FX9aTjhujeZCZACINS8AIKZzgb/KAQrdCugA - 0IFgBX9Y/iwPS6HX7wEgHyUfZ7ffn320fsqHz+3o3L+AP0Z9lcP9G6PCUKIoQQdTAaBQJj2Qyps/B+Bz - rsqr8ojik/JL8arAurp2nU75ddfrQeA4ADhiBQSwBkt5R9lRdgDoI+LNN9uybGuj3Dmzdy7zDjy4vPgP - XlzuuutuAUB/r/17z+88xyMckgVNJ2vzx8kyjSsziYPaNJRlOZzEQW0ayrIcTuKgNg1lWQ4ncVCbhrIs - h5M4qE1DWZbDSRzUpqEsy+EkDmrTUJblcBIHtWkoy3I4iYPaNJRlEWdT9Ouuvb7M3Xeu6b3ZNsDdVvoM - 3dWBvoYBc5wf7CAHMOhWQHcFGxis3ANAB4HUFQAMZpBYdQtAynVO1SNVL/XcezCcez2GrtPWL/XEjxHu - dKPrPteZzkpTv7tmz/3qY7wlfg/9PXGPAf56Zi5gPB/2PUX3OwDEM2T9g6yAyRVc5wJyEgzudy0u7ACg - WwEdAO4i4wY7XXAaCIcfHDp/YVl70mnlT17xZ9pNIb/TeMfQUDrCnDeTMtBQOsKcN5My0FA6wpw3kzLQ - UDrCnDeTMtBQOkIBwHGZLY0rFxw0JFsfGqo36VrT/c5M7yPKjQvXl4auA3/rW/9uIOIPy+pVx5cD9zcA - aB+EbwKdAOBObvHrAKDAn1v2YLcCOsfcQOLhKmbT59j6pXf9bl+2tg9Vx7zBHQBkfoeP8gIAShEC/AT+ - quI0Jcixb6H8OhBVgV+AKZ9HZ0oGrorPld1UdkUWgM+5twZamarkpNQqAHRFmJRcVWpDADBcuR0ATOzg - tS+blTd5jPKxFNCZYDndzRTYscccW97x9neU++8fPc4qx6E2PY6iTUQ86OG63kziOYTaeC4zk3gOoTae - y8wknkOojecyM4nnEGrjucxM4jmE2nguM5N4DqE2nsvMJJ5DqI3nMjOJ5xBq47nMTOI5hNp4LtPG4R// - +MflFS9/hW8KbUCDqRocWwegE5BJA9dgLewSCHQrF3uc6gzcagmcCgC9XtZ/3WkjSZ+gQ0L/9ZtCVx0Y - XHVXp9eSPpNu63Se67peR+a0x1XG4oDH0dNBkpeEeEqHfnS9uLHuGdag19Ldvok8O1lHa79QWX1GAMAh - KyBu4Fk7GAA0DgBo/dmuu+xWAeBc7X3LAsgTTzy5vPQPX16++Y1vDr7boJyXw0ytLJcNDsp5OczUynLZ - 4KCcl8NMrSyXDQ7KeTnM1Mpy2eCgnJfDEQCYK0BtGpqpbIimq0s8c0utfKjcUP5QuaBxcqjNm1Q2aLrr - wV//+jfK777ghWXlitUCgIyIdIqHAOAebskzQAfo25FVvCPgr7cEssI3XMJy+2reIMBv57IDXMHfiOu3 - zvvjw9XCjxYAAv6SC2TEhVIVqcAfykMAsIIsgBOKpQIwzfOryse5V2ojLGVmyo0VwFoFbOmBI5H661Su - ytQnOodiC9cG7EptZHRrnEfrobB79nvn7+Fv4+/ETcQO+Bykz8H21193Q/nGN77RvcvpaLr2sL70cF/v - EXqE/icTbR438Lve9e5y8ppTDGDsJY8HoGRz5gGiswYAIAwA1Pw+QF4FfM4MgF3/CRxa/QwitbCEeYUA - wQ4A9npEALDqQbfCoZsAYM5TdFkw7l10Xeg904/OLu9AYGWv53q0swDWOYJwB/iId2nuz3Ud9xp6MPRj - 6EgBXD0fA4A8B/UN9mzsmcaqYJ0bLQDo3APAfmNoXwnMmcA7W98GANyr7LXXvjoPeP7BC8rxx60pf/Ci - l5Sv/dvXx+qvh1uvPXK9niYeBUdezo/0pDr/f6ShZ/Bg6T8feEDHcP3Gb/x2Wb5sZTlgv3kCgLIA7hYb - ODsAlBs3cQZ/LgMAOggMcIhMAJCVvwYAGYkJ/BnL9ZsAoLt++Zh9n6fNNvMVwJoLEwDQFKQUH8ogAcAO - SKFMUCqh8Cq3ALBTZqG8DOR1ik6KLQHAKVyVW+YAgKHkKmsLGGMHpVMBoPPGOgVkFAAGcOwBIH8rnQij - 2512mlMOnX9o+fM/f2W391/bLsZR5LV1JtFDvV4rH1enlef8CKEch3KZoXIhz/kRQjkO5TJD5UKe8yOE - chzKZYbKhTznRwjlOJTLDJULec6PEMpxKJcZKhfynB8hlONQLjNULuQ5P0Iox6FcZqhcyHN+hFCOQ7nM - ULmQ5/wIoRyHchn4a1/7ern5pmeWuXP3Nx24k3Qdeq1bCIIOazisgwEAQ+fJ8gfHHqhsKl1BoOpQXwDQ - dKEBwE6vVJ0jfRK6cAQAuo7Kx8FlduBW9WKjL+FeXzroG63rsgB/AoCVo4zrR9NxcAWAvU40rh4d3NpY - APW3YiHlmdR+wQEgC0JwAzMXsD8ezgGgg0D6HAFAA+MAwDnWN2EB3F0A0E8DOWTegrL6mBPKC37nhTqr - Ot5lvNcIh+KZJsmGwqF4pkmyoXAonmmSbCgcimeaJBsKh+JBAoBZ2BaAosxMykLTlZlJvUzTXW8czaTs - f/X12Dfuc5/7QnneL/9aOXLpcj8GjlNANAeQDZ19/z636jmwGwWAuHp7EChZpKureIft52jfPw7m7gCg - jci09x8AcEtf+NGt+NXHDfcAENO/wB/KMzMjwzryRVmEwtPIEoVnigV28OfKj1BKScqrAr3Oyje6+KNT - ep1CC+4VmZSZwqpQK2cF1wPARslVjpGvn1Xs7HW8LkoQBbjllltqNLvLzruUNWvWlI/ceWd5wN5xfs/E - 2/c+TjYTejiuF3lRbxLnchFvqS03iXO5iLfUlpvEuVzEW2rLTeJcLuItteUmcS4X8ZbacpM4l4t4S225 - SZzLRbylttwkzuUi3lJbbhLnchFvqS3XMkfa/fEf/2lZtOBwrQaetd0seTgAcp31roK2HgRWUCfgV0Gf - sSxesNy/cA/+um1kEgDUPEDAE3Pqqh5xAIhOijB0VavDJnHVgQn0dfqwkwXg8/yuTF4sUq8X9+O7JeAt - 6XWjBsj8Heh2dLz9jQGQ9SwAfxUAbraFg0ABQdOP7fFw9DM+DxA3cAWA1kfRt7HXbXce8LzDyjGrjiv/ - +7d+R/M46RvzOx6KBw3lZ2rLDpVvy0SY5UFt2aHybZkIszyoLTtUvi0TYZYHtWWHyrdloBktAglqZTlv - HLVlZlJnHD2UukM003sbks9ENlSG45Q+9anPlNtvf05ZcsQymcL9GDgHgKyU6gEgVr3eEugAMHOf7+yW - PwBgt+3Ldpz564s/wvq3pQBgbPkSoM8BIKvgtDLOFN+Q6yQURADADJ66uX/VOpcBYCi0UFwBAEfAX8em - tKrVr1d2npYiS5zBH5yteGHhI5SChquyQ+b5/Wg4/g7K8Dei+NlSgs1M99pjr/Kc5zxH2xXwXoOhHM80 - JGspl/m/5Xq5fC6TZVkeNCSDcvlcJsuyPGhIBuXyuUyWZXnQkAzK5XOZLMvyoCEZlMvnMlmW5UFDMiiX - z2WyLMuDhmRQLp/LZFmWBw3JoFw+l8myLA8akkG5fC6TZa0cvfrud7+nnLz2lLLnbntqxT6ABL3mXgzj - DeFRfSZgJ5BnwCbOBe4AIPMDnd1VXK8TILDuhCDdgk6pABB90s+BBgD2LL04Yg3s9Vqv27LcdF8werHK - XSf26Z7Rnc59PjrSQweA6DsHgA783CPi+7kywM/PqAJAnksAwGoFdEugA0AtBrH+RQAQN7AxJ7OwECQA - 4M4CgHsaANy3AsBDyzErjy2/+Ru/Xb7w+S+ObKoP5ffdUivLZVsOiniWBbWyXLbloIhnWVAry2VbDop4 - lgW1sly25aCIZ1lQyDoAmGnoItCkC7Y0VGbStQiH6kCRlznkEU6SDVHkt+VaeeQNyTKNy2/lzFf5+Mc+ - UZ55821l8aKlCQDuLRcwAJC5EtrPrwOBDgCDBfbqquDZYSHUYhFf+OEbP+8o65+7fh38ZQCI+b7b9kWW - P2dNnK4A0EfOjAZ9RAgH+OsAYLKguZJzxTZpzguKKYBfXvCRuStLCPjrACB5T0sAkN+oCrYBfwJ4xj65 - 2ZW0FLU4AKAr7PgbkG24obtANt98s7KtKbadd9pZ+4y99p9eq/eX329LQ3lZFvFJ18j0YK9HOjhoSAa1 - ZXIYFPXasq0MasvkMCjqtWVbGdSWyWFQ1GvLtjKoLZPDoKjXlm1lUFsmh0FRry3byqC2TA6Dol5btpVB - bZkcBkW9tmwrg9oyOQyKem3ZVga1ZXIYFPXaspm//rWvl1tuuqXM1dnAOwkAajsYtnvpAE3Pmxi4cQAI - OwjsrX6AnpqHCzhAYL6GdKEDJ00rQaegQ6RP+sHoqF40FhBzHRl6bpQdAIbXpAN00n2pXNKTo+w6MtLx - u3FdgcCq8/x+jWOAXHU7el4WT56P9Qfd/EgMBfZMA/y5K5i5gFgB60KQyvQ/bMvDbhS4gDFsCADusY/O - A2YPXObB//qv/Wb53Oc+3wFAOL/foEnynBcU8pzX5kfYynNeUMhzXpsfYSvPeUEhz3ltfoStPOcFhTzn - tfkRRnwEAOYCORyinDdUbih/unJB/xWyIXoodYdoqO59991b7vzIR8qN199cjli0pBwgALhf2WOPvfVx - 6GzfAIAJBHbgr1oFI91xBYDdqR8s/hAAZNsXAOAs+0i3kft3S9y/zPsLC+DA4o8eAPYKL3a/F/jrRr0V - QFUl1ymZpIgc1BnIiy0OLB3AL3OAv1B07tqoILBjv+YIwKwKrgOAFdwJzMH1XkcAYFJ+oajl/rXy2vx5 - 441NuW1hz3J7zV0595wLype//BW903ivOQ61eTmEchwaSrflI92GUI5DQ3njZG1+lgXldFseyrI2P8uC - crotD2VZm59lQTndloeyrM3PsqCcbstDWdbmZ1lQTrfloSxr87MsKKfb8lCWtflZFpTTbXkoy9r8LAvK - 6bY8lGVtfpYF5XRbHsoy+Cc/+Wl55Sv/oixcsMjAxi5lO9N9TOHYDCDX6DIYMCcWCHSdF/pvRA92zHVq - fQNIG3MeuumWGAz3OqUCrBiYhn6CA/yZLhsPAI2Tx8O5B3SwPCICgFWeyo/qS37Hf9N1s8dD5zmjKx38 - yQ0MAwDj2dTnIysgfQVM/6E55HE0XA8A4X4OoANAvFMOAPfSlmdz99m/zDtgfllx1Mryq897fvnMpz87 - 1gII5Xc9jobKTBfPspaGykwXz7KWhspMF8+ylobKTBfPMmjQArg+NHThmchyXtBQeWhcPAjZOHlQmx/p - cfXGyXOYabq8kP/83nvLBz/4oXLdtTeWRQsXaw7gPnv7SSCsBHYLYGzs7CDQAaDzCACswFCWQAOAO3Lm - LwCQM3/r6l8HgNnyZx+sfbSbbb5VHc1Vs7593L3S44P3D3907p+DQB/x9uBPrt8RJYPiCeXUA0AHeYmV - l+UO/vJI19OhzKq8/lb3mwpN0aHM6ug2Nmd1a18Ff6bYIq38brFI1HmG/jbOxOTvZyuJ2TvOLvvuM7e8 - 8IW/r3lGk95zUM7L7z5TKx8qE9SWGyrbyiPdynIIrY8sOGhcuRxC42TBQePK5RAaJwsOGlcuh9A4WXDQ - uHI5hMbJgoPGlcshNE4WHDSuXA6hcbLgoHHlcgiNkwUHjSuXQ2icLDgol4NxA7///R8sa9eebEBjD9OB - 2+sb1pxm+5571y36zDlATrh5Ox1YQ3EFgCoTOhH3LxZAOPShuB9Qhmei11eWBoBVHen60vRZBW/oP9dz - yCxu8qwTlU+6yqQPkUWdyp2+bABm3EN/VnrcawWAbAZtf4+fC4y+Nw7Ay3OyZ9ABwGo8cBfwVhUAshCk - WgFjFXCdAzgbF/CcXTXNib6O068OPPDgsvzIo8tzn/Mr5ZOf/JTeX36fmfK7zmGmcWUI2/LjymYaV4aw - LT+ubKZxZQjb8uPKZhpXhrAtP67sFAA4VDmolY8rt7403XWG8ifVmcl9zfSaM7kWNKO6lvz5z39e3vve - 95WrrrqmLFpwhLuARwAgC0GYB+ibOzsINNAHV/CnsMZ3rOAPENit/hX4cwAYZ/7muX8+/89Ybl8Dfszt - qKEmQldl2C0CqQpAe2ABkBIA9Hl/PQB0BYfCqQqqKikprQ7oVba8UGwjio46SXFllnKL36ock5pduVVL - noBdKOUKACt3ALBTgFa+1gvXB8+DFW1zdppTVqw4Wu8sTv6I99qGUJZleUuRn8u1IZRlWd5S5GfO8ohH - mLmlSeXaeISZW5pUro1HmLmlSeXaeISZW5pUro1HmLmlSeXaeISZW5pUro1HmLmlSeXaeISZW5pUro1H - mLmlSeXaeITB3/rWt8ozb7m1zLVBW3YDA176Oc0V3NS5bm7hGgWALcsCSDnqh06sQClcwJ1+qXolAKBb - /SLNgNXAmOkxB4IVBDbsFr4KABP3ujTJqKPySW/yG+jESBsrXe9rFACa7quDZf0N0vFuBdTfWv9e/n7A - 36j711ku4G3GA0D6JyyATHMSALQ+76ADDi5HLT26POfZv1w+8fFPlPvuu797p1B+v0FZ1uaPKxc0nazN - H1cuaDpZmz+uXNB0sjZ/XLmg6WTw4CrgSEc850M5P9OQfJIsiHRwpkhn+ZCsJfKCMw3VHRcPQpY5KKdb - eVCOiyx5zz0/L+9657vLZZdeWRYeergmw+IC3nPPfTQPcNfd9hIAZD9AQKCsgR0I3K1a/ao1sLI2fd4B - NvCnvf84+YMFIL71S2z74gCwd/12Gz9rbkcAwKrspDDj49/UlIGBP7ErB1nTqhLRqBelIgWDsnMllwFd - gL6ntQBQSqsv1ymwKenKjGpDuSV2AIhrA+Dn99SBP1NoXbyyp5MCtDq4i1HqjPi3sOfDRqas/r3xhpvK - d7773SnvM7//HB9Hk/Kgh/N67bUyD9GkPCjyolzmIZqUB0VelMs8RJPyoMiLcpmHaFIeFHlRLvMQTcqD - Ii/KZR6iSXlQ5EW5zEM0KQ+KvCiXeYgm5UGRF+UyD9GkPCjyolzmIGI/+9nPyp//2V9ozi5zdxnEofM0 - t5kBbQBA4xEXsOk5LfgQ4JsKBDMAFAg0li6s3HlF0DtVL8aWVAAuH7T2IDAGymENHGFZBF33hV7suQWF - XqcfdNdrCGSm36n60X+/6utOTxpLp/vfob/J/hZ0oVYC29/uz2Fz9RkjAFAgsO4HWAGgtoHZjvOAZxsA - 3Mn6p50K25U5AHQXcAaAz7r9OeWjH/245lfrPeZ3WuNZFjSURzw4aCieZUFDecSDg4biWRY0lEc8OGgo - nmVBQ3nEg4OG4lkWhOxBLQKBhi44jsaVDfl01xrKH6o70+uNo5nUo8xMr9+WI/mzn91T3va2d5R1l1xu - SsoA4NwKAO2j0EIQzgNmHiAgMNzBBvyCOfotu4NxAfupH1j/OPbNASCjLy0AqQs/HABy5m+/+leMGxir - HwrSQqx+3SIQKcdRAKhRrxRFVXIjbMoFNkUjoFaVkRSXQF8FeyiuUGiKR5lRADjk3hgPAF25uvXPAV2n - 3KSYexAoJr/es8pbOUAtih0AiOtoxx1nlwP2P6j87d++utxbF3/k95/jk2hSmV/U9caVGZK3skjHdYKH - aEjeyiId1wkeoiF5K4t0XCd4iIbkrSzScZ3gIRqSt7JIx3WCh2hI3soiHdcJHqIheSuLdFwneIiG5K0s - 0nGd4CEakreySMd1gocoy4kxj+wD7/9AOXntqZq7ixtYC95Mz21iwK6z3lXuASCgzxiwAxDM1sAqC6AY - dTMAzF6REZ1oOgnwN+K1SMAsWwBDD3raw05PdmljWQatTAV/XjZzyP13Qxf7nOkAgK7/so7swJ+xg+T6 - bAQAMRJYXyGjgfcd4U3qAGDdCmYUAMZG0NUCaP0bfd2+AoCHlGUGAG+/9ZfKnXd+bCwAzByyTDndloXG - 5Yc850M53ZaFxuWHPOdDOd2WhcblhzznQzndloXG5Yc853cAMAuhNh00dBHi09WPMlke8SyP+DgOGpLn - sI1nno7aMuPqre/1+P9Pf/qz8uY3v61cdOGl5bD5i2QBZF+kPXevAFALQepikAoAgwMA9gtD3AXsFkDf - +69fAFKPfmP1rwFADkh3AOgfLx+xWADQj37TvBeAHxybn2rejDEAkEUgmviMsstKztl3ma8AsFNCWSF5 - Oiu1DgAC9jowmOs19SsAFKNEpVT9N/34Je4JUAfQaxRcgL9Q1FYPdkUYLo9NZQ3dbtvtNHl5zUknl898 - 5jNTJijPhNa3/HT0yPUeGj1yvYdG/1Ou981vfqs86/Zn28B6H9OLnAqyTdmCHQ4Y2LYAEAuXgF1lgZ2G - AwAa57r9PEDXHVpshi6RDnJ23eT6KbwUowCw5x7oVdYAOLPrRunHDvy57nT96fGQizt9ye/5vYTHI/Re - x9Wz0wFA0/n+TPy5jKwCFgDcUuBa28CIWwC44ygAtP6Lvm3PPfYu++6zfwWAKyoA/GgHAB+h/zoaOQkk - 4oQ5nkOojQdHOmhINhOarh7ynDfd9dvrjavfhlCOQ7nMUBzK8pHQmJVqb3rjW8qF519SDj1kYZmLCxgA - uMe+AoCsktJ+gAYAYz5gaw0UCLTQV/+69c8BYF4BDACs27+MAMDY+sU+5MQBAMUG/voJ06MAUC5UA4Ad - sBpRdABA4lOVm5SQ4q7MAuQNA0CLPy0UmZcfuRYcylQcANCUm90T9zMEADPHPQsA2n13Lg9Tdmxuur09 - v9123b38+q//Rrnrxz/u3nG8S6h9v9C4OES6rTNUfkgG5ThEuq0zVD7LMiFvy7dl2/wcttTWb9NQm5/D - ltr6bRpq83PYUlu/TUNtfg5bauu3aajNz2FLbf02DbX5OWyprd+moTY/hy219ds01ObnsKW2fpuG2vwc - thT1GWT/7d++qixaeHiZM9vdwFviBpZuywCuZwa6mxrYEdirwC8WgmhAPAgAwwrog2JNjUk6cRQAomuq - vqoAUOmqz0LvOQBEZqHAXKv/srzWRW9KRjzKVQ7wJ477cJ03AgDt3ru9AAMA8lwSANT8cBsc+wrgPAfQ - wF+1AmoFsI6CawAgq4AFAPdQP8cikACAt9367HLnRyYDwKF3H+87KMehNp0p8tr6bTpTm84UeW39Np2p - TWeKvLZ+m87UpjNFXlt/yjYw7UVClvPaMlAry+lJeTMl6jyYeuPooVxrqO5MrwcAfOO/3lEuOO8iHYYt - AKhtYNwCGAAw2K2BxoBBzQs0nsNxccz/SwDQWC5g++hw/3J6Rb/5sx/aLQBoH6ysgBrJ+dy/qQCwUXRy - /VYAiPXP2IGWjySl6FLYA7PgqoimKDNnV35JFuVVJ9iuYxzp0eubYsPyKADI3oSuiJ2JO3fKzsBhKGju - nx38UXqbmNJD4TOa3cGe4YLDFpa3vOUt5YH7Rycnry9FXcIcf7A00+vNVBaUrwe1ZR+53iPXy/R/6/Ww - 1n/iE58s55x9btktuYHRdT2I60EO3LmCE9gLMOgy14uuG/tr9ADQQaD0TCwwM5AF2ArQFRw6USydZjpR - wI39TUM/Vl2ZwR5AL+RVD8ICjuMAoPEUXan7qABQA2XjqteDewBozPNQ3+AA0MFfAMC6DcyW1foHALTn - TR/ULwLZSQCQPmvXXXZ3ALh3bwG87ZnPLh/58EfLvfdOBYBD7xdCHhw0lG5pSAZF3bZ+m25pSAZF3bZ+ - m25pSAZF3bZ+m25pSAZF3ZFFIOPimVpZLh9EPDhTm55EUTaHk2TTUVsXmu56bX6mobxWRtjms5XIv76h - AsCDEwC0j4KDstkLcDcbJcEAP+ZM7Gbgr18d7ItDOgAo3llAkBXAs9gA2sAfozAHgD7/LwNA3wMQAAg7 - CHQAyBzAgRNAAgCi7KqCcLBnikRhBYCyAIaCq8omgbZQagH2plgJW+6sgK4oc3lXoOl3+H1jB3mEzt3W - L6HoQjlHeWOUNgoPZQcwxmIw25TWRRdeXL7xjW9MfJ9tOsI2b4jaMkPpCNu8IZquTM6byfWgR67X0yPX - +59xPcIf/vCH5Xf+9wtMv+5XZuMGNv3Ht40rd0S3BYcruIK/DgSyh+DIwNjSYuoZSJJOdACIXux0jMBf - zwG8ep2Ffgt9NgroYNeRri97zrLR8p1sBAC6rP9N15UM3EP3ie2e5b6uf4MAYFgB6zNxq2gFgFoIQj/S - zgH0FcDe/xgbAPSj4HayPspPAxkPAO8cBIDjaKhdDMlmSv+vXm/sPoAz/cGQ5TzibdmQDclzmCnXCQ55 - DjNNl5flbdmh/MxZ1sahLI+wzQcAvtEA4IXnXSIL4L77HKCjcRz8Oe9mQA/urH9hAZQb2EHgyP6A4QIW - AGQFsH+AcQLIVvZhbjkFADIH0AAg4I+RMQwIFADsXcDa+gU2ABjKwXe9d0ubACBKzkLFEwB0F0cGgJUb - JdW7PUbl2QIYAFDcKTP/jVBonVLrAGBVaihleAD8IdvI/h7+VjoHVrXh/t1rr33KS1/6snLPPT8beYeZ - 2vcLDZUdV7+lX8T1Hiw9lN8dokeu98j11oceyvUohTvxjje9pSw78igDHnNkmcJqJYseoCYAnELnbj5g - AoDZIgh3ZaMeQMl0YgyMpWfQPSMAsAd/WpRRdVqv20bTPaMXM2d5jVfLYZ8XbDIbQGdd6ewA0Le9qjow - 60pjt2o6APTn4ZZQACDeIgFA6z/Uj+BRwgqYAKDPAUwAcAdWAvcAkO3O9tkrA8BnDQLAeN8zaQvrU+aR - 6/Wy9QKA42imZf9vLzdEQ3Uf/PUAgHfLBXzR+ZeWQ+czBxAAyB6ACQBq/l8FgITiAIC7azWVTgmZs3sF - gbiAmf/H6l8A4A51C5hRAOjgr50DWAEgilHKro50xQEAK/ALroBKADCUHKAK5VIVnQM2504poawC/FnY - z10Jru6MLl7LVpairIpMaQv1m1MAYAV8xrE/V4DCUfAHu+uGUT1ngG699dYGpHcsK1euKh/8wAfLA/85 - dXf69v1nWQ4nyYKmk+VwkixoJrJIj5MHDZWBsiyXeTA8k2sEjUtnGTSp3JA8aKgMNKnckDxoqAw0qdyQ - PGioDDSp3JA8aKgMNKnckDxoqAw0qdyQPGioDDSpXMgJv/LVr5YrLr/CdOoeZXvTh1oNvLnpO+m4Hvih - 4wTqKgAMq9cQAPT8AIAGkmQB7Bldw0IQ6STTi5oXLZ0Yq4FHddoUHhkcw6P6cbhMcCpj7ANmftM57qOz - ANq9oQNDn7cAkOcSgFjucOsn1GcIAGIFdAAYFkB2nMB7EgAQF7DOAjYAKAvgnAQAZQGc31sAP+IAMN5f - pvxeZ0K5/CPXm3y9kVXA4wpmWRvPdXJe0Exk+RrQUJ2gyJuuzHTXG7pOW25cHvFxZcfVgUj/5G4DgG+4 - o1xy4eXlsPmHVwC4rwCg3L2y+AXoS2yyXezjAfx13FkBHQDusMNsgUAAYG8BrFvAZACYXMB81DLtNwCw - U5BVGYTlr7OoWRhgyjkUnimZeg6mgFpwUkxwAL0e5I0qr1EGSFaFlq5JPLZ9ifvoAWCz7UvHtVwFhPwt - /H38zTyT7bbbruy8y67lmc+8tXz3O/3ef0PvdShviHK5oTqtLOcNUS43VKeNj8vLFOXa8lCbNx3nMz0n - yWbKQ/eQKafb/LZsUJRry0M53ea3ZYOiXFseyuk2vy0bFOXa8lBOt/lt2aAo15aHcrrNb8sGRbm2PJTT - bX5bNijKteWhnG7z27JByO/+yU/Ky1768nLwvEN6NzA6T1bAqt+MGeD21kAHeR2HTgQAKXQA2G0nk6bG - +CIQAKDpGfRRAn/oKjG6TNNXXJ+N6DkDdj7IzXIHf9KVAn4BBo3T/EC/lsdHGd3rnO+DgXM3CK66UeBv - BADaM6nPwedDZgBYLYDG9CuAwNYCyHSksAA6ANzV+jF3Ae/bAUDfBuYjH/E5gPF+MwflOBTpVg7lvJaD - chyKdCuHcl7LQTkORbqVQzmv5aAchyLdyqGc13JQjkOkBQDbgkFDMijLo24ry2HQpDJDeVCOQ9OVa0No - XBzK5YMjnaktFzRduZyG7hYAfHNZd/GVZeFhi90FvIdbADsA2II/Y8CfuFoAwwoYcwDdBewAcJYsgDsk - AOgm+s79KwCYXMC4fmXiTwoulGMoAxScrGm9wggF4iNKgF+wKRkLn2ahlFlwUkwZAGpfK8lNgQ2UDXYA - aHHjUGS4MkbBX7o/lJrCHgx62ar8AICm8AC5uH+3sufDhPH5hx5a/u41ryn33HPPyDuEZhJvqS03k2vk - eFDUbcu16aDIe7j44QR21Hu4geL/RG6plUe8DYOyvM2DWnkun8OgLG/zoFaey+cwKMvbPKiV5/I5DMry - Ng/K8vvvu7+8973vL2tOWjviBt5ss6kA0EEg6QEAiG6sIBDZCACEq46MwbF0TtVJoW9iOsxUAFh1ZNJz - nh4Fc6EnXV55iiUwywB9KS59mQAg9yQdWPUiocBfAEALWwC4ifcVAQB9IUgFgNa/4Gni5KneAugAkMWJ - TFPiKDitAmYbmAoAjzry6PKs255TPso+gGNcwJni/ea8LGvzMg3Jh+pkWZuXaUg+VCfL2rxMQ/KhOlnW - 5mUakrd1RiyAQ9TKc3qmdSBkwZkiPZQ3Hf0irpcpp/P1Znrdoes5ALyjXLbu6nL4oqVaBKJj4NLqX4G+ - nX2+H25fAUDFDfzJCujs8wArAKwu4FgFzB6A2xoA1CbQW7NSCwBo3FkAHQD28/9cwYXrt1eOgEBjLIDV - xeFAqldyAQI7AGiKJlv+BNwq98ouFFlNjyi3KIPCrPGquFx5Rry6gG2kHco2FNoU1n06UBUArEARZcff - ual1Cttus60B6R3LueecWz5d9/6bRA+lHfx38UMBXTOt+8j1hnmm5WbC0Y4eTvr/2/X+8wE/Gu5Zz/ql - steee2tuL+fWbs6gF2CTwJv0QNUFPQC0eAKAAoFV3uvIqG+6JPRj1UW9bsQS2OusntFloeuMK3gbkWWd - WFf6qkyXnwbPsF2jc/umMvo99KkGzMHcH/rR7rHqyXAB61nk58HfbgCQcFMMBwKBW1TwNzoHcBvre2Ib - mLAA7gQA3CkAIBtBH1DmGQBcftSq8pxnP698/GMcBTfsAg7KeREnHFdnUh6U8yI+qc6kPCjnRXxSnUl5 - UM6L+KQ6k/KgnBfxzgKYw+nowZQb+o02ntPjKMoNlc2ycWUyRZnMLU2Xn6ktO1T+rrvu1irgy9ddU5Yc - sbzsN/egCgA5BQT3r4HABgD66t8e+PlCEF8JHKuBdQxcAwCxAGoF8NYsAHEA6HMAfQSHOX/TbhNo/7gd - AKZR7sam3OTecADogGpUufU8CgBd6biyCg4AGBZAKSvkHfdKDnZFV681wvxOdWV0Sg1Q58BulP1exRsA - /hwAhvUPBcfxRqycZvPYF73oRVpF+J/N/D8opyOe33Ur+5/KDydYgR/K9ag7iWda7sFyvpeZ8oOtN44f - zuu17TPSEbYcNJQHt3mRjrDloKE8uM2LdIQtBw3lsSfgq1/9mrL4iCU2SN7RQMrW0n+dG1jgreceABIC - AMP6Zaw6DQBs6qNTOl3TAa3Qi6G3Im6cdJ1b7ZBlnViBXSrX6dLK/TSahu36/YC7/l7lUQDoLOtlBoCy - inp/oPmPgEDAMP0Gu0dUAOiLQJgH6BZAdp/YzvofnwNYAeDsbAE0ALiPAcADDy1HL19dnvfc55dPfuJT - HQCEg2aSjnCm8unSEc5UPl06wpnKp0tHOFP5pPTIIpC2YA6hHIcm5bU0Lj/khENlJsmHKOST6k3Ky5TL - tfGgkGdZUCsj3QHAS68ty5auKgfuf4g2ge4AYLb4CfDtprB3/Yb1z8CfjahkAWQLGJ0C0i8CiTmAPv8v - 9v/rN4LWR8x8DoFAtwByDFyY/P0EEJScKbYOAPbKwoFWKDoHgCg5Kbus5Ez5aOSpEKXkCgnw50oqFFRl - 0iOMEhtVXlJg9TekyAgVr/dUlZnus45we6VcOQCg/Y0o9q22YvXvDlr88fa3v738/Oc/t/f18Hbi/9U8 - BBp+0TLSv0i+//77B+UPltfnekN/7/8E2Uw5dFRQjkMzKTsuhHIcIh0c6aBWNqlMEOngSN9//wPl4x// - RDn//AvLLqYzsVBpU2i5gV3HZQA3AnoEAh34xEkgzgkAUj7Vj3mA0jumZ0b1oesp14tVl5nOc51G6Lqy - 14ejwC+406WJ5SJWvK1Tf8viHvJbVW/q/vxeA/wxyO+fRf0b03PQswg3sA2aN98yXMCxEAQr4CwZIPIi - EIwUPgdwDxk85hoAPPigw8qqo48rz//V3yqf/tRn9S0Gte8xwswhy2HQUHqoTuaQ5TBoKD1UJ3PIchg0 - lB6qkzlkOQwaSg/VyQyNAEAoZ46jyJ9Udn2uMYnacuPKr+/1gtp6M7lOzmvLjbtOhBkALl92bDl43oKy - 115zOwA4Os+vB4CerrK6EXQAQF8AMscAjJ8Csu22Pv+vswAyQjMG/DFnQyNg3CDGHQC0DzsAoJRfBwBx - /8YWMCiKtNWBsSuRAIAtCAzFFqEpJHhEQVWOvDbf6rYA0HfUzwq1V2idMtM91vtE3oJAywPUotiYB8lB - 5rvssmu59dbbyte//nUHBvbOHkqHOsT/ldebKUDIsogT/ncyzz/zTMoM8VC94KHy43io/oPh/JxbWc7L - 8ZmUm6ks4kPlhjhTluWwlUGTygVl2VC5CKFJ5YKyLIff+973yu/93gvLgQccJFCCLgwAiBu4A2+AHrHr - PfJ64OPAT2kBor6M14HRKUn/VF0TA1TpLOlG018GxDowGBw6b8rcPuch4CfASPmBOgH6XF9mrvfDvaEv - pTNxX7uXx4/89L/PAXH83VhD2S0hAGC/AMTnADoA1GbQ283qLYDaCBoA6CeB7LXHvmXuvgeVQ6zvO3bV - ieW3fuMF5XOf+0LXJoPadwk9Int4ZSMu4KA2HTTTcg+WZnK99fnNSX9H5E26Xi4HjauTy7V5mci7++6f - aBuYKy67thy9/LiygIUge+9f9thtLwMgAQAT2DN2AAjwM5k45v/1p4Fwbq1bAAGA29uHaABQW8AkALi5 - W/8AgAJ+AED7mH3xR3b/Av4cADr4S3sAmoJzy1oAvwq+qkIJF7AzysaUUFI+Gei1yqzLS7JQYgrTdZzj - d/0eHNixsjeAHpOb/T4dANYyxihoFD6KHVDM9gULFywqr3rV3+kdoYwAgPFu/ydy28nrb/pv4CFANRPG - JTQkzxxlZlJ2HOe6D8f1JnF+Hu1zmimPe7/rIxuSjys3jsdRm9+WnS6/penKT8on/rN77ilvfstbywnH - n1A4G5hBMRvgC9RVAIcucPDTgMAKfFSWTaEtrvmDSUf6RvlWp9bnWEmBwKprOj3Z6UXXjRmY9TqP+AYD - bt1wBQ9bBR0E+rSa0bysL42rfo4Bs+vGGCzbPUvH+/PwLcBGn4O7wt1wwFny2gy6gkAWG269zbZlG7aC - 6QDgjjJQxFnAGDkAgPsbAJx/yMJywnEnlxf87xeVL37+S2p/8c7yO4QiPZO8ofwhWYTT5Q3lD8kinC5v - KH9IFuF0eUP5Q7IIc94UADgpHhyU4+OorfNQ6Rd1vYfrmtNdj42g3/ymt5arrrheAPDwhcvKgfsfXAEg - 8/0SAEyAz8NdO5nvAxingbAIxI+B0x6Adf5fAECtAJbrNwBgvwKYve8AgHB2AUuxoQBYAAIzKhQQdEUx - Av6mKDfmAMY8wABuyIknHlFUxlHW4iN5T3Gl6Aqshsb8Zl4A4srMle4UAGj3GABQI177OxjdbrrpJlJc - O+44u1yybl355CdH56L8T2GU58PFGbAEUGllk5jnt74AKtfJYSvLHPmTONcdks2Eo16uOyTLdWbC4573 - TDjqBud2kNvFONkQz7TupOtBbTrTuLxx5aFxdaBxeVnO8/rKV79Sbrvt9rLH7nuObgoNuGGayyAA7PVh - WP/kCpbM9WPHAoHoyB4AZr3kuirryarH6uDWdZ3ruV4fen6XrgBwRD/W05J8J4UAgFbH6sb1ut8y7u4j - 3Zu7q3sAqL+BZ4D+1/Phb99EwDfmQmr6kPUj7lVqAeAsB4DWFwEAMU6wCTT91m677Vn23NMA4NyDtA3a - mhNPLy/6vZeUL33xK127at9f5pZaWaTbOjmduaVWFum2Tk5nbqmVRbqtk9OZW2plkW7r5HTmlgYtgJly - XltuXN7Q9UI2lAe18nHXIz7uGpke7PVmEocmlZuUx1nAb33L28s1V91YVhoAPGLRUeXggxfqo8A8vssu - Gfj1YK8Hgb1szk5pG5g6D3DWdgYC5QLevrAJNOBvyzr3z92/efsXt/wFdwAQxSfg58pQyrFzEaAoUBwo - kZ4zMAPIObsiGsyT8qph4l6xVe7y+mv0zO/WewAIGvfgzzkrOsoJAJqi429CqWEJ2NpA8gH7H1D+6KUv - Ld/7/vendHCkx3V6Wd6Wi3hbN8o93NyChMwzKQMPgZsh+XR87733djyUPxPO1/i/gYfu8b+S83taH85t - ZKac2+pQuw1ZzmtlM+XQjTk+Lmw5qJXlNPf24x//uPzNX/9NWXL4YtORswywbGWD3y1MB5jeA+ig56YA - QGcBoA74Va55HQsAen25f+Gse6Sf0FMBAB0EbjCgA8ezA8DMshQC/gZcwMM6M7F0Z+hKB62h5+M5BBDU - PMDaT9BvYAGkL+kBYJ0HaLqUfse3gjEAOAsXcLUA7ryrtjvba8+55cD955VFhy0tp609u/zRi19R/u2r - X9Oq7fzuhijL2zJtvYi38kxD5YPaehFv5ZmGyge19SLeyjMNlQ9q60W8lWdqyw8uAmkrk24rDpUJGsqb - lD9E48rPpO4QjasXcsKhMuPk42i66/3sZ/eUd7793eX6a24uK1ccbwBwWTnssCO0GtgBoLt3md8X8/wA - ej0IrEDQZNoEurp/WQXMAhDtAbjt9voAuz0A7QON/f82gw0A+gbQfNAO+tzt6x86oVv+XAH43L86QlTY - K7MOAFaFhmUP5aORraXdCthzHpmKkwKMke0ICOxkXlfX0T6DzvH7HfhLFsAe+DmHXADQRv387UwI337W - rHLqKaeV977nfdr7L3d0v2jOnXTutB8st4AhpzOPAzRZnsHPdMyiGXhI9lCY9zEdD9ULHle2lU9iyue/ - K/9trSynx8nWh/O7eTDcto9oE0Py4LaNzoRD38FDsl8UQ0Nhy/fdd2/52Mc+Xtatu9SAyM4GVOpqYECN - 6TzpOfQdwCdAYIA74xHwV1nyKNMBwKojw6pm7Pqn6suqJwXOnkra9Vrouaz3nC2vA3du4Qs3byz8EPjL - ALDRm25FtFD6039TLN2Z9SP366F0ZN3axucD8jfTX9BvMH/cAWCcByw2EIh7fVvrd3wVcN0GBgA4GwC4 - mwDg3gDAA+aXxYcvL2eefn7545f9Wfnm17+p95Tf3zhq89c33dL/y9f7X/nCQchCnsNWNo5y2Uk0XbnI - zzyJpiuTrzOpXNB05fK1JpULogwdynvf/b5y8w23lmNWnqCPYMFhS8rB8xZqbgTuX8Ae4M4XeQQItDiA - MC3+CAYAstnmDswB3M7AHzwFANqIt4K/YO0BGFZAPm6UmilDFGEow5ERrXEXl6JwxREjWs1pCUVTrX5S - Rv9fe/8dfs1SlmnD/P/NCEhm55yfnSM7b3YkbBAJIihJggpIUMAEYgCMqJgRRBRBUTGBGDBiwARmASNK - kFHH0df5nNG33z6r+1zrWvdTvdb6PWwcHbmP4zq6+q7qXh2q7zq7qrvXqBaM5nTTHJRawCp/BzeJZS0z - rW8CQNYzr38GwLYdHQCctB76dftbkB+DNn/0znfBzjnn0PDSl75s+Ku/+qtuA6gv89JX82u5I1VtzI9U - S2BRfULNkaqC00eq//k//2dTz7ekLLtLveX3UW9dqV3l8pgd5PhTZul89pR1YF/16uE+sr73RNyr86rO - 69un3EHE8h/60IeHb/zGbx4uv/Ty9s3PezMaQvzjppd4FzFv1fM1y2HQNjXNcnP+Zg8gL8qNWkHgBIDr - 56On2DgB3xwDqxrQGf/0M/ybMXKSILjpL7GUGDrH6dbzR7weAZR4Pd3Ir2Po9FLIOB1h1uMx7Sftg0PA - IwS2doQ2ZepcaADoSyAzANIm2QPIs+x875YewEsvuWq48YYHDI//1CcP3/Wd3zN84AMfbOcpLc/fNuuV - 2ear/mrblk3TV/3Vti2bpq/6q21bNk1f9ad13wJO6y28bYVpWW5pvTmtZXq2VOYjXd/S8nV+l2X5OkX/ - PDYAv/aOXx8+9/kvHB78wE9s3wIEAO93xXXjXdHl7RMw7eUONd45Nc3zJyX4nXxqGwKe3gLmMzDjHddx - J0wQGADI3Vl+/Lk9+9d6AO813G3u1m9DIe3Odh3QvPh5LkQAXGuCvwTAdXCbIK0B3Ax8093olF4J31x+ - HazmPJZdBcA5YKYCAPNO1u1ab9+UP8Ggd7ZjQBv3k2PAyx+33/6Q4a1v/Yn2ke7amC01cPqPRL2Gdx/1 - Gnm0LU9VkNCXeUuwkvO74MZ89U//9E8r9XzblOtJ1TI5/2+ppe3pqR4b5j3uqTyWVeT3zuc2WX6Xal2r - yrqb012q101PxMVMO296l/YpS5n/Zzw/P/tzPzc86lGPHuPlidMwMDfB3PgeBoBzHJxlTx+PxzQRKyO/ - iZg5rmOKl2sANA41AETGSeLfrE1gSy3511r1BK58xMx1mt+abp7VGBNXsXpK+0IKEOgz0g0AOSbzm8Ct - fWAovLUZvEQztSEMB7dhYIaAR7DmDwgAwGPtATxhegaQ/wE+68xzhnPPvWi43+XXDTfd+KDhiU/49OF7 - X/8Dw4c//N9W56qavszPcvrTp23z5TJZTn/6tG2+XCbL6U+fts2Xy2Q5/enTtvlyGaerZwBrRs+y3JLt - yu9Zb73py7yer1ouq6WvptNyfqlc9S2Vw3KeNMH2t37zXcMXft6Lh4c86OEzAN6/AeAVl13TPpA59QBO - z/a1IV6mo/iYZksHAJ44zp/ACyDtb+Cmj0Cv/wf46NYl3wAQ+Bsv1Gnod5Iff958vmUKZBnM2nN/CPBr - IDVDFlODyRzc7gyYjYFkM+BsqguAGxA4lyOfdJu37KgGf/5eKgBw3kbzBMD2X5cx/HvmmWcNL3zhC4f3 - vve947n5524jtqRsIA+q2vjm/Db1Gvld6sFEhZHqU0JNQo7ihaaqfcshgBv18pD5B9U//MM/NJF2Pc6n - 6u8dVL392zZv+SXVY1/lOfJ87VKvLqR69auq1tuq3vWQvm0S+vaVcXaXemXxsW1/+qd/Orz4xV88HDp0 - 7vTfwAAgj8HML4JsAGAHAlfwZ6w0f1xWsfwUKxMA509kFeBaxb8EvY1YuNZ/4S3f+DeQpnl+AsApPQ35 - ku901mq9+PldIJBtmeI4MbL1/I3bbtxvx4T9SggM0Y60ZwHn4V86HegB5DGkY/0MzAyAPN9+9pnnDhdd - cPlw9VX3H2658cHDUz/t6cObfvBHhr/927+bW8m1cd5yimU6zfPcW0br5fXKYfiV89V6eb1yGH7lfLVe - Xq8chl85X62XV8vt7AHUeith2vOn1TI925Xfs23LfDR+T3PZXMdB1ve///e/DL/3O78/fMkXvXR46IMf - 0QCQi2ECwGtb1/hZ40Uywd4pbXi3TYW/GQCbxnTr/QsAPPa4aQiYL7I3APTv3+z9m//5wxdANi7odndL - MJuUANiCQhcAp+CxCiZjkJvSU2BLcJt6BNEUjFbgp1ZBcC6/ClSTDJ6b4Lfelia2cQxiTS1vGgLmkwwO - //JmG0M/Rx999HDzzTcPP/gDPzD83d/93aoBO4hqI1kb0G2qDXE2zj3Vhj0b+6oKD1U9AFE9eOmpAtVB - JKT1xAP729RbRvXKZrpXJmWZbar7kPu1j3rHMlXPxy71zi/q1YtU1q0lZX1VWc+z7qeEvJ4/87cp4S9F - vFVL/iry/2XU3//3vx9+YLzeb73l1vatOp8DBG42AHDUCuqIiaPWADhO0exvsizrGEUcavFyFYemWDQB - lzGS9BQnE9SmHkE1xkSf7wP2ZgicQDCBMGLnON1cx6yNeMvvsg3r+GmMb+DHMXB/NvZz1pgGnDl+fF6M - NmYCwGPHuCoArp8BbD2Ap585nHvOBcPlYxt37dU3Drfe/JDhMz/9WcNbfuyt43n5H3MLOZnnzbSWvqV0 - TrVeGSx9S+mcar0yWPqW0jnVemWw9C2lc6r1ymDpQysArBlpdX7JeuVyvdq+6993fdX2WV9vPXU55qsP - 27Zsz6cxT2B7z7v/ePiKl33N8IkPfdRw/+tuHa4BAC+/bri8AeDVw4UXXt6+l9QgEACcewHp7TuxQeEM - gmPeavh3BMDjGgCe0LrfuQi5G2vf/2vDv/eeh38nbbwA0rnADYat98/AwNDAfFe7CmqrYDaD2sdNkOd8 - A74GcusgZIBqQWoOSHkXvAZH5LoMnNN8g8GAwAZ/TdO2qSnwTne2rfePoDYGb47HqaeeNjzrWc8afud3 - fqc1mNnIHal6jeiSakOcjbPa1qjXvB4coB5Y6KtQkqDSgxuhpycA6u///u9XEqrStyT+em9JBym7S3Vd - +67Pstv2x/1N9Y5Tqh7fnjwvnqNdyvNc60XWl6xLPWVdVb0631MFvyriYKZ781UJe6lteal/+dd/aY/g - vOud7xqe+YxnjkByxhgf4znAFv8m8NmAwIiP040y6bt1AbAtO8oRk/U3SYlDQl9qjpPGRuaNjaM2nu1L - AFwBn9NNufxG7EXE2fab/PYUL6dn/kLzvhsrV/veNO0/bQfD5633j+Hf9hmYTQBszwCO7VIDwFNOb8// - XXDBZcMVl187XHvNTcNttz60fQ3jp3/qZ8Zr4R832tCltKY/8zIf6+XVtKY/8zIf6+XVtKY/8zIf6+XV - tKY/8zIf6+XVtKZ/Ywg4C2B1HktfL39fq7+3tK6evy6X0jKd1vPrcx1V5jnt+dN6ZRWB6C/+4n3DN3z9 - Nw+PfPhjhvtfPwPg/a6fAfDK4ZKLrxwuvODyMUCd3S4eBPS19AnMn7xOj+JB22n4l0/ATM//TUPA8zOA - 95meAZxe/rjXNAzM0McKArnADWAj/Pnh5zkg5HDGSgQQgtoqiCWsqelbgBl88LcgNM5XAEQ1LUwaMHPd - wl/rhWwBdhP8TLcgN+5DC84E7nvcox2Xa665dviOV3/H8KEPfWijges1eOnrqdeA7lI2xkvKxjvVa/h7 - 0KCW4CPnK7z0IAf1AClFb6rTbfrbv/3bjfRHor/5m785IvXWpZa2TX8q9zePwZJ6xxUlNJpOXyrP7zbV - epL1qNazrHu9Oqt610DK66ZKyNtHgl+me2pw1/GrFQT+yzQM/MEPfHD4lm/+1jHmXjXGyKOmYeC8EW4x - cIIgoU4QXAFQ0QYAtmUDqFYxaYphTd68zvGsxcOMf3PMXH/eZYK/CfgEQGWZGRijXAJgA0t+z7g5xsWN - v4JTxH72Yd7ntt/0eDbRA8rQ7z1beyIA8n/AACDfnl0D4AntWUtGsPi6Rfv/37F9Y7TrumtvHh5028OG - 53325w+/+Au/NNa9/9naR9vNnKbZjmZez4c5X6dpLpd5PR/mfJ2muVzm9XyY83Wa5nKZ1/NhztdpmsuZ - d9gQMJYFnKb1fD07yLLbyu77e2m71rctPy2X0aqPaeZrS76//tBfD9/xqtcOj3n044YbbxgB8Oobhysb - AF7T/h8RALzk4quGC86/rL0UsgY/evtOmu6qeOtXHQAAG/SpEf42egHt/WsffQYAJwhMALxzSxPQfK5u - DCQtqBFYADUC2hxoCGxNEXzGgGRwmwBwKjOVxz9/6HSedz2bPYDTnbS/37ahafJVGETsR3uuZwxi3Lme - NEL0k5/8lOFXfvlXhn8cG1MarV5Dt4+y0VySjasN7TZlI22j3WvYUQKB4JZpVUEjIaTCiSCzpIShHlSl - +BuuffThD394pZ7/r//6rzfKbBNlU9Wf86ZT+ftuQ/VV9fZd1eOUEJlpVc9Hnree6rlOZf3IemOdsn5l - XXO+Kuuz9b5eC6kKhaoHhioBcJcq6PV8h+l//8t4vf/j8DNv+5nh0Z/06DF2njDce4yL7XMwM8gJf01C - XcJQSN/0jBwQuIbHFjtb3DQOzdA3y+eYp8dciIXEvzFtbCxqH3vOXsAV6M1l8lMwAYDtmUBjaPvtaXtW - cXLczjX8zTfKTev9E/7ax6DHtoMOBAHQfwPxGcBNADyp9f7xnVs+/cLXLq4cAfCGa28ZHvKgRwwv/IIv - GX7j139rrC/89/pme5nzS2nsY+UmO5Jyd3KmLqzhr9JfrfqWyuQ6di3TK4Ppy7xe2V3zab28j8b6/u7v - /vvwfW/4/vYK/E033Naeh6gAeNFF9xsvmPu1nsAzzzy39QACegKg4DfB3wyA7RuAI/w1AJyGgLkoedtt - AwBn8Fv1/iEu9BUATneAh/UCjuKfNTbgDwlnBJcVsE0BZ52eNQanSVO6AaDTOQhOIEj5Ke26JgCcpqvg - tRI+AXBKT8FtGv5lHwhqBDCGxC+97PLhFa/4huEv/vwvDmvctqk2iruUjSrKRtf5VDbYKhvzbNyVIFDB - QVXAEN6qElJQgk3CjqCU6oHWkuhxRR/84AcPU+YtlVEf+MAHVqrzVXXZg8htSvX2K5XHpqc8nnnMU56X - PGf1XKreed8GibWO1XqYyvpa63fvGlE9KEQ9KFQ9KKyqIHhQsQ1/9EfvHl70whcNh845d7jvCDD8JWbr - BQR8ZoBbKeCvwVCZrv8S7vBlW+ycY9I6VtHzNsUo/j5zinWpKUYKc6YnABzTK/hbl0ltLDuuz/hszHRb - anxs8Z5v/zWx3/N+jselaYRk/wpu+ieQScRT2hg6G/gMDH8Fx4uIACCPKvFM+/nnX9raMwDwqvvdMNz/ - +tuGhz30k4aXftlXDb/3e38wnpf/NbeQhxttZip9pp2a3maWy/I17dT0NrNclq9pp6a3meWyfE07Nb3N - LJflTd9Jxz7WK7vv8gf5nX8L23dfqo/5I10Ww8fzDj/2o28ZnvrkzxxuvvGBMwDyDOA10xDwRSMAXnhF - 0yUzCPLtJCCQv3sD+PjXjwZ+fPx59E1v/85/AzcD4PQ3cHMPIHdqo3Lot6nBHxf7JIJAgz2GMHiOZQ4S - SOBaB5JRBpdRfeAzXYLTDHf2AOqb/C4b6Xn9UyCbg1lLr7dlvZ3rMmyvz/8RoAlgxx13/PDoT/7k4W0/ - /bbh7/7276KB22zcVDaAKBvGbCh7qg1tNsDZIKNssHsNeiobf+FA9WACJXQkjKgKMT3wURWSErQSvHp6 - //vfvxLfXkwt+Xv6y7/8y73VWy5925Tbq3r7larHJudRPZ712CPPS5431Tu/qNaFrCe9epR1DtU6iWod - tm7X60LltXMQMEQ9KKzqQeFBxDo4rt/zuu8Zbrrx5vbW6r14Lpp4KMghQa7NTzCU2ugF5Ma5aSrvjXMb - RYlewHW8GuPTHNNWcXN+frrFQOOkcXGc5vOAmW5xspNu8y2OzrFzFRen2Lgx/DvH+2n7p2nrEGAfG/wJ - gCP8oQaA8/f/8hnA1vvHv4Ac315OPPPMQ+1PDnj2j/bs8hEAr77yhvYNwEc9/DHD1738G4c//uM/a72z - tb1kXlVbKqv1ltNX/dhSWa23nL7qx5bKar3l9FU/tlRW6y2nr/oxfYe9BHKklssfdF1L5fGratt+445a - 39J6tCNdH/8G8nM/+wvDs57x2cOtNz24/R9wA8DLrxkuEQAvAgAvb6/MA4Do3EN8Iub0BntAX4M//vqN - 7/6h8cIDAPkO0woAeQmk9QBOEDjdtXEB8/mDEQS5uFcBbLr4ffFD6Gsa0/Tw3aU9bxeBJIPY/AmYKegQ - iJjqWwenFqAS9FbCt/bX3sQ1/KHcjthO/WNZtpXnb/hvToI6//nJ8z7nn3/B8GVf9pLh3e9+d7eBW1Jt - EJ2vjWhP2ehmY5wNNMrGOxv02tADARUOmE8JEhU2KoyoCjEVeoShhKOErNT73ve+rv7iL/5ib/35n//5 - hv7sz/6sqfpTlkF88mNbecv18lBuS25/7o/7Wve/HqOcV3ls83h7/PPc1HOIEhZVrQPWjVp/sp6hrIO9 - eqqsz9b9vB5Q3vz0QDHhMNUDRSUY7gLFfQEScRP+y7/8K8NTn/q04bRTTxshZn4xbjUacremCQAnuBP8 - HDFZx86p7Po5am6kZ/hrcXR61m76X/J1zDJuTjF0in8N9uaYZ4wU5hzWdfh34wWRUVOsZTr72jpG3xyD - 1789/f4EgAGrAOAMgdP+TPs6jRSN+zpKAJz+Cm5WA0A+Ocbw7zGtHWKECvg7/7xL26NM6OIRAPnUGc+8 - 33T/Bw6PefQThld+62vG6+MDw7/OfwOHbWtXtczvlUufZXvltMzvlUufZXvltMzvlUufZXvltMzvlUuf - ZXvlNPPvVAuazmnP5zSlZbpntTyWvsyr5bAsq/Xm9WVeLYdlubqMviot05q+LJtT7kJ/8zfeOXz+537R - 8MDb5r+Da0PAVw+X8vzfCHvcLfE2MEPAF5w/TYHCC86/dDj9jLOH444/afra+gx+dLsr/pAb0R3fhoDv - Oz2jsfocTHsLeALAVTDjYh/FSxJTACMwJFTNPWwtPQWt1XQOZF0AdL75Jv8UnNagh6ZeQIPd2n+4+D2D - WW7fvD3hEwAJbAAuw798+PkTHvqw4Yd+6IeGD37ogxuQtiQbvtoY2kBm41mVjawNb22ME+JQbcRVbewr - ECQwCBEJFqhCSAUXlICjEoZUBaaEKeEqBZChP/mTP9lLf/zHf/wRiW879vyK/F1l2A63e5tyP/OY9JTH - sHesPQ+eH89VnkeV5znPP8q6kfWm1quse7VuZv1F1ut6LXitJBhWOOwB4j5wiHpgqBIMe74q8lnnn/7J - nw4v/5qXjzfel7fhy9UwcELdCobQFCNXGmPKqgew5U9l24303HvYALDBXwXAOWY2zaDWYuIUN9exMDQ/ - 8zfB3+EAWJUx099p8dP4iAC/cfvs6Wz/AMX+Ivdthr9J0xBwA8B7TqNKtC385zwASLtD58Tpp/PB50uG - 80YxpQeQR5vaG8BX3zjccuODhic87qnD61/3xrEOTh+B1rKtVFqmtV0+00yVlmltl880U6VlWtvlM81U - aZnWdvlMM1VaprG9vgPYW5F2UD9W82q5Xl4tk0Zebxmtl1fLpJG3lF/zTC+Vx+oy//qv/zK85z18Cubl - 7VuAvBEFAF4BALYewBkAG/xNd088Q4EaFI46dOiC9g8hvOwx3XXR9T6KZ/9m+PND0AAgz2gkANr750W+ - 7gVUBDCCl0CVgDVOCSQtmIyBZZ6fAHAKYtOd7CbkKfNakJo1Ba0AQLRaZr2e6XfH6fib6x7KaTt4DpBn - aqZ5Atx8ZzvuC/tKgD906LzhC7/wRcO73vXbw38bG7iEtZ5s9LIRrI1kKhvTVG10s0HOhhrVhhxlQ68S - BHpA14OLhA9gJKElIaYCTgWzfQANuHrPe97TpqYRPa89/dEf/dFe+sM//MPV1PRBVH9r12+T77bvkvut - 8liYzmOZx5dpno8ERqf1fOb5RtYDJST2YNF01r2sl1lfrce1vud14TXTA8NUDxArGFYlKKYqJOb8Lv23 - //Y3w1ve/OPtn0GOP+HEMTbSuzX36jVNMFSBaNVL2JHlNwBwvnFe3TyjVWxLTbFzEQBbD+CmrweB+tbr - nX7T+RX8obZ9U5xkuzcAcGwH3K+NN4BXPYAx/Nt6AI9uI1GnnXrWcM45F46x9qKmc8+9uLVlACCfO6PD - 47Zbbh8+/anPHH7sR3+81YNd7admurapadvysMwzvW2ZbXlY5pnetsy2PCzzTG9bZlselnmmXWYDAHWm - 6UtVv/PaUhmtzn8k1lv/PrZtmczrlev95kHWh97//g8Or/zWV7dPwfB/wALgZZdcVQBwAj+60r2bOu+8 - S1ZweMZ4p0VPIBchwNde/gAA2x0ZOmr1HGAOBdsDWF8EWQMgn4KZAsP00PIEW9OHQwlgk3yTrQWYFQBO - gWYCPaYGojnAzb4auA4vX9R+ZwxgY3oVSDc0btu8XQLgavh3DFxHj1D8oAfdPnzf975xeN9fvG/VqO2j - bAyzkczGs6oCXE4T3lBtuFPZwGfjX2EOLQFcSviocJLgAsw4FdBUglEFJdPC2R/8wR8cpt///d/f0O/9 - 3u8dpt/93d89sHrrUflbS7+5JJdFuf11v5D7nWBa5/NYIo+xxxx5bpDnSkh0ijzfFRpV1pdU1inrmXVR - MLSuqqzbS5DYA8MeHC5B4RIgZnobMPYgsad/HPX3f/8/xnrze8OLXvTiMcZe2G6S+SYgIwUNfGYYWgHR - CoYAoXXMXMkbZwT8GT9XIyfr2NmNb00CYImNPflSSPhWQDjH2XXP36gWn9excdqu+SYZzb2AxP4Gf8h9 - AwB9DnB+C1gAVHRGnHTS6cMZZxwazjrr/OHssy8YDp1z0dhuXdweZ+JPDq684vrh+mtuGR542ycMz332 - C4af//m3N3C3jaxtpVOl1Twt/TnF0qe0mqelP6dY+pRW87T05xRLn9Jqnpb+nGLpU5rp1XcAq+VC5ufU - NJbpJestW9fR86dlmZ5lXpbdd5lqdR3bymr7rI8ivAn8/d/3g8OnPvaJ7WPQ/B8w3eMAIM/78ezfhfT+ - jeB3/gh8qAHgoYvnOyumF7f5s848rz1z0f71Y7wo7zNejK33r/UAjgA4PwfYAPBem8PA7Y737lzgBL17 - tIt/DYAEsfmlkFnrb+4RSIC+KZ1Bxr+DQ0LdNB/w1/wZrFLr5VPT743p9hvT76OpJ3A9P4HiNPx7tzEI - c0dP798555w7vOAFnzv8+q//emvcskGzUau+lA1hNpAJcaklgEO1MU6QS5hTS1AnyAkIKAEuVaEDCSQJ - KUiYSfBRFYxyvgIZH9hWv/3bv72hd73rXRt65zvfudJv/dZvrVTn0W/+5m9uzOeyqVx3/laqV77mka7b - X5X7ivI4eGzyWNXjiipECoueozx3nlfPd4VGZf2osIiyjln3rJO1zi5BYoXDCoWCYcLhNkCsoJjA2ANH - ldC4pIRJBAC+/6/eP7zh9d87PPhBD23/o77xTcAWBycgalA0wxDfAmzxMgGQ/FX5CoATbLW4Od+grsBs - jGX/dUyjjXgnyG1o7gEc85s28qZ5AHB61Ib1xO+M0+l35+1gm4BA4uSYngDQoWD3JfYP6C0A2J4nbz2B - 9x2OOfr4Ef5OG0499ezhjNMPDWeecW6DQJ5bP++8i4eLZwDkDWAAkE/AfNEXfunwzt/67fZm9rptXLef - 6avqWfp7ZdNX1bP098qmr6pn6e+VTV9Vz9LfK5u+Kq37HUDMQnWq5XzNw3q+apSx3NL6lvJzXkt/La8t - Lact5dcyzi+V15by/+n/+af2BfRPf8rTh5vu/4Dh6vHCuOIKPgMzA2B7/o/hX3oAp14/utIbAJ5z8XDO - 2Re2O6zpTuv8cXrucPppZ7eXQu4zXpC87UowAwbXL4LkSyBcyOteQIMef/tjwCOQVQCcgsYUODagy8DV - 0TSkS2AyUBHACGTrANbyZwBc5eV6AvoqAE69kFMZeyMJuAQ1hzL4QOmDHvTg4btf97qxYXzvBqzt0r4g - h5ZALgEu0yhBDtFwZ8OOEuZUBYQKcAq4SPAwnZCS8CLUJPgkGKmEp1SCmvqN3/iNRQHk6Nd+7dea3vGO - dzQ5nz70q7/6q90y2+RvVO3Ky/zetqdyf7cBah7DepwrQOZ5ynOY0CgsWgecJjAmNKIKjEKiSlBEFRCV - 10aFwwqGwmHtORQOKyD2IFHtgkVBsZeu4nd/9Vd+dXjOcz5nvEE8b+CTJsTE6YZ4DULGxYQ94WjjOcAW - bwBAoIoYxI3omB7jZYuZCWJtiohx67RxL0HP+LiCvdmfmqBvLttibqyXuDhOp5i5HtFZwR+ab/iJ++zP - 9BdwU7rtZwCg6QZ/x5wwnAj8nXLmcNrYBvH8H58uo32ivaL94huAvgF8w3W3Do942CcPX/OVXz+89z1/ - 3D7SbbtYTR9T1bNaznS1Wq5XBqvlTFer5XplsFrOdLVarlcGq+VMV6vlapk7bVsIW0pX25bXs1qeebVk - S2W2+aq/WpbJ6T6+nvXKHeYbxYsgv/Wb7xye/zmfN9x68+3twrjf5XwGpg+ADP0Kf3SrnzPDHxfamWcc - at3u3nmdfto5wwknnDLC31FtqIJ/vgD67nXvNfzdHa0u5LFMHdJogW8KCNwZ+tdGvDUGAE7gdec5oEyB - K4PYYfr/TYFpFcBWQWs93QDANp/rWP9OC5zt92df01gmAHB1R3vXj28B69AY3J//vBcMv/TLvzz86dig - Za/HNlWIS2WDqRLilkDOaW2gbcSzMVcV6FQFOZQQJ2BUJZAksPXARiUcIQEpIcn5CmypX/mVX9nQL4/n - 5Jd+6Zea3v72t2+o+n/xF3+xqebvI36nyt/fpbrNqu6P+7gEqHn8escYVZDMc4U8h0vQiITFCoxIaETW - tayH1lG0CxK9LvJ6AgztNcwbKeEwAbEHiQmLFRR3QWNPQmMFSfJYB/v2qle9erj1ltvaS3XtxjgAcAWB - c1rIm2LldPM8xU98Ux6PngB/7Tm7pummebpxTm3Gz3VsZDqB3pQ3x8fZjy8BcR0vWdd6fav0/DvIIWmU - ADj1/tkDyH6wf5v7SZoyvAzCI0Z8ieLEE/lf+jNGADxrBYCMStFG0QPoNwAvv3R6A5hPwDz20U8YXv3t - rx0+8P4PrNpH20gt28zMz/n0Y6arH6t5vfn0Y6arH6t5vfn0Y6arH6t5vfn0Y6arH6t5vfnuEHBvXt0R - 1lvPPus+yHK71rfPuphPpa/aPj6XRdz1/Omf/Nnw5S/9quH2Bz1s+ju4K/grOACQN4Bn+GtDv1PP37nC - 3zkXDmcDf2ec14AP8ONZQC4+1LrhxwuQC/Gkk09rFyoXb/vI5xikgL7pLm79FvCG5mDX6wH07nEKZOug - sg44BqcJ5KbAhY/gNQWqngxwm/PTutT0/N/4e/wOv+lvz9NMt+EXAHDcH76P+IAHPGh4zWu+szWAQpqg - tpRO2SAqe1JSPZBLiEM9iENLILcvzAkKgpxKsEj4qJCmtkFaqgdYVRXa0C/8wi+spj//8z+/0s/93M8d - pp/92Z9tIv0zP/MzTcybdr4uh1xWZV7+rqrb0xNlesr9U+67kJrHrh5blMd8G0T24DFhUVVYRFmPBMYe - JFZAtE4zrdeB10eCoXCYYJi9hsJh7TlMQKyQWEExYTHnhcaaFiTrPGm2gXrx9Kc/czj77ENt1KRB3Rg7 - Vr17DYoQYDRrzlv3AKIpz7+CS+CboGuKXxsibq3iHOlpvsXCGgcFw5U283lEx3W0OGl6jouT5u0Zt68C - YOsBXIHgeh+5kQYciac8QsTnxo4/nn+iOqX1/p188gSAp5561goA7QG88LxL23Pt/NUpnzzjDeCnfNpn - Dj/8ph8d/vt///uxYdxsK02nD7PtXLLMz3I9H5ble5b5Wa7nw7J8zzI/y/V8WJbvWeZnuZ4Py/Laagg4 - F6rS6vw221Wul7+0TP7utjLVlsqmZZmltPaRri8FAH74Qx8eXv3K7xge+fBHtz/H5i9yfAmE3r8LZwBc - 9/4Bf/T+XTj1/o3wZ48fF91pp08A2CCQu7F5nnwu0GOPPXHgA55Tb9549zde1NnFvx7+nQPAHBCmnj+h - L4MZ6SmoTMFpDEYzvK1Abp4mEJrXfKaLVsMZLbBN628vf7TAZsCbf5ttWAU5Ats09MI+MPx97rkXDM95 - znMbCPzhH6wbtYS1bOz0ZyNougJchTkb1Ap0NrgV6JQgpxLksqHPhl+QqzAnPCRUJIBUQKsSYhJyhKCE - q4Qq5y3D1HIJbG9729tW+umf/umVfuqnfqop0+gnf/Inm37iJ36iybR+lOVzmaosk7+N6vYsKbdfuZ9L - 8nikPKYeX4+3xx55PvJ8eQ7z3G6DRoGxB40VFKmH3nRk3U1ArNeE1wvyRqjCoTdVCYa117D2Hi5pCRx7 - ALmPWOav3v9X7Tr+xm/8puGmG29pf7PZPgw9x8XphngGog3N8Ne5iaYsUGW8NGa2dItnm3Fsip+zVv4p - Xq7nkb2E6VurrZuREObHMquYOf/uxva0OLkJgCvN+4yf7WaeESWGe4/lL0fbHxKcPB6rU9uzf6ecMgLg - CH+0N3RIbADgBZcOl158v+F+l/EG8M3DA2596PDZz/m8sT7/ysA3cW0nbRu1XrpOsfSpnNd66d60p8zT - euk6xdKncl7rpesUS5/Kea2XrtONHsBtC2DbfD3r5VUf89vW11sHts1/JOvbZh/p+iijVn9MPooHkn/s - R988PPHxTxluuO6WBoCtB7C9AXzp/ALI9PZve+mjAeAFrffvrDMnAKTnr8FfAz/uwM5sOuWUUeMFeTLT - k88cTj5p8iMuXL7ZRDc+cEew4M501WvGxQ/8zYFhAsApEEzBY4auedrUAg7gNulwqJu+YXW4P9Upw3oN - kC2YTZrm17+/2pY5yLEfPPN44oknt96/V77y28eG7zdXDVpVNnY5j2wUVQW3qoQ4G1lhTmVjnI10D+ay - oU/tgrmECUFDABHcUA9aEtiEnwSoXRK6BDf01re+dfjxH//xrt7ylrd09eY3v3n4sR/7sZWYP4h661S9 - 7VhS3Xbmc99QwmaK45EQqTy2CZMJy73zkgCpKjAq6wYSHKk3CYoVDgXDhENk3RYS6/UiIHqDhATFJUBM - UExIrKC4DRiFxoNKoCT9F3/xvuFPxt9864+/dXjqU5423jCe3z6uz4tjuwCwgh9+y0430MTPKW6uwKzF - MzSDXMJcD+wAuZ5ftTgJKI6xL9aNVgCIWpyc4Q/Nsd1ev7vNmrZ3LDtOeRaStqKB37EKADxpOL79P/0m - ANIW0S7RQcFIFW0XnRn8xWn7D+Drbh4e+uBHtr+A+8M/fHd7AcQ2csky76NRroq2uedfssz7j1Zu8S1g - rOfXt22l2K78bbZrfQe1uuxB17+r/LZ8pkrw84/J+SI9H4R+/ud8/nDLjQ8crrofAMjfwE3P/63f/B0B - cIQ/dLa9f+Md1hlnAH88c8Gw7wh3wF7TGSvR86dOOvG04cSTxgv25OmC5cIFBnl9n7eHCVbtjnMMKC14 - jEGAYLAGPzWDVgSaSSy3KXv+1nBXAG9DU/4GRG6sfw5oLZDNvz0/99cgsG3PXaZhinvzZtpx4zG8aHju - cz+7NdC/MTZu2ailbPSUoOZ8NpA9aBPcKsCpJZCzYU6Q2wZuFd4qwCVAoIQLwSMBDVWAcR7IEXx6ANUD - LiGN6Y/+6I8eph/5kR8ZfviHf3gv8bHuN73pTcMP/uAPNplmuo9YXuU68zeWfCm2uaruV0JqyuNSj13C - pPJ4J1xmmnMjYPfAMetBynqS4CgwJiBSH7Mn0XqdgOg1kNcG8jpKSBQUExCXIFElKFZYTFDcVwLlNlHu - j8f1/+a4by//mq8dbrz/zWMsPb19UuuevBXc4E4ABPJCCX8oAVA1CAwQXA3TbgJgfj0hIW7qyZtim/71 - TfAkb5RXsDdrvcw4X+J4g7/Vdq17FvHzHOR973vscMwIfEfz71IjAAqB01+P8n/0p4xaAyAdEHRI8Fz6 - BIAXtTbsoosun/4D+Irr238Af/KjHt+e//vgBz44/L8BW1rOm6751Wr+0rzpXj4S/myrnUdazpuu+dVq - /tK86ZpfreYvzZuu+drqJZB0avv4mD+SZU33pllO2+XL5es0y2k9X1rNz/X1bOk3UFYmBPxx58OLIH/+ - Z+8bvu7lrxhuf9AnDFdfef1w+aXzM4AAIG//AoCrFz+mZ//oXm+9f2dMvX6nNQA8a7wIBcDTJxg8+fTh - 5JNOHy/QcToCIHdr6ATULt7xDo4LeARDyvHfwvylDxc/HwQFqqagAMwRdMZAQTBp8DWKvBZ4+tA3QVwF - vg4I/tc6Py0riG5qHdBqHqBKEAb++BD2ySefOjz4wQ8Zvv2V3z68/RffvtGoKQGtzisbRFXhLcGtp4S5 - CnQJcSgb7SV4S4hTFdx6EiwAjQpvCSqkK9wAPMJQQhUStOoUCW6pH/iBHxi+//u/v+mNb3zjSvpS+L/v - +77vMLlMLy9luZTrrb78zVqGebZ7Se5bDzxTFSidR/WYI89Fnh8kQHpOKySmhEWU9Yn6lXXPmwvhEFF/ - hcMKiCivmx4kCobZe5hwmICYPYkVEFVCoqBYexfTV/1V5LtO1v+7v/O7ww+96YeHJz3xKeNN9wVtKJhv - rPKNO4Z5Bbou+IUAxg0ARK2XLUdUiKUT2AlzDQA3eglLeoy36ZsAb56f8wS/KW9Td0EN/qb89gLJHKun - 3r57tvh/9NHHD0cdddyk9kcD01+MHnvMCH7HTvDX/o9+bj9Obh0KZ7YPQLcewBkAabMaAF54efuXq6uv - uv9wy00PGj7jqZ81vPUtPzXwd3w2m7aV1fSbV+exOo/1fJh+80wLerbR6UtVq3l1HqvzWM+H6TevzmN1 - Huv5MP3m1fnFHsBcQNtWrhr+mrdUFtu17jtyfUeSl/5ati5jeVQrlr1//in53/zN3w4/8P1vGh7z6McN - 1159/+GKy64aLrmYt4AFQD/9cuH85u95Tbz1Ow39Tg/eMgTc4I/h3hH2Tmm9fhMA8o8hrfdvhr82HS9e - uvDb/wnzTMd8Ydu9f+yxJ7U7PoIfX36/613uPt8ljlDGB0jHaf0/SoPQen6S85MSAIW+dXrzK/ZTgGtB - KoLj9N2saZ47WYYwCF58k4rPOBDEjj3u+OHiSy4dPud5zx8b0R/baNgOogS2qoQ2e9x6SqBbgjfUAzYk - tKmEtVRCAxI0dgFcSkhLVUCqquD1vd/7vSu94Q1v2NDrX//6pu/5nu/ZkP7U6173ukV993d/92EyL9eb - y1T1frsuW/Pr/qjcZ+GzHheUx7LK4y1Qpjw/njfPJ+fW8+35rxIaUQKjgKgExVp3ExS9HryeepCYoNgD - xF29h1U9WMwexVTm71POoWzWz2/94i/84vDSl3z5cMP1N4030WeM8ZHYOMVB4K4BIPGG6RYQPBz+pmep - faymgWCDwDWwTSMbxLVNcJtGO9baGBX5L/gAv3m+xcRpfeT915Y/lfFm3hh75xFI78anXMZ9u+9Rxzbw - m/5Z6vjW+zfBH76pB/DYWRMA8gIIbQkvgMwAyPPmMwC2j0CP7db0BvD0H8DXXnNje+HxRS/8kuFd7/yd - 4X//L77/t24zc5pmW1qt+nLe9NJytWxtpy2T85atZtlq1ZfzppeWW/Kn5bzppeWW/KuXQNK2LZD+Xplq - +5TZ1z7a67ojfEyrrETZ8wf88b+UPAf4K7/yq8NnPeM5w/2vv3m43+VXrwGQIeDxIjr30Ah/q2f/zm0X - mAA4Df+OEHjKugcQ8KNbvvX8jVPEnRoX63TXNoLfeAEfhxoAzhrhjzu9o8eL/Oij7fqfLv4WFMYgce97 - 85+Z927AdZcxuAFggB8wKMjxP5WbUOd/V875gGPTf1ml2/9cojk4TXenm5oC3BjcCKAE4DF4NeibP26N - eOmDv8Y79dTThk/8xIcP3/ptr2wNnT0fNnJIX0+WyQYytQ3YUuYnxAlwFeIquNnAm67AJhxUaKhgsS+s - oYSaCkSqglQVMPZd3/Vdw2tf+9rD9J3f+Z0rveY1r2lKX8p89R3f8R0bevWrX92UvrpMKstl2d5v95T7 - wf4tKWHU42G6dzzRPpCJEjA9v4JjDx6zvlB/BMaEQ0Xd7PUseoNCva/XToVEbox6gCgkVkDMXkRBscJi - AqOgKDR+JEoI5Tf4vXf86juG13/P64fHf+oTWi/gCccbF08Y7nPvo4d7jjfDd7/rPRoECng9APQ5wQTA - dS/geNM6xs2PHzW9FTz13AGE9tD5SItKANzoCZwBsAFe03zzLOwZXwG+EQ6J2S1ujjHzPvx37xjTiev3 - 4X/jxynzRx1FDyBAmAAoBNoDuAZA2hkB0BdADp19Yeu4YCTrUp7/u991w/XX3Tx80iMfO3zbt7yqfYD7 - X0s7WU1f5u3jY5r5Wi2HWbZCn9P0ozTn07+Pj2nma7Ucto+PaeZrtRxWfV0APBLb9iNLluV6Zau/l17y - pV9b8mO7/Pusz/lagVAP/vg/yn/4x38Y3vue9w5f8bKvHh542+3jhXLtcNnFVw4X81dv5106XkTzZ19a - 7980/MtFdhrwd9o5rdu9AaDPAJ6Mpuf7uDDp+SPdLtZR09DvyTMAjsGtaera5+5uAsBRbQhgCg7cDd53 - nJ/+7HvyT3nHtN42oJAvw9/t7ncfwWz6CzmfK/GOVbDLHr7WizhrGu6dgtR0J8wzKmOgJIASUO929/bp - Gv+Dcvo3k1nzfLuTHbfn+HF/LrvsiuFzP/fzhzeODeSb37x+5spGzqkNnlPTSmBjqiq4IcFNiHNeiBPg - VDbM2WBnY14BTmCr4JaAkCChhIwEkpTQYloJPhWSBKeehCvA7FWvetWGvv3bv73pla985Yb0p2qZb/u2 - bztM3/qt33qYry6XynIs6/Lk+Zt1O1K5L8JnTxUyM43yWKqEy22QyTlKmPQce/6tD9YNQT+hUVAUClXW - 1azLgmJeA7sAUTBcgsMeIG7rSczHMhIYPxKxLtfPb/G7v/RLv9xeBvmSL/6SEVjuP/cCnrTq/Wp/uwkI - jjfB9xhvgtvzgavnAYHBWStf7Q2cAXCWzwUKgMLfGgAD9hQAOIu/g2uxdfW3cCPwzfH0znce1zn+Hp+0 - aTfK480x0LfSGCtb/G5/FMC/RgmAaBr+Bfom+Dt+Gh0atQZAXgKhB3B65GjqATzUnk9nxGr6C7jLhssu - var90xV/ePDpT3nG8ONv/on2Tyy2l1Wa6fRhvXJLZWq5nGrMZ5vNdMmHNNPpw3rllsrUcjnVeuWWytRy - OdWy3GEAmJnbFuyVc5rW82G5fFrPv7QOzWV65bb5q+nLZWq5zEvTr6g0yCHfLvz9wz8Mf/8//r59DPP7 - 3vDG4dGPemx7DpALpr0JfD5vAE/P/5191oXDmSMAcnFxkU0AePYaAMcLkGDlsO8EgNOwb2oCwAkCBcBj - jxvvcMcLu/X6zXd8aAV6Y7AgOBg0CBZT0DhquNccPFbzIwwyXAKMcZcJoN2DYHmP8c55FOm73X28g27f - IJyno1qZESL5TA3L3Oue81/W0bvX1gfgTbBHMNvQDH/82wl3rWeecVb7g/dv/uZvbo1dNnQ0bvsoG0aU - wKYqsKWEtwS4VDbMNtY23rvgrQcGKOGhAkYFtFQFmCVgq/M9JWB9y7d8y4Y4H+ibvumbDpN5vfxv/MZv - XOkbvuEbVko/qstVZdm6HsvkdqTqvgiQVe7/kvJYeTxRwuWShMuEyCVYFOgTFhH1C/XgUFlvqccVFAHD - hENUexC9mdrWe5hDzEJiPl6RkKiAxVSC4zZNYDelXZb1JYz6u2zHT//028bj/JrhUx77qeMN+PltxOQ4 - 3n4FghoQzS9EjOIfhvg8yr2Ic/QOAoXENcFwBYB8ZmWEv9VQ8NTbtwLAGf68aV719M0wV2+gU9ON812m - 3+H7heN23PMe/E/vFJsn0PMvQdO31hTjp15AbuwnADx2BX+8DHLMMQDgCH/H0YEwtSMnjW1KA8BTz2jt - kf8D7PN/l7Th36uHa6++cXjgrQ8dvuiFXzL89rt+Z2wH/9dGO7kPZPXy6nya+b0ymZeq2/LvYfu03nya - +b0yS3mrZwAzA3O++rGeD9u2TLVahvmerzettrRsz+e05mnmZX715XwqKwvqwR9/fN3+jPwf/7H9RRFf - qOdjpNx5PvfZzxuuv/bGdsFw4dB9zl/ATW//XjACoC9/nDsN/wYATsO/EwDa8yf0cZEm/HH3xkO8a/gb - g1m7wAW/6e6PAAAA3kf4WwGggQTgGyEPtWHYSaseuVADtznvHvcC9kYVv2mCKVrD4xr2AMkm4W/Uvcb1 - EezYvuNPOGm45prrhi/4/C9oDePr3/D64Q3fu9wjotKfcrmUjSjqwVpPNsRCnCDXA7oEOMGtwluFNZVQ - oSqcpQSXhBuhZxsUmZdlmApXTF/xilc0Mc/067/+65u+7uu+7jCZl/lf+7Vfu9LLX/7ypq/5mq9pU/1Z - LtdluifXlXJ5t8FtX1ICpPub8lhsUx47lOegngvSAmYFyDz/1gvribBonUpgrJCoqK/UZ+s410HCYd7o - 2HMtIHLzJCDaO74EiEJiBUVh0WHmVEJjDj8nSCp9KcEz18lv+btsA9vFvn3BF3zhcN0110+9gMRKQIjh - UAQMtt4wnpmenhNs8ZN4OcbIBoTc9M4wyEgGIyNTr980QjIN+Qp803N8Dvc69NvUwJAewwkgGWX5+PbP - HOON892JgcDeeAM8A1+Lze1GfIrP7eZ4lT+B4Cqej1rD33rabv7H+N+Gf1HbP9qJsd1oADj1AG4A4Oln - D2eeeWhsq6b/AKYDow3/XnFt+8zZox7+2OFVr/yO4f3v/8DYLm6CVbabtV1FS+1u+ndZLee8qttQ00zT - XE5zPpX+XVbLOZ9K/y6r5ZxPLb4F3PPXMneU7VpvL3/bMvts577r3OZjWkVFSfAT/uj1E/5az98If/wd - EX9F9MEPfbC98faKV3zTNAx8xTXtOcD2JvC5l7TX6VfP/zUAPDTB3/wCyPrZP4Z+ZwAc1V74OGnd+zeB - n8O/0/N/AqBd/VPvH8O8qALgdLe4EWAAtjnINAXMNfBbgdss0kvz4WeIpQ2zjLp7+Dbhb4JEXvzg306O - Pua48e7z0PC4xz1hbMy/vjWADaRee3hPiY2fDWDOpyyfcl1IUEMJa8pGOKEtwa3Oo23gJrAJbQJCVYKF - oAF0VHBJoGGaEJZQtaReGXwJVkwBt6/+6q9u+qqv+qoN6c+8r/zKr9zQV3zFV6xU81K5TtN1fbmuXGdu - B2Kbd8n9TLHP21SPF6rg6Xz6OEdL4Jj1QvVg8SDAaH0XCgXDhEMlJFYwzB5zAVHVYeYKi6oHjCnhsaaV - y6YEUdbP7/n7bAvb9YNv+sHhm8Zj/ZhHP3bqBTxx6gWcAPC4ScTLWcTP6fMo0zBp6x0cy/BICvA13cyO - sYvn74xjTMf51ms4T+lFJM/4x3LTaMgMcIoYDGjem/Wv/cbgVboplhnnJwCce/9W8Df1/JE27vdeApme - F5/bkRNObu3KBIBnzgB47nDOCICMXF144eXDpe3/f68fbr35wcNnfvqzhp/+ybe19u9f//VfuoCV08xX - Wk3nPOZ8b5laFsOH8jfztzOtmU6fVsvVMr1lez6tlqtlesv2fJq+1RDwthVozKf0pS3lbSufU435mlfL - YL3lcqox31t+X1taH7LSqN6Qb8Iff0IO/H34r/964Gv0f/mX7xve+8fvHYPijw6P+9QnDtdefUP7cOb0 - IsjF4wU1ASAXl//7uwGAPPcHAI7Q52dfkODHEEbr/Tuet37ni7ddyFOwmgCQi3wGwHEKAK4fCh4BkOf9 - CBqjDCRT0DHIhIDCAoAbav65d2+cV+St5ucAOA0LT9DX7qgbAI4BkvL8Rnvr975jsDpmBN6Thvvf/6Z2 - 505Dmb0mNoa9RlAt+ZXLpmxgkb+jaoOM2KYKbulzKrCpHrQlKPSgIgV49GAlQSbhp0ITSqBSS/npR0DW - y172spVe+tKXNqUv/S95yUsWtVRG/9I6q3rLU/7Lv/zLV2K7c165btIJkqjuu8rj4zHOeZRwWX2cowqR - FRBTCYsJjCrrHHUzrxHqe8JhgmHCoeJmqfYc1p7z7EmsvYkJjIBiDxodfk5w3KVcJuET+Tv8rtvhIxts - 62u+4zXD85//guHa1gs4fSaLXsDp5YjQGCuZAoVtOgPhNFwMME7xlLwVXLUb7CnGCl5tKPY+xzSwa8O0 - q3g7xdyN+NrSa+CbfBPo3ete03Td6zdDYoPG0QcAsv5ZawDkcR+3b3reewW4Yxvh8390HtCGtB7Ak6a/ - gWvfADzjnPaFikPnXDC2W9P//15x+bXDddfcNDzsoZ80vOwlXzX8we//4dge/vOqkyTbzV5bqrK9RT3L - vJymH0ufftP5e9t+H2lL/mqZn9P0Y+lLf7XMz2n6sfSlH1v1AGp1/iC2z7KWqdOP1O6I9eWy29ZDnrKC - WKEr/AF+PO/HkC8Pvgp/DPtO8PeX7WOk737Pu9szKl/4+S8abr7xtjYMfPFFl7dPwUzfALxg/v5fAuD8 - BvAIgDwD2J7/O3l++WO8MH0GUPhrw7++AJJ3q3MPoHd7AiBDAO0FkNXzfxMETgA4aRWMDEKjph7A+WUN - QK1qzFsB4KzMb8DX7pCFP7SGQcuxfgLafe971BigjhvOO+/84UlPfFJrmG0ksxclG8aUDSTp2khmA7pN - LOv6bZCV27CvBDbVA7YEBJQw0RMAUkFlCWpQBaWcT1WAWsr/si/7suFLv/RLhy/5ki9p+uIv/uJVOoV/ - l1784hd3Zf6u9Tpfl7Us24nY5irzUrVMHhNVj0vvODPfOydMPWcVKCsgpqw/wmJeD6l6bVCfEwpVwqHa - BomCor3pdZi516OYsFiHnvdRgpxyHa5T+Vv8rtvjaADbzT5xjD/50Y8ZzjuXZwHHuDn3Aq7grw2Tmp4k - CBpLSQt8a02g1eBrhj9lbE2tYC/U8kbYM+5mXO6qAeA8BNzE7xnXp+3Im/62D8AfMDvu93Ft+PekBsI8 - Q07bQhuz+gj02C4x/HveuRet3v696srrB17++LQnfvrwfW/4/uGvP/TXrW10dCzbzSXQ2qYlO2herhPt - gr60Jf8227bMv+X6DgNATX8vf9sy25bD0r+rLJZl1JJl2SWreTm/bTmNMqrCn5V6H/jjPyj5G6IGf+9+ - d/sm1a/9+q8Nr/y2bx8e+YhPbm8DX3rJ9JdwvE4/AeDcA3j69Ndvp7YewAn+JgCcoG8Cv1En5XN/CYBT - 799SD+BRaAWABqjNIMWDzxlc1hC47vWb0tELCPj5/N/sEwAbKDYwnEFvBYDzfJtO+ajBXxv65bMvx45B - 6LThAbc9YLxjf35rcL+803DaYGaj2Ws8s+E0XfOqH7kufwMJYJneJht3t1tVKBAeEiJ6PiWICDFOVYUf - 51HCU9W+4EW5L/qiLxpe9KIXrfTCF75wQ1/4hV/YTS+JMugLvuALVmn8rJvf2vZ7ls3llOVdx5KER9PV - 775X9Y6Pfo+/5wefYIk8j8rzbV23/qisU1nPrJ+1/lOnBcUKhsJh3iABiqr2ImZPokPMgqLy8YkKjYJj - AmOFx4S2JR9TAVSwQ/l7bAfbxXayvfbssz+veMXXD8/7nOcNN95w0xhzz5y+CzjHyQmQ6PET+JYETAFV - E/jxnOAEf6M24uqUNqbytrHpCe7W8NdevqOnrwKgyzNt87PauiZfAuD0+5MmAHQImO2eABYA5CVB2gva - jgkA8/k/h38PtXbqgvMubp0XV1x+9fTtvwd/Ynv549fe8ettBOyf//n/P+p/bYBgwqDtaraz2d7WNMq2 - 2XRONctkfsr19mSZtFy2zqcyz3RONctkfk+ZZzqnmmUyP9UAEGk17bzpnjK/ppes5m8r7/pUtZ6/Vy7N - ZbJc+vRXn7JSLMGfb/om/P3N3/zNCv74D0v+goiv0AN/fIuKzxG86U0/NDz7WZ893HD9zcNll145XDQC - IM9TbPQA0vvXXv6YXvzgHz/88HMC4DQtANi679fDvw0A20U+XvCjppc/CFRTsGrwpwwmaA5M050p6Rn+ - ZmWav1OawG5TCYAbvgTABoETAE7wN62boV96/446is++nDQeqyuGJz3x04bP//zPb433i7+o37OTDWkC - Eo1oVUJXSiBz2ls2111/S19Pbl9CmFDgPBIadsGG+UhAqarAkzCkBKWEpR48KdfHVB9lgTXEeUp93ud9 - 3vC5n/u5G8KHskxvPoXf36hymfo7+Vs99dbpvuc+Zdr5PB5V5tUyHLdt5wt5zrOO9ACxJ+ofdbRXnxMU - e4CYkJiyN7EHi73eRAVoJTAKjdm7qBIiU5mf5ZHrUv6Gv8s2sG1soz3+3/CNUy/+13391w0v/9qvacf2 - cZ/6uOGiiy5pvYCrFz4K+LWX5lZp5yffOq7O8DfH1jWArW+uV9A3A+Bm3KXnb+79m9MNAElHXF7nj9Pm - FwDXv7MS2wGMztslALZ92QDAk9qjQ7QhtCu0LwmAdFCce86F08sfF9+v/bXpTTc+YHj8pz55eO13vm74 - 8z/789Ye0jFC+0g7SXu5rUdwSbbB2San1fm03jLO5zrzd0z3zPKZn770az2f1lsufenXej6tt5zzB/oO - oCvIFWGubJf1yuQ6M71kmdcrl+vIdLVe3lK5KisE2gZ/vuzBm74Jf/ypOf9rCfzxFXrgj29S8WkCHkz+ - mq9++fCwT3jkcD9eBrloeg7wUPsbuAuml0AaAJ7dev3a372Fpr91G+Fv7p4XANsQ8PzsxvQg70kTAHJx - z3ezBiifA1n1/jEEPN4ZTkGIu88p4EwSALkTTQCMN3sT7Jg26BPwJvBLyFuVmedTDf5GsS28+HHMsccP - hw6dNx6vhw3PfMYzh+c973mtFzAbdYGhNsq1QXVq46oSvJa0BGjb5G/526kEhVQCQ4WP3DfnzfcYpGre - trIeyx44Zb7zVbnsC17wgpU4V4pz9zmf8zkrMe/57KmXn+uuv0c+6/3sz/7sJn8jf6unpfW6v87nb2XZ - pWOCXEf6PA95/rKMech6kXW3qtY15r2p8IZDCYgJiYBh1VKP4kF6EquWehXrfFXmu45U/ga/zXawTYpt - tDffHnz2if182cteOh6nLxme+5znDrfd9sARdM5sN5zTIzPA3tS7JwROcZQRlBmmVhCIiK+jgK05tk7x - FQibNUPZqgdvjKvr+bVvDYIRi8c80/pXADiq9SiO65h+I6Bz/N0J+mbN28q+EF8BXtqKCQB59m89/Nue - /zt1Hv49a3r5g2fXeYTpuqtvHB56+yOGL/yCLx5+8RfePnz4wx9unSE8Cw8E7gOC2db2ZHtc2+hUNX29 - fOZ3/UY1fUv5mvlV1fQt5WvmV1XT18vfAMBegZw3bbmcz6mW5VJLZt5Smbr8tnVhB11fzyyjrBRW0Ap/ - Oezrm75U/A996EMb8Nf+e3KGP3r+gD++P/Xmt7y5DYk84+nPGm647qY2DMwHoQ8dml8EAQDnT8BkD2C7 - GBvwnboCwPYCCAAI+M29fw38Zvhrd3bc4RUAnIJXBKg5SEyBxMAz9/45/DCnG6i1od41+KEJ8gLusodv - nG9lmn/WXDbXMYElvX98xX4a+j311NPbix9PeMITh6d/5tOHz/qszxqe9axnDc95znOanvvc565UoSIb - 81SvMVY2vAlZzlf4qv7Md6rq7+Q2IEGB7XOKEjSW8qoq0CDLMyW/J48dx3EJmnrLKcu4vCCmPE+9c4d6 - ZXt5rj+3kTTlWO+zn/3sjTqi8KPqz99YWrfK7bA8Zeqx4Fj3fFXm+VuW8xxbL3p1VWU9Q9ZDwDHBUDhE - 3tRUOHRaexNV9iQKifYkCocJiarXm5jq+YU35LK5TuRv2ZMpqAqubCPby3az/W2/vuwlbd85DoA1x4pj - /vgnPGG47LLLW3zlw/nTMPAMTG3EJDXF0QmoxvkZqHoAyI3sBIBrKBPaGri1eTX7G+AxXUNfyjjdHtWZ - l5vWPfUo+jtN429P2+H2CrT2/vmG80mtLVkN/47HYXr+7+zWLvFvVX7776orrhtuuv8Dhyc94WnDd37H - dw9/9Efvbl+8YCTsH/7hf7T2ERCkrUwQrDBoO7sNBmsbbbvtNP1pmXckqtYrg9Kcz2mvHJZ5qTTnc9or - h2We6n4HsM5jdV5b8lfbVc78beX2/S1sn/WlUa6W1ZeVzEpnpbSyJvzlZ16Avw9+8IPtZY8/+7M/W8Ef - /z3J3w+t4e+nB/6x4od++IfasysvfcnLhkc8/NHDFZdfM1x0weXtu0q8YTX9Ddz8DGD7BMwaAE+KT774 - t28nnDhesA0Ap96/6e3feQi4AeAEge2C3whe6wBl0FgHn7VWAEivoNA3P+vXoA4Jei29hrsc6uXtXj8U - PZW917iO9Qsf7VnCBoBTYGPo94QTTxwuu/zy4RGPeMTwpCc9aXjKU54yPO1pTx0+/dOfNnzGZ3xG02d+ - 5mc2Pf3pTx+e+cxnNkCskJiNvA09stHNhrenbbBlQ91TrxxpG/0U25Cg0VMtkyBSZfmqXDaPieodr4Mo - j7nAleK8pJb8VbkO5Xbmb1GW809dsD6YfsYzntGU9cS60vuN3Jf6G5bH77577J3X5zH3+FsO1d/Q7zIp - z2HWm1rHBMaExh4cCoj2SFdQVNnr3QPG3nBzKkExJaRlnmV75fHVdQt1bgNTwZXtY3vtrWdfsuedY8Hx - 4Zg9/wXT9feMMYbc/uDbx1h8Xoup9IzVG2fEvyYlBE4wNav5x7iqVjFWGDs85tKzR969R1BbfXg/YzDA - p9obwHOa5cb8JtffVObn36wA2DoHGO4GAHlsaH72r/X+tZEmh3/PaY8n0UnByx+XX3pV+/DzQ29/5PBF - L/zS4ed+9ufaI0+0hYyEAYH0BNJOAoJC4FKP4DYIrO2z5ry+OsVqWuW6tcx3PqdYTSvn05bys1xNK+fT - lvKzXE2jFQCmU8u0lmV6+djSOpbSu8yyTO+I9WG5zrT0p6wUWRmpnFRWKi2Vt37jjwqf8Pfe9763fe+P - Px3nfyf5+yG+Qj/B35vbZwl4O42HlLm7feYznjXeRd06XHLxFa1rnTes2osg7SUQvwE4AuAon/+rAMgz - K0x9+WMFgAz/cnE3+Jt7ACNw1eC0gj/SLejMd54zADo0m/AHsG2AHr7DAJDv/AUA6m+a14Pm9RPYuGPm - Qexzzz1vuO2224ZHP/rRw6d8yqcMn/qpnzo8/vGPH574xCc2AYXoyU9+coPDpz4VOPz0LhwqAQDVhjyV - jfg2ZWNOI53TXjnn6++hhAu3qwKHymVUXdYy/l7+bl1OEEog2iUByuOZ2pZXJZh5fkz3zply/fkbpnN5 - zr/1Yale+Juup8r8XG9djt+ux4apxz3PQR7zuv25jirPl+cw1239SmBMSPQGJLVP7+IuYLQ3saoHiwKj - 6VSWzfKZxzqVPZkV7pyyvWy/vevsr6DMMQH4vB6f/ZzpfDzj6c8YHve4xw3XXXfDcPr8Qsj0xu88DDwD - 3wqkUhvxdYyrSwDIyxhtOoGbACjUtV6/Nr/2rdR6/dJvuVGsb/UbxHOAcvS13r+6zce09qA9/8dI0Tz8 - mwB44tjW8Nw57RDPpfPtv/PHNoqXP3h06eYbHzg8+UmfMbz2Nd81/M5v/87wvvf9ZfvqBSNh9ATSPgqC - QGAFwW29gbbFQprTJWmZTtOfy7jO6teHZTptl9/1KC3Tabv8rkdpmU5Lf3sJBFtacCl9R9nSOo/0d/dZ - H7bPfMoKZyW0Yvq8X8Ifz/z14O/3f//3B/7InD875++J+Oshvj7PB0j5FhWfJHjta7+rPZzM22cvfOGL - hkc/6jHtgrrwAj4Hc8Fw9mEAeOZwcgPA6f9/VwC4+t/fSdPLH5OOHS9mX/5Y3Zm2AGWwAgAJCmNgmrUG - wCmgrMGPZ/2m5/0mAJzVeuwAtwnghL5MNwF9wN8871QJgGv4O2oMuscOZ5x+5nDdtdcPD33oQ1sP4CMf - +cjhUY96VIPBT/7kTx4e85jHDI997GObgEMCt3AIFH7ap33aCgxTQOLTnva0w0CxNuw2yqmDNtiWX/Ln - utHS76qEDde7tC7ze2Wcr/6UcIPyuDjNPI9fBavqy2WqLJeq0LatbMryTDnPPdW8+hv1dyzPVNVl87h4 - HDm+2847v5PHJNfhenq+KuEwVQEx4VDt06soLAJTCYvZs5gSFqsSHk2nessgATR/w21JwFMCHvsn5HEs - PC6eC46b55lz+LQxNhA7HvaJnzhcesllY8w9tX0WZgWAcwwF7NYwpRIAmd8EwE0IRBOwrYZ9Z6hz2Het - w2FvNQwcPtTWN78M0tJt2Hka/j1se8d9sQdw9fyfADi2MyedfHp7Bt23f2mbLrjg0vbiIm/+Pvxhjx6+ - 7EtfNvz0T/3M8Ed/+EftBRDaQh6D+tAHP7TqDaStpM0UBGlLBcF9egNr+5xtdrXqq+WcrzKvWvVl+SX7 - 97a+FQBivZWkmV+XWVqu56++fcpo+NWS7bs+fb316VMV/qiIwl/2/PmmL5Xbb/wBf+95z3sOgz/+quhw - +HvtCH/f3h5S/uqv/qoxEH7xGHiePtx224OGSy65YjjvPL4HyAeh5+8ACoDAHzpxDYA8qNvAz6Hfpuki - 5mJeAeD8JpuBaXoTjIBEYDAYzUFo1NTztw4y6p73ngFQaGsguAlzK6gbga+J+RkAffZvtXxqXBfrJigS - OE8++ZT2LM6tt9463H777cNDHvKQ4RM+4ROGhz3sYU2fOAZooFAw/KRP+qQGhkIhPYUCYeoJT3jCChCB - QwUUVtmw28hnY69oOGy4bUjSl/M23uZlfl3nkizj8nV9yLLm198lz3nLme7J32TfBedtyvI5j1xn+uvv - pFzHLrFdasmf8hznjQH+XLa3fNaPlPlss/uDOK4ef2Ajj3tV7m8eg8y3TPqVv5PiN4VOITQBEWVPYq9H - EQmJVcJiwpeyd7FKeKwwWUHO8qTtteuBXW4vU0EvQTuPuceQ88V55/rnZpGY8MQnPqHFCW4wb7n5lvby - 2QknjLHUG+kZnjbfph3Tq961McaOoDj5CvxFrK1aQdwcgzegbp4mGBqTKxhO65rW1wCzAeC8DbG9wuwG - AAJ/x8/Dv3PvHx0QPI/Os+nntpc/6P27brjtltuHz3rGc4bXfdf3DO/41XcMf/D7f9A6QPjkGUPBf/VX - f9U6R5Z6A3vPBu4CwGynna/W82GWz+V689V6PiyX0+p6esv2fBj+mlfX01u258Pwm7fzLWAL50JLaU1f - lnGafizTWi9/Vzlt3/VVw19lZdoH/vYZ9k344++K+FI9Hy3lQ6i8+MEnCYA/nmlhSIM72ec8+znDYx/z - KcN1197YvgnIndZZZ/EiCAC4/gcQP/7cvv/XAJCevxH6HPqdwa/BH5qf/bMXcH1nKgAeHpS4G0344z+A - Hf7d6PkbdQ80zq/Bz2HdCf5W4Ge+ADj6pr9AEv6i92/cLoa0L7zgouG6664bbrnlluEBD3hA0wMf+MDh - QQ960PDgBz94BYWIHkKhUDCkp1AoJJhnj6FDyQIiUCgYphISaSB6PYoJADYqNuJCgfPIxkdZxnIVKDKP - af4WskFT+knb4NUy2+TyrkOf2+H2oTwG5tcyub5Ulk+ZX7elVxbtyke5Pcpt9/wq/e5Xb5kql6WMv+l2 - eQxTub3btt8883NbsozrdP2cb6E+JRDu0jZgFBZNC17Zo5hKWHM+4THnXYayCXP1N5kKd4Ju7qf1nWOS - 583zxHXM9e1NIfEAERuIEcQK4sdDHvqQ4eqrrm5vBfM89SYAAlRqgsHDoXCKsZMAMdWJu0LcDH8T3K3B - TqhTxmgBcHo7eALASXPa32Ebxm1lu9iH1T+bjG1DewOYF0COnzoUaF943IjHjk5n+PdMXv64cOr9u+yq - 4frrbh4e+8mPH776K18+/Pib3zL86jt+dXjnO9/ZPnXGVy/49JkQ2HoDRwikzazPBiYEJgD2ILCCXyqt - +pfye9bzW968WibzqvX8ljevlsm8aj2/5c2rZZg/7BnAnGJ1Ia1Xtto+ZbDMr2V7eUxrubTeMprLqp4v - K1WCn/BHhaRiUkET/tr/+i7AHy98AH/8ITnwR88f8McLH3yIFPjjuT/hjyGN57/geS2YPelJnzZ8wkMe - Ntzv8mvaV9bPPnsCQN8CXn0CJv7+bQWA44XrA7zrnr8Kf2NQKnemBovVEITpMdgIgA0C5+Hf1BrohL4J - 5jZ7+yJN3lxm/R+Yk9ZDv0eP+3PSuP/nD1deeeVw/fXXD/e///2bbrrppqabb765CTDk2UAEHAKGwmH2 - FgKED3/4wzeGkIVDwTCHkYXD2oPYA0QlGKpsbNKnbMTThyybsOmyptOXIFABQXBICQy5TFWuY8mf2+x2 - ZF5u30HE7/S2uf5+qpdf53NbU3k86zlUS+WR58nHDeo5y22o6q0n15Fl8/fN15flVD12zguIzqdPecOQ - MJVwJXAJkwmKPWBUtUxVlhPuBDy3I8W2s28eF+UxnHrz1pDHtYy4rhP0uEEkHhAbHFEgZjxsjB/cZBJr - Lrn4kjEGnzrG1TGe0nNGLAX8ZrCbNAHWaioY3tf/WN/eA5iaRmEmuMvHcBIAa8/fhnJ9/Gb73WnbGgDO - vX++AQwATh+A5oXCqW1pvX+nnNkeRTqHT7/w4eeLrxiuuvK64fYHP2x43ud87vBdr/2u4Sd/4ifaC458 - 4oyvXdAO8gIk7SLtI+0kI2W0mR8eIZA2tDccvG0oONtqlG04057pt+ySZd4+5f4jrm8DAKvVBWo555eW - 1+p6sG3zS+lt9pGuD3/KCpUAKPxRIamYVNJ85o+7GSo1n3qhkvu2Ly98ZM9fwh8fL+VbVnzKgDfZeICZ - nj/ugAl6BDOCFVBy680PHC69+MrWC3hmexOY5wCnt4CnXkA//jwDoEO/c8/fBIDAny9/OPzbvzMlOPCg - MEGHu8YJANfBpUFgAcB7td4/AG8NeasPQTffBHirMkxHCXwT/E3rafB3n+m5v+OPP2E45+xzhksvvbQB - 4NVXXz1cc801w7XXXttEjyBQqADDG2+8sYEhQMhwcfYU2ktIDyECCrOXkKAvFHLsl3oMhcMEw1QOK6ts - hKo/GyrLbVMtRzohoKoHBUo4qtNdquuuv+d6sjHetY11nnUkmNjI97bRZapqecotbVP1K4+3x7n6Unme - qixT120+dSPrh+neMi5nWmW53n7pW1IeN499HvfqX4LFCoYp/QmSKteR83n+81wi9svjYe89Eva8Trlu - vZaFPYGP658bwwZ7440isYEYQbzgJpL4QSy5+Zabh2uvHm/Kzzt/jLmnzDF1jqMN+AIAUysAZB4ImyEw - wWxOe9PNN/ymGEzsHWPw6oWPOQ43uJvmpxv20FxuY52k229PYlsmAGQfps4BRokm+Fv3/q1f/jh7OItP - v5w9ffj5ikuvGm664ZbhSU948vBVX/XVw+vf8IbWzvGYEy868sIjnSC0h3SKCIH8G5Y9gXSg+EwgHStC - YB0GVvsAYEozXfOyDJbzS2ksl1fOp+X8UhrL5ZXzaTm/lMZyeeX8nXJGy3TPyO8tp+3j2zWP6TtIWe0g - ZZgqKw7THvzZ+0cXNXcqPvdHBV76yDOVP5/5S/jj46V8v4pPFvDGGs+6MOTB3S6BjmBGwAJAHjIGoRuu - v7F9aPPss85rr9+3XsAGgGv4mwBw7v07bv7wM89x0J1fev8mzXetFQANGBlcGgAScNZ3n36ipYn0DHMT - 3AmACYH2AlpG31hm9AF+TeNv8L2/4447YTjjjDOHCy64YLj0EoYaLhsuv/zy4Yorrhjud7/7NSBEV111 - 1QoMEVB4ww03bMBg9hDmsLG9gwmE+Uxh9hQmGAqFAGFCoRIK7SlM6TfPRj9l47+vepCQyga+Khv8bFzT - 35uvy6dyXZTZd1tSridhQwBw3a6/t6zTlPm5PftIuGC6jyi7zzms5bI+ZB1Jv8u4HNP8zarcJtM9ZX7u - ez2e9bjmOUoYTAlxKs8n8pwiz1FVngePhcfGY5XDtkjA45q1Vw9tgz1uEokLxAmAj5hB7CCOEE+40eTm - k1h09lnnDCeecFJ7K3h9Iz0BYIujEVdbbJ2hy3RT719BZrX5GeQWlcBXpy29Xu/0m5vbRPyfhn87vX8z - ANLWTM/+nTvu8wXt6xQX892/K68fHvYJjxhe8PwXtI9t8yWLN37/97fHnH5ybPd44ZFPntEeAoHZEygE - 8kcJFQJpZ+uzgNkLaDvNNKFvKZ3tvemcYpmvLZVzWvNruZzHlso5rfm1XM5jS+Wc1nyn3e8AYjlf89J6 - ea5vaTn9S8v2bB//QdankV9lZRL+EgCpiL3n/ujKzr93S/jLt313wR/PtzDMQbAkyD3ucY9vgYsgRVC6 - 9dbbRsi5frhgvOviZRCeAzz1FIeATxtO8J8/Rq0BkLe4pu/+bfyP5QYAetc6Ke9IVwEE4Avw2wDAkD16 - DermIeC1eON3gr0pf/Ip/hNYAJzg7/gx4Jw+HDp0aDj//PMbBF500UXDxRdfPFxyySWtR1AgrFCYvYQE - a2BQEMyewYTBHCqmAbCnkIZBKORcJBDaQygQCoWCoTCYPYUoh5V7kGjjlg3cUn6VDbiNeKarsnG1IV9S - bfCrP321QUeUyd9LuY4q1+X6TKePcrvW6TYsle8dm6o8rkrAqmClr56bfc5hlhFqav1AuX5/r/ebNY9l - a5lUlk+5b3lMPH4e4zwvHus8B9vOmceY38rtyH3O48F1U2HPHj1hj+u0B3oJe0jYQ8QEYgPippF4wY0k - MYQby2uvubbFlyuvvKrFnAsvvLB9meD446fnAac4KmhNcTT/d9dh16n3byqzgkUBjdjr/AhybX4Fc/N0 - VL4AMuUtDQG7bn/TeE/sn8Sz4Gw/ANg6DcZ2o8HfCXz42Wf/pg8/Hzr7gqn377Krh1tufuB43p7a2jEe - ZeLv9vjv5e8fIZB2j0+dvf3tbx9+7dd+beBlSJ4J5D/waS/pNPHFENrSfClEAKwQKAAm/Klsw2vbbpuf - 0yXbd5lteWnk17K9ZbblpZFfy/aW2ZbXfQkkC/bSvRXt61uyfZZ3Pv1Lv7FtfUyrasVJ+BMAqYBURLqm - qZzcqdj7l2/85n/71k+98MIHz/xV+OONNh5yBv4IkAQ9wODRn7SGPwLTzTffMsLM/dunYfiLON7CmgBw - /U8gwt/04sd0EU8A6KdfNgEQ+Fvftc6BaRV4CgA2jUEH8Fv1+KFp6FYAvEd7A1jQE/6qzJ/grwHg/NIH - 8HfscceN+3VK6/07++yzRwg8p4HgeeedtwiDCYSCYPYMOlScMJggyJ2+Q8U5ZCwUInsIs2eQhsaeBaaC - YCphsIpznQ1bNnj7qjbeNtbblA04spHuqTbs6c/8fUT5hIJty2cPUs/vfK7T9Wb5VC2r8lgooaQnj3Ue - 84QYxDnJ87N03np5CTq1XuRyKH8P9cox7zrr+lSWR739YN5jwP4qjlcey8wzP4+p61asP7cPse9505TX - Te3ds1cP1V692rPnUK69e8JeBT57+oghE/Rd2WILMYZYQ8whDhGbTj3l1HbT2j6lNYNdxtJVTB01fe9v - 1FymAuO6989HcGaIIxav5ic5BLzOOxwC/e1N6Bzj/Rz/UWsTjjluGv4dAbD9hejYnvCFiVPnZ//4IwJG - oM47dOFwycWXt3+s+qRHPaa9sMg3HvmIN72AQCCdHbR7/MUpo2D2AtJBQkcJo2X2AuZ3Au0FdBi4B4A9 - CMz2PIUv237TdVp9WPq1LJfpOq0+LP1alst0nVYfln4ty2W6TlcAuFQoLfN6+dW2rWuX9ZYlfSTrwur6 - XJeqlceKJfxR8aiEdei3/r8vzzdwh8OdDg/AAn985NlPvfC2L8/8AX98rd6eP+CPZ2JomAiEBDpAggBG - wCJIEZhuuP6G4Zqrr2l3npddygeiufM8azUM3APA9iZXDP9OADhd7Kuev+j9IxAZfAwy03Mm0es3Qlp7 - 03cFf2sAXM/31eBP8Bs1fRIG+Bt17/uMv3/UcMyxx477cmJ7wPrUU08bTj/99OHMM88czjrrrBkGDw3n - nntug0FAkDtwVIGQu3N7BXeBoMPDDhErewUEwewVrMPDTjl3tWfQHkF7B5VgmD2BVdlA99RrsGvjbIOd - ykaZRpv6pwClhC+H7TK9pN5yNU8Yq+XyObB89kvts06U+UvPkLmfSt82iMnj53H2WNYy5Oe5SXmeFL56 - Xjn31IltAJi/sbQelXWqrq/KdaqlPH6zHoPc/9w+xTrqtrifqMIe10heOwLfLugT9gQ+b+y4rrnOhT1i - AMC30cs3Q18CHyKuEF+IM8Qb4g83pIcOnTvGqLOGk07iX0Lm/wNewZwABpzNUDbHWP0rQFOx7HqZdTnB - bkOrcgmAlF3/ljEeNeij169Nj21/C9qe/2u9f/OnX+bev/bdv/bs36Hh0Nnnt69SXHXltcNDbv+E8Vw/ - uY1e8V1GPubN3/DxP8x0dtDu/ciP/Mjwtre9bfilX/ql9jUM2kg+jbbUC+hbwTkMLARuA8Cesp237a/T - mp/pOt2W51TlvOk63ZbnVOW86TrdludUdQEw09XMz3JYryy2q3xOMx+r81j6esv2fFpvvspKI/wh4c8X - P6iY+ckX7l74xhGVmd4/X/rgjV/ufPiHDy4CnovgrshPvfjCB8/88cIHDRNBk+BHYCOYCX8EKYCFgEQw - umwMQhdfdMlw0YWXtDsx3sg65ZTpLeDpG4Ax9Lt68YOPlk69f97xefcnAK7uDgkWY/BYgd8sn/WbevgE - wFH3WMPf1LMH5AF8a9DrasxvzwfO8HefMXAdffTR43YfN+7DCWMwPanplFNOGUHw1OG0004b70DPaCB4 - zjnrHkFFMM6ewewRBATtEUQ5PJzPCSJBkF4Bjr8AmBBIA1OHhJ0mCAqD9lQk/KkEwCobyGyAlf5sXGuD - nBCjXwl+CX/CkOCklh7kr/Kh/oSvXn4q8y3TK6ePaV0Gf/5mlnF9iHyBMZUgiBIGheTecfQY1zKWSwDa - BUt5HpHn2HqQ576WTWU5y5q2PtX1Lam3bOYjtj33zXmXdTn2Q7jrqQKf14ywh7ieEvq45gS/2suXwMe1 - LPQJfNnDRzxACX3EDHv5gD7iCjeaQh8xhxh0zjmHWkwiNnHDeuKJJ43xdhoKbtA3w9gGAM5wlpA3xd1Z - M7Apy1huWn4EPXyr9c1a+Sw3pVludaM/xnz+l3iCQDoEJgBsz/45/DsCIP/7e+op9P753b/xxvvQRcPl - l1013HbrA8fz9Nh2nTz72c8ZPv/zPq/1AvJCYw4FZy8gj0XRRtZnAX0reFcvIABYIbDCXgU/pWX6ILa0 - jv+o69sYAqaQBZcWSMvyH4nlOvb9/W35+64PX600KOGv1/tHxaSCUlG5a6HyUont/eO1d3v/eAiW5yBe - 97rXDa9+9avbXRF/Ss5dEl+35yOmfL+KBovGg2AJEBDYCGYEMIKW8GdAIhARfFov2LkXDOeec37rmp8g - cA2AGy99jAFp/ZdE44VvD+AcEIC/7PVDSwC4kgC46t2boG4CQKb3nKZ3n1XTDQAZ9r33GJzuOwakoxsA - HnPMMQ0Cjz/++HFfTmwQePLJJ69A0B5BegMBQY6D4rgQnO0RJHAnBBLYc2iY4M8dP41BBcEcGu71AtLo - ZC+gMNgDwSX4sweQBpDGURBMINzVWNPQ1kYYuKBO1d4sQSXBT+gBhCpECVI8npCf9vDzHFX5uQ6WdZnM - r6rLI38vlfn5DbhclnKWSZ8SFqt6YLgLCPMYmlaWScgT+nrlLOt5VBXomK+yXKouU9eVZVPCmsr1VH/m - u3zdbsok+Al5Ka8BroeEPm+ghD7BL6GP3j5Uh3eFP65hruUKffby9aAvh3e5kazQR5wB/Ig/gN+ZZ9A7 - xgsSfCbl5AaAvLwGVLURlTmeTj19pMsQLb6WN0Ia5ZoAtlhmVQZNea6zTVmPamXn323p9TKt52+M9Uc1 - AKyffzluAsDWeXDScCLDvyedNsbdM4bTTuXZv0PDuYcuGC69+IrhxvvfPDz8Ex/Rzu1Tn/LUdl3x9Qp7 - AV/+8pe3R53oBeQvTmkLaRN5K5g28p3z9wHtBfRlkKVewKU3gpd6AG3XNdM5rT6sl95WLqfbymE1f1fe - tnJYzd+VV33tLWBnetZbqNq+67DMtrLYPuVyfbusrs9lU1YaKpMAKPxR6ez988UPh37rix+86u5bv299 - 61tb798b3vCG1dAvn3th6Je7JL5wn0O/BEwCJMGOwEYgAz4IXASq1vM3BiUCEsGIAHTWWTyTccZ4YZ41 - nH3moXF69ninBgQyDMzbvw775jN/MwACf63nbwwMc6+fwcJA0oZ8gb956NfhX4GvDvlO0Be6OwA4apze - nfQ8vXsDQIBxgr97t94/hn+BwFFHHdUg8Nhjj50h8IRxnyYQTAi0N7CCYIVAewIJ7gmBBP7sCRQCsydw - CQABdIeBhcAqGy3OKQ1aD/4UDWCFQOEvG1obWxta4SIhA5gQWFIAh+kEvgQhoS/BL4EL+ZHfnvIjvQDY - rvL1A7/KdaRyGVQ/Fmx+iuUSElEFQpX7nscECcaCoccw5bFNVcjzHCyVt1yCo0DleU9/KuvFkYp19Ooc - 0m9eLeM2KstU+LO+V1XwS+BDXmsO8Sb0VfBDXL/CXw7tJvhxI5jgl0O8gh/xpAd+xB/iECMTxCXi04lj - rCJm8SzgMccSc+cb7Bnuprg6xVaeq55iLdPszQtAbPA2TZmfQG4TKtt0nl/7p3Lkp3j2kO0RAlu70P4R - yuFf3/49eTj5JIZ/T2ttCt+e5Z+oLr7osuHaa64fj/WD2zni3H7akz+tXSNcb7RrjG7RC8ho16te9ar2 - LOCb3vSm1gv4Mz/zM20o2F5AnwXMfwmhfQUA6Wyh08VewAqAttcV/JwqLeczv+evVsthOZ/5PX+1Wg7L - +czv+avVcljOZ746bAg4rfpc6P+U3ZG/7b6orEAJgFQ4e/+4E/HZPypp7f3z3z7e/va3t0r+lre8ZfXW - LxfBN33TN7W7ope97GWt94+/MaIxolEhmBMogQICnr1/DFcAJgQpgxNAQyAiCE1DDuNFevIp453nCEWn - nTGccdqZ493a6e3B3RP49t8GAM7d/Q0AJ/ibAsI6qEwBZQpAm+BnGugbAa719E3P8B0GfmqGvsM05gGM - 01u/8/N/o+5zH3oCZxAcIZDewIRAewIdDs5nAxHBGQmBBG+COMG8B4A5FEzjwLGmseC4+0ygAIgEQBoe - AdBewBSNVfb+0ajZA5jQVxtCATDhr9fA0lBTZ4S9lIAh3CW4VOBLyFP2ntmDJngJXYIXd/v+JyzpVEJZ - lk/l34T11pPL5zpcxr8Dy78FS7m+XE+CYYJmwqGqPYdISEwg9FimD3m8UQVFz0Mtl2U5h5xLxHneR4Kh - daP60l9lvhDYAzr9vTrZE/kJgFVZ97kWvDHiWkkA9Lqyxy/hT+gT/LheuW5rz1/t8ePaR8QBY6vwR4yt - 4McN5qrHb4w5xJ/W4yf4jTeoxChGLo45huHUEa6OOrqpxVpgLGLqFE/54sE6rhJ3c8RlBYZNAXJjWtBb - ayrT1MpVAHQ+AdChX//5Yw2AfEcW+OP5ctqUQ2efO1x8Ic/9XT3cfNPNw+0PuX14xCMfMTzmsY9p55q6 - y4sgXIs8284Ljjzrzn/b5xvB9AIyQkZb6cehAUCfA2QYeAkAe8PAAmBt05WW6SXbVeb/tvVt9ADus/Is - v2S78pesrru3noOse9v6zLPi9OCPOw17//LlD4Z/AUCeWeDZP//rly5turbp4vbNXyp9PvvHG1IveclL - pn/6GBsnGhUCPYGSgAgoEOgIbAQze/8MUgQngAbIMQgBRAQgPpZ8wiiGH04ZgZC7tlPGC/iE4/kANHd3 - awAkIBEAVm+ijWp3mGgMIO3vhFYBagS+Bn2h1RDvBHlTrx5wN/nu3vwdAHRIuE3x3WNc3z3H30D3Gn97 - AkAhsA4HE2QrALYe0BkCfS6QgE0PIEE8h4Er/GUPIA0EvQQCoI0IDYoQSGPDuekBoNCX4LcEf8JelfBH - o5nwZ4NawQ84SLBABOKEuyrqnHCngCBgKEHPtOAlpAlfvf9qZZoSzjLPZXj+tf6Rf66vrsNlXS6X78n1 - sWyFQ5TAyT6mEhYrKCYYCspKP8fZnsQlZZmESLULJO0xVMJiT/XmYGlZylQgrLKn0Lq4lFchEHljg6jr - irpfYTAh0N6/CoDcjFXwQ1y/9uIDf9zYbev1IzbY60fM2Hy+75wV9NUeP+FP8JvgD7BiqJXetvuu49kY - W9Ea+IDAe0+xtaWZzt9AbZrjL/+zPkoQbOkxr6XnaaqBYwO+TehTfI6mAWDCH9qAP3oyT27wx4sfh84+ - b7jowovH43W/Fic5xgDgwx/x8BbXOLfUH+o+19WLX/zi1tHByyD8y1X7LuAb3zh9F/Anf/IwAKzPAdZv - AlYApG2mja49gLbrKc10+rBeuV6ZnGI9H8Z8Ldcrk1Os58OYr+V6ZXKK9XwY8/q6n4FJW1phz38Qq8v8 - W68PXw/+lgCQCujzfx+eX/6gsjL868sf+ekXKjlvPvHsA5WfuyAeigUA/Z9fGhmCP0GXC4igR7DL4V+C - F0GLYFWHfwlIU+8fz5zQZc+wA89wHNsEEHIRTxoBsT0TOL0B3P76DQCkB7AO/xKkGgCug9EEgPNQb8If - sDeC3QYAOn835jd19xH4Jt19uNvd7tamEwBOPYAAoFrqBcxnAYVAewAdBiZ4OwTMMcsh4G29fw7/0oBU - +KOhWer9E/rULugT9KqEvgQ+G1obZhtrGm6gQFAQHIQ8gKVKmEnQq5AnIAlewlcFMJ71oScbkcbnPA0A - Mk9lHr0EPAqRwpfLqvwtl1V1+VwHctsSDIVDYTP30fmExB4cehwrKCKOdQJ2ynPhvOCYAJnyfJpOaOxB - okpY7OX3tASXSkjsyfqpdkFhBUOvDSUEci1xTXGNAYJccwmA3JRxfXK92nMv/Dn0K/wh4U/wS/gjXtjj - R4ylx0/ws8fPXj9vvI29xCjgj3hF3AL6iGPEtXt6gzvG0SagzrjaYuum2j8hkW754zrm8hsC9oDEFRwS - t2cAnCFw/ZZxAOAY71sHQAPAGf6OWQMg/xxFm8Hw7+mnnz0eg/FG+vzpMZorrwwAHG+EiX2cI84f55z6 - yfXCdSoAZg+gzwG+/e1vXwEgo2d0olQA9BnA2gMo/AmAtt9VtO29th/Tb5ksl3laz5eW+UrLPK3nS8t8 - pWWe1vOlZb7CWg8g5nTJan6uRNu2LssvLYP1lkvbtqy2z/rwKysK010AyJ1IDwDr838C4A//8A+vPv3C - XRDP//lfvwmABFWCILBAkAMsCGwEtCUAJEABPMBPhUACkUHoqPEudAKo48a7uunOroHgeLE3EGwQuO4J - dAjhsB7AFpiEPwFQqFvrHncb/SP4AX9tfu7pI323u919+PiPv1sT8IfucQ97ADcB0B7ACoD2ACYAEpwT - AIU/jlMd/uU40gBU+MveP3v+hD60NPSbQ700VIqgmNBnT4eQJ+gl7C0BHxL4kA06Db8wQOAFIAQMgESo - q8pevAS8BLsErpTwBWxRjxXP/CDSPACu6O3Ocswj8mggGCbimVhEGl8un+vIZRXlXY/pXIfLsm0VEk0n - LOa+Co7CYsKhgJhpgREJisJ1T+Zvg0jPZebj6/U4phISkfMqy/TkclXCppCYwOiNSVUPFhMOBUJBEGWv - YAXBHgTaC8h1y/Wb8GfvnxDIzR+xQPgDbIQ/e/4c8iWm2Osn+NnrRyyy5y9jLnGL+NXAb4xtiDjHze7d - x5vfKeaN8Y542mLr+sa6xdcxjVZ+ZSyetQZBpjMMNiCcAXClzd7ABoD2AB61BkA6B1rvX+v5G2+sT+Ul - u0PDueddMFx80UUjMF/W4ibHk2PMcRcAOV+cT+oOdZtrh+uQIWC/B+gzgH4OhmcA9wVAPwWTw78VALM9 - T2k9f/Wpar289OmvPlWtl5c+/dWnqvXy0qe/+jaeAUSa6fTXaZrlenlY5mcZ0+lbslqmt8yu9eHvSQAE - /pDwR6UDAPOfP6icVNIEQB5mTQD8iZ/4idYDmN/+6wEggZjgSQAk0AETBLYEQAJXDgEzpEmQIkBxd1oh - 8LjjuaAdhuBOcBqCAAb5w3IeTj7+uPFOj+7+UTz70V4IGYMCgaINH8TdJFrdnbYAZe/fGgAn0ON5wDFQ - CYgt7x4Bfh/fJPwREBMAhT9U4Y8gK/wh9hex73X4t8IfAZ5jR9DnODIEJPgRzGgkcuhX+BP6UA77VvBz - mLf29iXwCXoCnpAn6GXjSKOZjau9M/byEWSpNzb+PegDRoAVe7lS9oQl5Al2QlxPPXDjQW9kmvrNW+6K - Hm985JFO8TwsPQSIdC6XsjzrQc73yqYs5/YlJJLuAaeQKTiiCooeMyQsC4sCY8Kiac9HzguPgiMS0iuw - Z77gmKC41LvojUEqy/T8LueyTBM0BcWcFxCtp6aV9bgCYwKhN0IJhFxHu0DQZwGFwARArnPhj2s/AXDp - mT97/4C/BEDjT8KfvX5oO/xNox5THBxvftvjL9Oz0JOIn2PcXMXXTbXh4gRCegkBQKb3BP6m3sUJADd7 - AzcA8D5j29A+/+Jz4QDsBH+8PMiw72mnjvt9+vSVBeLpJZcw/HtFO34cU3sAOQfEPc4T57ECIG0ez7+/ - 4Q1vaO0hHSO8IMln0mgvBUCHgPNbgLS1uz4DIwDahqvavi9Z5pmuU4x0asnqMr0pRjq1ZHWZ3hQjnVqy - ukz3MzCqWs+HVX/Om2a65NeWfL0yWJbPtLbkywqSlScBkApm71/2AOb3/wBAv/+XPYD5DCDPPTgEzDOA - NEw0NDQeBHMCK0ERIOCOF5ggqAmABDECmMMW3q0arLxL7fUEHj0GpmPmu1KCUmoCLJ6vmy7+NgTAM4LH - xPOB451iG0IYgwlBpAWUMcBMd61MIxi1HjyGO8hjWFjwm4JdC3x3m+DPYCj8JQCut213z5/wR5DiOCw9 - 9wf8Oewr/Dncy/F1yJegxnCvQ70V+vI5v3y2T+Bz6IoGS+gT9hLybPgS9Gwc7WlJ0EOCno00ovEHAoAB - oQ+gEPIEPMFFyLP3S9gTeBLsEu4Eu4Qu4Y07fEWw5zEH/gUgRb1HOc+Ul6JS5me5XLbO98q5HufZHrYt - QVPlfEKjoIl68JjQWGERcVxrz2Ief6YJkEJjAmSm6zznt/Y6Cov2LlZRR3p+VZe3x9H6ZTqBsyfrqNAo - OCrrs4BovRcIuT7s9RYIuY56IMg1yLWYEMh1y/UrBHKNc60TQxMAcwi41wNYh3+Nr/b+AX/EpQTA1Q33 - GMcEQGIc8qZ3BYB3vetw11lTTJxvoBfgDxFnHX0RACeNv9cgcLx5BgDvNW6DAv4CABnpWfX+tZ6/cR+O - 5dnxadj3pBEATz6JXs7p5ppjQDzlGHHMiJ3ETECbYw6Ic044T8Qxzjf1kbrNdcO1yN+e8iiUfwlH+5j/ - C0wHCh0pvAXMlzXyO4D2/tEG0x7TMSP8LQGgbTuqVv29cs5nXq8cVv29cs5nXq8caNEp4gAAQPZJREFU - Vv29cs5nXq8cVv11vgFgXTAL1Tys5+vZtnLb1o9lfi2z5MtptcxXteJUAKSycddBBVwaAuauJf/+jZdA - eL6Bt4Dp7uYDmHR/+w1AGiMuDBoJAjlBlYBI8Ku9gAQywMReQCCQuzAuRu9YgR4DVQ1SBijvTg1QQFb2 - trVPsKD73Lfl8/DyUe05kXm4gMAx+ggiQuAkgtBmoEPTne50tzsFtwn4DgJ+BNUKf4IfAbmCH0Fb+LPX - j+CevX40ADnUa29fPuNHL0IO8wp9BDp7+4Q+BPDROGVPn717CXsER3tCepBH40jw7AGeEvTsCUL2MAl9 - Ap/DnQl4CGjpgR6wk3BHPQWelEBFQAeyqMt840vRw81jDtzocMe/TQwJIee5Nnr5rAs5r7KcZWo55tke - tottTQmcPb/w6H4DtQKksNiDRlWhsYKj8FjBkXiwpMwX4CtEJkj2RP1AztsDqV/pFy6pX6mse1kXBUgh - krqqrL/UZwGSep5AaA+iQGgvoTdNwiDXWIIgN2HES65TXw4BBJd6AokBxNHsBUwIJH4QRwBAb66NraeN - sYfYmjfZAmCNrQmAUzwM+JsB8C53uetw5zvfpekud7nLCIPcII8xssVRoG9cXjCcNfnjxju0/h/1CQT9 - xMwK/uZn/wQ/nvnjW4WMBjE9bpxnn2g7Tjvt1LbfHAfaGmCZ42bvH6ANeHP8OR8AO+eP80w9oq5yPRAb - Xvva1w48//eWt7xl9QkY/xM4h3+z98/h3/wnENrjBEDhL2XbXtv69KXlfJbDemVT+tJyPsthvbIpfWk5 - n+WwXtmUvrScJ734EkiuINM5PYjlMkvL71ov+Qf57V5Z11ElAAqBCYDZAygA9j4CTXc2zzXkc4C+CMJF - QMNEA0OjYS8gQZWLhgDIRQRIABgENECEQAaoEMS4kwVk7AlMCDRYAUcEKnsD824VoKp3q/epQeteE5gB - dvcKTaDnCx8z7I3TCndIEKwS+JTgx7Yk+BFUE/wIuuwTQZh9rODHMegN93Kcao+fvX00Dhxbh3lrb5/Q - 59CusqdP6AP4aJgS+OzRE/gEPCFP0BP2aBRpKO2JsVGtjTANM423vUH28NmjJ0wAFgl59mYJKQl69uLZ - e4eEI6FOsKP+Al4AG3f1fOAVmaaO09vNA98pPoKeoozlah4+81mf60y5XvJ4vCLLuAx+tw2xzfsowdJ9 - F3ITFIVFJTRyHIVGwbH2NCYsCoxVCefOcz7teexJoKTx9QagqoJkVQXLnCLrXpVgiRIkqbfW44RFwZC6 - nzc9XicJhYIh11YPBLM3kOsWEORa5oaOmzufCbQ3kHhAXHBUxZ5Ah4JrLyAxx1EWYpEQmM//VQhMAETE - xQ0AHEXvH+B35zvfeUN3vetdWn6DwRZr1xA4ASDpEfqYzvCHrwJgG/4d4Q/wQ0cDfw77tuf/2OaxLZjz - eE78xLG9oO0484wzW4wlthJTAWaOG8ex9v5xw0vM4zxynqlD1FWuA64lrmue/+OxKNpF2kdGyxg1Y/SM - UTR6/+rnX3L4d1vvn+C3DQBzvtqSv5rlLLu03JK/muUsu7Tckr+a5Sy7tFz675QzmcYyjZlf/dV6+UvL - 7LM+bWm96d+1PvOrdgGgn4GhYua/gPDtIp8DpBfwnfEpGLq7ueuh8vMsIA0TDQuNBQ0AQZugSpAkEBLo - gAghkICWgYyLjzswLkQuSAIXQcuhC3sDEwSRASsfXPbutQavvIu9N5A2w9oEheuA1oBuVkvP+YKdQJnz - iHUn9CF+P3v72E621x4/Ai/7w74RlNlP9pf9JmADfgRwjgcBncC+1NtnTx/Qx7H1ZY7s6QP66F2osEej - Q+NjDx/ATqNET4XAZ49e9ubR0GWPSA65CXrUARrOBDxk7w71xJ49GnBBjzok7AkLAkYP8OzJQ4ALQFN7 - 8QjawFBCHkAlfBHQ6dV+/etfvyHqODc7PPbAHf+SyFfM861MlHmsZ0mW4fdSWYZ5t4tt3Uc9AK0gmTBp - T2SFRo4j8rgKjwmNngOhO1UhUpDMXseehErrwTYJmKnsrUywVNljqQRKRf2sMGkdRsKicCgUKnsPhUPB - kOuJa0sQdIiYGzBBkBs0rl2uYa5lIIXr3GcDl0AwewPr84D2BCJ6xE6Lm2tjqXHUG2tj3BIEJggCgVMv - 4AR/H/dxHzfc+ePGNBrn79KA8K5jWZYbb67HG/DpZpxnsefev/nRG7Ua+r3PBICtBxAYbHljmQaK8w34 - GO/Zbp4LJ+42+KPn75xD7RjY+8dxIpYSQ332jxjJ8Sf+cX6IZ5xj6gp1lTrPtcP1yNu/9b+AffbP7/85 - 9Ouzf9n757N/CX8JgBX+lizLLJXXv5SflmWWyutfyk/LMkvl9S/lp2WZXvm9PwPjwnUFH03L37yjfru3 - TrQPAPoiCHco3Kn4TyDcwWQvIHc3POTKw670Ar75zW9uEPiGN0z/CEJDQSNA0CaoCoEEPeABCAQ2uMC4 - s7U3EHBxWCN7Aw1cCYJ59+oQBuICFwgrFBLIEgoJDNlbKBw6rcKfYKdcD2K9Ah+/tQR9vWFeoa8O8XIM - HOa1t49jVKGPhoDglUO7vWf5aFDqcC4NDufFZ/Ycyt0GfBXwaPQcakvQE+5oNIW7VIIeDTUNePbqUY+W - YA/oEO5Q7ckT9FD2pgFDS3AHrPFoA6JeK/71hh5vgr3iuZ+c74kyqV4ZxLpTvGXPbyLS1c82uZ27tASh - 7DfXbapCZYJjQmNKcBQWl5Q9j8JkBcheD6S+CpbCpPPpQxUys7cytQSZ1kPnUQVK6q71WIgEFKnzCYbC - oT2IXDP2HPpcoiDI9cd12OsVdGhYEOR657oXBO0VBAQdFiZ+2BvocDCxBgjMeGosFQKJW8QwJATmTXSF - QEEQJQROvYET9DUQvPMIgmgEQqCwgeE4T4/hx7eh4hEI2wgM65x7CBsYjoA4zt/zntyc448Rm+afbtKB - Q7b1uOOOHU48gZGWaZSF9oJ9Bf5oU4ivxFViKvGUY8gNM/Gywh/nj/NLPaEuUtez98+/gONRqez94y/g - au/ftmf/jhT+tCxnepdvm/1HXt9hL4GkHckPYMzv48P0mV/lyc2TnKqWPtO1nMumrEhWLgGQygcEVgCs - zwHm9wDtBfRZQCq/EEiDQiNRewJp/Al6BDqGQAhuBDZ6nraBIAFMEKzBi4sYGcAAKYIYcCUQekdboVBV - OEwJikxV5hsYEetAwh7it/hdfp9tYbsIQGwn28t2O8TLnSgBiX0kKBGw6elj37O3j2PCsRH4ej19ObTL - sbWXL3v4esAn7DmUSw8FjZLAZ89e9ujZsNHIAXr2juSQnIBHgyngpWxkCaxCnqIRpx4BAUCCAhrszRP2 - hDxUe/MQYAPgUEcFPWGPuitkAWnUZ3q3UzzzSl1H3PigTPfEy1KKHnPkfC3rulP83SKqvtwutnWXEj57 - gMn+V6AUGIXGBMaE54RFxDGv6vU8CpKcN8GRqUpwrH7iizAJRFaoFCyFSwEz61BKwKSeJWBug0rqqtAo - OKqEQ6HQHkTA0N5Drx+uJXsMudayV5Brk+uU61UYzF5BQZDrn1ggDAKCQA1xoweCxJsKghlDhUBiGiLO - EfeIidz45k2zINjrERQEEwZTQB89gQBiS/O84F2yzLSsvYvT0DGP4qyftwZG+Sg128X2sa1sM+B36qnT - DTf7ZbylHeE4cEw4Pgl/xE5iJfDNOeCcEN84h5xb6gD1jHqcvX90ivjiR/33D9pSev+Wvvu3LwAi2/ic - YpnGlvJ66TrFMo0t5fXSdYplGlvK66XrFMs01stbAWCuoC7Ys4OWWyqb+ciTmSe150NLtm+Z+huIimU3 - c0IglZFKWXsBuXPhDkYIzE/C8KYTXzz/2Z/92dag0RjRmFQIJFDS0HMBcSEBEMAFsAF8+Gygd7YOb3BB - CoJcpPR+ccEuPdsiFPqMC6o9hSgBUUgUFIVFJTSmzLM8ch2I9SN+i9/l99kOxDbl8C7bbk+fvXwEa+5I - 2WeGd4U+AjrHJHv5CP7AM7KXrwd8wh5DTIjePXv2EA0O52SpZ8/ePXowEvbs0RPyHGJDCXz25CXgEUht - YKknNtA23EIeoi7R+NcevQQ9gSQhzyFYgEbY6YGecCe0EdC5uVHUcUSvN8/59EQPAOKayHQVN045b9kq - 11t/k+1gm9xGpgi4zO3Wn/kVQNln9h0JlKaFRsFReKzQqPQlQAqR9jqmEigFR6ecU6HRdMKkIs4o4RIJ - mEJm9lSmqs9ezITNBM6ETuHSXsoER0HRHkfqPvDAtcA10YNDrieuK4eQuf4SBrleEwa5rrm+udaBQZ8V - JCZ4M50g2Bsa9qaaOERMcoSFmNXrDeQmN0HQkQ/Ay5GS7BkUCO0VrLrb3YW6w1XLur7V8O48KsPvc3O+ - hr71c9XsgyMstA0+TkMbwnEgvhJb86UPjifwx40wcZBzwrkihnGOOf/UK+otsYTriOuVFz9oG/nXLF78 - oPePDhRf/MjPvtj7JwBW+BMAbb97sp3X0pdasl65LJ++1JL1ymX59KWWrFcuy6cvlbYBgJlpepdP6/k0 - 8uqyOVW7TigS1JzPdaTV+Wouk+tjauUSAIVAewGpnNyhcKfSg0CGgrm7cSiYnkCee6BR4kKgQaUhILAT - kAmiBEouHIIggY+7YO56CXD0LmWPIN3uAAzBTBDk4mRogws1n3MBkABCg9kVI0QJhQQ1A1sPDu01RN71 - Jig6TZhT5Al2VfbuCXoJe3VoV+Dr9fAJfOx3D/pySFfgc0jXZ/dQ9u5xnBnGRfbuJezR6Nib55CtPXmK - xkrQcyjMXjx7QjjPiIZP4KNBFPIEPXtuaFRtaGmAE/IQwZZGXQgAEgQ9h20FPSSMEJyBFkEPsLE3jbqa - wCRkEcgBNES9TnGHj3jIO8WNEOJaQDQEiGeBVM6bb/mU6+opf9NtQWyb2+x213l9CZwCJfsuVKaExtpb - aS+k4OhxVQJk9jwiex4V58deSCEywVFQtBeyyvwU9SHBMuUNwi5lL6agSSyrgAk8JjBWWKRuC4nUeQGR - a4HrAgmGwiHXFVAIEHINcj3aM+gwMdcvMOjLIwAh13wOExMXvJl2iDhHVoRBewWJRz0QJJ4R64iBAJU3 - xYCWIyeOjgiE9g4KhABblSAn1KVqWcR6WC/iN/gtfpttAEy9IQdYidHEYuIw+0HsZd+MuYAf+3/rrbe0 - 2Eobw/PoxFR7/oiVHG+OP+eD8wTkJ/xRX6nrXDtch/T+MUKWn33Jod/eW7+2wXbKCH7ZZte23ra9Wq9c - z/4zre9OPWc1y9TpQSyXqeneCV3yMc10zyyTVn2k6/pUDwIdCuauxF5AXwjxeUAgkLsa7m54HtCeQBou - GhgaEhoMGgECPEGaIEojTmCkwScIAgaAA0GOC4zgxl1u3uE6PMwQB3e1+SkEhzlqQAOg8g6XuzzERZ89 - hgY6gAwJiAmJyp7E9CHKIZdTPdAz8CTwsY0Cn8/ysT+9IV323R4+gY9ABfAR9LcN5Qp79uxlr55DuNzh - 0tgk4Al3NkyKecEO0ZjZk8e5JUgKeYKesGfDSF2gwaRe0IjSoNrA2vDSCCfoIRt56pWgZ2+ePVQV9gAW - AEbYsxcPAAKGqLdCnRAmrPHGu6Kepwj2ikciEA9+c2O0ryzPtMp1LsnfZltyO1Fuu9CpKnwmUAqKSoBc - gkbB0XT6UPY8VohUwGQCpb2QFR6rPN+e85pXAbMnoVOlr9eLKXTWnsslYKRe2/MoKAqICYfZe8i1xPXF - dUYPOvDBdcn1yY0ZvYNcv1zLyB5CrnWAkBhgD6FDxQ4TGz+Nnd5ME4eIR46sGCOJZcQ4b5j3gUF7BpVA - KBT2JCgifQl7PnrjIzb8pr18QB/bw3bVERZ7+xzq5SabHj/2m/0X/ABlYirxlONHzKRNqvDHueOcct6p - K9RX6jfXCNdWDv0Cf774UZ/7o51deu4vARDZfqOeZV6vTOZV9SzzemUyr6pnmdcrk3lVPcu8XpnMQ60H - sFcQy8JaLcu8qtbzYeknXU/krvnqS6vz2FK5nlgvqhDoUHD2BCYEUpG5m/GZQHsCediVBokLgIaExoLg - T3AnGBM8uWAIjlw8BEKCHwGPC4s7XnqaDGzcdQEsBDTubuudLb1evg1XH4DmoranEKgiuHHBL8GhUGbg - A9SExF2iHOVTrMP1CXk5nMt25Bu7Ah+BCNhL0PP5PYCP/Rb4nhTDuQIfsEfQymFcjmP27Dl0mz17ADgB - DuCjsQHw6MGjAapDtBXwaLhowAC7Htwpe/NoBO3Jo3HM3jzqhz03CXiIRtjGWdhD1C0CsL15KEGv9ur1 - YI86CyQJU8IXUEYwV9RxxN29YpgnxQ0R1wN3/7tEOcq7TE/mo/yN9Lktbl9PbL/7k+CZkClIphIehUbB - sfZKLvVQCpEJkEJkwqRASdzInseePMc5r5hnWdLWB+GyJ+qP0Gk6fT0QTbhcAkZhMUHR3kVBkWuA64Fr - Qzjk+uFaEgoTBrkZEwi5SXO4GEjh+uZa57rn+reHkPiZIEg8IbYIgz5mw0iDIEi8ckQlh4eFQeCqDhEn - DCYQIoZlU0KisvdQyEOUE/aydy9HYxyBsZcP4GM7jc3EYuIwMZi4C/TRNhhvaTsc7iWm0usHQBNDiZnE - SeIix5/zwTkiZnFOhT/qqvDH9cR1mfBXh37pWOm99JEAaPus0mi/t1kvP9v+av8Z1negt4C19PXytZ6v - muvgZPbSPZnvtGc9v76covrbqAJg7QUEAns9gVRqPw9DZefFECo+DUyCIAGegEwQJVgSHAmKBEMuJC4o - AAKwADoMbkAJgY2gxh2uPYO94Q6HOmovITCVPYVc9AY6AsHNN03fHUwlJBIEBTelr5cn3Al42atH0AH0 - +H1k7x4BiEBMEMrn9nIYl+BNYGKf2fccys3n9oC9BD0aBZ/Tqz17Dt3am+dQLcCXgMe5cXi2gp1Qh2jE - BLse3Nnwcd5pDBPyBL0lwKPxtXGmwRb2bOztfUrIIyALekg4EfiAG+opAVvAE+iox8BXwhr1mx5vp9z4 - MDXtPNcCwz6IXnLTPVH2SOTvpdwWxXaquh9MhcsKlMJkAqXHp4Kj8FinqPZMVoi057EHkr1eSMQ5XRLn - 3POOLJ/QmaApbGZPJQ25qr4Ko8Jl9lwKkwmNSFgUFCskcj1wbdiDKBTaY8g1BxByPXJtAoT0unO9EjOF - QoGQaz5fJmG4mDhB7My4SZxZGiImPhLDiGn1Zhmw6sGgj9DYOygUAm0KiFOCohLwFMsKejmcy2/Rw8dv - O9Ii9HnTTWw2HhOHicHEXfaR9sFHZwQ/4irx1MdhiJ+0QcRG2iaOP+eE+MV543z24I/rieuPdjH/7QP4 - q0O/tLO7ev6Q7TiW6TvC/rOsbycAYv7YPj/aK1N9OU8aeUKdpj9PeJ1HB7Esv7Q+5ysEZi+gPYFU3Hwm - kDsaKrdDwvQG0jjRwNCQ0GDQABDguUAIpgRMLhoadRp5QRBgACi4wyLAASHe8QIrgAtBzTvcfAYGEKIH - DEDyLpdeMkCK4GZPIRd8bwj5wbdP/4GrBDSALUVQVD2/yyHXRTBFgCgBVtizd49tA15rjx7BiGAt5FXQ - Y9+XevZoAOzRA/IQjYPDuPbsOWwr7HHskb14At5Sj50S7hLsenBno1chz6G7hDyUkGdPHnVI0EPCHo29 - kEd9AzAIyA5/AiHURSHFnjDhJwEPmKIeA2gAHKJuKwL7krjjR1wPiF5y5PyScpltcv2o9/sot1UAdT9U - BdCcr1CZAGmvpPP6EiARxxX1QLICJPK8JDQqz5/plFCZSr9poXMJPLO3sqoHn0JlBUlhskJj9kD2ALHC - IdcM1xDXlL2FXH8JhNlLKBT6HKE30Q4ZcyMIDNIzaK+gw8TAIPHHm2jiEjGS3jFiGLEtR1IAKm527R28 - 4or1dwUBMXrgEgoR0JbPV6v0kU5V0HMol9+hN9LevRxpAfqEPWMy+0CcJwYTd4U+Hi2yt49jQjwFmjle - xE+Oob1+xELOAeeFc8W545xyrqkP1CvqL3Wf64Zrb9v3/nq9fz3wQ7bVWqbTlvyY6+iV+c+yvq0AmAtU - ma9lGqtl0+pyKE+q8+nL+Vq22pJPf05RXbcSABMCez2B+WIIlVoQtDeQhokGhouAxoHgz4VBILY3kCBJ - YCQgciEJggQ6AIMgxwVHgKP3ieDGhUhPFTDDXS6BjV4toAcAEggBJO90hUICHHrSCFgJh4KhcMhdsFMC - BaCWwpd+5ym/TazfXj1+m21gWwxAwp7Dt+yHz+kJeARvBOgRzJG9ehX4AL3e8G0P9OjZozGpQ7NCnmAn - 0FWoS7CjAau9d8BdD/BqLx6ioeyBnr06NMI21NmIE3ypXwl4CNAQPAQRoESAAWyop0CPYCTgCWQCHKJ+ - c7OjeAyiiusgRQPgtKqW7Wlb2d7v5/YhttltN12V+5mQWaHSY1QlPCZE9kByCSYrQAqPFSKR51PZM4lq - XirLLfViJnxmmrolSCZQCo+pCpKCo7BIvVbU9QRErgWuC8GQ64driWuK64trb6mnECgkXnJd00vI9c4N - nr2DeRMN5BBTiC/EmoyX3IASm4hVxEfiFzCYIyneHGcPIUBoLyFABpjlsLFwSG+dPXYq5y0r5CHgEsgU - 9PgNfovfzVEWv4wAuHKDb4w2BgO47FtCH3GWuMpxEfo4ZsRNYmW+6MF5qODHOaeOUJ8S/riWuG5z2Dc/ - +ZLwtwSAttmpbMur0qq/l+7Np9Kqv5fuzafSqr+X7s2n0qq/l149A9jLPIgdtLzmb6E8wb10rQDOH9Ry - HUti3agHgFTS7A3sDQlTwWtvII0GjUHtDSR4ctEQHGnYuZC4oIACQIE7YAIdFxxBDhABTHIIpBfcuHh9 - FgYo5KI2wAGFXOwEOiCLXjWgi4BHb5siMAiMwBnBoko/U8FSETx7adbJbxF0cthW2LMnj20mOBOMEu4I - 3OxfQh6BypcxOA7IHj0hz548h2wdriWgIRoPREPC8U7QE/DsrRPmADmUUJdgV+FOVcAT7mgYFfUhe/No - SKkrNLbUG2RPEA129ubRyAt4iDqXoCeACCeAi6CXsJeQB1AJW4IYjz4o6rziLr8nbpAy3VOWr9qnXG5H - KrcVuQ9VCZUqYVJ4XAJIxPFTHtMKkaiCZIXGCo6phMiU53ibLCN8IutHAmhCp+kKkgmQ1sMKkEJjAqM9 - jgmJ1HXrvT2JwiHXDNeRPYZcbxUKuU65ZomVwqA30MALccARFXoHa7wUCB0mJib5zCBxizjnM9f5iA0j - GUChj9YIhX5mBjADCumRA9bonUPAW0/mU1b5WA1K2AM8hT179gQ+buDZTgA2H6FhX3hshtjLCAr7SztB - bOV40GvKMaJ94bgRKzmWxEbiIcedc5Hgx7mlDlAvqEPUUeGPa4hrMId9hT/a0ez5W+r9o222DU+r81qv - nHI+p1qd13rllPM51eq81iunnM+pVue1XjnlfE7vlJnVamEsfT0/luk0l1lSnuSc19fLN63SevO1XPqU - v6MSAnsg2INAewNpjGhoaDxoLGgACPJcGARagykXTcIgQZDgBxgACwQ8gx0AQpDjzpeL0WEQAxw9hAAP - Fy/q9RQCUgQ6es0IdvSicQdMEEgBjNmTqIRHoQ3hJ5CkWE5xZ+k0Aa8+m5c9eD6b53Ctz+blsC37CABn - T54vYHA8OC5CXn3+DsDLIVp78uy9s+dOyAPsBLqEOHssTAt1iiBZAc9Gzp48Gj/OPbIXT9AjsNKI2qDS - 2NrwUn/sDaI+VdATFgAJwIL6R1BGAl8P9gQfgIg6TPAWsAQw6rjixgdR9007j7wuUvj0m+6VW5Jl62+l - D7l9ua2mEyir3F/Ug8gKjlUeQ9TrjVQVJhMcK0CmEiKd7pKgWedTFUArhAqeCZ+C4xI8LgGj0GjdXgJE - rg+uFXsNua7sLeRadCiZa5TrljjJDRuwwrXN9c71Txywd5A4AeD4/GDeQOeIijfPxDRvmoEnewiBwhwy - BgrpZQPA7C3M4WMflQHaFEO0Sl8+TuPwLcrHaeiFXII9tovtYzt9RprtJ1YTh4n5DvESa9l3YqrP9xE3 - gWiOHceQ40lcJBYS74hjnJsEP8479YE6RJ0U/rheuKa4NmvPH6rwlwCY7XPPev5afqlMz/6zrG+vZwCx - XStesl1lye+d5JT5WSbTaT3fNrM86v2GskJWEKwQiHJImIaGSk/DQYNAsOeC4MLgAjGYEjQJlARHgiEX - FMGPi8s7Ye+CCXbc/dLjxMXIRSkQZpDj4vXZmLzzJdhxkXP3S8ADqgAsAJHAh0z74gnBECgjUBAUHXIV - 2gS3Jdlrp+y5q3Bn750vXxCUATy22eFaQc8XMdg/9tPhWnvxhD2OCceGhiB78BLwUB2WrUOywh0NT8Kc - IJcS6pS9d6hCXgU8e08IqIKejecS5CHqkQ10hT2BQdBDCXv27Ak2FfaEJkXdTmBD1PkqboiquD5QLy9l - uX3LV/W2p6e6H6klmEwJi0vaBZGpJYDk/PTk+VOCZGpbXk8JoKkeeKqEyQqPFRqFxQqMgqKwKCAKh/Yi - cs0IhFxbXGtch/YUJhDaS4i41rn+hcF68+xoir2DxB+fHSROAUj2DgKE3MByIwsUcgPcg8InPelJDcQc - PgbQ8pEZ4DDTPhONMg/l4zWsB8hknTxKQ48kvyXsMbIi6HHT7Q23N9vEZGIwcZ6YS7wlxhJXiam0HRwf - 4ibxkvjozS8xkRhInCOGcW6IUYIf55y6QJ2hPhlXqP9cP1xzXM/CX6/nb1/409fLOxL7z7a+O+2zolqm - txGkd63LMttUT3j6aoUwnevex7Kcy1XV30T7QKAgaINFZacBoaHgAuBC4IIgIBNoCaZcLAZKgiIXkgFQ - GCToAQ0EPS48gp0wmIHOHsK886WXi4AnGAmHBD3ugu01JPgBV0xNEwy5G/QOmaAoNCJ74gQ2xXwVftYh - 1LHehDp+0x48e+/YPodsHa4V9Hwuj968HKpl3xG9eMKevXiCneoBnpDX67UT7CrIpYS6FOfQHg7Vg7wE - PCEvQa9CXvba2Agn6NmoU9+EBuqfgEF9FPaAlQQb4UcYEpgSshLQfB6WqfKm6EjlNZU3WFXbfie3ZUm5 - Dz3l/noMUILiLvVAsiqP/TaIVMJkSpA8UlXwTG0DT9SDxyVoFBYFRqExQVFATDhMMOQaSig0PiYQZi8h - 13reONdnCIklwqCP1xCLiE3GP+Id0OSNMSAFFAJVwBWQRc8a4AWAMbxKr5tgyLCrcCggZppnoQFG5HPR - ynIsj3yMJnv2gD16Kn0umpv1OpLCPrAvxF9iLvvJ/rLvHAOOBceF2Mmx4rhx/IyHtD/EP+IaMYxzwnni - 3Bl/qAvGGuoV9ZU6znXDNcW1WeGvgh/KtljVdrvOp6/aUpmev+ertlSm5+/5qi2V6fl7vmpLZfTdSQem - c8lqfq/srnVolrF8Pck5nxWhlkul9Xxp5uVU9X5HX0IgqhBYnwu0AaER4AIwmHNRGFS5WAyWwiABkIvK - wAcgGPS48ACNXrADZARC7tiAHi5iAIigJxz6nIzBj7s9Ln4hEQFYgFbtTSRg5BBrPlPHFAluVZZDrNP1 - K34T8fvCXQ7XCnmoDtXag8e+O0ybkFfBLuEue+6EPHvtEvSEOxqe2mOnOE+CXcKdEvIEPQFvCfLsyUvI - oxGlvtjQJuzZSFO/hDwkJFD/BAtgQwCpsCf0JAwlOCVooYQ1h3W2Ka+Zbb6PRL3tqT7nU7lPpnPfVR4b - j0/1eRxRAmRPFRir8lzlfE8JlPvIOlElcKZ6wNmDR+si6sGish7X3kTqf4KhvYeCoVBofOSaND4KhPYS - cq1z/ScMetNMDPGmmThDzCH+ZA8h8Yu4l6Mo3PwCVIxg+IgNox3AF1Do4zXZY+ijMEBiPjbjPCBHj6Lz - VT5GA+j5GA2/A4gyugKcsj1sG9vo6Amwx/azH8Ry4q3AR1wllnIsiKMcG44R8Ex85DhyPIl/HGOONced - c8A5IUYl+Bl3qCvULeoj9Zvrg2uK647rfBv8KdtgzXT6Mx/LvGo1z3T6Mx/LvGo1z3T6Mx/LvGo1z3T6 - Mx/LvGo1zzTTjZdAtKXCWqZ7tiu/GuVRnvA88bt0JNZbrq4X5Xa4fSgBUAmCNizZcNAQGOANzgRXg6gB - UhgkAHpXnHfDQAMXHmABfHj3S8ADVgx0QI53v94BA4f2GAJIQmIFREVAsDdNYCQ4AovInjcgkjyB0gBK - YBHcFPmK8q5b+XuIbRDuBDwhz2Ha3vN47HcCXkLeNrAT7phyXCvkJdjVHjtBXagT7BRBUvUAr0KePSVC - XjaW1BHqig2rja0NcQ/ylHAgQAh7KIFPwLEOJxwZwFMJbqYR18Q+6pXN9WxTXU71ym5T3Y+U+5z7nsdD - 6c/jZhp5XFMJiyqhcV95HqvyHC/5mK+yjgiadT6VdWwbOKKExwqNGQcFQ64BlD2HGRsTCgXC2kvIdS0Q - Egfyplkg9PlB4yExx15CYxo3ptlL6OiJPYX0qtG75igJICYc2mvoozQ+GlOF3xfeFPP6KFMfoclhXHv1 - AL280faGOoGPfSSesu/ET2+OOT60JRwvjh3xj2PKsSXGcbw59pwDzgnnivPGuTT+GG+oS9Qx6jrXANcI - 1xjX6EHgz3T6sMyvtq0c05SW+dW2lWOa0jK/2rZyTFNa5lfbVo5pCls9A6gjrRbOMjUvrVcubWmZnrIi - 9CrFkm0rk/5axuVQ/d2eKgSibERsGAz+BHcDroE0QTBhkIuKwJd3w0CDAQ/I2AaEBDxAB+WdsAEQCYtA - ooCoCIrIHkXvlg2OTPEJZEwzeCa0Kcu7jBCXMKf4bcFOuENsq4FKuFP23i313Al22XOXYKeEuwp1gp0B - UNlDkWCntsGdgJeQR+O3BHk2mIKewdaAa9A18KZs7AUG6qIQYv1kap0VdJT12uC9JK+DTP+fUt02lXnb - yua+5v4vqR6znjy+imPucc/jX/OzTFWew21KyMzzX9MJllU133qVcW2brJ89WKxgiATDjIuCYUJhjY9c - p96Y5QjKtiHjvHEm5hCDiE3ENHsJvRFGwJQjJ0BWPlrjSAlwCJT5OI2PwSCfb2aqMr+n7NGzVw8QtVeP - m3O2y5vsHClhP4jDxF5iLPGUfaZN4FgQK42THCuOGcfPm1ihj+PNsec8EKs4R8Yizqfxx3hDvaJ+Uv+5 - TrievO6Ev9rW2g7Xdtl5raa3Sau+mqdluZ606qt5WpbrSau+mqdluZ606nPafQkkC/as5pvOaeYvWZYz - jfLk14qhX6WlL/OW0ml1Oaap+ttuj3cvCYLZYNTAb5AmiGbQNCAigyAXVe9uuHcXLBB6B0zAA2SEG0DH - u2EubiUsAkyAk5CYoAhkZXDMnkXn0y+oVblMimUS5hLo+H3lNtUevOy9Q+wT+5hwl1An2C311HEcEcEO - Jcxl2gBYJdSpBDvhjnPagztVIc/G0eCqEvZsXJdALxt4oQEJGVlPVYKNdToD9zbl9ZDXyL+16jalL8ul - f5fyWFTlMUst5fWOdc1bKpN5nkPPZz2vzuc57ynrxkFk3bKuIetfyrqpqK8JjRkHrefW/YRDrpNtUJjx - MaEwYyQxgRhBzAB6vGlOMCT2EJuIVdyMcpPqjS4SDAEsQIveQgGR3jbhMB+noQcRUEQ1jQA5lX7Fuliv - ozCOsvDbjJp4Y5431YAsQJsxlxgr9HEMOBbGSeMjx814582r0Mdx5zwYp4xHnEfjD/WA+kHdos56nXAd - ed3ZlqpsZ2tbvG1eq3k5xczPvN68VvNyipmfeb15reblFDM/83rzWs3LKWZ+5qmdAOgUS1/1L5VLy3K7 - yqSsFLsqiOlqS77qz3XUdE9uD1pqRGrgNxhn0DQwGggNggS9DHgGPYHQoJcBz2BnwGMq3HBBc2F7V5yw - WCFRUCQwClcGSHsVqwgmSJDsyTIol+3BHL+dYnsEPHvwBFxBz6FZ91PA81hkj10CnY0FU8TxFPKEOdNC - HechgU7ZMKmEOsFOETiVDR0S8FA2jkxtNG1Es4HNBrjCnoFYKFBZP5FBugZrpwdVXicfDe3zG7ktpu9I - 5TWP6jHs6SDle+elnreDaNvyWSeW6orAqLJ+5bSqQiKy3lqHrdcVDr0elqAQcb1xDVYgzJtmrntiAHHB - WJg3zMQV4x9xyJgHEDpikje79hQ6koEAMOHQx2lUPuZS55EgiSzDepQjK46iOJLCNrA9eUPtjTTbXuOs - 0Me+e1NMnDQ+cqw4bjXmcXwFv4xVnCPjkbHH+mHdsb5zzdRrVNm+atnmpr9aXWbJcl27ymm7yqWWLPN2 - lUstWebtKpdKOwwAa8Gc7/mc39dyOay3DsvsI8tr23xp1cd8XVZfygqaFdWKu9Qo9AI2F4RB0qBo8CPo - 0dgLgrvuhLkguTAz4Bn0MvAh74iVQCQoJhwmIBIclUFSYFySIFmVZVxPApzit3syWPV674Q898/95hh4 - B6s4Vopjl0q4q0CH9oU65Tm0EavyfAt5CXrIRtFGMhtQ6k+FPQNvBuDaiCPrZsp6a6Cusr5XLeXlNbJN - S9fVvnK5VK/cHaXc3zw+KI/hNh20/NJ56uUfVEvrWaovzNd61atjWQYZ96ynTGv9zfqNMjYiro+Mkcr4 - KAwi42OFQmIC8ZB4QexAxBFvlIkzxCFiE7FKIPRG2BtZ4KqOlAiJjn4Aifl4TQpwU/TWAZL23JFvz529 - dwl3CsjjBpvt8ubZKTFX0MsYavzMmFmhL+OfcY7jy3E2biX4ca48rxl3qAfUGeqWdT6vJZTXrbbNl7Yt - v5fX86Vty+/l9Xxp2/J7eT1f2rb8Xl7Ph93JRE6rT9uVt2S95XrLVx+mH9WKYn5OtSzTM/OzXC/dm+8p - K7IVvAb2DJwZHL1YbMh7wS5l0BMKBQ9h0ICnCHzKAKgERYNhQiEiOAhWSuDKHkWFr+evspzrMgD7G7kN - Kbevwp1yfxLw2GfvXqsMcBw7ZDrBjoDnMVYGwSWws3FSnjvPaVUFPGUDaN2oDaV1R2XAzcDbU9bNVNZf - lHX7SNS7XpbUK3/QdaRyO1xPne8py+yr3vHK47iPti27dH7UrrxdqmXr8rXebKtH5qUy5jmtqvU567r1 - XyBEXjdeR8ZHY6PXLtey13gCYY2BxhRjofGOmCUQ5k2wN7rAodAFINbREuAMUHRY2bTzPZEHYNprlz13 - eUON2A62SchjW/NGmdhK3GS/kPuJ2HfF8TAuGgeNdcY74xnH2xiVcck45Pnm3GfdoD5Zx/N6M52mL/29 - Mmm1fJp5mV/L9uarTzMv82vZ3nz1aeZlfi3bm68+zbzMz/Sd6oJLC6SvTrdZryzpOp/TNMv2pPXmc5pW - fUtlti1rfpWVWmXwVL2AaDDsBTpVg51AYcADOjLgGfQy8HknhwTFDIbCYQYEgqLTVA2UOe2JPCXA1TKs - z/XnNigCtapwpwQ7xf6xvx4Lj02VAS61D9wZCJHnJxsk0p67bLgycNZzncG0yuCqah3KeZT1DWVdRNbR - qlqXVa/OV19qW/7/TevDn+r59lVvnbvOz755RyLXUeuOyrxt5WpdzPppfa312nm0BITK64prLeMj16zX - MuLa5po3JmYMzDgoGBKXiFfAoDeq3gDnzS7ABXwJiRUUhUUExAly+msZ0nVkJHvv/N0EvIyzxlXjKfvD - vqUybnIcKvQZ74xnKGNXng+h3fPnufX8Z31SWdeZVjNfM72vrxr+fZft+arh33fZnq8a/n2X7fmq4d+2 - 7MYQcG8lvYXTer5ttu869DFVaZlfbV/fkRrr2qWs5Fb8XnDsBUAvpLy4MtBx8WWw88I04AmEGfC4oBMO - UQ8QhUKVMGWQYGrgMGAuqeYLbglwKteZv4UE154MWrlvykCWDYAgpxLokMeRY8rxVR5vjz1KcDMoLinP - Z8rzXZWNn0E1A+uSah3L+pfKOrpNvfr9MR1cvWOLemVTvWX+vSjrUU3vo1pXU7VeW/+Nk8hrxWvJa21b - jMz4aGw0XhBHjCsZ6wRCYCpvWE0neAmKPWAUFGsPHUqoRC6rHBnhN7xZdgrgLcVT9sM4qTJe2g5U6ONY - 9eJcxjPjVMamPId5rq0bqFfPUVqdx3o+bVse9rH1He7rvgSC7Vp5mmWZZrpOTWPb8usU2+Wr+Us+zfzM - 25auWsqzcudU5cWA8kJBNdDVIGeg8wI00BnsBJUKhDXoGfiqEhINEAYH52vQQAaVBLIq81QvKKFcr+L3 - 3LYU27wEdUigM5h5XKo8bgY7A14e5yobnJTnyPO2TZ7jbbI+pGqdSdX6pbIOprJ+Wn9Vz6e0Ol+tl79t - +V75tF7+tuV75dN6+duW75VP6+Xr+/emfc/5Lp9ppjW9j3r1FWWdzjqO8nrI64XrKmOl8po1ThorufYz - RhAzjCfEF+Oc8UsYBK7yJlY4tMcQIKtagkV9SqBDvXXxG/yecLcEeMZSY2fG+V7MzDhpLDQGZmxDvRhW - Y1OeS8+1dSbrjcprRavzWK9s9dV5rc5jvbLVV+e1Oo/1ylZfndfqPNYrW311XqvzWC27FQDVkvXylspv - W9dSnr6lvJ4fW8pL31J+LeP8UnmnS8qK7oWQF0deNGopuCkvRMHDAJeBrhfsVIKh6gXCDBApAwjKwIJq - sKl+pqo3n+tGvd9HBivU2yf3dQnu8hgxzePncVUGvQx+SzIY5rlT+j2/Ks95+lLWlaw7qNYn61hPWS9T - 2/KQdVxLP1bLZB5m+fTXdC+vTjXLp7+me3l1qlk+/TXdy6tTzfLpr+leXp1qlk9/Tffy6hSz7EeiXfVl - l7JO7ivrd70ukNdMvd68Jmu8RMZJ46Mx0viRcdA45Q0pwKUcqag+laBmz5zQ6LyyDNNcR66XqbAn4Al5 - bmuNnRkXkbGxxkdjonHQ45axLVVj1bYYlOe91gd0EKvlcx0fW99uy/J3ypneivIHan6v/C7L9VXblrdk - 28ofdH27yu6Tv4+8ELxgeqrBTXnxeVFmgFMGOKZe1CoDXk8ZGJzW4JHz25RQ2fMZoFD6cx0ZpHK70s8+ - VdX9Nqh5XJDHqh6/pYDXUz0/VVnGc7pNvbpQlXXHurRNvTq4r7Jea+nPKbbkUzmvpT+n2JJP5byW/pxi - Sz6V81r6c4ot+VTOa+nPKbbkUzmvpT+n2JJP5byW/pxilr0jtVRHaz3Oa0DV6yevPeR1WuOlMVIZJ4gd - GW8QcUioQkLXkgRFJKhlzxwA1+uxQwl1S8qb5V78dJvdD2Nk7qPpGhONh734V4+txzzPh+eqnsM8ryrr - k5bparWslv5apldeq2W19NcyvfJaLaulv5bplddqWS39tUyvvFbLYnfS2VtwX5+2tB5tW37P/9Fa39Jy - PZ+2VD6VVvOqvDBSGdQyreoFmBdnDXAqL+wMdqarDBA9iMrgaJk6v69fJcilcpm6HchtdbtzP1N5LPIY - pfI4qnqsVZ6HPDf1XFV5Puu5TunPfMsvKetSrWNLWrJd+Wn7lPvY+pbtP9P6LPeRKOs88vpYUl57Xq95 - fXvt1zjZi4PEo4TBhC2UN7JIUATSehLgqlyuri+Vv1tvkjNmooyVNU4uxcQ8RqgX61A93p4Xz1WeszyP - 1oe0Or9kuQ7sY+ub7CNZX/c7gPvaQX64Gr4lf9quecx1LeWlOV+nafh6fqzmma5TzfJLqhcLqhdXlReh - F2eVAc6p8qJfksEhg0T1ZTC5I1QDlKq/i+r2qtzHVAYy5LEx3ZvPIKc85vUc9KbbtHSOnc9pVa03R6qs - k6adptLSl2Wqz7TTVFr6skz1mXaaSktflqk+005TaenLMtVn2mkqLX1ZpvpMO02lpS/LVJ9pp6m09GWZ - 6jPtNJWWviyz5Otpqc7X6wLlNeM1VcX1qeq1j4wZxhTiDXFIiEIVsFDetAqKglkP1vaRsKnqb6DcBrdv - KXa6Pxkrc9+VxyW1Lb7lOUjlearnz/OvpV+r81hdNpfL8unX6jxWl83lsnz6tTqP1WVzuSyffq3OY3XZ - XC7Lp1+r81hd1uUWnwFM27ZCLedNL/n28WN1HuuVSZ/p6seWyqXV5ZyvfqyWy6nmcql6saS/VyYvOoNY - nVe9i7h3sSODQWpbOYPjv4Vym6rcprqdVb1j4TGqxy2Vx1t5HpbOSyrLbFM9z1XWhX3UK5++aumv+fvm - pe27zLa8tH2X2ZaXtu8y2/LS9l1mW17avstsy0vbd5lteWn7LrMtL22fZaqW6nj161Nel3l9mzYuZNwg - ttR4lECVoGW6B4qAWgJcQlvO1zyV66zKbXD7mPa2vcbKjIXblPEs08jjXI+581XV9PXytMxbSmsfW9/h - ts/6DvsMzFJBzPld5bQlv9bLr+uudtC8j2R9R2K7fmtfeUGlvAiX1LuIU174B1EGjQwiu7QPoG1T/r7p - JfX2tap3vJaUxzuPf2rpHKl6Hp3/PyHr3rapxnz6atr5XVON+fTVtPO7phrz6atp53dNNebTV9PO75pq - zKevpp3fNdWYT19NO79rqjGfvpp2ftdUYz59Ne38rqnGfPqcX1Lv2updfyivcWNCxgjjSY1FxLJUBSwk - HCYUVjDM+SxTletK1d+s21W3W22LlXlMesrjh3rHVd+SqlWf81ne9NJ8WvXVZTK9NJ9WfXWZTC/Np1Vf - XSbTS/Np1VeXyfTSvHZEQ8B3ZBnL9cqnb2l9tYzzvfK17L6W6037SNe3S0sXXKp30fa07cKveQdRBpee - lpZxuqtsVd3euh+m67HJ+ZruKc/DvxdV65VJVUt/5lef5dSSZX6Wqz7LqSXL/CxXfZZTS5b5Wa76LKeW - LPOzXPVZTi1Z5me56rOcWrLMz3LVZzm1ZJmf5arPcmrJMj/LVZ/lVFrN612r1ZfXtfL6VxlTUI1NPbBS - FcQqqKklkKuq60O931Vuo9td9wXV/VW9Y7OkeixzPo937zzpc1p9Ws2r6epzWn1azavp6nNafVrNq+nq - c1p9Ws2r6epzWn1azavp6ruTM9WykNLSl/60zMsy+jMfM50+LP01TzMv803XZZb8WObVdM6nLfmxzKvp - 3vy+yotwl3oXfS9AoF6evszbtZ5tyvX11qF/SbvK9Y5BVe8Y1mOstuUdibRe3pK0TGPb8rBe/tIypLNM - zms5n2W1ms4yOa/lfJbVajrL5LyW81lWq+ksk/NazmdZraazTM5rOZ9ltZrOMjmv5XyW1Wo6y+S8lvNZ - VqvpLJPzWs5nWa2ms0zOazmfZarymu1d4+lDvTiSMUkJWlU9KFtSD+aWQK/3W6q3fchtr/tT93lf9Y6X - 8ngqz4tW01kmpdV801pNZ5mUVvNNazWdZVJazTet1XSWSWk137RW01kmpdV801pNo1UPYG8BzcJKq2Xr - PLbL18tPI7+W37bMPuur015aq/NY+nJZp720Vuex9LlMT72LTl9elKaralD4aOmO/K1t258+y9T9z+N0 - pL59tW2ZaumrZZV51e5IX68M9rH1fWx92H+E9e2j3jWtL7UUX1CFrZ56sHYQ9dZZldvkdlUfqvuGcv89 - BtV3JNIyjS3NVz+2j+9j67tj17fRA9hLM61p55dsn/xemaXl9il7kPVp2/Izz3SdVvtorY9pVV64prdd - zOT9R9RB9iHL3lHax5aWMZ2+fWyp/EHWl2Vq+VxPKq36ltKY8y6j0qpvKY057zIqrfqW0pjzLqPSqm8p - jTnvMiqt+pbSmPMuo9KqbymNOe8yKq36ltKY8y6j0qpvKY057zIqrfqW0pjzLqPSt098qPFE9eAqoaum - PxLV9e2j3jan3LecLvlSadVX8zF9tZxKq76aj+mr5VRa9dV8TF8tp9Kqr+Zj+mo5lVZ9NR/TV8uptOqr - +Zi+Wk5hXQDM6bb8Jevl77PsUl4uu896tIOU6a2XtHJ+l9WyuQxp5fwuy7JVSxfuR1P8pjpI3pK2raf6 - 99GRLreknvX8+paWwf6t15f7YNp5rZZxus3fK6NtW27Jn2nntVrG6TZ/r4y2bbklf6ad12oZp9v8mXZe - q2WcbvNn2nmtlnG6zZ9p57Vaxuk2f6ad12oZp9v8mXZeq2Wc9rQUe5z21AOwfXRQqOuptz0qt7nuy7b9 - Mb9q6bhpdR7bVS7z04/VeWxXucxPP1bnsV3lMj/9WJ3HdpXL/PRjdR7bVS7z04/VeWxXOaaHPQOYBbBe - upbZZfuW3afcHf27WWZXefO3lfu3WB/T/1PaFjSORP9W6/O4LVmvXPq0Xrme9cqlT+uV61mvXPo0fdWP - 6euVSd+Sv5q+Xpn0Lfmr6euVSd+Sv5q+Xpn0Lfmr6euVSd+Sv5q+Xpn0Lfmr6euVSd+Sv5q+Xpn0Lfmr - 6euVSd+Sv5q+Xpn0bfNX9eKHPqYH1S6IW/Lvo7pNu7bX/CV5fLRMY1nWvG0+01qmMcupXT7TWqYxy6ld - PtNapjHLqV0+01qmMcupXT7TWqYxy6ldPtMa6fYMYHXmfDXzt5VL/67ytexB7KO9vl3zu+zfw/rw/WeU - 1kunT6vLLdl/9PWlL7VkmWd6yZdasswzveRLLVnmmV7ypZYs80wv+VJLlnmml3ypJcs800u+1JJlnukl - X2rJMs/0ki+1ZJlnesmXWrLMq8ugHihVXw+q0nekyt/YZ529crl8T9V6eb1yWPX3yrmuzOuVw6q/V851 - ZV6vHFb9vXKuK/N65bDq75VzXZnXK4dVf6+c68q8Xjms+nvlXFfmZXoDALNwSjPdy0ury9R5p+k/iPWW - O+j6snxOqw/LNFbnsd6yPR+WaazOY71lez4s01idx3K5TPfMMv8etGSZX8vVvKVyadvK1bylcmnbytW8 - pXJp28rVvDqv7VNG26fsPmW0fcruU0bbp+w+ZbR9yu5TRtun7D5ltH3K7lNG26fsPmW0fcruU0bbp+w+ - ZbR9ymZeqgdW+/p6Osj6qpb8qC6f5nz6l3xKq/OY87VcTjHSSqvzmPO1XE4x0kqr85jztVxOMdJKq/OY - 87VcTjHSSqvzmPO1XE4x0kqr85jztVxOMdIK674FnAXSskxO06qvV+agtm0dR7r+3nb2fDnFLLdUVttW - Jv2WWyqrbSuTfsvtW1ZbKo/lsgdRWs7XclXaUhrr5THNdE6xpTTWy2Oa6ZxiS2msl8c00znFltJYL49p - pntTrZat5fQ5j+V8+rGaV8vpcx7L+fRjNa+W0+c8lvPpx2peLafPeSzn04/VvFpOn/NYzqcfq3m1nD7n - sZxPP1bzajl9zmM5n36s5tVy+pzHcj79WM2r5fQ5j+V8+rGaV8vpcx7L+fRjNe/fi5bgbpu0nv9IfFr6 - 9B+JT0uf/iPxaenTfyQ+LX36j8SnpU//kfi09Ok/qO+wD0FjFsLqAjlfLcvU/J4P6/mw3vLVPpL19ewg - 69vH/r2uz2Vy2vNV6/mw3rI9X7WeD+st2/NV6/mw3rI9X7WeD+st2/NV6/mw3rI9X7WeD8tlUvrqtPq0 - pbJKX51Wn7ZUVumr0+rTlsoqfXVafdpSWaWvTqtPWyqr9NVp9WlLZZW+Oq0+bams0len1actlVX66rT6 - tKWySl+dVp+2VFbpq9OaXlIP1A4Kb/tKW/L3rOb3lktf+ntW83vLpS/9Pav5veXSl/6e1fzeculLf89q - fm+59KW/ZzW/t1z60t+zmt9bLn1o8UPQmvkukNbzYT2fti2vZwctv8vc5rrebb5tZfcpo+1Tdp8y2j5l - a5marvaxcv93lcuyu/K0mnY+09iuPK2mnc80titPq2nnM43tytNq2vlMY7vytJp2PtPYrjytpp3PNLYr - T6tp5zON7crTatr5TGO78rSadj7T2K48raadzzS2K08z76MpfyetllHmaZlOq36XrzJPy3Ra9bt8lXla - ptOq3+WrzNMynVb9Ll9lnpbptOp3+SrztEynVb/LV5mnZTqt+l2+yjzssJdAtG2+XeX3WV+vTJr5THvL - 9nzbzPwst69vm/1HWh/G/JH6erbvsj1fz/Zdtufr2b7L9nw923fZnq9n+y7b8/WslnN+m3/JemXSt+Rf - sl6Z9C35l6xXJn1L/iXrlUnfkn/JemXSt+Rfsl6Z9C35l6xXJn1L/iXrlUnfkn/JemXSt+Rfsl6Z9C35 - l6xXJn1L/iXrlUnfkn/JemXSt+Rfsl6Z9C35l6xXJn1L/iXrlUnfkn/JemXSt+Rfsl6Z9C35l6xXJn1L - /rUNw/8HUayy7//gbcAAAAAASUVORK5CYII= - - - \ No newline at end of file diff --git a/Scp/ScpMonitor/Program.cs b/Scp/ScpMonitor/Program.cs deleted file mode 100644 index e47cb74..0000000 --- a/Scp/ScpMonitor/Program.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Windows.Forms; - -namespace ScpMonitor -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new ScpForm()); - } - } -} diff --git a/Scp/ScpMonitor/Properties/AssemblyInfo.cs b/Scp/ScpMonitor/Properties/AssemblyInfo.cs deleted file mode 100644 index 40a21a2..0000000 --- a/Scp/ScpMonitor/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("ScpMonitor")] -[assembly: AssemblyProduct("ScpMonitor")] - -[assembly: Guid("85966027-b1d8-4a14-bc29-36f9091db86b")] diff --git a/Scp/ScpMonitor/Properties/Resources.Designer.cs b/Scp/ScpMonitor/Properties/Resources.Designer.cs deleted file mode 100644 index 67de6d7..0000000 --- a/Scp/ScpMonitor/Properties/Resources.Designer.cs +++ /dev/null @@ -1,73 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.34011 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ScpMonitor.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ScpMonitor.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). - /// - internal static System.Drawing.Icon Scp_All { - get { - object obj = ResourceManager.GetObject("Scp_All", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - } -} diff --git a/Scp/ScpMonitor/Properties/Resources.resx b/Scp/ScpMonitor/Properties/Resources.resx deleted file mode 100644 index 6224879..0000000 --- a/Scp/ScpMonitor/Properties/Resources.resx +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\Scp_All.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Scp/ScpMonitor/Properties/Settings.Designer.cs b/Scp/ScpMonitor/Properties/Settings.Designer.cs deleted file mode 100644 index 4013b7d..0000000 --- a/Scp/ScpMonitor/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.269 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ScpMonitor.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/Scp/ScpMonitor/Properties/Settings.settings b/Scp/ScpMonitor/Properties/Settings.settings deleted file mode 100644 index 3964565..0000000 --- a/Scp/ScpMonitor/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Scp/ScpMonitor/ScpButton.Designer.cs b/Scp/ScpMonitor/ScpButton.Designer.cs deleted file mode 100644 index c309bcb..0000000 --- a/Scp/ScpMonitor/ScpButton.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace ScpMonitor -{ - partial class ScpButton - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - } - - #endregion - } -} diff --git a/Scp/ScpMonitor/ScpButton.cs b/Scp/ScpMonitor/ScpButton.cs deleted file mode 100644 index 76aab55..0000000 --- a/Scp/ScpMonitor/ScpButton.cs +++ /dev/null @@ -1,240 +0,0 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.Drawing.Drawing2D; - -namespace ScpMonitor -{ - [DesignTimeVisible(true), ToolboxItem(true)] - public partial class ScpButton : Button - { - protected enum State { Normal, Hover, Clicked } - - protected State m_State = State.Normal; - - protected Color m_NormalColor = Color.Silver; - protected Color m_HoverColor = Color.DodgerBlue; - - public Boolean Glassy - { - get { return m_NormalColor == Color.Black; } - set - { - if (value ^ Glassy) - { - m_NormalColor = value ? Color.Black : Color.Silver; - Invalidate(); - } - } - } - - public ScpButton() - { - InitializeComponent(); - } - - protected static GraphicsPath CreateRoundRectangle(Rectangle Rectangle, int Radius) - { - GraphicsPath gp = new GraphicsPath(); - - int l = Rectangle.Left; - int t = Rectangle.Top; - int w = Rectangle.Width; - int h = Rectangle.Height; - int d = Radius << 1; - - gp.AddArc(l, t, d, d, 180, 90); // top left - gp.AddLine(l + Radius, t, l + w - Radius, t); // top - gp.AddArc(l + w - d, t, d, d, 270, 90); // top right - gp.AddLine(l + w, t + Radius, l + w, t + h - Radius); // right - gp.AddArc(l + w - d, t + h - d, d, d, 0, 90); // bottom right - gp.AddLine(l + w - Radius, t + h, l + Radius, t + h); // bottom - gp.AddArc(l, t + h - d, d, d, 90, 90); // bottom left - gp.AddLine(l, t + h - Radius, l, t + Radius); // left - - gp.CloseFigure(); - return gp; - } - - protected static GraphicsPath CreateTopRoundRectangle(Rectangle Rectangle, int Radius) - { - GraphicsPath gp = new GraphicsPath(); - - int l = Rectangle.Left; - int t = Rectangle.Top; - int w = Rectangle.Width; - int h = Rectangle.Height; - int d = Radius << 1; - - gp.AddArc(l, t, d, d, 180, 90); // topleft - gp.AddLine(l + Radius, t, l + w - Radius, t); // top - gp.AddArc(l + w - d, t, d, d, 270, 90); // topright - gp.AddLine(l + w, t + Radius, l + w, t + h); // right - gp.AddLine(l + w, t + h, l, t + h); // bottom - gp.AddLine(l, t + h, l, t + Radius); // left - - gp.CloseFigure(); - return gp; - } - - protected static GraphicsPath CreateBottomRadialPath(Rectangle Rectangle) - { - GraphicsPath gp = new GraphicsPath(); - RectangleF rf = Rectangle; - - rf.X -= rf.Width * .35f; - rf.Y -= rf.Height * .15f; - - rf.Width *= 1.7f; - rf.Height *= 2.3f; - - gp.AddEllipse(rf); - - gp.CloseFigure(); - return gp; - } - - protected void Glassify(Rectangle Rectangle, PaintEventArgs e, Color Color, bool Pressed) - { - using (GraphicsPath gp = CreateRoundRectangle(Rectangle, 2)) - { - int opacity = 0x7f; - - using (Brush brush = new SolidBrush(Color.FromArgb(opacity, Color))) - { - e.Graphics.FillPath(brush, gp); - } - } - - using (GraphicsPath clip = CreateRoundRectangle(Rectangle, 2)) - { - e.Graphics.SetClip(clip, CombineMode.Intersect); - - using (GraphicsPath gp = CreateBottomRadialPath(Rectangle)) - { - using (PathGradientBrush brush = new PathGradientBrush(gp)) - { - int opacity = (int)(0xB2 * .99f + .5f); - - RectangleF bounds = gp.GetBounds(); - - brush.CenterPoint = new PointF((bounds.Left + bounds.Right) / 2f, (bounds.Top + bounds.Bottom) / 2f); - brush.CenterColor = Color.FromArgb(opacity, Color.White); - brush.SurroundColors = new Color[] { Color.FromArgb(0, Color.White) }; - - e.Graphics.FillPath(brush, gp); - } - } - - e.Graphics.ResetClip(); - } - - Rectangle newRect = Rectangle; newRect.Height >>= 1; - - if (newRect.Width > 0 && newRect.Height > 0) - { - newRect.Height++; - - using (GraphicsPath gp = CreateTopRoundRectangle(newRect, 2)) - { - int opacity = Pressed ? (int)(.4f * 0x9 + .5f) : 0x99; - - newRect.Height++; - - using (LinearGradientBrush brush = new LinearGradientBrush(newRect, Color.FromArgb(opacity, Color.White), Color.FromArgb(opacity / 3, Color.White), LinearGradientMode.Vertical)) - { - e.Graphics.FillPath(brush, gp); - } - } - } - - int Y = Rectangle.Y + Rectangle.Height - 1; - - // e.Graphics.DrawLine(new Pen(Color.Black), Rectangle.Left, Y, Rectangle.Right, Y); - } - - protected override void OnPaint(PaintEventArgs e) - { - e.Graphics.SmoothingMode = SmoothingMode.HighQuality; - e.Graphics.Clear(Color.White); - - SizeF textSize = e.Graphics.MeasureString(this.Text, base.Font); - - int textX = (int)(base.Size.Width / 2) - (int)(textSize.Width / 2); - int textY = (int)(base.Size.Height / 2) - (int)(textSize.Height / 2); - - Rectangle newRect = new Rectangle(ClientRectangle.X - 1, ClientRectangle.Y - 1, ClientRectangle.Width + 1, ClientRectangle.Height + 1); - - if (Enabled) - { - switch (m_State) - { - case State.Normal: - { - Glassify(newRect, e, m_NormalColor, false); - - e.Graphics.DrawString(this.Text, base.Font, new SolidBrush(base.ForeColor), textX, textY); - } - break; - - case State.Hover: - { - Glassify(newRect, e, m_HoverColor, false); - - e.Graphics.DrawString(this.Text, base.Font, new SolidBrush(base.ForeColor), textX, textY); - } - break; - - case State.Clicked: - { - Glassify(newRect, e, m_HoverColor, true); - - e.Graphics.DrawRectangle(new Pen(m_HoverColor, 2), newRect); - e.Graphics.DrawString(this.Text, base.Font, new SolidBrush(base.ForeColor), textX + 1, textY + 1); - } - break; - } - } - else - { - Glassify(newRect, e, m_NormalColor, false); - - e.Graphics.DrawString(this.Text, base.Font, new SolidBrush(base.ForeColor), textX, textY); - } - } - - protected override void OnMouseLeave(EventArgs e) - { - m_State = State.Normal; - - this.Invalidate(); - base.OnMouseLeave(e); - } - - protected override void OnMouseEnter(EventArgs e) - { - if (Enabled) m_State = State.Hover; - - this.Invalidate(); - base.OnMouseEnter(e); - } - - protected override void OnMouseUp(MouseEventArgs e) - { - if (Enabled) m_State = State.Hover; - - this.Invalidate(); - base.OnMouseUp(e); - } - - protected override void OnMouseDown(MouseEventArgs e) - { - if (Enabled) m_State = State.Clicked; - - this.Invalidate(); - base.OnMouseDown(e); - } - } -} diff --git a/Scp/ScpMonitor/ScpForm.Designer.cs b/Scp/ScpMonitor/ScpForm.Designer.cs deleted file mode 100644 index 0f1a3ab..0000000 --- a/Scp/ScpMonitor/ScpForm.Designer.cs +++ /dev/null @@ -1,243 +0,0 @@ -namespace ScpMonitor -{ - partial class ScpForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.lblHost = new System.Windows.Forms.Label(); - this.lblPad_1 = new System.Windows.Forms.Label(); - this.lblPad_2 = new System.Windows.Forms.Label(); - this.lblPad_3 = new System.Windows.Forms.Label(); - this.lblPad_4 = new System.Windows.Forms.Label(); - this.tmrUpdate = new System.Windows.Forms.Timer(this.components); - this.niTray = new System.Windows.Forms.NotifyIcon(this.components); - this.cmTray = new System.Windows.Forms.ContextMenuStrip(this.components); - this.tmConfig = new System.Windows.Forms.ToolStripMenuItem(); - this.tmProfile = new System.Windows.Forms.ToolStripMenuItem(); - this.tmReset = new System.Windows.Forms.ToolStripMenuItem(); - this.tmExit = new System.Windows.Forms.ToolStripMenuItem(); - this.btnUp_1 = new System.Windows.Forms.Button(); - this.btnUp_2 = new System.Windows.Forms.Button(); - this.btnUp_3 = new System.Windows.Forms.Button(); - this.cmTray.SuspendLayout(); - this.SuspendLayout(); - // - // lblHost - // - this.lblHost.AutoSize = true; - this.lblHost.Font = new System.Drawing.Font("Lucida Console", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblHost.Location = new System.Drawing.Point(10, 10); - this.lblHost.Name = "lblHost"; - this.lblHost.Size = new System.Drawing.Size(223, 13); - this.lblHost.TabIndex = 1; - this.lblHost.Text = "Host Address : Disconnected"; - // - // lblPad_1 - // - this.lblPad_1.AutoSize = true; - this.lblPad_1.Font = new System.Drawing.Font("Lucida Console", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblPad_1.Location = new System.Drawing.Point(320, 10); - this.lblPad_1.Name = "lblPad_1"; - this.lblPad_1.Size = new System.Drawing.Size(167, 13); - this.lblPad_1.TabIndex = 2; - this.lblPad_1.Text = "Pad 1 : Disconnected"; - // - // lblPad_2 - // - this.lblPad_2.AutoSize = true; - this.lblPad_2.Font = new System.Drawing.Font("Lucida Console", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblPad_2.Location = new System.Drawing.Point(320, 35); - this.lblPad_2.Name = "lblPad_2"; - this.lblPad_2.Size = new System.Drawing.Size(167, 13); - this.lblPad_2.TabIndex = 3; - this.lblPad_2.Text = "Pad 2 : Disconnected"; - // - // lblPad_3 - // - this.lblPad_3.AutoSize = true; - this.lblPad_3.Font = new System.Drawing.Font("Lucida Console", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblPad_3.Location = new System.Drawing.Point(320, 60); - this.lblPad_3.Name = "lblPad_3"; - this.lblPad_3.Size = new System.Drawing.Size(167, 13); - this.lblPad_3.TabIndex = 4; - this.lblPad_3.Text = "Pad 3 : Disconnected"; - // - // lblPad_4 - // - this.lblPad_4.AutoSize = true; - this.lblPad_4.Font = new System.Drawing.Font("Lucida Console", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblPad_4.Location = new System.Drawing.Point(320, 85); - this.lblPad_4.Name = "lblPad_4"; - this.lblPad_4.Size = new System.Drawing.Size(167, 13); - this.lblPad_4.TabIndex = 5; - this.lblPad_4.Text = "Pad 4 : Disconnected"; - // - // tmrUpdate - // - this.tmrUpdate.Tick += new System.EventHandler(this.tmrUpdate_Tick); - // - // niTray - // - this.niTray.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; - this.niTray.BalloonTipTitle = "SCP Monitor"; - this.niTray.ContextMenuStrip = this.cmTray; - this.niTray.Text = "SCP Monitor"; - this.niTray.Visible = true; - this.niTray.MouseClick += new System.Windows.Forms.MouseEventHandler(this.niTray_Click); - // - // cmTray - // - this.cmTray.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.tmConfig, - this.tmProfile, - this.tmReset, - this.tmExit}); - this.cmTray.Name = "cmTray"; - this.cmTray.Size = new System.Drawing.Size(159, 92); - // - // tmConfig - // - this.tmConfig.Enabled = false; - this.tmConfig.Name = "tmConfig"; - this.tmConfig.Size = new System.Drawing.Size(158, 22); - this.tmConfig.Text = "&Configuration"; - this.tmConfig.Click += new System.EventHandler(this.tmConfig_Click); - // - // tmProfile - // - this.tmProfile.Enabled = false; - this.tmProfile.Name = "tmProfile"; - this.tmProfile.Size = new System.Drawing.Size(158, 22); - this.tmProfile.Text = "&Profile Manager"; - this.tmProfile.Click += new System.EventHandler(this.tmProfile_Click); - // - // tmReset - // - this.tmReset.Name = "tmReset"; - this.tmReset.Size = new System.Drawing.Size(158, 22); - this.tmReset.Text = "&Reset Position"; - this.tmReset.Click += new System.EventHandler(this.tmReset_Click); - // - // tmExit - // - this.tmExit.Name = "tmExit"; - this.tmExit.Size = new System.Drawing.Size(158, 22); - this.tmExit.Text = "E&xit"; - this.tmExit.Click += new System.EventHandler(this.tmExit_Click); - // - // btnUp_1 - // - this.btnUp_1.Enabled = false; - this.btnUp_1.Location = new System.Drawing.Point(294, 29); - this.btnUp_1.Name = "btnUp_1"; - this.btnUp_1.Size = new System.Drawing.Size(20, 23); - this.btnUp_1.TabIndex = 6; - this.btnUp_1.Tag = "1"; - this.btnUp_1.Text = "^"; - this.btnUp_1.UseVisualStyleBackColor = true; - this.btnUp_1.Click += new System.EventHandler(this.btnUp_Click); - this.btnUp_1.Enter += new System.EventHandler(this.Button_Enter); - // - // btnUp_2 - // - this.btnUp_2.Enabled = false; - this.btnUp_2.Location = new System.Drawing.Point(294, 54); - this.btnUp_2.Name = "btnUp_2"; - this.btnUp_2.Size = new System.Drawing.Size(20, 23); - this.btnUp_2.TabIndex = 7; - this.btnUp_2.Tag = "2"; - this.btnUp_2.Text = "^"; - this.btnUp_2.UseVisualStyleBackColor = true; - this.btnUp_2.Click += new System.EventHandler(this.btnUp_Click); - this.btnUp_2.Enter += new System.EventHandler(this.Button_Enter); - // - // btnUp_3 - // - this.btnUp_3.Enabled = false; - this.btnUp_3.Location = new System.Drawing.Point(294, 79); - this.btnUp_3.Name = "btnUp_3"; - this.btnUp_3.Size = new System.Drawing.Size(20, 23); - this.btnUp_3.TabIndex = 8; - this.btnUp_3.Tag = "3"; - this.btnUp_3.Text = "^"; - this.btnUp_3.UseVisualStyleBackColor = true; - this.btnUp_3.Click += new System.EventHandler(this.btnUp_Click); - this.btnUp_3.Enter += new System.EventHandler(this.Button_Enter); - // - // ScpForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.ClientSize = new System.Drawing.Size(734, 111); - this.Controls.Add(this.btnUp_3); - this.Controls.Add(this.btnUp_2); - this.Controls.Add(this.btnUp_1); - this.Controls.Add(this.lblPad_4); - this.Controls.Add(this.lblPad_3); - this.Controls.Add(this.lblPad_2); - this.Controls.Add(this.lblPad_1); - this.Controls.Add(this.lblHost); - this.DoubleBuffered = true; - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ScpForm"; - this.ShowInTaskbar = false; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "SCP Monitor"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_Closing); - this.Load += new System.EventHandler(this.Form_Load); - this.cmTray.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label lblHost; - private System.Windows.Forms.Label lblPad_1; - private System.Windows.Forms.Label lblPad_2; - private System.Windows.Forms.Label lblPad_3; - private System.Windows.Forms.Label lblPad_4; - private System.Windows.Forms.Timer tmrUpdate; - private System.Windows.Forms.NotifyIcon niTray; - private System.Windows.Forms.ContextMenuStrip cmTray; - private System.Windows.Forms.ToolStripMenuItem tmExit; - private System.Windows.Forms.ToolStripMenuItem tmConfig; - private System.Windows.Forms.Button btnUp_1; - private System.Windows.Forms.Button btnUp_2; - private System.Windows.Forms.Button btnUp_3; - private System.Windows.Forms.ToolStripMenuItem tmReset; - private System.Windows.Forms.ToolStripMenuItem tmProfile; - - } -} - diff --git a/Scp/ScpMonitor/ScpForm.cs b/Scp/ScpMonitor/ScpForm.cs deleted file mode 100644 index ad656db..0000000 --- a/Scp/ScpMonitor/ScpForm.cs +++ /dev/null @@ -1,395 +0,0 @@ -using System; -using System.Windows.Forms; -using System.Text; -using System.Drawing; -using System.Configuration; - -using System.Net; -using System.Net.Sockets; - -using ScpControl; - -namespace ScpMonitor -{ - public partial class ScpForm : Form - { - protected RegistrySettings m_Config = new RegistrySettings(); - - protected Boolean FormSaved, ConfSaved, ProfSaved, FormVisible; - protected Int32 FormX, FormY, ConfX, ConfY, ProfX, ProfY; - - protected Boolean m_Connected = false; - - protected IPEndPoint m_ServerEp = new IPEndPoint(IPAddress.Loopback, 26760); - protected UdpClient m_Server = new UdpClient(); - - protected Byte[] m_Buffer = new Byte[2]; - protected Char[] m_Delim = new Char[] { '^' }; - - protected SettingsForm Settings = new SettingsForm(); - protected ProfilesForm Profiles = new ProfilesForm(); - - public ScpForm() - { - InitializeComponent(); - btnUp_1.Tag = (Byte) 1; - btnUp_2.Tag = (Byte) 2; - btnUp_3.Tag = (Byte) 3; - - m_Server.Client.ReceiveTimeout = 250; - m_Buffer[1] = 0x02; - - FormVisible = m_Config.Visible; - - FormSaved = m_Config.FormSaved; - FormX = m_Config.FormX; - FormY = m_Config.FormY; - - ConfSaved = m_Config.ConfSaved; - ConfX = m_Config.ConfX; - ConfY = m_Config.ConfY; - - ProfSaved = m_Config.ProfSaved; - ProfX = m_Config.ProfX; - ProfY = m_Config.ProfY; - - if (FormSaved) - { - StartPosition = FormStartPosition.Manual; - Location = new System.Drawing.Point(FormX, FormY); - } - - if (!FormVisible) - { - WindowState = FormWindowState.Minimized; - Visible = false; - } - - if (ConfSaved) - { - Settings.StartPosition = FormStartPosition.Manual; - Settings.Location = new System.Drawing.Point(ConfX, ConfY); - } - - if (ProfSaved) - { - Profiles.StartPosition = FormStartPosition.Manual; - Profiles.Location = new System.Drawing.Point(ProfX, ProfY); - } - - lblHost.Text = "Host Address : 00:00:00:00:00:00\r\n\r\n0\r\n\r\n0\r\n\r\n0"; - lblPad_1.Text = "Pad 1 : DS3 00:00:00:00:00:00 - USB FFFFFFFF Charging"; - - Int32 SizeX = 50 + lblHost.Width + lblPad_1.Width; - Int32 SizeY = 20 + lblHost.Height; - - lblPad_1.Location = new Point(new Size(40 + lblHost.Width, 10 + lblHost.Height / 7 * 0)); - lblPad_2.Location = new Point(new Size(40 + lblHost.Width, 10 + lblHost.Height / 7 * 2)); - lblPad_3.Location = new Point(new Size(40 + lblHost.Width, 10 + lblHost.Height / 7 * 4)); - lblPad_4.Location = new Point(new Size(40 + lblHost.Width, 10 + lblHost.Height / 7 * 6)); - - btnUp_1.Location = new Point(lblPad_2.Location.X - 26, lblPad_2.Location.Y - 6); - btnUp_2.Location = new Point(lblPad_3.Location.X - 26, lblPad_3.Location.Y - 6); - btnUp_3.Location = new Point(lblPad_4.Location.X - 26, lblPad_4.Location.Y - 6); - - ClientSize = new Size(SizeX, SizeY); - } - - public void Reset() - { - CenterToScreen(); - } - - protected void Parse(Byte[] Buffer) - { - if (!m_Connected) - { - m_Connected = true; - tmConfig.Enabled = true; - tmProfile.Enabled = true; - - niTray.BalloonTipText = "Server Connected"; - niTray.ShowBalloonTip(3000); - } - - String Data = Encoding.Unicode.GetString(Buffer); - String[] Split = Data.Split(m_Delim, StringSplitOptions.RemoveEmptyEntries); - - lblHost.Text = Split[0]; - - lblPad_1.Text = Split[1]; - lblPad_2.Text = Split[2]; btnUp_1.Enabled = !Split[2].Contains("Disconnected"); - lblPad_3.Text = Split[3]; btnUp_2.Enabled = !Split[3].Contains("Disconnected"); - lblPad_4.Text = Split[4]; btnUp_3.Enabled = !Split[4].Contains("Disconnected"); - } - - protected void Clear() - { - if (m_Connected) - { - m_Connected = false; - tmConfig.Enabled = false; - tmProfile.Enabled = false; - - niTray.BalloonTipText = "Server Disconnected"; - niTray.ShowBalloonTip(3000); - } - - if (Settings.Visible) Settings.Hide(); - if (Profiles.Visible) Profiles.Hide(); - - lblHost.Text = "Host Address : Disconnected"; - - lblPad_1.Text = "Pad 1 : Disconnected"; - lblPad_2.Text = "Pad 2 : Disconnected"; - lblPad_3.Text = "Pad 3 : Disconnected"; - lblPad_4.Text = "Pad 4 : Disconnected"; - - btnUp_1.Enabled = btnUp_2.Enabled = btnUp_3.Enabled = false; - } - - protected void tmrUpdate_Tick(object sender, EventArgs e) - { - lock (this) - { - tmrUpdate.Enabled = false; - - try - { - if (Visible && Location.X != -32000 && Location.Y != -32000) - { - FormVisible = true; - - FormX = Location.X; - FormY = Location.Y; - FormSaved = true; - } - else - { - FormVisible = false; - } - - if (Settings.Visible && Settings.Location.X != -32000 && Settings.Location.Y != -32000) - { - ConfX = Settings.Location.X; - ConfY = Settings.Location.Y; - ConfSaved = true; - } - - if (Profiles.Visible && Profiles.Location.X != -32000 && Profiles.Location.Y != -32000) - { - ProfX = Profiles.Location.X; - ProfY = Profiles.Location.Y; - ProfSaved = true; - } - - if (m_Server.Send(m_Buffer, m_Buffer.Length, m_ServerEp) == m_Buffer.Length) - { - IPEndPoint ReferenceEp = new IPEndPoint(IPAddress.Loopback, 0); - - Byte[] Buffer = m_Server.Receive(ref ReferenceEp); - - if (Buffer.Length > 0) Parse(Buffer); - } - } - catch - { - Clear(); - } - - tmrUpdate.Enabled = true; - } - } - - protected void Form_Load(object sender, EventArgs e) - { - Icon = niTray.Icon = Properties.Resources.Scp_All; - - tmrUpdate.Enabled = true; - } - - protected void Form_Closing(object sender, FormClosingEventArgs e) - { - if (e.CloseReason == CloseReason.UserClosing && niTray.Visible) - { - e.Cancel = true; - - if (Settings.Visible) Settings.Hide(); - if (Profiles.Visible) Profiles.Hide(); - - Visible = false; - WindowState = FormWindowState.Minimized; - } - else - { - tmrUpdate.Enabled = false; - - m_Config.Visible = FormVisible; - - m_Config.FormSaved = FormSaved; - m_Config.FormX = FormX; - m_Config.FormY = FormY; - - m_Config.ConfSaved = ConfSaved; - m_Config.ConfX = ConfX; - m_Config.ConfY = ConfY; - - m_Config.ProfSaved = ProfSaved; - m_Config.ProfX = ProfX; - m_Config.ProfY = ProfY; - - m_Config.Save(); - } - } - - protected void btnUp_Click(object sender, EventArgs e) - { - Byte[] Buffer = { 0, 5, (Byte)((Button)sender).Tag }; - - m_Server.Send(Buffer, Buffer.Length, m_ServerEp); - } - - protected void niTray_Click(object sender, MouseEventArgs e) - { - if (e.Button == MouseButtons.Left) - { - if (WindowState == FormWindowState.Minimized) - { - WindowState = FormWindowState.Normal; - Visible = true; - - Activate(); - } - else - { - if (Settings.Visible) Settings.Hide(); - if (Profiles.Visible) Profiles.Hide(); - - Visible = false; - WindowState = FormWindowState.Minimized; - } - } - } - - protected void tmConfig_Click(object sender, EventArgs e) - { - if (!Settings.Visible) - { - Settings.Request(); - Settings.Show(this); - } - - Settings.Activate(); - } - - protected void tmProfile_Click(object sender, EventArgs e) - { - if (!Profiles.Visible) - { - Profiles.Request(); - Profiles.Show(this); - } - - Profiles.Activate(); - } - - protected void tmReset_Click(object sender, EventArgs e) - { - lock (this) - { - tmrUpdate.Enabled = false; - - Reset(); - Settings.Reset(); - Profiles.Reset(); - - tmrUpdate.Enabled = true; - } - } - - protected void tmExit_Click(object sender, EventArgs e) - { - niTray.Visible = false; - Close(); - } - - protected void Button_Enter(object sender, EventArgs e) - { - ThemeUtil.UpdateFocus(((Button) sender).Handle); - } - } - - [SettingsProvider(typeof(ScpControl.RegistryProvider))] - public class RegistrySettings : ApplicationSettingsBase - { - [UserScopedSetting, DefaultSettingValue("true")] - public Boolean Visible - { - get { return (Boolean) this["Visible"]; } - set { this["Visible"] = value; } - } - - [UserScopedSetting, DefaultSettingValue("false")] - public Boolean FormSaved - { - get { return (Boolean) this["FormSaved"]; } - set { this["FormSaved"] = value; } - } - - [UserScopedSetting, DefaultSettingValue("false")] - public Boolean ConfSaved - { - get { return (Boolean) this["ConfSaved"]; } - set { this["ConfSaved"] = value; } - } - - [UserScopedSetting, DefaultSettingValue("false")] - public Boolean ProfSaved - { - get { return (Boolean)this["ProfSaved"]; } - set { this["ProfSaved"] = value; } - } - - [UserScopedSetting, DefaultSettingValue("-32000")] - public Int32 FormX - { - get { return (Int32) this["FormX"]; } - set { this["FormX"] = value; } - } - - [UserScopedSetting, DefaultSettingValue("-32000")] - public Int32 FormY - { - get { return (Int32)this["FormY"]; } - set { this["FormY"] = value; } - } - - [UserScopedSetting, DefaultSettingValue("-32000")] - public Int32 ConfX - { - get { return (Int32)this["ConfX"]; } - set { this["ConfX"] = value; } - } - - [UserScopedSetting, DefaultSettingValue("-32000")] - public Int32 ConfY - { - get { return (Int32)this["ConfY"]; } - set { this["ConfY"] = value; } - } - - [UserScopedSetting, DefaultSettingValue("-32000")] - public Int32 ProfX - { - get { return (Int32)this["ProfX"]; } - set { this["ProfX"] = value; } - } - - [UserScopedSetting, DefaultSettingValue("-32000")] - public Int32 ProfY - { - get { return (Int32)this["ProfY"]; } - set { this["ProfY"] = value; } - } - } -} diff --git a/Scp/ScpMonitor/ScpForm.resx b/Scp/ScpMonitor/ScpForm.resx deleted file mode 100644 index 379780d..0000000 --- a/Scp/ScpMonitor/ScpForm.resx +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 128, 17 - - - 213, 17 - - \ No newline at end of file diff --git a/Scp/ScpMonitor/ScpMonitor.csproj b/Scp/ScpMonitor/ScpMonitor.csproj deleted file mode 100644 index 267c9b2..0000000 --- a/Scp/ScpMonitor/ScpMonitor.csproj +++ /dev/null @@ -1,166 +0,0 @@ - - - - Release - AnyCPU - 8.0.30703 - 2.0 - {6C9F554E-90D6-449C-91E9-130D476D88B5} - WinExe - Properties - ScpMonitor - ScpMonitor - v4.0 - 512 - - - - ..\..\bin\ - TRACE - true - pdbonly - AnyCPU - bin\Release\ScpMonitor.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - true - ..\..\bin\ - DEBUG;TRACE - full - AnyCPU - bin\Debug\ScpMonitor.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - Resources\Scp_All.ico - - - - - - - - - - - - - UserControl - - - AxisBar.cs - - - UserControl - - - AxisControl.cs - - - Form - - - ProfileProperties.cs - - - Form - - - ProfilesForm.cs - - - - Component - - - ScpButton.cs - - - Form - - - ScpForm.cs - - - - - Form - - - SettingsForm.cs - - - AxisBar.cs - - - AxisControl.cs - - - ProfileProperties.cs - - - ProfilesForm.cs - - - ScpForm.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - SettingsForm.cs - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - {ddecf06e-be48-4610-8bf8-4ae5140d9f0c} - ScpControl - - - - - Copy /Y /B $(SolutionDir)\Common\Properties\Info.cs $(ProjectDir)\Properties\CommonInfo.cs > nul: -If Not Exist $(ProjectDir)\Resources\Scp_All.ico Copy /Y /B $(SolutionDir)\Common\Resources\Scp.ico $(ProjectDir)\Resources\Scp_All.ico > nul: - - - \ No newline at end of file diff --git a/Scp/ScpMonitor/ScpMonitor_2010.csproj b/Scp/ScpMonitor/ScpMonitor_2010.csproj deleted file mode 100644 index 25d8fa2..0000000 --- a/Scp/ScpMonitor/ScpMonitor_2010.csproj +++ /dev/null @@ -1,164 +0,0 @@ - - - - Release - AnyCPU - 8.0.30703 - 2.0 - {6C9F554E-90D6-449C-91E9-130D476D88B5} - WinExe - Properties - ScpMonitor - ScpMonitor - v4.0 - 512 - - - - ..\..\bin\ - TRACE - true - pdbonly - AnyCPU - bin\Release\ScpMonitor.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - true - ..\..\bin\ - DEBUG;TRACE - full - AnyCPU - bin\Debug\ScpMonitor.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - Resources\Scp_All.ico - - - - - - - - - - - UserControl - - - AxisBar.cs - - - UserControl - - - AxisControl.cs - - - Form - - - ProfileProperties.cs - - - Form - - - ProfilesForm.cs - - - - Component - - - ScpButton.cs - - - Form - - - ScpForm.cs - - - - - Form - - - SettingsForm.cs - - - AxisBar.cs - - - AxisControl.cs - - - ProfileProperties.cs - - - ProfilesForm.cs - - - ScpForm.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - SettingsForm.cs - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C} - ScpControl_2010 - - - - - Copy /Y /B $(SolutionDir)\Common\Properties\Info.cs $(ProjectDir)\Properties\CommonInfo.cs > nul: -If Not Exist $(ProjectDir)\Resources\Scp_All.ico Copy /Y /B $(SolutionDir)\Common\Resources\Scp.ico $(ProjectDir)\Resources\Scp_All.ico > nul: - - - \ No newline at end of file diff --git a/Scp/ScpMonitor/SettingsForm.Designer.cs b/Scp/ScpMonitor/SettingsForm.Designer.cs deleted file mode 100644 index 7d5c499..0000000 --- a/Scp/ScpMonitor/SettingsForm.Designer.cs +++ /dev/null @@ -1,404 +0,0 @@ -namespace ScpMonitor -{ - partial class SettingsForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.gbFlip = new System.Windows.Forms.GroupBox(); - this.cbRY = new System.Windows.Forms.CheckBox(); - this.cbRX = new System.Windows.Forms.CheckBox(); - this.cbLY = new System.Windows.Forms.CheckBox(); - this.cbLX = new System.Windows.Forms.CheckBox(); - this.tbIdle = new System.Windows.Forms.TrackBar(); - this.btnOK = new System.Windows.Forms.Button(); - this.btnCancel = new System.Windows.Forms.Button(); - this.lblIdle = new System.Windows.Forms.Label(); - this.cbLED = new System.Windows.Forms.CheckBox(); - this.cbRumble = new System.Windows.Forms.CheckBox(); - this.cbTriggers = new System.Windows.Forms.CheckBox(); - this.tbLatency = new System.Windows.Forms.TrackBar(); - this.lblLatency = new System.Windows.Forms.Label(); - this.tbLeft = new System.Windows.Forms.TrackBar(); - this.tbRight = new System.Windows.Forms.TrackBar(); - this.gbThreshold = new System.Windows.Forms.GroupBox(); - this.label2 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.cbNative = new System.Windows.Forms.CheckBox(); - this.cbSSP = new System.Windows.Forms.CheckBox(); - this.ttSSP = new System.Windows.Forms.ToolTip(this.components); - this.cbForce = new System.Windows.Forms.CheckBox(); - this.lblBrightness = new System.Windows.Forms.Label(); - this.tbBrightness = new System.Windows.Forms.TrackBar(); - this.gbFlip.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.tbIdle)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.tbLatency)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.tbLeft)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.tbRight)).BeginInit(); - this.gbThreshold.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.tbBrightness)).BeginInit(); - this.SuspendLayout(); - // - // gbFlip - // - this.gbFlip.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.gbFlip.Controls.Add(this.cbRY); - this.gbFlip.Controls.Add(this.cbRX); - this.gbFlip.Controls.Add(this.cbLY); - this.gbFlip.Controls.Add(this.cbLX); - this.gbFlip.Location = new System.Drawing.Point(12, 12); - this.gbFlip.Name = "gbFlip"; - this.gbFlip.Size = new System.Drawing.Size(270, 44); - this.gbFlip.TabIndex = 0; - this.gbFlip.TabStop = false; - this.gbFlip.Text = " Flip Axis "; - // - // cbRY - // - this.cbRY.AutoSize = true; - this.cbRY.Location = new System.Drawing.Point(201, 20); - this.cbRY.Name = "cbRY"; - this.cbRY.Size = new System.Drawing.Size(41, 17); - this.cbRY.TabIndex = 3; - this.cbRY.Text = "RY"; - this.cbRY.UseVisualStyleBackColor = true; - // - // cbRX - // - this.cbRX.AutoSize = true; - this.cbRX.Location = new System.Drawing.Point(141, 20); - this.cbRX.Name = "cbRX"; - this.cbRX.Size = new System.Drawing.Size(41, 17); - this.cbRX.TabIndex = 2; - this.cbRX.Text = "RX"; - this.cbRX.UseVisualStyleBackColor = true; - // - // cbLY - // - this.cbLY.AutoSize = true; - this.cbLY.Location = new System.Drawing.Point(81, 20); - this.cbLY.Name = "cbLY"; - this.cbLY.Size = new System.Drawing.Size(39, 17); - this.cbLY.TabIndex = 1; - this.cbLY.Text = "LY"; - this.cbLY.UseVisualStyleBackColor = true; - // - // cbLX - // - this.cbLX.AutoSize = true; - this.cbLX.Location = new System.Drawing.Point(21, 20); - this.cbLX.Name = "cbLX"; - this.cbLX.Size = new System.Drawing.Size(39, 17); - this.cbLX.TabIndex = 0; - this.cbLX.Text = "LX"; - this.cbLX.UseVisualStyleBackColor = true; - // - // tbIdle - // - this.tbIdle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tbIdle.AutoSize = false; - this.tbIdle.Location = new System.Drawing.Point(12, 169); - this.tbIdle.Maximum = 30; - this.tbIdle.Name = "tbIdle"; - this.tbIdle.Size = new System.Drawing.Size(270, 34); - this.tbIdle.TabIndex = 2; - this.tbIdle.Value = 10; - this.tbIdle.ValueChanged += new System.EventHandler(this.tbIdle_ValueChanged); - // - // btnOK - // - this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnOK.Location = new System.Drawing.Point(126, 447); - this.btnOK.Name = "btnOK"; - this.btnOK.Size = new System.Drawing.Size(75, 23); - this.btnOK.TabIndex = 16; - this.btnOK.Text = "OK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); - // - // btnCancel - // - this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnCancel.Location = new System.Drawing.Point(207, 447); - this.btnCancel.Name = "btnCancel"; - this.btnCancel.Size = new System.Drawing.Size(75, 23); - this.btnCancel.TabIndex = 17; - this.btnCancel.Text = "Cancel"; - this.btnCancel.UseVisualStyleBackColor = true; - this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); - // - // lblIdle - // - this.lblIdle.AutoSize = true; - this.lblIdle.Location = new System.Drawing.Point(12, 206); - this.lblIdle.Name = "lblIdle"; - this.lblIdle.Size = new System.Drawing.Size(125, 13); - this.lblIdle.TabIndex = 3; - this.lblIdle.Text = "Idle Timeout : 10 minutes"; - // - // cbLED - // - this.cbLED.AutoSize = true; - this.cbLED.Location = new System.Drawing.Point(12, 373); - this.cbLED.Name = "cbLED"; - this.cbLED.Size = new System.Drawing.Size(85, 17); - this.cbLED.TabIndex = 8; - this.cbLED.Text = "Disable LED"; - this.cbLED.UseVisualStyleBackColor = true; - // - // cbRumble - // - this.cbRumble.AutoSize = true; - this.cbRumble.Location = new System.Drawing.Point(12, 396); - this.cbRumble.Name = "cbRumble"; - this.cbRumble.Size = new System.Drawing.Size(100, 17); - this.cbRumble.TabIndex = 9; - this.cbRumble.Text = "Disable Rumble"; - this.cbRumble.UseVisualStyleBackColor = true; - // - // cbTriggers - // - this.cbTriggers.AutoSize = true; - this.cbTriggers.Location = new System.Drawing.Point(153, 419); - this.cbTriggers.Name = "cbTriggers"; - this.cbTriggers.Size = new System.Drawing.Size(88, 17); - this.cbTriggers.TabIndex = 10; - this.cbTriggers.Text = "Map Triggers"; - this.cbTriggers.UseVisualStyleBackColor = true; - this.cbTriggers.Visible = false; - // - // tbLatency - // - this.tbLatency.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tbLatency.AutoSize = false; - this.tbLatency.LargeChange = 1; - this.tbLatency.Location = new System.Drawing.Point(12, 231); - this.tbLatency.Maximum = 16; - this.tbLatency.Name = "tbLatency"; - this.tbLatency.Size = new System.Drawing.Size(270, 34); - this.tbLatency.TabIndex = 4; - this.tbLatency.Value = 8; - this.tbLatency.ValueChanged += new System.EventHandler(this.tbLatency_ValueChanged); - // - // lblLatency - // - this.lblLatency.AutoSize = true; - this.lblLatency.Location = new System.Drawing.Point(12, 268); - this.lblLatency.Name = "lblLatency"; - this.lblLatency.Size = new System.Drawing.Size(151, 13); - this.lblLatency.TabIndex = 5; - this.lblLatency.Text = "DS3 Rumble Latency : 128 ms"; - // - // tbLeft - // - this.tbLeft.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tbLeft.AutoSize = false; - this.tbLeft.LargeChange = 8; - this.tbLeft.Location = new System.Drawing.Point(78, 19); - this.tbLeft.Maximum = 127; - this.tbLeft.Name = "tbLeft"; - this.tbLeft.Size = new System.Drawing.Size(186, 34); - this.tbLeft.TabIndex = 1; - this.tbLeft.TickFrequency = 8; - // - // tbRight - // - this.tbRight.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tbRight.AutoSize = false; - this.tbRight.LargeChange = 8; - this.tbRight.Location = new System.Drawing.Point(78, 59); - this.tbRight.Maximum = 127; - this.tbRight.Name = "tbRight"; - this.tbRight.Size = new System.Drawing.Size(186, 34); - this.tbRight.TabIndex = 3; - this.tbRight.TickFrequency = 8; - // - // gbThreshold - // - this.gbThreshold.Controls.Add(this.label2); - this.gbThreshold.Controls.Add(this.label1); - this.gbThreshold.Controls.Add(this.tbLeft); - this.gbThreshold.Controls.Add(this.tbRight); - this.gbThreshold.Location = new System.Drawing.Point(12, 62); - this.gbThreshold.Name = "gbThreshold"; - this.gbThreshold.Size = new System.Drawing.Size(270, 101); - this.gbThreshold.TabIndex = 1; - this.gbThreshold.TabStop = false; - this.gbThreshold.Text = "Threshold"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(15, 63); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(59, 13); - this.label2.TabIndex = 2; - this.label2.Text = "Right Stick"; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(15, 23); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(52, 13); - this.label1.TabIndex = 0; - this.label1.Text = "Left Stick"; - // - // cbNative - // - this.cbNative.AutoSize = true; - this.cbNative.Location = new System.Drawing.Point(153, 373); - this.cbNative.Name = "cbNative"; - this.cbNative.Size = new System.Drawing.Size(122, 17); - this.cbNative.TabIndex = 11; - this.cbNative.Text = "Disable Native Feed"; - this.cbNative.UseVisualStyleBackColor = true; - // - // cbSSP - // - this.cbSSP.AutoSize = true; - this.cbSSP.Location = new System.Drawing.Point(153, 396); - this.cbSSP.Name = "cbSSP"; - this.cbSSP.Size = new System.Drawing.Size(85, 17); - this.cbSSP.TabIndex = 12; - this.cbSSP.Text = "Disable SSP"; - this.cbSSP.UseVisualStyleBackColor = true; - // - // cbForce - // - this.cbForce.AutoSize = true; - this.cbForce.Location = new System.Drawing.Point(12, 419); - this.cbForce.Name = "cbForce"; - this.cbForce.Size = new System.Drawing.Size(81, 17); - this.cbForce.TabIndex = 18; - this.cbForce.Text = "DS4 Repair"; - this.ttSSP.SetToolTip(this.cbForce, "Force DS4 to Repair Bluetooth Link Key on USB Connection"); - this.cbForce.UseVisualStyleBackColor = true; - // - // lblBrightness - // - this.lblBrightness.AutoSize = true; - this.lblBrightness.Location = new System.Drawing.Point(12, 333); - this.lblBrightness.Name = "lblBrightness"; - this.lblBrightness.Size = new System.Drawing.Size(155, 13); - this.lblBrightness.TabIndex = 7; - this.lblBrightness.Text = "DS4 Light Bar Brightness : 128"; - // - // tbBrightness - // - this.tbBrightness.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tbBrightness.AutoSize = false; - this.tbBrightness.LargeChange = 16; - this.tbBrightness.Location = new System.Drawing.Point(12, 296); - this.tbBrightness.Maximum = 255; - this.tbBrightness.Name = "tbBrightness"; - this.tbBrightness.Size = new System.Drawing.Size(270, 34); - this.tbBrightness.TabIndex = 6; - this.tbBrightness.TickFrequency = 16; - this.tbBrightness.Value = 128; - this.tbBrightness.ValueChanged += new System.EventHandler(this.tbBrightness_ValueChanged); - // - // SettingsForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(294, 482); - this.Controls.Add(this.cbForce); - this.Controls.Add(this.lblBrightness); - this.Controls.Add(this.tbBrightness); - this.Controls.Add(this.cbSSP); - this.Controls.Add(this.cbNative); - this.Controls.Add(this.gbThreshold); - this.Controls.Add(this.lblLatency); - this.Controls.Add(this.tbLatency); - this.Controls.Add(this.cbTriggers); - this.Controls.Add(this.cbRumble); - this.Controls.Add(this.cbLED); - this.Controls.Add(this.lblIdle); - this.Controls.Add(this.btnCancel); - this.Controls.Add(this.btnOK); - this.Controls.Add(this.tbIdle); - this.Controls.Add(this.gbFlip); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "SettingsForm"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "Service Configuration"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_Closing); - this.Load += new System.EventHandler(this.Form_Load); - this.gbFlip.ResumeLayout(false); - this.gbFlip.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.tbIdle)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.tbLatency)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.tbLeft)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.tbRight)).EndInit(); - this.gbThreshold.ResumeLayout(false); - this.gbThreshold.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.tbBrightness)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.GroupBox gbFlip; - private System.Windows.Forms.CheckBox cbRY; - private System.Windows.Forms.CheckBox cbRX; - private System.Windows.Forms.CheckBox cbLY; - private System.Windows.Forms.CheckBox cbLX; - private System.Windows.Forms.TrackBar tbIdle; - private System.Windows.Forms.Button btnOK; - private System.Windows.Forms.Button btnCancel; - private System.Windows.Forms.Label lblIdle; - private System.Windows.Forms.CheckBox cbLED; - private System.Windows.Forms.CheckBox cbRumble; - private System.Windows.Forms.CheckBox cbTriggers; - private System.Windows.Forms.TrackBar tbLatency; - private System.Windows.Forms.Label lblLatency; - private System.Windows.Forms.TrackBar tbLeft; - private System.Windows.Forms.TrackBar tbRight; - private System.Windows.Forms.GroupBox gbThreshold; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.CheckBox cbNative; - private System.Windows.Forms.CheckBox cbSSP; - private System.Windows.Forms.ToolTip ttSSP; - private System.Windows.Forms.Label lblBrightness; - private System.Windows.Forms.TrackBar tbBrightness; - private System.Windows.Forms.CheckBox cbForce; - } -} \ No newline at end of file diff --git a/Scp/ScpMonitor/SettingsForm.cs b/Scp/ScpMonitor/SettingsForm.cs deleted file mode 100644 index a8e267b..0000000 --- a/Scp/ScpMonitor/SettingsForm.cs +++ /dev/null @@ -1,145 +0,0 @@ -using System; -using System.Windows.Forms; -using System.Text; - -using System.Net; -using System.Net.Sockets; - -namespace ScpMonitor -{ - public partial class SettingsForm : Form - { - protected Char[] m_Delim = new Char[] { '^' }; - - protected IPEndPoint m_ServerEp = new IPEndPoint(IPAddress.Loopback, 26760); - protected UdpClient m_Server = new UdpClient(); - - protected Byte[] m_Buffer = new Byte[17]; - - public SettingsForm() - { - InitializeComponent(); - - m_Server.Client.ReceiveTimeout = 250; - - ttSSP.SetToolTip(cbSSP, @"Requires Service Restart"); - } - - public void Reset() - { - CenterToScreen(); - } - - public void Request() - { - try - { - m_Buffer[1] = 0x03; - - if (m_Server.Send(m_Buffer, m_Buffer.Length, m_ServerEp) == m_Buffer.Length) - { - IPEndPoint ReferenceEp = new IPEndPoint(IPAddress.Loopback, 0); - - Byte[] Buffer = m_Server.Receive(ref ReferenceEp); - - tbIdle.Value = Buffer[ 2]; - cbLX.Checked = Buffer[ 3] == 1; - cbLY.Checked = Buffer[ 4] == 1; - cbRX.Checked = Buffer[ 5] == 1; - cbRY.Checked = Buffer[ 6] == 1; - cbLED.Checked = Buffer[ 7] == 1; - cbRumble.Checked = Buffer[ 8] == 1; - cbTriggers.Checked = Buffer[ 9] == 1; - tbLatency.Value = Buffer[10]; - tbLeft.Value = Buffer[11]; - tbRight.Value = Buffer[12]; - cbNative.Checked = Buffer[13] == 1; - cbSSP.Checked = Buffer[14] == 1; - tbBrightness.Value = Buffer[15]; - cbForce.Checked = Buffer[16] == 1; - } - } - catch { } - } - - protected void Form_Load(object sender, EventArgs e) - { - Icon = Properties.Resources.Scp_All; - } - - protected void Form_Closing(object sender, FormClosingEventArgs e) - { - if (e.CloseReason == CloseReason.UserClosing) - { - e.Cancel = true; Hide(); - } - } - - protected void btnOK_Click(object sender, EventArgs e) - { - m_Buffer[ 1] = 0x04; - m_Buffer[ 2] = (Byte) tbIdle.Value; - m_Buffer[ 3] = (Byte)(cbLX.Checked ? 0x01 : 0x00); - m_Buffer[ 4] = (Byte)(cbLY.Checked ? 0x01 : 0x00); - m_Buffer[ 5] = (Byte)(cbRX.Checked ? 0x01 : 0x00); - m_Buffer[ 6] = (Byte)(cbRY.Checked ? 0x01 : 0x00); - m_Buffer[ 7] = (Byte)(cbLED.Checked ? 0x01 : 0x00); - m_Buffer[ 8] = (Byte)(cbRumble.Checked ? 0x01 : 0x00); - m_Buffer[ 9] = (Byte)(cbTriggers.Checked ? 0x01 : 0x00); - m_Buffer[10] = (Byte) tbLatency.Value; - m_Buffer[11] = (Byte) tbLeft.Value; - m_Buffer[12] = (Byte) tbRight.Value; - m_Buffer[13] = (Byte)(cbNative.Checked ? 0x01 : 0x00); - m_Buffer[14] = (Byte)(cbSSP.Checked ? 0x01 : 0x00); - m_Buffer[15] = (Byte) tbBrightness.Value; - m_Buffer[16] = (Byte)(cbForce.Checked ? 0x01 : 0x00); - - m_Server.Send(m_Buffer, m_Buffer.Length, m_ServerEp); - Hide(); - } - - protected void btnCancel_Click(object sender, EventArgs e) - { - Hide(); - } - - protected void tbIdle_ValueChanged(object sender, EventArgs e) - { - Int32 Value = tbIdle.Value; - - if (Value == 0) - { - lblIdle.Text = "Idle Timeout : Disabled"; - } - else if (Value == 1) - { - lblIdle.Text = "Idle Timeout : 1 minute"; - } - else - { - lblIdle.Text = String.Format("Idle Timeout : {0} minutes", Value); - } - } - - protected void tbLatency_ValueChanged(object sender, EventArgs e) - { - Int32 Value = tbLatency.Value << 4; - - lblLatency.Text = String.Format("DS3 Rumble Latency : {0} ms", Value); - } - - protected void tbBrightness_ValueChanged(object sender, EventArgs e) - { - Int32 Value = tbBrightness.Value; - - if (Value == 0) - { - lblBrightness.Text = String.Format("DS4 Light Bar Brighness : Disabled", Value); - } - else - { - lblBrightness.Text = String.Format("DS4 Light Bar Brighness : {0}", Value); - } - } - } -} diff --git a/Scp/ScpMonitor/SettingsForm.resx b/Scp/ScpMonitor/SettingsForm.resx deleted file mode 100644 index b5d7004..0000000 --- a/Scp/ScpMonitor/SettingsForm.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - \ No newline at end of file diff --git a/Scp/ScpPair/Program.cs b/Scp/ScpPair/Program.cs deleted file mode 100644 index edcd246..0000000 --- a/Scp/ScpPair/Program.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Windows.Forms; - -namespace ScpPair -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new ScpForm()); - } - } -} diff --git a/Scp/ScpPair/Properties/AssemblyInfo.cs b/Scp/ScpPair/Properties/AssemblyInfo.cs deleted file mode 100644 index d057b6f..0000000 --- a/Scp/ScpPair/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("ScpPair")] -[assembly: AssemblyProduct("ScpPair")] - -[assembly: Guid("359e2b03-d7dd-48a2-893f-4ece5bd91258")] diff --git a/Scp/ScpPair/Properties/Resources.Designer.cs b/Scp/ScpPair/Properties/Resources.Designer.cs deleted file mode 100644 index f39abea..0000000 --- a/Scp/ScpPair/Properties/Resources.Designer.cs +++ /dev/null @@ -1,73 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.34011 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ScpPair.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ScpPair.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). - /// - internal static System.Drawing.Icon Scp_All { - get { - object obj = ResourceManager.GetObject("Scp_All", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - } -} diff --git a/Scp/ScpPair/Properties/Resources.resx b/Scp/ScpPair/Properties/Resources.resx deleted file mode 100644 index 6224879..0000000 --- a/Scp/ScpPair/Properties/Resources.resx +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\Scp_All.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Scp/ScpPair/Properties/Settings.Designer.cs b/Scp/ScpPair/Properties/Settings.Designer.cs deleted file mode 100644 index e322d97..0000000 --- a/Scp/ScpPair/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.18034 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ScpPair.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/Scp/ScpPair/Properties/Settings.settings b/Scp/ScpPair/Properties/Settings.settings deleted file mode 100644 index 3964565..0000000 --- a/Scp/ScpPair/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Scp/ScpPair/ScpForm.Designer.cs b/Scp/ScpPair/ScpForm.Designer.cs deleted file mode 100644 index ee7a185..0000000 --- a/Scp/ScpPair/ScpForm.Designer.cs +++ /dev/null @@ -1,148 +0,0 @@ -namespace ScpPair -{ - partial class ScpForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.usbDevice = new ScpControl.UsbDs3(this.components); - this.tmEnable = new System.Windows.Forms.Timer(this.components); - this.tbMaster = new System.Windows.Forms.TextBox(); - this.lblLocal = new System.Windows.Forms.Label(); - this.lblRemote = new System.Windows.Forms.Label(); - this.lblMac = new System.Windows.Forms.Label(); - this.lblMaster = new System.Windows.Forms.Label(); - this.btnSet = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // usbDevice - // - this.usbDevice.IsShutdown = false; - this.usbDevice.PadId = ScpControl.DsPadId.One; - // - // tmEnable - // - this.tmEnable.Enabled = true; - this.tmEnable.Tick += new System.EventHandler(this.tmEnable_Tick); - // - // tbMaster - // - this.tbMaster.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tbMaster.Location = new System.Drawing.Point(12, 84); - this.tbMaster.Name = "tbMaster"; - this.tbMaster.Size = new System.Drawing.Size(194, 20); - this.tbMaster.TabIndex = 0; - // - // lblLocal - // - this.lblLocal.AutoSize = true; - this.lblLocal.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblLocal.Location = new System.Drawing.Point(12, 9); - this.lblLocal.Name = "lblLocal"; - this.lblLocal.Size = new System.Drawing.Size(61, 12); - this.lblLocal.TabIndex = 1; - this.lblLocal.Text = "Local :"; - // - // lblRemote - // - this.lblRemote.AutoSize = true; - this.lblRemote.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblRemote.Location = new System.Drawing.Point(12, 38); - this.lblRemote.Name = "lblRemote"; - this.lblRemote.Size = new System.Drawing.Size(61, 12); - this.lblRemote.TabIndex = 2; - this.lblRemote.Text = "Remote :"; - // - // lblMac - // - this.lblMac.AutoSize = true; - this.lblMac.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblMac.Location = new System.Drawing.Point(79, 9); - this.lblMac.Name = "lblMac"; - this.lblMac.Size = new System.Drawing.Size(0, 12); - this.lblMac.TabIndex = 3; - // - // lblMaster - // - this.lblMaster.AutoSize = true; - this.lblMaster.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblMaster.Location = new System.Drawing.Point(79, 38); - this.lblMaster.Name = "lblMaster"; - this.lblMaster.Size = new System.Drawing.Size(0, 12); - this.lblMaster.TabIndex = 4; - // - // btnSet - // - this.btnSet.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnSet.Enabled = false; - this.btnSet.Location = new System.Drawing.Point(131, 119); - this.btnSet.Name = "btnSet"; - this.btnSet.Size = new System.Drawing.Size(75, 23); - this.btnSet.TabIndex = 5; - this.btnSet.Text = "Set"; - this.btnSet.UseVisualStyleBackColor = true; - this.btnSet.Click += new System.EventHandler(this.btnSet_Click); - this.btnSet.Enter += new System.EventHandler(this.Button_Enter); - // - // ScpForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(221, 154); - this.Controls.Add(this.btnSet); - this.Controls.Add(this.lblMaster); - this.Controls.Add(this.lblMac); - this.Controls.Add(this.lblRemote); - this.Controls.Add(this.lblLocal); - this.Controls.Add(this.tbMaster); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ScpForm"; - this.Text = "SCP Pair Tool"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_Close); - this.Load += new System.EventHandler(this.Form_Load); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private ScpControl.UsbDs3 usbDevice; - private System.Windows.Forms.Timer tmEnable; - private System.Windows.Forms.TextBox tbMaster; - private System.Windows.Forms.Label lblLocal; - private System.Windows.Forms.Label lblRemote; - private System.Windows.Forms.Label lblMac; - private System.Windows.Forms.Label lblMaster; - private System.Windows.Forms.Button btnSet; - - } -} - diff --git a/Scp/ScpPair/ScpForm.cs b/Scp/ScpPair/ScpForm.cs deleted file mode 100644 index e9f3f99..0000000 --- a/Scp/ScpPair/ScpForm.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System; -using System.Drawing; -using System.Windows.Forms; -using ScpControl; -using System.Runtime.InteropServices; - -namespace ScpPair -{ - public partial class ScpForm : Form - { - protected IntPtr m_UsbNotify = IntPtr.Zero; - - protected Byte[] Master = new Byte[6]; - - public ScpForm() - { - InitializeComponent(); - } - - private void tmEnable_Tick(object sender, EventArgs e) - { - if (usbDevice.State == DsState.Connected) - { - String[] Split = tbMaster.Text.Split(new String[] { ":" }, StringSplitOptions.RemoveEmptyEntries); - - if (Split.Length == 6) - { - Boolean Ok = true; - - for (Int32 Index = 0; Index < 6 && Ok; Index++) - { - if (Split[Index].Length != 2 || !Byte.TryParse(Split[Index], System.Globalization.NumberStyles.HexNumber, null, out Master[Index])) - { - Ok = false; - } - } - - btnSet.Enabled = Ok; - } - - lblMac.Text = usbDevice.Local; - lblMaster.Text = usbDevice.Remote; - } - else - { - lblMac.Text = String.Empty; - lblMaster.Text = String.Empty; - } - } - - private void btnSet_Click(object sender, EventArgs e) - { - usbDevice.Pair(Master); - } - - private void Form_Load(object sender, EventArgs e) - { - Icon = Properties.Resources.Scp_All; - - if (usbDevice.Open()) usbDevice.Start(); - - ScpDevice.RegisterNotify(Handle, new Guid(UsbDs3.USB_CLASS_GUID), ref m_UsbNotify); - } - - private void Form_Close(object sender, FormClosingEventArgs e) - { - if (m_UsbNotify != IntPtr.Zero) ScpDevice.UnregisterNotify(m_UsbNotify); - - if (usbDevice.State == DsState.Connected) usbDevice.Close(); - } - - protected override void WndProc(ref Message m) - { - try - { - if (m.Msg == ScpDevice.WM_DEVICECHANGE) - { - String Path; - ScpDevice.DEV_BROADCAST_HDR hdr; - Int32 Type = m.WParam.ToInt32(); - - hdr = (ScpDevice.DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(ScpDevice.DEV_BROADCAST_HDR)); - - if (hdr.dbch_devicetype == ScpDevice.DBT_DEVTYP_DEVICEINTERFACE) - { - ScpDevice.DEV_BROADCAST_DEVICEINTERFACE_M deviceInterface; - - deviceInterface = (ScpDevice.DEV_BROADCAST_DEVICEINTERFACE_M)Marshal.PtrToStructure(m.LParam, typeof(ScpDevice.DEV_BROADCAST_DEVICEINTERFACE_M)); - - Path = new String(deviceInterface.dbcc_name); - Path = Path.Substring(0, Path.IndexOf('\0')).ToUpper(); - - switch (Type) - { - case ScpDevice.DBT_DEVICEARRIVAL: - - if (usbDevice.State != DsState.Connected) - { - usbDevice.Close(); - usbDevice = new UsbDs3(); - - if (usbDevice.Open(Path)) usbDevice.Start(); - } - break; - - case ScpDevice.DBT_DEVICEREMOVECOMPLETE: - - if (Path == usbDevice.Path && usbDevice.State == DsState.Connected) - { - usbDevice.Close(); - } - - break; - } - } - } - } - catch { } - - base.WndProc(ref m); - } - - protected void Button_Enter(object sender, EventArgs e) - { - ThemeUtil.UpdateFocus(((Button) sender).Handle); - } - } -} diff --git a/Scp/ScpPair/ScpForm.resx b/Scp/ScpPair/ScpForm.resx deleted file mode 100644 index 32ff8c4..0000000 --- a/Scp/ScpPair/ScpForm.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 124, 17 - - \ No newline at end of file diff --git a/Scp/ScpPair/ScpPair.csproj b/Scp/ScpPair/ScpPair.csproj deleted file mode 100644 index f6f2814..0000000 --- a/Scp/ScpPair/ScpPair.csproj +++ /dev/null @@ -1,109 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {FDC70577-8D4C-4E79-87EE-E9B3D09FAA8A} - WinExe - Properties - ScpPair - ScpPair - v4.0 - Client - 512 - - - true - ..\..\bin\ - DEBUG;TRACE - full - AnyCPU - bin\Debug\ScpPair.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - ..\..\bin\ - TRACE - true - pdbonly - AnyCPU - bin\Release\ScpPair.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - - - Resources\Scp_All.ico - - - - - - - - - - Form - - - ScpForm.cs - - - - - ScpForm.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C} - ScpControl - - - - - - - - Copy /Y /B $(SolutionDir)\Common\Properties\Info.cs $(ProjectDir)\Properties\CommonInfo.cs > nul: -If Not Exist $(ProjectDir)\Resources\Scp_All.ico Copy /Y /B $(SolutionDir)\Common\Resources\Scp.ico $(ProjectDir)\Resources\Scp_All.ico > nul: - - - \ No newline at end of file diff --git a/Scp/ScpPair/ScpPair_2010.csproj b/Scp/ScpPair/ScpPair_2010.csproj deleted file mode 100644 index 56ce87a..0000000 --- a/Scp/ScpPair/ScpPair_2010.csproj +++ /dev/null @@ -1,108 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {FDC70577-8D4C-4E79-87EE-E9B3D09FAA8A} - WinExe - Properties - ScpPair - ScpPair - v4.0 - Client - 512 - - - true - ..\..\bin\ - DEBUG;TRACE - full - AnyCPU - bin\Debug\ScpPair.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - ..\..\bin\ - TRACE - true - pdbonly - AnyCPU - bin\Release\ScpPair.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - - - Resources\Scp_All.ico - - - - - - - - - - Form - - - ScpForm.cs - - - - - ScpForm.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C} - ScpControl - - - - - - - - Copy /Y /B $(SolutionDir)\Common\Properties\Info.cs $(ProjectDir)\Properties\CommonInfo.cs > nul: -If Not Exist $(ProjectDir)\Resources\Scp_All.ico Copy /Y /B $(SolutionDir)\Common\Resources\Scp.ico $(ProjectDir)\Resources\Scp_All.ico > nul: - - - \ No newline at end of file diff --git a/Scp/ScpServer.sln b/Scp/ScpServer.sln deleted file mode 100644 index 3784165..0000000 --- a/Scp/ScpServer.sln +++ /dev/null @@ -1,52 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2013 for Windows Desktop -VisualStudioVersion = 12.0.30110.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScpMonitor", "ScpMonitor\ScpMonitor.csproj", "{6C9F554E-90D6-449C-91E9-130D476D88B5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScpService", "ScpService\ScpService.csproj", "{DA326CAA-4E14-4B0F-993D-91F5BD19FBA0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScpServer", "ScpServer\ScpServer.csproj", "{D553DB39-186A-48B2-B8FA-E9C56C2BC382}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScpInstaller", "ScpInstaller\ScpInstaller.csproj", "{D5ED7E4A-0B5B-42C4-BBBE-942842BC4535}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScpControl", "ScpControl\ScpControl.csproj", "{DDECF06E-BE48-4610-8BF8-4AE5140D9F0C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScpPair", "ScpPair\ScpPair.csproj", "{FDC70577-8D4C-4E79-87EE-E9B3D09FAA8A}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6C9F554E-90D6-449C-91E9-130D476D88B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C9F554E-90D6-449C-91E9-130D476D88B5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C9F554E-90D6-449C-91E9-130D476D88B5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C9F554E-90D6-449C-91E9-130D476D88B5}.Release|Any CPU.Build.0 = Release|Any CPU - {DA326CAA-4E14-4B0F-993D-91F5BD19FBA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DA326CAA-4E14-4B0F-993D-91F5BD19FBA0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DA326CAA-4E14-4B0F-993D-91F5BD19FBA0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DA326CAA-4E14-4B0F-993D-91F5BD19FBA0}.Release|Any CPU.Build.0 = Release|Any CPU - {D553DB39-186A-48B2-B8FA-E9C56C2BC382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D553DB39-186A-48B2-B8FA-E9C56C2BC382}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D553DB39-186A-48B2-B8FA-E9C56C2BC382}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D553DB39-186A-48B2-B8FA-E9C56C2BC382}.Release|Any CPU.Build.0 = Release|Any CPU - {D5ED7E4A-0B5B-42C4-BBBE-942842BC4535}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5ED7E4A-0B5B-42C4-BBBE-942842BC4535}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5ED7E4A-0B5B-42C4-BBBE-942842BC4535}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5ED7E4A-0B5B-42C4-BBBE-942842BC4535}.Release|Any CPU.Build.0 = Release|Any CPU - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C}.Release|Any CPU.Build.0 = Release|Any CPU - {FDC70577-8D4C-4E79-87EE-E9B3D09FAA8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FDC70577-8D4C-4E79-87EE-E9B3D09FAA8A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FDC70577-8D4C-4E79-87EE-E9B3D09FAA8A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FDC70577-8D4C-4E79-87EE-E9B3D09FAA8A}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Scp/ScpServer/Program.cs b/Scp/ScpServer/Program.cs deleted file mode 100644 index 4c6e0a4..0000000 --- a/Scp/ScpServer/Program.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Windows.Forms; - -namespace ScpServer -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new ScpForm()); - } - } -} diff --git a/Scp/ScpServer/Properties/AssemblyInfo.cs b/Scp/ScpServer/Properties/AssemblyInfo.cs deleted file mode 100644 index 3688adf..0000000 --- a/Scp/ScpServer/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("ScpServer")] -[assembly: AssemblyProduct("ScpServer")] - -[assembly: Guid("a52b5b20-d9ee-4f32-8518-307fa14aa0c6")] diff --git a/Scp/ScpServer/Properties/Resources.Designer.cs b/Scp/ScpServer/Properties/Resources.Designer.cs deleted file mode 100644 index ff12203..0000000 --- a/Scp/ScpServer/Properties/Resources.Designer.cs +++ /dev/null @@ -1,70 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.269 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ScpServer.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ScpServer.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - internal static System.Drawing.Icon Scp_All { - get { - object obj = ResourceManager.GetObject("Scp_All", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - } -} diff --git a/Scp/ScpServer/Properties/Resources.resx b/Scp/ScpServer/Properties/Resources.resx deleted file mode 100644 index 6224879..0000000 --- a/Scp/ScpServer/Properties/Resources.resx +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\Scp_All.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Scp/ScpServer/Properties/Settings.Designer.cs b/Scp/ScpServer/Properties/Settings.Designer.cs deleted file mode 100644 index 1c27a31..0000000 --- a/Scp/ScpServer/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.269 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ScpServer.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/Scp/ScpServer/Properties/Settings.settings b/Scp/ScpServer/Properties/Settings.settings deleted file mode 100644 index 3964565..0000000 --- a/Scp/ScpServer/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Scp/ScpServer/ScpForm.Designer.cs b/Scp/ScpServer/ScpForm.Designer.cs deleted file mode 100644 index d18f0fc..0000000 --- a/Scp/ScpServer/ScpForm.Designer.cs +++ /dev/null @@ -1,352 +0,0 @@ -namespace ScpServer -{ - partial class ScpForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.lvDebug = new System.Windows.Forms.ListView(); - this.chTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.chData = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.tmrUpdate = new System.Windows.Forms.Timer(this.components); - this.pnlButton = new System.Windows.Forms.Panel(); - this.btnClear = new System.Windows.Forms.Button(); - this.btnBoth = new System.Windows.Forms.Button(); - this.btnPair = new System.Windows.Forms.Button(); - this.btnOff = new System.Windows.Forms.Button(); - this.btnRight = new System.Windows.Forms.Button(); - this.btnLeft = new System.Windows.Forms.Button(); - this.btnStop = new System.Windows.Forms.Button(); - this.btnStart = new System.Windows.Forms.Button(); - this.lblHost = new System.Windows.Forms.Label(); - this.pnlDebug = new System.Windows.Forms.Panel(); - this.pnlStatus = new System.Windows.Forms.Panel(); - this.gpPads = new System.Windows.Forms.GroupBox(); - this.rbPad_4 = new System.Windows.Forms.RadioButton(); - this.rbPad_3 = new System.Windows.Forms.RadioButton(); - this.rbPad_2 = new System.Windows.Forms.RadioButton(); - this.rbPad_1 = new System.Windows.Forms.RadioButton(); - this.rootHub = new ScpControl.RootHub(this.components); - this.pnlButton.SuspendLayout(); - this.pnlDebug.SuspendLayout(); - this.pnlStatus.SuspendLayout(); - this.gpPads.SuspendLayout(); - this.SuspendLayout(); - // - // lvDebug - // - this.lvDebug.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.chTime, - this.chData}); - this.lvDebug.Dock = System.Windows.Forms.DockStyle.Fill; - this.lvDebug.Font = new System.Drawing.Font("Lucida Console", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lvDebug.FullRowSelect = true; - this.lvDebug.Location = new System.Drawing.Point(0, 0); - this.lvDebug.Name = "lvDebug"; - this.lvDebug.Size = new System.Drawing.Size(769, 370); - this.lvDebug.TabIndex = 0; - this.lvDebug.UseCompatibleStateImageBehavior = false; - this.lvDebug.View = System.Windows.Forms.View.Details; - this.lvDebug.Enter += new System.EventHandler(this.lvDebug_Enter); - // - // chTime - // - this.chTime.Text = "Time"; - this.chTime.Width = 200; - // - // chData - // - this.chData.Text = "Data"; - this.chData.Width = 525; - // - // tmrUpdate - // - this.tmrUpdate.Tick += new System.EventHandler(this.tmrUpdate_Tick); - // - // pnlButton - // - this.pnlButton.Controls.Add(this.btnClear); - this.pnlButton.Controls.Add(this.btnBoth); - this.pnlButton.Controls.Add(this.btnPair); - this.pnlButton.Controls.Add(this.btnOff); - this.pnlButton.Controls.Add(this.btnRight); - this.pnlButton.Controls.Add(this.btnLeft); - this.pnlButton.Controls.Add(this.btnStop); - this.pnlButton.Controls.Add(this.btnStart); - this.pnlButton.Dock = System.Windows.Forms.DockStyle.Bottom; - this.pnlButton.Location = new System.Drawing.Point(0, 476); - this.pnlButton.Name = "pnlButton"; - this.pnlButton.Size = new System.Drawing.Size(769, 35); - this.pnlButton.TabIndex = 10; - // - // btnClear - // - this.btnClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.btnClear.Enabled = false; - this.btnClear.Location = new System.Drawing.Point(520, 6); - this.btnClear.Name = "btnClear"; - this.btnClear.Size = new System.Drawing.Size(75, 23); - this.btnClear.TabIndex = 9; - this.btnClear.Text = "Clear"; - this.btnClear.UseVisualStyleBackColor = true; - this.btnClear.Click += new System.EventHandler(this.btnClear_Click); - this.btnClear.Enter += new System.EventHandler(this.Button_Enter); - // - // btnBoth - // - this.btnBoth.Enabled = false; - this.btnBoth.Location = new System.Drawing.Point(12, 6); - this.btnBoth.Name = "btnBoth"; - this.btnBoth.Size = new System.Drawing.Size(75, 23); - this.btnBoth.TabIndex = 3; - this.btnBoth.Text = "Both"; - this.btnBoth.UseVisualStyleBackColor = true; - this.btnBoth.Click += new System.EventHandler(this.btnMotor_Click); - this.btnBoth.Enter += new System.EventHandler(this.Button_Enter); - // - // btnPair - // - this.btnPair.Enabled = false; - this.btnPair.Location = new System.Drawing.Point(336, 6); - this.btnPair.Name = "btnPair"; - this.btnPair.Size = new System.Drawing.Size(75, 23); - this.btnPair.TabIndex = 7; - this.btnPair.Text = "Pair"; - this.btnPair.UseVisualStyleBackColor = true; - this.btnPair.Click += new System.EventHandler(this.btnPair_Click); - this.btnPair.Enter += new System.EventHandler(this.Button_Enter); - // - // btnOff - // - this.btnOff.Enabled = false; - this.btnOff.Location = new System.Drawing.Point(255, 6); - this.btnOff.Name = "btnOff"; - this.btnOff.Size = new System.Drawing.Size(75, 23); - this.btnOff.TabIndex = 6; - this.btnOff.Text = "Off"; - this.btnOff.UseVisualStyleBackColor = true; - this.btnOff.Click += new System.EventHandler(this.btnMotor_Click); - this.btnOff.Enter += new System.EventHandler(this.Button_Enter); - // - // btnRight - // - this.btnRight.Enabled = false; - this.btnRight.Location = new System.Drawing.Point(174, 6); - this.btnRight.Name = "btnRight"; - this.btnRight.Size = new System.Drawing.Size(75, 23); - this.btnRight.TabIndex = 5; - this.btnRight.Text = "Right"; - this.btnRight.UseVisualStyleBackColor = true; - this.btnRight.Click += new System.EventHandler(this.btnMotor_Click); - this.btnRight.Enter += new System.EventHandler(this.Button_Enter); - // - // btnLeft - // - this.btnLeft.Enabled = false; - this.btnLeft.Location = new System.Drawing.Point(93, 6); - this.btnLeft.Name = "btnLeft"; - this.btnLeft.Size = new System.Drawing.Size(75, 23); - this.btnLeft.TabIndex = 4; - this.btnLeft.Text = "Left"; - this.btnLeft.UseVisualStyleBackColor = true; - this.btnLeft.Click += new System.EventHandler(this.btnMotor_Click); - this.btnLeft.Enter += new System.EventHandler(this.Button_Enter); - // - // btnStop - // - this.btnStop.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.btnStop.Enabled = false; - this.btnStop.Location = new System.Drawing.Point(682, 6); - this.btnStop.Name = "btnStop"; - this.btnStop.Size = new System.Drawing.Size(75, 23); - this.btnStop.TabIndex = 2; - this.btnStop.Text = "Stop"; - this.btnStop.UseVisualStyleBackColor = true; - this.btnStop.Click += new System.EventHandler(this.btnStop_Click); - this.btnStop.Enter += new System.EventHandler(this.Button_Enter); - // - // btnStart - // - this.btnStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.btnStart.Location = new System.Drawing.Point(601, 6); - this.btnStart.Name = "btnStart"; - this.btnStart.Size = new System.Drawing.Size(75, 23); - this.btnStart.TabIndex = 1; - this.btnStart.Text = "Start"; - this.btnStart.UseVisualStyleBackColor = true; - this.btnStart.Click += new System.EventHandler(this.btnStart_Click); - this.btnStart.Enter += new System.EventHandler(this.Button_Enter); - // - // lblHost - // - this.lblHost.AutoSize = true; - this.lblHost.Font = new System.Drawing.Font("Lucida Console", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblHost.Location = new System.Drawing.Point(12, 9); - this.lblHost.Name = "lblHost"; - this.lblHost.Size = new System.Drawing.Size(119, 13); - this.lblHost.TabIndex = 0; - this.lblHost.Text = "Host Address :"; - // - // pnlDebug - // - this.pnlDebug.Controls.Add(this.lvDebug); - this.pnlDebug.Dock = System.Windows.Forms.DockStyle.Fill; - this.pnlDebug.Location = new System.Drawing.Point(0, 106); - this.pnlDebug.Name = "pnlDebug"; - this.pnlDebug.Size = new System.Drawing.Size(769, 370); - this.pnlDebug.TabIndex = 11; - // - // pnlStatus - // - this.pnlStatus.Controls.Add(this.gpPads); - this.pnlStatus.Controls.Add(this.lblHost); - this.pnlStatus.Dock = System.Windows.Forms.DockStyle.Top; - this.pnlStatus.Location = new System.Drawing.Point(0, 0); - this.pnlStatus.Name = "pnlStatus"; - this.pnlStatus.Size = new System.Drawing.Size(769, 106); - this.pnlStatus.TabIndex = 9; - // - // gpPads - // - this.gpPads.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.gpPads.Controls.Add(this.rbPad_4); - this.gpPads.Controls.Add(this.rbPad_3); - this.gpPads.Controls.Add(this.rbPad_2); - this.gpPads.Controls.Add(this.rbPad_1); - this.gpPads.Location = new System.Drawing.Point(300, -4); - this.gpPads.Name = "gpPads"; - this.gpPads.Size = new System.Drawing.Size(465, 104); - this.gpPads.TabIndex = 1; - this.gpPads.TabStop = false; - // - // rbPad_4 - // - this.rbPad_4.AutoSize = true; - this.rbPad_4.Enabled = false; - this.rbPad_4.Font = new System.Drawing.Font("Lucida Console", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.rbPad_4.Location = new System.Drawing.Point(6, 79); - this.rbPad_4.Name = "rbPad_4"; - this.rbPad_4.Size = new System.Drawing.Size(185, 17); - this.rbPad_4.TabIndex = 3; - this.rbPad_4.TabStop = true; - this.rbPad_4.Text = "Pad 4 : Disconnected"; - this.rbPad_4.UseVisualStyleBackColor = true; - // - // rbPad_3 - // - this.rbPad_3.AutoSize = true; - this.rbPad_3.Enabled = false; - this.rbPad_3.Font = new System.Drawing.Font("Lucida Console", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.rbPad_3.Location = new System.Drawing.Point(6, 56); - this.rbPad_3.Name = "rbPad_3"; - this.rbPad_3.Size = new System.Drawing.Size(185, 17); - this.rbPad_3.TabIndex = 2; - this.rbPad_3.TabStop = true; - this.rbPad_3.Text = "Pad 3 : Disconnected"; - this.rbPad_3.UseVisualStyleBackColor = true; - // - // rbPad_2 - // - this.rbPad_2.AutoSize = true; - this.rbPad_2.Enabled = false; - this.rbPad_2.Font = new System.Drawing.Font("Lucida Console", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.rbPad_2.Location = new System.Drawing.Point(6, 33); - this.rbPad_2.Name = "rbPad_2"; - this.rbPad_2.Size = new System.Drawing.Size(185, 17); - this.rbPad_2.TabIndex = 1; - this.rbPad_2.TabStop = true; - this.rbPad_2.Text = "Pad 2 : Disconnected"; - this.rbPad_2.UseVisualStyleBackColor = true; - // - // rbPad_1 - // - this.rbPad_1.AutoSize = true; - this.rbPad_1.Enabled = false; - this.rbPad_1.Font = new System.Drawing.Font("Lucida Console", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.rbPad_1.Location = new System.Drawing.Point(6, 10); - this.rbPad_1.Name = "rbPad_1"; - this.rbPad_1.Size = new System.Drawing.Size(185, 17); - this.rbPad_1.TabIndex = 0; - this.rbPad_1.TabStop = true; - this.rbPad_1.Text = "Pad 1 : Disconnected"; - this.rbPad_1.UseVisualStyleBackColor = true; - // - // rootHub - // - this.rootHub.Debug += new System.EventHandler(this.On_Debug); - // - // ScpForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(769, 511); - this.Controls.Add(this.pnlDebug); - this.Controls.Add(this.pnlButton); - this.Controls.Add(this.pnlStatus); - this.MinimumSize = new System.Drawing.Size(785, 550); - this.Name = "ScpForm"; - this.Text = "SCP Server"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_Close); - this.Load += new System.EventHandler(this.Form_Load); - this.pnlButton.ResumeLayout(false); - this.pnlDebug.ResumeLayout(false); - this.pnlStatus.ResumeLayout(false); - this.pnlStatus.PerformLayout(); - this.gpPads.ResumeLayout(false); - this.gpPads.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.ListView lvDebug; - private System.Windows.Forms.ColumnHeader chTime; - private System.Windows.Forms.ColumnHeader chData; - private System.Windows.Forms.Timer tmrUpdate; - private System.Windows.Forms.Panel pnlButton; - private System.Windows.Forms.Button btnBoth; - private System.Windows.Forms.Button btnPair; - private System.Windows.Forms.Button btnOff; - private System.Windows.Forms.Button btnRight; - private System.Windows.Forms.Button btnLeft; - private System.Windows.Forms.Button btnStop; - private System.Windows.Forms.Button btnStart; - private System.Windows.Forms.Label lblHost; - private System.Windows.Forms.Panel pnlDebug; - private System.Windows.Forms.Panel pnlStatus; - private System.Windows.Forms.GroupBox gpPads; - private System.Windows.Forms.RadioButton rbPad_4; - private System.Windows.Forms.RadioButton rbPad_3; - private System.Windows.Forms.RadioButton rbPad_2; - private System.Windows.Forms.RadioButton rbPad_1; - private System.Windows.Forms.Button btnClear; - private ScpControl.RootHub rootHub; - } -} - diff --git a/Scp/ScpServer/ScpForm.cs b/Scp/ScpServer/ScpForm.cs deleted file mode 100644 index fedc8d3..0000000 --- a/Scp/ScpServer/ScpForm.cs +++ /dev/null @@ -1,254 +0,0 @@ -using System; -using System.Windows.Forms; -using System.IO; -using System.Runtime.InteropServices; -using System.Reflection; - -using ScpControl; - -namespace ScpServer -{ - public partial class ScpForm : Form - { - protected String m_Log = Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName + "\\" + Assembly.GetExecutingAssembly().GetName().Name + ".log"; - - delegate void LogDebugDelegate(DateTime Time, String Data); - - protected void LogDebug(DateTime Time, String Data) - { - if (lvDebug.InvokeRequired) - { - LogDebugDelegate d = new LogDebugDelegate(LogDebug); - try - { - this.Invoke(d, new Object[] { Time, Data }); - } - catch { } - } - else - { - String Posted = Time.ToString("yyyy-MM-dd HH:mm:ss.fff"); - - lvDebug.Items.Add(new ListViewItem(new String[] { Posted, Data })).EnsureVisible(); - - try - { - using (StreamWriter fs = new StreamWriter(m_Log, true)) - { - fs.Write(String.Format("{0} {1}\r\n", Posted, Data)); - fs.Flush(); - } - } - catch { } - } - } - - protected IntPtr m_Ds3Notify = IntPtr.Zero; - protected IntPtr m_Ds4Notify = IntPtr.Zero; - protected IntPtr m_BthNotify = IntPtr.Zero; - - protected RadioButton[] Pad = new RadioButton[4]; - - public ScpForm() - { - InitializeComponent(); - ThemeUtil.SetTheme(lvDebug); - - Pad[0] = rbPad_1; - Pad[1] = rbPad_2; - Pad[2] = rbPad_3; - Pad[3] = rbPad_4; - } - - protected void Form_Load(object sender, EventArgs e) - { - Icon = Properties.Resources.Scp_All; - - ScpDevice.RegisterNotify(Handle, new Guid(UsbDs3.USB_CLASS_GUID ), ref m_Ds3Notify); - ScpDevice.RegisterNotify(Handle, new Guid(UsbDs4.USB_CLASS_GUID ), ref m_Ds4Notify); - ScpDevice.RegisterNotify(Handle, new Guid(BthDongle.BTH_CLASS_GUID), ref m_BthNotify); - - LogDebug(DateTime.Now, String.Format("++ {0} {1}", Assembly.GetExecutingAssembly().Location, Assembly.GetExecutingAssembly().GetName().Version.ToString())); - - tmrUpdate.Enabled = true; - btnStart_Click(sender, e); - } - - protected void Form_Close(object sender, FormClosingEventArgs e) - { - rootHub.Stop(); - rootHub.Close(); - - if (m_Ds3Notify != IntPtr.Zero) ScpDevice.UnregisterNotify(m_Ds3Notify); - if (m_Ds4Notify != IntPtr.Zero) ScpDevice.UnregisterNotify(m_Ds4Notify); - if (m_BthNotify != IntPtr.Zero) ScpDevice.UnregisterNotify(m_BthNotify); - } - - protected void btnStart_Click(object sender, EventArgs e) - { - if (rootHub.Open() && rootHub.Start()) - { - btnStart.Enabled = false; - btnStop.Enabled = true; - } - } - - protected void btnStop_Click(object sender, EventArgs e) - { - if (rootHub.Stop()) - { - btnStart.Enabled = true; - btnStop.Enabled = false; - } - } - - protected void btnClear_Click(object sender, EventArgs e) - { - lvDebug.Items.Clear(); - } - - protected void btnMotor_Click(object sender, EventArgs e) - { - Button Target = (Button) sender; - Byte Left = 0x00, Right = 0x00; - - if (Target == btnBoth) - { - Left = 0xFF; Right = 0xFF; - } - else if (Target == btnLeft ) Left = 0xFF; - else if (Target == btnRight) Right = 0xFF; - - for (int Index = 0; Index < 4; Index++) - { - if (Pad[Index].Enabled && Pad[Index].Checked) - { - rootHub.Pad[Index].Rumble(Left, Right); - } - } - } - - protected void btnPair_Click(object sender, EventArgs e) - { - for (Int32 Index = 0; Index < Pad.Length; Index++) - { - if (Pad[Index].Checked) - { - Byte[] Master = new Byte[6]; - String[] Parts = rootHub.Master.Split(new String[] { ":" }, StringSplitOptions.RemoveEmptyEntries); - - for (Int32 Part = 0; Part < Master.Length; Part++) - { - Master[Part] = Byte.Parse(Parts[Part], System.Globalization.NumberStyles.HexNumber); - } - - rootHub.Pad[Index].Pair(Master); - break; - } - } - } - - protected void btnDisconnect_Click(object sender, EventArgs e) - { - for (Int32 Index = 0; Index < Pad.Length; Index++) - { - if (Pad[Index].Checked) - { - rootHub.Pad[Index].Disconnect(); - break; - } - } - } - - protected void btnSuspend_Click(object sender, EventArgs e) - { - rootHub.Suspend(); - } - - protected void btnResume_Click(object sender, EventArgs e) - { - rootHub.Resume(); - } - - protected override void WndProc(ref Message m) - { - try - { - if (m.Msg == ScpDevice.WM_DEVICECHANGE) - { - Int32 Type = m.WParam.ToInt32(); - - switch (Type) - { - case ScpDevice.DBT_DEVICEARRIVAL: - case ScpDevice.DBT_DEVICEQUERYREMOVE: - case ScpDevice.DBT_DEVICEREMOVECOMPLETE: - - ScpDevice.DEV_BROADCAST_HDR hdr; - - hdr = (ScpDevice.DEV_BROADCAST_HDR) Marshal.PtrToStructure(m.LParam, typeof(ScpDevice.DEV_BROADCAST_HDR)); - - if (hdr.dbch_devicetype == ScpDevice.DBT_DEVTYP_DEVICEINTERFACE) - { - ScpDevice.DEV_BROADCAST_DEVICEINTERFACE_M deviceInterface; - - deviceInterface = (ScpDevice.DEV_BROADCAST_DEVICEINTERFACE_M) Marshal.PtrToStructure(m.LParam, typeof(ScpDevice.DEV_BROADCAST_DEVICEINTERFACE_M)); - - String Class = "{" + new Guid(deviceInterface.dbcc_classguid).ToString().ToUpper() + "}"; - - String Path = new String(deviceInterface.dbcc_name); - Path = Path.Substring(0, Path.IndexOf('\0')).ToUpper(); - - rootHub.Notify((ScpDevice.Notified) Type, Class, Path); - } - break; - } - } - } - catch { } - - base.WndProc(ref m); - } - - protected void tmrUpdate_Tick(object sender, EventArgs e) - { - Boolean bSelected = false, bDisconnect = false, bPair = false; - - lblHost.Text = rootHub.Dongle; lblHost.Enabled = btnStop.Enabled; - - for (Int32 Index = 0; Index < Pad.Length; Index++) - { - Pad[Index].Text = rootHub.Pad[Index].ToString(); - Pad[Index].Enabled = rootHub.Pad[Index].State == DsState.Connected; - Pad[Index].Checked = Pad[Index].Enabled && Pad[Index].Checked; - - bSelected = bSelected || Pad[Index].Checked; - bDisconnect = bDisconnect || rootHub.Pad[Index].Connection == DsConnection.BTH; - - bPair = bPair || (Pad[Index].Checked && rootHub.Pad[Index].Connection == DsConnection.USB && rootHub.Master != rootHub.Pad[Index].Remote); - } - - btnBoth.Enabled = btnLeft.Enabled = btnRight.Enabled = btnOff.Enabled = bSelected && btnStop.Enabled; - - btnPair.Enabled = bPair && bSelected && btnStop.Enabled && rootHub.Pairable; - - btnClear.Enabled = lvDebug.Items.Count > 0; - } - - protected void On_Debug(object sender, ScpControl.DebugEventArgs e) - { - LogDebug(e.Time, e.Data); - } - - - protected void lvDebug_Enter(object sender, EventArgs e) - { - ThemeUtil.UpdateFocus(lvDebug.Handle); - } - - protected void Button_Enter(object sender, EventArgs e) - { - ThemeUtil.UpdateFocus(((Button) sender).Handle); - } - } -} diff --git a/Scp/ScpServer/ScpForm.resx b/Scp/ScpServer/ScpForm.resx deleted file mode 100644 index e592320..0000000 --- a/Scp/ScpServer/ScpForm.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 128, 17 - - \ No newline at end of file diff --git a/Scp/ScpServer/ScpServer.csproj b/Scp/ScpServer/ScpServer.csproj deleted file mode 100644 index 38addf1..0000000 --- a/Scp/ScpServer/ScpServer.csproj +++ /dev/null @@ -1,112 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {D553DB39-186A-48B2-B8FA-E9C56C2BC382} - WinExe - Properties - ScpServer - ScpServer - v4.0 - 512 - - - - true - ..\..\bin\ - DEBUG;TRACE - full - AnyCPU - bin\Debug\ScpServer.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - false - - - ..\..\bin\ - TRACE - true - pdbonly - AnyCPU - bin\Release\ScpServer.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - Resources\Scp_All.ico - - - - - - - - - - Form - - - ScpForm.cs - - - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - ScpForm.cs - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C} - ScpControl - - - - - - - - Copy /Y /B $(SolutionDir)\Common\Properties\Info.cs $(ProjectDir)\Properties\CommonInfo.cs > nul: -If Not Exist $(ProjectDir)\Resources\Scp_All.ico Copy /Y /B $(SolutionDir)\Common\Resources\Scp.ico $(ProjectDir)\Resources\Scp_All.ico > nul: - - - \ No newline at end of file diff --git a/Scp/ScpServer/ScpServer_2010.csproj b/Scp/ScpServer/ScpServer_2010.csproj deleted file mode 100644 index 38addf1..0000000 --- a/Scp/ScpServer/ScpServer_2010.csproj +++ /dev/null @@ -1,112 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {D553DB39-186A-48B2-B8FA-E9C56C2BC382} - WinExe - Properties - ScpServer - ScpServer - v4.0 - 512 - - - - true - ..\..\bin\ - DEBUG;TRACE - full - AnyCPU - bin\Debug\ScpServer.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - false - - - ..\..\bin\ - TRACE - true - pdbonly - AnyCPU - bin\Release\ScpServer.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - Resources\Scp_All.ico - - - - - - - - - - Form - - - ScpForm.cs - - - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - ScpForm.cs - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C} - ScpControl - - - - - - - - Copy /Y /B $(SolutionDir)\Common\Properties\Info.cs $(ProjectDir)\Properties\CommonInfo.cs > nul: -If Not Exist $(ProjectDir)\Resources\Scp_All.ico Copy /Y /B $(SolutionDir)\Common\Resources\Scp.ico $(ProjectDir)\Resources\Scp_All.ico > nul: - - - \ No newline at end of file diff --git a/Scp/ScpServer_2010.sln b/Scp/ScpServer_2010.sln deleted file mode 100644 index 66ee825..0000000 --- a/Scp/ScpServer_2010.sln +++ /dev/null @@ -1,50 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScpMonitor_2010", "ScpMonitor\ScpMonitor_2010.csproj", "{6C9F554E-90D6-449C-91E9-130D476D88B5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScpServer_2010", "ScpServer\ScpServer_2010.csproj", "{D553DB39-186A-48B2-B8FA-E9C56C2BC382}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScpControl_2010", "ScpControl\ScpControl_2010.csproj", "{DDECF06E-BE48-4610-8BF8-4AE5140D9F0C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScpService_2010", "ScpService\ScpService_2010.csproj", "{DA326CAA-4E14-4B0F-993D-91F5BD19FBA0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScpInstaller_2010", "ScpInstaller\ScpInstaller_2010.csproj", "{D5ED7E4A-0B5B-42C4-BBBE-942842BC4535}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScpPair_2010", "ScpPair\ScpPair_2010.csproj", "{FDC70577-8D4C-4E79-87EE-E9B3D09FAA8A}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6C9F554E-90D6-449C-91E9-130D476D88B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C9F554E-90D6-449C-91E9-130D476D88B5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C9F554E-90D6-449C-91E9-130D476D88B5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C9F554E-90D6-449C-91E9-130D476D88B5}.Release|Any CPU.Build.0 = Release|Any CPU - {D553DB39-186A-48B2-B8FA-E9C56C2BC382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D553DB39-186A-48B2-B8FA-E9C56C2BC382}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D553DB39-186A-48B2-B8FA-E9C56C2BC382}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D553DB39-186A-48B2-B8FA-E9C56C2BC382}.Release|Any CPU.Build.0 = Release|Any CPU - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C}.Release|Any CPU.Build.0 = Release|Any CPU - {DA326CAA-4E14-4B0F-993D-91F5BD19FBA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DA326CAA-4E14-4B0F-993D-91F5BD19FBA0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DA326CAA-4E14-4B0F-993D-91F5BD19FBA0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DA326CAA-4E14-4B0F-993D-91F5BD19FBA0}.Release|Any CPU.Build.0 = Release|Any CPU - {D5ED7E4A-0B5B-42C4-BBBE-942842BC4535}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5ED7E4A-0B5B-42C4-BBBE-942842BC4535}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5ED7E4A-0B5B-42C4-BBBE-942842BC4535}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5ED7E4A-0B5B-42C4-BBBE-942842BC4535}.Release|Any CPU.Build.0 = Release|Any CPU - {FDC70577-8D4C-4E79-87EE-E9B3D09FAA8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FDC70577-8D4C-4E79-87EE-E9B3D09FAA8A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FDC70577-8D4C-4E79-87EE-E9B3D09FAA8A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FDC70577-8D4C-4E79-87EE-E9B3D09FAA8A}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Scp/ScpService/Ds3Service.Designer.cs b/Scp/ScpService/Ds3Service.Designer.cs deleted file mode 100644 index 2cd6917..0000000 --- a/Scp/ScpService/Ds3Service.Designer.cs +++ /dev/null @@ -1,52 +0,0 @@ -namespace ScpService -{ - partial class Ds3Service - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - m_Timer.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.rootHub = new ScpControl.RootHub(this.components); - // - // rootHub - // - this.rootHub.Debug += new System.EventHandler(this.OnDebug); - // - // Ds3Service - // - this.AutoLog = false; - this.CanHandlePowerEvent = true; - this.CanShutdown = true; - this.ServiceName = "Ds3Service"; - - } - - #endregion - - private ScpControl.RootHub rootHub; - } -} diff --git a/Scp/ScpService/Ds3Service.cs b/Scp/ScpService/Ds3Service.cs deleted file mode 100644 index 038aebe..0000000 --- a/Scp/ScpService/Ds3Service.cs +++ /dev/null @@ -1,169 +0,0 @@ -using System; -using System.ComponentModel; -using System.IO; -using System.ServiceProcess; -using System.Runtime.InteropServices; -using System.Threading; -using System.Reflection; - -using ScpControl; - -namespace ScpService -{ - public partial class Ds3Service : ServiceBase - { - protected ScpDevice.ServiceControlHandlerEx m_ControlHandler; - - protected String m_Log = Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName + "\\" + Assembly.GetExecutingAssembly().GetName().Name + ".log"; - protected IntPtr m_ServiceHandle = IntPtr.Zero; - protected IntPtr m_Ds3Notify = IntPtr.Zero; - protected IntPtr m_Ds4Notify = IntPtr.Zero; - protected IntPtr m_BthNotify = IntPtr.Zero; - protected Timer m_Timer; - - public Ds3Service() - { - InitializeComponent(); - - m_Timer = new Timer(OnTimer, null, Timeout.Infinite, Timeout.Infinite); - } - - protected override void OnStart(String[] args) - { - EventLog.WriteEntry("Scarlet.Crush Productions DS3 Service Started", System.Diagnostics.EventLogEntryType.Information, 1); - - try { if (File.Exists(m_Log)) File.Delete(m_Log); } - catch { } - - OnDebug(this, new DebugEventArgs(String.Format("++ {0} {1}", Assembly.GetExecutingAssembly().Location, Assembly.GetExecutingAssembly().GetName().Version.ToString()))); - - m_ControlHandler = new ScpDevice.ServiceControlHandlerEx(ServiceControlHandler); - m_ServiceHandle = ScpDevice.RegisterServiceCtrlHandlerEx(ServiceName, m_ControlHandler, IntPtr.Zero); - - rootHub.Open(); - rootHub.Start(); - - ScpDevice.RegisterNotify(m_ServiceHandle, new Guid(UsbDs3.USB_CLASS_GUID), ref m_Ds3Notify, false); - ScpDevice.RegisterNotify(m_ServiceHandle, new Guid(UsbDs4.USB_CLASS_GUID), ref m_Ds4Notify, false); - ScpDevice.RegisterNotify(m_ServiceHandle, new Guid(BthDongle.BTH_CLASS_GUID), ref m_BthNotify, false); - } - - protected override void OnStop() - { - if (m_Ds3Notify != IntPtr.Zero) ScpDevice.UnregisterNotify(m_Ds3Notify); - if (m_Ds4Notify != IntPtr.Zero) ScpDevice.UnregisterNotify(m_Ds4Notify); - if (m_BthNotify != IntPtr.Zero) ScpDevice.UnregisterNotify(m_BthNotify); - - rootHub.Stop(); - rootHub.Close(); - - EventLog.WriteEntry("Scarlet.Crush Productions DS3 Service Stopped", System.Diagnostics.EventLogEntryType.Information, 2); - } - - protected Int32 ServiceControlHandler(Int32 Control, Int32 Type, IntPtr Data, IntPtr Context) - { - switch (Control) - { - case ScpDevice.SERVICE_CONTROL_STOP: - case ScpDevice.SERVICE_CONTROL_SHUTDOWN: - - base.Stop(); - break; - - case ScpDevice.SERVICE_CONTROL_POWEREVENT: - - switch (Type) - { - case ScpDevice.PBT_APMSUSPEND: - - EventLog.WriteEntry("Scp DS3 Service Suspending", System.Diagnostics.EventLogEntryType.Information, 3); - - rootHub.Suspend(); - break; - - case ScpDevice.PBT_APMRESUMEAUTOMATIC: - - EventLog.WriteEntry("Scp DS3 Service Resuming", System.Diagnostics.EventLogEntryType.Information, 4); - - m_Timer.Change(10000, Timeout.Infinite); - break; - } - break; - - case ScpDevice.SERVICE_CONTROL_DEVICEEVENT: - - switch (Type) - { - case ScpDevice.DBT_DEVICEARRIVAL: - case ScpDevice.DBT_DEVICEREMOVECOMPLETE: - - ScpDevice.DEV_BROADCAST_HDR hdr; - - hdr = (ScpDevice.DEV_BROADCAST_HDR) Marshal.PtrToStructure(Data, typeof(ScpDevice.DEV_BROADCAST_HDR)); - - if (hdr.dbch_devicetype == ScpDevice.DBT_DEVTYP_DEVICEINTERFACE) - { - ScpDevice.DEV_BROADCAST_DEVICEINTERFACE_M deviceInterface; - - deviceInterface = (ScpDevice.DEV_BROADCAST_DEVICEINTERFACE_M) Marshal.PtrToStructure(Data, typeof(ScpDevice.DEV_BROADCAST_DEVICEINTERFACE_M)); - - String Class = "{" + new Guid(deviceInterface.dbcc_classguid).ToString().ToUpper() + "}"; - - String Path = new String(deviceInterface.dbcc_name); - Path = Path.Substring(0, Path.IndexOf('\0')).ToUpper(); - - DsPadId Pad = rootHub.Notify((ScpDevice.Notified) Type, Class, Path); - - if (Pad != DsPadId.None) - { - if (rootHub.Pairable && (rootHub.Master != rootHub.Pad[(Byte) Pad].Remote)) - { - Byte[] Master = new Byte[6]; - String[] Parts = rootHub.Master.Split(new String[] { ":" }, StringSplitOptions.RemoveEmptyEntries); - - for (Int32 Part = 0; Part < Master.Length; Part++) - { - Master[Part] = Byte.Parse(Parts[Part], System.Globalization.NumberStyles.HexNumber); - } - - rootHub.Pad[(Byte) Pad].Pair(Master); - - EventLog.WriteEntry(String.Format("Paired DS3 [{0}] To BTH Dongle [{1}]", rootHub.Pad[(Byte) Pad].Local, rootHub.Master), System.Diagnostics.EventLogEntryType.Information, 6); - } - } - } - break; - } - break; - } - - return 0; // NO_ERROR - } - - protected void OnTimer(object State) - { - lock (this) - { - rootHub.Resume(); - - EventLog.WriteEntry("Scp DS3 Service Resumed", System.Diagnostics.EventLogEntryType.Information, 5); - } - } - - protected void OnDebug(object sender, DebugEventArgs e) - { - lock (rootHub) - { - try - { - using (StreamWriter fs = new StreamWriter(m_Log, true)) - { - fs.Write(String.Format("{0} {1}\r\n", e.Time.ToString("yyyy-MM-dd HH:mm:ss.fff"), e.Data)); - fs.Flush(); - } - } - catch { } - } - } - } -} diff --git a/Scp/ScpService/Ds3Service.resx b/Scp/ScpService/Ds3Service.resx deleted file mode 100644 index 994de70..0000000 --- a/Scp/ScpService/Ds3Service.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - False - - \ No newline at end of file diff --git a/Scp/ScpService/Program.cs b/Scp/ScpService/Program.cs deleted file mode 100644 index e7ad953..0000000 --- a/Scp/ScpService/Program.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.ServiceProcess; - -namespace ScpService -{ - static class Program - { - /// - /// The main entry point for the application. - /// - static void Main() - { - ServiceBase[] ServicesToRun; - ServicesToRun = new ServiceBase[] - { - new Ds3Service() - }; - ServiceBase.Run(ServicesToRun); - } - } -} diff --git a/Scp/ScpService/ProjectInstaller.Designer.cs b/Scp/ScpService/ProjectInstaller.Designer.cs deleted file mode 100644 index 8310fb2..0000000 --- a/Scp/ScpService/ProjectInstaller.Designer.cs +++ /dev/null @@ -1,61 +0,0 @@ -namespace ScpService -{ - partial class ProjectInstaller - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.serviceProcessInstaller = new System.ServiceProcess.ServiceProcessInstaller(); - this.serviceInstaller = new System.ServiceProcess.ServiceInstaller(); - // - // serviceProcessInstaller - // - this.serviceProcessInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem; - this.serviceProcessInstaller.Password = null; - this.serviceProcessInstaller.Username = null; - // - // serviceInstaller - // - this.serviceInstaller.DisplayName = "SCP DS3 Service"; - this.serviceInstaller.ServiceName = "Ds3Service"; - this.serviceInstaller.ServicesDependedOn = new string[] { - "ScpVBus"}; - this.serviceInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic; - // - // ProjectInstaller - // - this.Installers.AddRange(new System.Configuration.Install.Installer[] { - this.serviceProcessInstaller, - this.serviceInstaller}); - - } - - #endregion - - private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller; - private System.ServiceProcess.ServiceInstaller serviceInstaller; - } -} \ No newline at end of file diff --git a/Scp/ScpService/ProjectInstaller.cs b/Scp/ScpService/ProjectInstaller.cs deleted file mode 100644 index 78141ea..0000000 --- a/Scp/ScpService/ProjectInstaller.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.ComponentModel; -using System.Configuration.Install; - -namespace ScpService -{ - [RunInstaller(true)] - public partial class ProjectInstaller : System.Configuration.Install.Installer - { - public ProjectInstaller() - { - InitializeComponent(); - } - } -} diff --git a/Scp/ScpService/ProjectInstaller.resx b/Scp/ScpService/ProjectInstaller.resx deleted file mode 100644 index 0eb4745..0000000 --- a/Scp/ScpService/ProjectInstaller.resx +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 56 - - - 17, 17 - - - False - - \ No newline at end of file diff --git a/Scp/ScpService/Properties/AssemblyInfo.cs b/Scp/ScpService/Properties/AssemblyInfo.cs deleted file mode 100644 index f95119c..0000000 --- a/Scp/ScpService/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("ScpService")] -[assembly: AssemblyProduct("ScpService")] - -[assembly: Guid("04b22521-cf98-4967-99a4-14479e672589")] diff --git a/Scp/ScpService/ScpService.csproj b/Scp/ScpService/ScpService.csproj deleted file mode 100644 index a9fe446..0000000 --- a/Scp/ScpService/ScpService.csproj +++ /dev/null @@ -1,104 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {DA326CAA-4E14-4B0F-993D-91F5BD19FBA0} - WinExe - Properties - ScpService - ScpService - v4.0 - 512 - - - - Resources\Scp_All.ico - - - true - ..\..\bin\ - DEBUG;TRACE - full - AnyCPU - bin\Debug\ScpService.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - false - - - ..\..\bin\ - TRACE - true - pdbonly - AnyCPU - bin\Release\ScpService.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - - - - - - - - Component - - - Ds3Service.cs - - - - Component - - - ProjectInstaller.cs - - - - - - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C} - ScpControl - - - - - Ds3Service.cs - - - ProjectInstaller.cs - - - - - - - - Copy /Y /B $(SolutionDir)\Common\Properties\Info.cs $(ProjectDir)\Properties\CommonInfo.cs > nul: -If Not Exist $(ProjectDir)\Resources\Scp_All.ico Copy /Y /B $(SolutionDir)\Common\Resources\Scp.ico $(ProjectDir)\Resources\Scp_All.ico > nul: - - - \ No newline at end of file diff --git a/Scp/ScpService/ScpService_2010.csproj b/Scp/ScpService/ScpService_2010.csproj deleted file mode 100644 index a9fe446..0000000 --- a/Scp/ScpService/ScpService_2010.csproj +++ /dev/null @@ -1,104 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {DA326CAA-4E14-4B0F-993D-91F5BD19FBA0} - WinExe - Properties - ScpService - ScpService - v4.0 - 512 - - - - Resources\Scp_All.ico - - - true - ..\..\bin\ - DEBUG;TRACE - full - AnyCPU - bin\Debug\ScpService.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - false - - - ..\..\bin\ - TRACE - true - pdbonly - AnyCPU - bin\Release\ScpService.exe.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - - - - - - - - - - Component - - - Ds3Service.cs - - - - Component - - - ProjectInstaller.cs - - - - - - {DDECF06E-BE48-4610-8BF8-4AE5140D9F0C} - ScpControl - - - - - Ds3Service.cs - - - ProjectInstaller.cs - - - - - - - - Copy /Y /B $(SolutionDir)\Common\Properties\Info.cs $(ProjectDir)\Properties\CommonInfo.cs > nul: -If Not Exist $(ProjectDir)\Resources\Scp_All.ico Copy /Y /B $(SolutionDir)\Common\Resources\Scp.ico $(ProjectDir)\Resources\Scp_All.ico > nul: - - - \ No newline at end of file diff --git a/Scp/ScpUser.sln b/Scp/ScpUser.sln deleted file mode 100644 index 1723a01..0000000 --- a/Scp/ScpUser.sln +++ /dev/null @@ -1,38 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2013 for Windows Desktop -VisualStudioVersion = 12.0.30110.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SCPUser", "ScpUser\ScpUser.vcxproj", "{295687B3-0DDD-4EB1-A12A-3F2AA6B86817}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XInput_SCP", "XInput_Scp\XInput_SCP.vcxproj", "{00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Debug|Win32.ActiveCfg = Debug|Win32 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Debug|Win32.Build.0 = Debug|Win32 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Debug|x64.ActiveCfg = Debug|x64 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Debug|x64.Build.0 = Debug|x64 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Release|Win32.ActiveCfg = Release|Win32 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Release|Win32.Build.0 = Release|Win32 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Release|x64.ActiveCfg = Release|x64 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Release|x64.Build.0 = Release|x64 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Debug|Win32.ActiveCfg = Debug|Win32 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Debug|Win32.Build.0 = Debug|Win32 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Debug|x64.ActiveCfg = Debug|x64 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Debug|x64.Build.0 = Debug|x64 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Release|Win32.ActiveCfg = Release|Win32 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Release|Win32.Build.0 = Release|Win32 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Release|x64.ActiveCfg = Release|x64 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Scp/ScpUser/ARPIcon.ico b/Scp/ScpUser/ARPIcon.ico deleted file mode 100644 index 93565d9..0000000 Binary files a/Scp/ScpUser/ARPIcon.ico and /dev/null differ diff --git a/Scp/ScpUser/AssemblyInfo.cpp b/Scp/ScpUser/AssemblyInfo.cpp deleted file mode 100644 index 4e143ea..0000000 --- a/Scp/ScpUser/AssemblyInfo.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "stdafx.h" - -using namespace System; -using namespace System::Reflection; -using namespace System::Runtime::CompilerServices; -using namespace System::Runtime::InteropServices; -using namespace System::Security::Permissions; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly:AssemblyTitleAttribute("SCPUser")]; -[assembly:AssemblyDescriptionAttribute("")]; -[assembly:AssemblyConfigurationAttribute("")]; -[assembly:AssemblyCompanyAttribute("Scarlet.Crush Productions")]; -[assembly:AssemblyProductAttribute("SCPUser")]; -[assembly:AssemblyCopyrightAttribute("Copyright (c) Scarlet.Crush 2012, 2013, 2014")]; -[assembly:AssemblyTrademarkAttribute("")]; -[assembly:AssemblyCultureAttribute("")]; - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the value or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly:AssemblyVersionAttribute("2.5.1.137")]; - -[assembly:ComVisible(false)]; - -[assembly:CLSCompliantAttribute(true)]; - -// [assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)]; diff --git a/Scp/ScpUser/Resources/Controller.png b/Scp/ScpUser/Resources/Controller.png deleted file mode 100644 index baec49a..0000000 Binary files a/Scp/ScpUser/Resources/Controller.png and /dev/null differ diff --git a/Scp/ScpUser/Resources/Game.ico b/Scp/ScpUser/Resources/Game.ico deleted file mode 100644 index 8cff41e..0000000 Binary files a/Scp/ScpUser/Resources/Game.ico and /dev/null differ diff --git a/Scp/ScpUser/ScpExtended.cpp b/Scp/ScpUser/ScpExtended.cpp deleted file mode 100644 index 436d9e4..0000000 --- a/Scp/ScpUser/ScpExtended.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "StdAfx.h" -#include "SCPExtensions.h" -#include "SCPExtended.h" diff --git a/Scp/ScpUser/ScpExtended.h b/Scp/ScpUser/ScpExtended.h deleted file mode 100644 index be83e7e..0000000 --- a/Scp/ScpUser/ScpExtended.h +++ /dev/null @@ -1,272 +0,0 @@ -#pragma once -#include "SCPExtensions.h" - -namespace SCPUser { - - using namespace System; - using namespace System::ComponentModel; - using namespace System::Collections; - using namespace System::Windows::Forms; - using namespace System::Data; - using namespace System::Drawing; - - static SCP_EXTN m_Extension[4]; - static DWORD m_Status [4]; - - public ref class SCPExtended : public System::Windows::Forms::Form - { - - public: - - SCPExtended(void) - { - InitializeComponent(); - - for(int Index = 0; Index < 4; Index++) - { - m_Status[Index] = ERROR_DEVICE_NOT_CONNECTED; - } - - tmUpdate->Enabled = true; - } - - protected: - - ~SCPExtended() - { - if (components) - { - delete components; - } - } - - #pragma region Windows Form Designer generated code - /// - /// Required designer variable. - /// - private: System::ComponentModel::IContainer^ components; - private: System::Windows::Forms::ListView^ lvGrid; - private: System::Windows::Forms::ColumnHeader^ chName; - private: System::Windows::Forms::ColumnHeader^ chController1; - private: System::Windows::Forms::ColumnHeader^ chController2; - private: System::Windows::Forms::ColumnHeader^ chController3; - private: System::Windows::Forms::Timer^ tmUpdate; - private: System::Windows::Forms::ColumnHeader^ chController4; - private: - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - void InitializeComponent(void) - { - this->components = (gcnew System::ComponentModel::Container()); - System::Windows::Forms::ListViewItem^ listViewItem1 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"Up", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem2 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"Right", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem3 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"Down", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem4 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"Left", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem5 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"LX", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem6 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"LY", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem7 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"L1", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem8 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"L2", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem9 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"L3", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem10 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"RX", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem11 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"RY", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem12 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"R1", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem13 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"R2", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem14 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"R3", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem15 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"Triangle", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem16 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"Circle", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem17 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"Cross", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem18 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"Square", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem19 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"Select", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem20 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"Start", - L"", L"", L"", L""}, -1)); - System::Windows::Forms::ListViewItem^ listViewItem21 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(5) {L"PS", - L"", L"", L"", L""}, -1)); - this->lvGrid = (gcnew System::Windows::Forms::ListView()); - this->chName = (gcnew System::Windows::Forms::ColumnHeader()); - this->chController1 = (gcnew System::Windows::Forms::ColumnHeader()); - this->chController2 = (gcnew System::Windows::Forms::ColumnHeader()); - this->chController3 = (gcnew System::Windows::Forms::ColumnHeader()); - this->chController4 = (gcnew System::Windows::Forms::ColumnHeader()); - this->tmUpdate = (gcnew System::Windows::Forms::Timer(this->components)); - this->SuspendLayout(); - // - // lvGrid - // - this->lvGrid->Columns->AddRange(gcnew cli::array< System::Windows::Forms::ColumnHeader^ >(5) {this->chName, this->chController1, - this->chController2, this->chController3, this->chController4}); - this->lvGrid->Dock = System::Windows::Forms::DockStyle::Fill; - this->lvGrid->FullRowSelect = true; - this->lvGrid->Items->AddRange(gcnew cli::array< System::Windows::Forms::ListViewItem^ >(21) {listViewItem1, listViewItem2, - listViewItem3, listViewItem4, listViewItem5, listViewItem6, listViewItem7, listViewItem8, listViewItem9, listViewItem10, listViewItem11, - listViewItem12, listViewItem13, listViewItem14, listViewItem15, listViewItem16, listViewItem17, listViewItem18, listViewItem19, - listViewItem20, listViewItem21}); - this->lvGrid->Location = System::Drawing::Point(0, 0); - this->lvGrid->Name = L"lvGrid"; - this->lvGrid->Size = System::Drawing::Size(379, 388); - this->lvGrid->TabIndex = 0; - this->lvGrid->TabStop = false; - this->lvGrid->UseCompatibleStateImageBehavior = false; - this->lvGrid->View = System::Windows::Forms::View::Details; - // - // chName - // - this->chName->Text = L"Name"; - this->chName->Width = 75; - // - // chController1 - // - this->chController1->Text = L"Value (#1)"; - this->chController1->Width = 75; - // - // chController2 - // - this->chController2->Text = L"Value (#2)"; - this->chController2->Width = 75; - // - // chController3 - // - this->chController3->Text = L"Value (#3)"; - this->chController3->Width = 75; - // - // chController4 - // - this->chController4->Text = L"Value (#4)"; - this->chController4->Width = 75; - // - // tmUpdate - // - this->tmUpdate->Tick += gcnew System::EventHandler(this, &SCPExtended::tmUpdate_Tick); - // - // SCPExtended - // - this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); - this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; - this->ClientSize = System::Drawing::Size(379, 388); - this->ControlBox = false; - this->Controls->Add(this->lvGrid); - this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedToolWindow; - this->Name = L"SCPExtended"; - this->ShowInTaskbar = false; - this->SizeGripStyle = System::Windows::Forms::SizeGripStyle::Hide; - this->Text = L"SCPExtended"; - this->ResumeLayout(false); - - } - #pragma endregion - - private: - System::Void tmUpdate_Tick(System::Object^ sender, System::EventArgs^ e) - { - SCP_EXTN Extension; - DWORD Status; - - // lvGrid->BeginUpdate(); - - for (int Index = 0, Column = 1, Row = 0; Index < 4; Index++, Column++) - { - if ((Status = XInputGetExtended(Index, &Extension)) == ERROR_SUCCESS) - { - if (m_Status[Index] != Status) - { - lvGrid->Items[ 0]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_UP ); - lvGrid->Items[ 1]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_RIGHT); - lvGrid->Items[ 2]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_DOWN ); - lvGrid->Items[ 3]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_LEFT ); - - lvGrid->Items[ 4]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_LX); - lvGrid->Items[ 5]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_LY); - - lvGrid->Items[ 6]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_L1); - lvGrid->Items[ 7]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_L2); - lvGrid->Items[ 8]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_L3); - - lvGrid->Items[ 9]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_RX); - lvGrid->Items[10]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_RY); - - lvGrid->Items[11]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_R1); - lvGrid->Items[12]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_R2); - lvGrid->Items[13]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_R3); - - lvGrid->Items[14]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_T); - lvGrid->Items[15]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_C); - lvGrid->Items[16]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_X); - lvGrid->Items[17]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_S); - - lvGrid->Items[18]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_SELECT); - lvGrid->Items[19]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_START ); - - lvGrid->Items[20]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_PS ); - } - else - { - if (m_Extension[Index].SCP_UP != Extension.SCP_UP ) lvGrid->Items[0]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_UP ); - if (m_Extension[Index].SCP_RIGHT != Extension.SCP_RIGHT) lvGrid->Items[1]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_RIGHT); - if (m_Extension[Index].SCP_DOWN != Extension.SCP_DOWN ) lvGrid->Items[2]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_DOWN ); - if (m_Extension[Index].SCP_LEFT != Extension.SCP_LEFT ) lvGrid->Items[3]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_LEFT ); - - if (m_Extension[Index].SCP_LX != Extension.SCP_LX) lvGrid->Items[4]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_LX); - if (m_Extension[Index].SCP_LY != Extension.SCP_LY) lvGrid->Items[5]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_LY); - - if (m_Extension[Index].SCP_L1 != Extension.SCP_L1) lvGrid->Items[6]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_L1); - if (m_Extension[Index].SCP_L2 != Extension.SCP_L2) lvGrid->Items[7]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_L2); - if (m_Extension[Index].SCP_L3 != Extension.SCP_L3) lvGrid->Items[8]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_L3); - - if (m_Extension[Index].SCP_RX != Extension.SCP_RX) lvGrid->Items[ 9]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_RX); - if (m_Extension[Index].SCP_RY != Extension.SCP_RY) lvGrid->Items[10]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_RY); - - if (m_Extension[Index].SCP_R1 != Extension.SCP_R1) lvGrid->Items[11]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_R1); - if (m_Extension[Index].SCP_R2 != Extension.SCP_R2) lvGrid->Items[12]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_R2); - if (m_Extension[Index].SCP_R3 != Extension.SCP_R3) lvGrid->Items[13]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_R3); - - if (m_Extension[Index].SCP_T != Extension.SCP_T) lvGrid->Items[14]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_T); - if (m_Extension[Index].SCP_C != Extension.SCP_C) lvGrid->Items[15]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_C); - if (m_Extension[Index].SCP_X != Extension.SCP_X) lvGrid->Items[16]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_X); - if (m_Extension[Index].SCP_S != Extension.SCP_S) lvGrid->Items[17]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_S); - - if (m_Extension[Index].SCP_SELECT != Extension.SCP_SELECT) lvGrid->Items[18]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_SELECT); - if (m_Extension[Index].SCP_START != Extension.SCP_START ) lvGrid->Items[19]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_START ); - - if (m_Extension[Index].SCP_PS != Extension.SCP_PS ) lvGrid->Items[20]->SubItems[Column]->Text = String::Format("{0:F3}", Extension.SCP_PS ); - } - - memcpy(&m_Extension[Index], &Extension, sizeof(SCP_EXTN)); - } - else - { - if (m_Status[Index] != Status) - { - for (int Row = 0; Row < lvGrid->Items->Count; Row++) - { - lvGrid->Items[Row]->SubItems[Column]->Text = String::Format(""); - } - } - } - - m_Status[Index] = Status; - } - - // lvGrid->EndUpdate(); - } - }; -} diff --git a/Scp/ScpUser/ScpExtended.resx b/Scp/ScpUser/ScpExtended.resx deleted file mode 100644 index c18d373..0000000 --- a/Scp/ScpUser/ScpExtended.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - \ No newline at end of file diff --git a/Scp/ScpUser/ScpExtensions.cpp b/Scp/ScpUser/ScpExtensions.cpp deleted file mode 100644 index 28b44e4..0000000 --- a/Scp/ScpUser/ScpExtensions.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "StdAfx.h" -#include "SCPExtensions.h" - -DWORD WINAPI XInputGetExtended(DWORD dwUserIndex, SCP_EXTN* pPressure) -{ -static BOOL l_Loaded = false, l_Available = false; -static HMODULE l_hXInputDll = NULL; -static FARPROC l_hXInputFunc[] = { NULL }; - - DWORD RetVal = ERROR_NOT_SUPPORTED; - - if (!l_Loaded) - { - if ((l_hXInputDll = LoadLibrary(_T("XInput1_3.dll"))) != NULL) - { - if ((l_hXInputFunc[0] = GetProcAddress(l_hXInputDll, "XInputGetExtended")) != NULL) - { - l_Available = true; - } - } - - l_Loaded = true; - } - - if (l_Available) - { - RetVal = ((XInputGetExtendedFunction)(l_hXInputFunc[0]))(dwUserIndex, pPressure); - } - - return RetVal; -} diff --git a/Scp/ScpUser/ScpExtensions.h b/Scp/ScpUser/ScpExtensions.h deleted file mode 100644 index 8b02231..0000000 --- a/Scp/ScpUser/ScpExtensions.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -typedef struct -{ - float SCP_UP; - float SCP_RIGHT; - float SCP_DOWN; - float SCP_LEFT; - - float SCP_LX; - float SCP_LY; - - float SCP_L1; - float SCP_L2; - float SCP_L3; - - float SCP_RX; - float SCP_RY; - - float SCP_R1; - float SCP_R2; - float SCP_R3; - - float SCP_T; - float SCP_C; - float SCP_X; - float SCP_S; - - float SCP_SELECT; - float SCP_START; - - float SCP_PS; - -} SCP_EXTN; - -typedef DWORD (WINAPI *XInputGetExtendedFunction)(__in DWORD dwUserIndex, __out SCP_EXTN* pPressure); - -extern DWORD WINAPI XInputGetExtended(DWORD dwUserIndex, SCP_EXTN* pPressure); diff --git a/Scp/ScpUser/ScpPad.h b/Scp/ScpUser/ScpPad.h deleted file mode 100644 index 1c37252..0000000 --- a/Scp/ScpUser/ScpPad.h +++ /dev/null @@ -1,592 +0,0 @@ -#pragma once - -#include "SCPExtended.h" - -namespace SCPUser { - - using namespace System; - using namespace System::Windows::Forms; - using namespace System::Drawing; - - struct PAD_STATE - { - XINPUT_STATE state; - XINPUT_VIBRATION vibration; - - bool bConnected; - }; - - static XINPUT_VIBRATION l_Vibration [XUSER_MAX_COUNT]; - static PAD_STATE l_Controller [XUSER_MAX_COUNT]; - static TCHAR l_szMessage [XUSER_MAX_COUNT][1024]; - - public ref class SCPPad : public System::Windows::Forms::Form - { - protected: - SCPExtended^ m_Extended; - - public: - SCPPad(void) - { - InitializeComponent(); - - m_Extended = gcnew SCPExtended(); - - l_szMessage[0][0] = 0; - l_szMessage[1][0] = 0; - l_szMessage[2][0] = 0; - l_szMessage[3][0] = 0; - - lbOutput_0->Text = _T(""); - lbOutput_1->Text = _T(""); - lbOutput_2->Text = _T(""); - lbOutput_3->Text = _T(""); - - ZeroMemory(l_Controller, sizeof(PAD_STATE) * XUSER_MAX_COUNT); - ZeroMemory(l_Vibration, sizeof(XINPUT_VIBRATION) * XUSER_MAX_COUNT); - - XInputEnable(true); - } - - protected: - ~SCPPad(void) - { - XINPUT_VIBRATION vibration = { 0, 0 }; - - for (DWORD i = 0; i < XUSER_MAX_COUNT; i++) - { - if (l_Controller[i].bConnected) - { - XInputSetState(i, &vibration); - } - } - - XInputEnable(false); - - if (components) - { - delete components; - } - } - - private: - HRESULT UpdateControllerState() - { - DWORD dwResult; - - for (DWORD i = 0; i < XUSER_MAX_COUNT; i++) - { - // Simply get the state of the controller from XInput. - dwResult = XInputGetState(i, &l_Controller[i].state); - - if (dwResult == ERROR_SUCCESS) - { - l_Controller[i].bConnected = true; - - if ((l_Vibration[i].wLeftMotorSpeed != l_Controller[i].vibration.wLeftMotorSpeed) - || (l_Vibration[i].wRightMotorSpeed != l_Controller[i].vibration.wRightMotorSpeed)) - { - l_Vibration[i].wLeftMotorSpeed = l_Controller[i].vibration.wLeftMotorSpeed; - l_Vibration[i].wRightMotorSpeed = l_Controller[i].vibration.wRightMotorSpeed; - - XInputSetState(i, &l_Controller[i].vibration); - } - } - else - { - l_Controller[i].bConnected = false; - } - } - - return S_OK; - } - - private: - System::Void updateTimer_Tick(System::Object^ sender, System::EventArgs^ e) - { - bool bRepaint = false; - updateTimer->Enabled = false; - - TCHAR sz[4][1024] = { _T(""), _T(""), _T(""), _T("") }; - - if (UpdateControllerState() == S_OK) - { - for (DWORD i = 0; i < XUSER_MAX_COUNT; i++) - { - if (l_Controller[i].bConnected) - { - WORD wButtons = l_Controller[i].state.Gamepad.wButtons; - - if (cbDeadZone->Checked) - { - if (-XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE < l_Controller[i].state.Gamepad.sThumbLX - && l_Controller[i].state.Gamepad.sThumbLX < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) - { - l_Controller[i].state.Gamepad.sThumbLX = 0; - } - - if (-XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE < l_Controller[i].state.Gamepad.sThumbLY - && l_Controller[i].state.Gamepad.sThumbLY < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) - { - l_Controller[i].state.Gamepad.sThumbLY = 0; - } - - if (-XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE < l_Controller[i].state.Gamepad.sThumbRX - && l_Controller[i].state.Gamepad.sThumbRX < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) - { - l_Controller[i].state.Gamepad.sThumbRX = 0; - } - - if (-XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE < l_Controller[i].state.Gamepad.sThumbRY - && l_Controller[i].state.Gamepad.sThumbRY < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) - { - l_Controller[i].state.Gamepad.sThumbRY = 0; - } - - if (l_Controller[i].state.Gamepad.bLeftTrigger < XINPUT_GAMEPAD_TRIGGER_THRESHOLD) - { - l_Controller[i].state.Gamepad.bLeftTrigger = 0; - } - - if (l_Controller[i].state.Gamepad.bRightTrigger < XINPUT_GAMEPAD_TRIGGER_THRESHOLD) - { - l_Controller[i].state.Gamepad.bRightTrigger = 0; - } - } - - _stprintf_s(sz[i], 1024, - _T("Controller %d: Connected\n") - _T(" Buttons: %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n") - _T(" Left Trigger: %d\n") - _T(" Right Trigger: %d\n") - _T(" Left Thumbstick: %d/%d\n") - _T(" Right Thumbstick: %d/%d"), i + 1, - ( wButtons & XINPUT_GAMEPAD_DPAD_UP ) ? _T("DPAD_UP ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_DPAD_DOWN ) ? _T("DPAD_DOWN ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_DPAD_LEFT ) ? _T("DPAD_LEFT ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_DPAD_RIGHT ) ? _T("DPAD_RIGHT ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_START ) ? _T("START ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_BACK ) ? _T("BACK ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_LEFT_THUMB ) ? _T("LEFT_THUMB ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_RIGHT_THUMB ) ? _T("RIGHT_THUMB ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER ) ? _T("LEFT_SHOULDER ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER ) ? _T("RIGHT_SHOULDER ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_A ) ? _T("A ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_B ) ? _T("B ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_X ) ? _T("X ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_Y ) ? _T("Y ") : _T(""), - ( wButtons & XINPUT_GAMEPAD_GUIDE ) ? _T("GUIDE ") : _T(""), - l_Controller[i].state.Gamepad.bLeftTrigger, - l_Controller[i].state.Gamepad.bRightTrigger, - l_Controller[i].state.Gamepad.sThumbLX, - l_Controller[i].state.Gamepad.sThumbLY, - l_Controller[i].state.Gamepad.sThumbRX, - l_Controller[i].state.Gamepad.sThumbRY ); - } - else - { - _stprintf_s(sz[i], 1024, _T("Controller %d: Disconnected\n"), i + 1); - } - - switch (i) - { - case 0: - tbOutput_0_Large->Visible = l_Controller[i].bConnected; - tbOutput_0_Small->Visible = l_Controller[i].bConnected; - - l_Controller[i].vibration.wLeftMotorSpeed = (WORD)((float)tbOutput_0_Large->Value * 653.55f); - l_Controller[i].vibration.wRightMotorSpeed = (WORD)((float)tbOutput_0_Small->Value * 653.55f); - break; - - case 1: - tbOutput_1_Large->Visible = l_Controller[i].bConnected; - tbOutput_1_Small->Visible = l_Controller[i].bConnected; - - l_Controller[i].vibration.wLeftMotorSpeed = (WORD)((float)tbOutput_1_Large->Value * 653.55f); - l_Controller[i].vibration.wRightMotorSpeed = (WORD)((float)tbOutput_1_Small->Value * 653.55f); - break; - - case 2: - tbOutput_2_Large->Visible = l_Controller[i].bConnected; - tbOutput_2_Small->Visible = l_Controller[i].bConnected; - - l_Controller[i].vibration.wLeftMotorSpeed = (WORD)((float)tbOutput_2_Large->Value * 653.55f); - l_Controller[i].vibration.wRightMotorSpeed = (WORD)((float)tbOutput_2_Small->Value * 653.55f); - break; - - case 3: - tbOutput_3_Large->Visible = l_Controller[i].bConnected; - tbOutput_3_Small->Visible = l_Controller[i].bConnected; - - l_Controller[i].vibration.wLeftMotorSpeed = (WORD)((float)tbOutput_3_Large->Value * 653.55f); - l_Controller[i].vibration.wRightMotorSpeed = (WORD)((float)tbOutput_3_Small->Value * 653.55f); - break; - } - } - } - - for (DWORD i = 0; i < XUSER_MAX_COUNT; i++) - { - if (_tcscmp(sz[i], l_szMessage[i]) != 0) - { - _tcscpy_s(l_szMessage[i], 1024, sz[i]); - bRepaint = true; - } - } - - if (bRepaint) - { - lbOutput_0->Text = gcnew String(l_szMessage[0]); - lbOutput_1->Text = gcnew String(l_szMessage[1]); - lbOutput_2->Text = gcnew String(l_szMessage[2]); - lbOutput_3->Text = gcnew String(l_szMessage[3]); - } - - updateTimer->Enabled = true; - } - - private: - System::Void cbAdvanced_CheckedChanged(System::Object^ sender, System::EventArgs^ e) - { - if (cbAdvanced->Checked) - { - this->ClientSize = System::Drawing::Size(this->ClientSize.Width + 175, this->ClientSize.Height); - advPanel->Visible = cbAdvanced->Checked; - } - else - { - advPanel->Visible = cbAdvanced->Checked; - this->ClientSize = System::Drawing::Size(this->ClientSize.Width - 175, this->ClientSize.Height); - } - } - - private: - System::Void cbExtensions_CheckedChanged(System::Object^ sender, System::EventArgs^ e) - { - if (cbExtensions->Checked) - { - m_Extended->Show(this); - } - else - { - m_Extended->Hide(); - } - } - - #pragma region Windows Form Designer generated code - private: - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - void InitializeComponent(void) - { - this->components = (gcnew System::ComponentModel::Container()); - System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(SCPPad::typeid)); - this->lbOutput_0 = (gcnew System::Windows::Forms::Label()); - this->lbOutput_1 = (gcnew System::Windows::Forms::Label()); - this->lbOutput_2 = (gcnew System::Windows::Forms::Label()); - this->lbOutput_3 = (gcnew System::Windows::Forms::Label()); - this->cbAdvanced = (gcnew System::Windows::Forms::CheckBox()); - this->advPanel = (gcnew System::Windows::Forms::Panel()); - this->lblRumble = (gcnew System::Windows::Forms::Label()); - this->tbOutput_0_Large = (gcnew System::Windows::Forms::TrackBar()); - this->tbOutput_0_Small = (gcnew System::Windows::Forms::TrackBar()); - this->tbOutput_1_Large = (gcnew System::Windows::Forms::TrackBar()); - this->tbOutput_1_Small = (gcnew System::Windows::Forms::TrackBar()); - this->tbOutput_2_Large = (gcnew System::Windows::Forms::TrackBar()); - this->tbOutput_2_Small = (gcnew System::Windows::Forms::TrackBar()); - this->tbOutput_3_Large = (gcnew System::Windows::Forms::TrackBar()); - this->tbOutput_3_Small = (gcnew System::Windows::Forms::TrackBar()); - this->cbDeadZone = (gcnew System::Windows::Forms::CheckBox()); - this->statusBar = (gcnew System::Windows::Forms::StatusBar()); - this->updateTimer = (gcnew System::Windows::Forms::Timer(this->components)); - this->cbExtensions = (gcnew System::Windows::Forms::CheckBox()); - this->advPanel->SuspendLayout(); - (cli::safe_cast(this->tbOutput_0_Large))->BeginInit(); - (cli::safe_cast(this->tbOutput_0_Small))->BeginInit(); - (cli::safe_cast(this->tbOutput_1_Large))->BeginInit(); - (cli::safe_cast(this->tbOutput_1_Small))->BeginInit(); - (cli::safe_cast(this->tbOutput_2_Large))->BeginInit(); - (cli::safe_cast(this->tbOutput_2_Small))->BeginInit(); - (cli::safe_cast(this->tbOutput_3_Large))->BeginInit(); - (cli::safe_cast(this->tbOutput_3_Small))->BeginInit(); - this->SuspendLayout(); - // - // lbOutput_0 - // - this->lbOutput_0->AutoSize = true; - this->lbOutput_0->BackColor = System::Drawing::Color::Transparent; - this->lbOutput_0->ForeColor = System::Drawing::SystemColors::ControlText; - this->lbOutput_0->Location = System::Drawing::Point(40, 30); - this->lbOutput_0->Name = L"lbOutput_0"; - this->lbOutput_0->Size = System::Drawing::Size(49, 13); - this->lbOutput_0->TabIndex = 8; - this->lbOutput_0->Text = L""; - // - // lbOutput_1 - // - this->lbOutput_1->AutoSize = true; - this->lbOutput_1->BackColor = System::Drawing::Color::Transparent; - this->lbOutput_1->ForeColor = System::Drawing::SystemColors::ControlText; - this->lbOutput_1->Location = System::Drawing::Point(40, 120); - this->lbOutput_1->Name = L"lbOutput_1"; - this->lbOutput_1->Size = System::Drawing::Size(49, 13); - this->lbOutput_1->TabIndex = 9; - this->lbOutput_1->Text = L""; - // - // lbOutput_2 - // - this->lbOutput_2->AutoSize = true; - this->lbOutput_2->BackColor = System::Drawing::Color::Transparent; - this->lbOutput_2->ForeColor = System::Drawing::SystemColors::ControlText; - this->lbOutput_2->Location = System::Drawing::Point(40, 210); - this->lbOutput_2->Name = L"lbOutput_2"; - this->lbOutput_2->Size = System::Drawing::Size(49, 13); - this->lbOutput_2->TabIndex = 10; - this->lbOutput_2->Text = L""; - // - // lbOutput_3 - // - this->lbOutput_3->AutoSize = true; - this->lbOutput_3->BackColor = System::Drawing::Color::Transparent; - this->lbOutput_3->ForeColor = System::Drawing::SystemColors::ControlText; - this->lbOutput_3->Location = System::Drawing::Point(40, 300); - this->lbOutput_3->Name = L"lbOutput_3"; - this->lbOutput_3->Size = System::Drawing::Size(49, 13); - this->lbOutput_3->TabIndex = 11; - this->lbOutput_3->Text = L""; - // - // cbAdvanced - // - this->cbAdvanced->AutoSize = true; - this->cbAdvanced->BackColor = System::Drawing::Color::Transparent; - this->cbAdvanced->Location = System::Drawing::Point(302, 445); - this->cbAdvanced->Name = L"cbAdvanced"; - this->cbAdvanced->Size = System::Drawing::Size(75, 17); - this->cbAdvanced->TabIndex = 12; - this->cbAdvanced->Text = L"Advanced"; - this->cbAdvanced->UseVisualStyleBackColor = false; - this->cbAdvanced->CheckedChanged += gcnew System::EventHandler(this, &SCPPad::cbAdvanced_CheckedChanged); - // - // advPanel - // - this->advPanel->BackColor = System::Drawing::SystemColors::Control; - this->advPanel->Controls->Add(this->cbExtensions); - this->advPanel->Controls->Add(this->lblRumble); - this->advPanel->Controls->Add(this->tbOutput_0_Large); - this->advPanel->Controls->Add(this->tbOutput_0_Small); - this->advPanel->Controls->Add(this->tbOutput_1_Large); - this->advPanel->Controls->Add(this->tbOutput_1_Small); - this->advPanel->Controls->Add(this->tbOutput_2_Large); - this->advPanel->Controls->Add(this->tbOutput_2_Small); - this->advPanel->Controls->Add(this->tbOutput_3_Large); - this->advPanel->Controls->Add(this->tbOutput_3_Small); - this->advPanel->Controls->Add(this->cbDeadZone); - this->advPanel->Dock = System::Windows::Forms::DockStyle::Right; - this->advPanel->Location = System::Drawing::Point(505, 0); - this->advPanel->Name = L"advPanel"; - this->advPanel->Size = System::Drawing::Size(175, 478); - this->advPanel->TabIndex = 13; - this->advPanel->Visible = false; - // - // lblRumble - // - this->lblRumble->AutoSize = true; - this->lblRumble->Location = System::Drawing::Point(72, 9); - this->lblRumble->Name = L"lblRumble"; - this->lblRumble->Size = System::Drawing::Size(43, 13); - this->lblRumble->TabIndex = 0; - this->lblRumble->Text = L"Rumble"; - // - // tbOutput_0_Large - // - this->tbOutput_0_Large->AutoSize = false; - this->tbOutput_0_Large->BackColor = System::Drawing::SystemColors::Control; - this->tbOutput_0_Large->Location = System::Drawing::Point(17, 30); - this->tbOutput_0_Large->Maximum = 100; - this->tbOutput_0_Large->Name = L"tbOutput_0_Large"; - this->tbOutput_0_Large->Size = System::Drawing::Size(150, 25); - this->tbOutput_0_Large->TabIndex = 1; - this->tbOutput_0_Large->TickFrequency = 10; - this->tbOutput_0_Large->TickStyle = System::Windows::Forms::TickStyle::None; - // - // tbOutput_0_Small - // - this->tbOutput_0_Small->AutoSize = false; - this->tbOutput_0_Small->BackColor = System::Drawing::SystemColors::Control; - this->tbOutput_0_Small->Location = System::Drawing::Point(17, 61); - this->tbOutput_0_Small->Maximum = 100; - this->tbOutput_0_Small->Name = L"tbOutput_0_Small"; - this->tbOutput_0_Small->Size = System::Drawing::Size(150, 25); - this->tbOutput_0_Small->TabIndex = 2; - this->tbOutput_0_Small->TickFrequency = 10; - this->tbOutput_0_Small->TickStyle = System::Windows::Forms::TickStyle::None; - // - // tbOutput_1_Large - // - this->tbOutput_1_Large->AutoSize = false; - this->tbOutput_1_Large->BackColor = System::Drawing::SystemColors::Control; - this->tbOutput_1_Large->Location = System::Drawing::Point(17, 120); - this->tbOutput_1_Large->Maximum = 100; - this->tbOutput_1_Large->Name = L"tbOutput_1_Large"; - this->tbOutput_1_Large->Size = System::Drawing::Size(150, 25); - this->tbOutput_1_Large->TabIndex = 3; - this->tbOutput_1_Large->TickFrequency = 10; - this->tbOutput_1_Large->TickStyle = System::Windows::Forms::TickStyle::None; - // - // tbOutput_1_Small - // - this->tbOutput_1_Small->AutoSize = false; - this->tbOutput_1_Small->BackColor = System::Drawing::SystemColors::Control; - this->tbOutput_1_Small->Location = System::Drawing::Point(17, 151); - this->tbOutput_1_Small->Maximum = 100; - this->tbOutput_1_Small->Name = L"tbOutput_1_Small"; - this->tbOutput_1_Small->Size = System::Drawing::Size(150, 25); - this->tbOutput_1_Small->TabIndex = 4; - this->tbOutput_1_Small->TickFrequency = 10; - this->tbOutput_1_Small->TickStyle = System::Windows::Forms::TickStyle::None; - // - // tbOutput_2_Large - // - this->tbOutput_2_Large->AutoSize = false; - this->tbOutput_2_Large->BackColor = System::Drawing::SystemColors::Control; - this->tbOutput_2_Large->Location = System::Drawing::Point(17, 210); - this->tbOutput_2_Large->Maximum = 100; - this->tbOutput_2_Large->Name = L"tbOutput_2_Large"; - this->tbOutput_2_Large->Size = System::Drawing::Size(150, 25); - this->tbOutput_2_Large->TabIndex = 5; - this->tbOutput_2_Large->TickFrequency = 10; - this->tbOutput_2_Large->TickStyle = System::Windows::Forms::TickStyle::None; - // - // tbOutput_2_Small - // - this->tbOutput_2_Small->AutoSize = false; - this->tbOutput_2_Small->BackColor = System::Drawing::SystemColors::Control; - this->tbOutput_2_Small->Location = System::Drawing::Point(17, 241); - this->tbOutput_2_Small->Maximum = 100; - this->tbOutput_2_Small->Name = L"tbOutput_2_Small"; - this->tbOutput_2_Small->Size = System::Drawing::Size(150, 25); - this->tbOutput_2_Small->TabIndex = 6; - this->tbOutput_2_Small->TickFrequency = 10; - this->tbOutput_2_Small->TickStyle = System::Windows::Forms::TickStyle::None; - // - // tbOutput_3_Large - // - this->tbOutput_3_Large->AutoSize = false; - this->tbOutput_3_Large->BackColor = System::Drawing::SystemColors::Control; - this->tbOutput_3_Large->Location = System::Drawing::Point(17, 300); - this->tbOutput_3_Large->Maximum = 100; - this->tbOutput_3_Large->Name = L"tbOutput_3_Large"; - this->tbOutput_3_Large->Size = System::Drawing::Size(150, 25); - this->tbOutput_3_Large->TabIndex = 7; - this->tbOutput_3_Large->TickFrequency = 10; - this->tbOutput_3_Large->TickStyle = System::Windows::Forms::TickStyle::None; - // - // tbOutput_3_Small - // - this->tbOutput_3_Small->AutoSize = false; - this->tbOutput_3_Small->BackColor = System::Drawing::SystemColors::Control; - this->tbOutput_3_Small->Location = System::Drawing::Point(17, 331); - this->tbOutput_3_Small->Maximum = 100; - this->tbOutput_3_Small->Name = L"tbOutput_3_Small"; - this->tbOutput_3_Small->Size = System::Drawing::Size(150, 25); - this->tbOutput_3_Small->TabIndex = 8; - this->tbOutput_3_Small->TickFrequency = 10; - this->tbOutput_3_Small->TickStyle = System::Windows::Forms::TickStyle::None; - // - // cbDeadZone - // - this->cbDeadZone->AutoSize = true; - this->cbDeadZone->BackColor = System::Drawing::Color::Transparent; - this->cbDeadZone->Checked = true; - this->cbDeadZone->CheckState = System::Windows::Forms::CheckState::Checked; - this->cbDeadZone->Location = System::Drawing::Point(50, 444); - this->cbDeadZone->Name = L"cbDeadZone"; - this->cbDeadZone->Size = System::Drawing::Size(80, 17); - this->cbDeadZone->TabIndex = 9; - this->cbDeadZone->Text = L"Dead Zone"; - this->cbDeadZone->UseVisualStyleBackColor = false; - // - // statusBar - // - this->statusBar->Location = System::Drawing::Point(0, 478); - this->statusBar->Name = L"statusBar"; - this->statusBar->Size = System::Drawing::Size(680, 22); - this->statusBar->TabIndex = 7; - // - // updateTimer - // - this->updateTimer->Enabled = true; - this->updateTimer->Interval = 50; - this->updateTimer->Tick += gcnew System::EventHandler(this, &SCPPad::updateTimer_Tick); - // - // cbExtensions - // - this->cbExtensions->AutoSize = true; - this->cbExtensions->Location = System::Drawing::Point(50, 421); - this->cbExtensions->Name = L"cbExtensions"; - this->cbExtensions->Size = System::Drawing::Size(77, 17); - this->cbExtensions->TabIndex = 10; - this->cbExtensions->Text = L"Extensions"; - this->cbExtensions->UseVisualStyleBackColor = true; - this->cbExtensions->CheckedChanged += gcnew System::EventHandler(this, &SCPPad::cbExtensions_CheckedChanged); - // - // SCPPad - // - this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); - this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; - this->BackColor = System::Drawing::Color::White; - this->BackgroundImage = (cli::safe_cast(resources->GetObject(L"$this.BackgroundImage"))); - this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::None; - this->ClientSize = System::Drawing::Size(680, 500); - this->Controls->Add(this->lbOutput_0); - this->Controls->Add(this->lbOutput_1); - this->Controls->Add(this->lbOutput_2); - this->Controls->Add(this->lbOutput_3); - this->Controls->Add(this->cbAdvanced); - this->Controls->Add(this->advPanel); - this->Controls->Add(this->statusBar); - this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle; - this->Icon = (cli::safe_cast(resources->GetObject(L"$this.Icon"))); - this->MaximizeBox = false; - this->Name = L"SCPPad"; - this->Text = L"XInput Controller Tester"; - this->advPanel->ResumeLayout(false); - this->advPanel->PerformLayout(); - (cli::safe_cast(this->tbOutput_0_Large))->EndInit(); - (cli::safe_cast(this->tbOutput_0_Small))->EndInit(); - (cli::safe_cast(this->tbOutput_1_Large))->EndInit(); - (cli::safe_cast(this->tbOutput_1_Small))->EndInit(); - (cli::safe_cast(this->tbOutput_2_Large))->EndInit(); - (cli::safe_cast(this->tbOutput_2_Small))->EndInit(); - (cli::safe_cast(this->tbOutput_3_Large))->EndInit(); - (cli::safe_cast(this->tbOutput_3_Small))->EndInit(); - this->ResumeLayout(false); - this->PerformLayout(); - - } - - private: System::Windows::Forms::Label^ lbOutput_0; - private: System::Windows::Forms::Label^ lbOutput_1; - private: System::Windows::Forms::Label^ lbOutput_2; - private: System::Windows::Forms::Label^ lbOutput_3; - private: System::Windows::Forms::CheckBox^ cbAdvanced; - private: System::Windows::Forms::Panel^ advPanel; - private: System::Windows::Forms::Label^ lblRumble; - private: System::Windows::Forms::TrackBar^ tbOutput_0_Large; - private: System::Windows::Forms::TrackBar^ tbOutput_0_Small; - private: System::Windows::Forms::TrackBar^ tbOutput_1_Large; - private: System::Windows::Forms::TrackBar^ tbOutput_1_Small; - private: System::Windows::Forms::TrackBar^ tbOutput_2_Large; - private: System::Windows::Forms::TrackBar^ tbOutput_2_Small; - private: System::Windows::Forms::TrackBar^ tbOutput_3_Large; - private: System::Windows::Forms::TrackBar^ tbOutput_3_Small; - private: System::Windows::Forms::CheckBox^ cbDeadZone; - private: System::Windows::Forms::StatusBar^ statusBar; - private: System::Windows::Forms::Timer^ updateTimer; - private: System::Windows::Forms::CheckBox^ cbExtensions; - private: System::ComponentModel::IContainer^ components; - #pragma endregion - }; -} diff --git a/Scp/ScpUser/ScpPad.resX b/Scp/ScpUser/ScpPad.resX deleted file mode 100644 index e221527..0000000 --- a/Scp/ScpUser/ScpPad.resX +++ /dev/null @@ -1,4438 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - - - 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 - 7iLs7Owk6+vrKOnp6Snp6eko7OzsJu/v7x/09PQW+Pj4D/v7+wj6+voN7u7uIK6uru+WlpHzxMe9/87P - x//MysT/zM3D/8/Ox//e3tb/8PDn///////c287/eHRl/mpoZPhzc3P/mZmZwrKysnPCwsJhzs7OUNbW - 1kba2tpB2traQNjY2ELV1dVH1NTUSdTU1EjZ2dlC4ODgNunp6Snx8fEa+Pj4D/j4+A/m5uZZd3d396Wk - n/fP0sj/zM3I/8rJwv/PzsX/5ePd/+/v4//7/PL////////////d3NP/fHls/mlmX/dvbmz4jIyM46Cg - oLKwsLCFubm5db6+vnK6urqPtbW1p6urq86lpaXdpaWl4bi4uKXLy8tY2traQOjo6Cvy8vIZ+Pj4EdnZ - 2Zp/f33yt7ew+9vb0//Y2dP/0dHJ/97d1P/w8er/srCe/5aWf/+2tqD//Pz2///////S0sD/m5mJ/2tn - WvtraGP4cHBu+nJycf5ycnL+cnJy/m9ubf1sa2n8amhk+GNhXPp9fHj0gYGA8XNzc/7Kyspr3t7eOe3t - 7SD39/cU0tLSt4SEg/DJzMX+9Pfw//n78v/19ef////5/8fHt/9dWDz/XVo6/1NSL/+npY7///////X1 - 4f/l5dj/vLqv/4qHev9tal76Z2Rb+WNhW/liX1f5XVpO+mFeUftzb17/pKCT/8zMw//Nz8n4hYWE8HNz - c/7X19dI6enpKPf39xPS0tKzhoaF79/h2v7w9Or/2dnM/+zr2/////z/paOO/2VdQf9mYUL/YV89/2tp - Sf//////8fHe//Hw5v//////8fTv/83NxP+kopT/jIp8/5aThP+xs6X/z8/F//f28P////////////X5 - 7/+rq6X1c3Nz/tTU1Ezo6Ogr9/f3EdbW1qmGh4Xu5ebe/5yYhP9bVT3/c25Y/87KsP/AvKb/bmpO/19a - Ov9qZkf/jIpz////9f/09ef////6//////////////////7/9//n6N7/8vTs//X38v/6/PT/9vbv/+fm - 4P/l6N3/0dLH/6WlnveRkZH51dXVRenp6Sf4+PgQ1tbWq4eIhu/e4tn/XVc//yQaAP80LRL/oZ5//+/v - 1/+trJn/ioNu/6KbhP/m4df//Pzx////////////0tPE/83Pwv/6+vn//////+Hj0v/c3dH/4eLZ/9nZ - z//W1s7/1NTN/83Nw/+7uq//jIyI8aioqObb29s97e3tIfr6+g7e3t6SgoKB8ejq5f+Fg2//PTUc/2xm - UP/Ewqv/8PDd/+3r4//g2dP/9fv2///////07eX//////7a6q/9GQSj/R0Ip/6OilP////v/zs23/8fI - tP/Oz8T/0tHI/8/PyP/MzsP/wcG0/6KimPh2dnX4ysrKoOPj4y/y8vIZ+/v7Cuvr61p6enr1z8/M+Ovr - 4/+7uav/2NbJ//r78f/m597/187I/9Tv4/+e4tv/ltzF/93s4///////mZuI/xAHAP8tKA3/gH5n/+Xl - 1P/KybX/wsOx/8rKwv/MzcT/ycrC/8TFtf+rqZ39hIN/8bKystPc3Nw77OzsIvf39xH9/f0F9vb2G3R0 - dP2bm5rt6+vq/f3++f/5+/b/7/Hs/+Dh2//j3Nb/o+vZ/2TKsf9Qoof/keLP///////Hxbb/Pjkc/1hX - Pf+5tqD/4t3O/8zMvv/IyLz/ysrD/8nKwP/ExLf/srGk/4yLhfKjo6Pr1tbWfejo6Cr09PQX+/v7Cv7+ - /gP7+/sK7e3teXp6evWpqqfwysvG+8rLxvvLzcf82NzW/vDo5P+x7d7/dtir/2+0j/+D28L/3tTM/+/w - 6P/Dybz/2dbK/9ze0//S1Mr/0c/J/8zNxP/MzML/x8e5/7m2pv+Tk4r1d3d2+M3Nzabl5eUv8vLyGvn5 - +Q3+/v4G/v7+Af39/Qb5+fkN7e3tmnZ3dvmKionujIyL7YiJh+6NjoztsrCv8dja1v2z8db/qObJ/8Pe - 1P/b0s7/09LI/9zMvv/g4Nj/ZaWP/1uRe//Ex77/z8/H/8nJvP+9va7/l5aN9nh4d/bJycm34+PjM+/v - 7x34+PgO/f39Bf7+/gIAAAAA/v7+Af39/QX6+voL8/PzPtvb267V1dW41tbWqc7Ozrp3d3f4jYyM7b68 - u/Xj6OP/5uLd/93d3P/Cq5P/q2Eu/7ynjv9moo3/a510/9vYxf/S0sf/vr6t/5qZj/Z3d3b3xcXFuuHh - 4TPv7+8f9/f3Efz8/Ab+/v4D////AgAAAAD///8C/v7+Av7+/gT8/PwH+/v7C/n5+Q739/cT9PT0Gezs - 7EnT09Ozenp69p2dne3f4Nv+3N7Z/9zOuv/ClG7/zr+s/9bWz/92grD/tLS7/8jIuf+UlYz1eHh39sPD - w73h4eEz7u7uIPf39xD7+/sI/v7+A////wEAAAAAAAAAAAAAAAAAAAAA////Af7+/gH+/v4D/v7+BP7+ - /gb8/PwI+vr6DvX19RXn5+eEr6+v66anpe/j493/6ufd/2603v9Wo9L/lp7H/x8ttP92fqX/oKCU9nZ2 - dvjLy8uz4+PjMO/v7x739/cQ+/v7CP7+/gL///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///wH+/v4D/Pz8CPf39xHl5eWYfX1988TEwffa39n/Zbnq/zKd2//P0cT/nJyw/4SE - gfF2dnX5ysrKueXl5Szw8PAc+Pj4D/v7+wf+/v4C////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4C/Pz8CPb29hZ0dHP+i4yL7rSzr/S8u7X2ub66+6yq - o/WGhoHvdHRz/dzc3HDp6ekm8vLyGPj4+A38/PwH/v7+A////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wH+/v4C+/v7CPf390FzdHP+eXl49318 - fPN5eXj2dXV1+nR0dPzo6OhH7+/vHfX19RT6+voM/f39Bf7+/gH///8BAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wH+/v4E/Pz8B/n5 - +RLw8PBE6urqZuzs7FHw8PAy8vLyIvb29hP5+fkN+/v7CP7+/gT+/v4BAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// - /wL+/v4C/v7+BP39/Qf8/PwJ+/v7Cvv7+wn8/PwK/f39Bf7+/gT+/v4B////AQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA///////////8P////A////gP///4D///8Af///AH///gB///4AP//+AB - ///AAP//wAB//8AADA+AAAAHgAAAA4AAAAOAAAADgAAAA4AAAAPAAAAHwAAAD+AAAA/gAAAf+AAAP//A - AH//4AD///AB///4B////A////////////8= - - - \ No newline at end of file diff --git a/Scp/ScpUser/ScpUser.cpp b/Scp/ScpUser/ScpUser.cpp deleted file mode 100644 index 6e0001e..0000000 --- a/Scp/ScpUser/ScpUser.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// DS3User.cpp : main project file. - -#include "stdafx.h" -#include "SCPPad.h" - -using namespace SCPUser; - -[STAThreadAttribute] -int main(array ^args) -{ - // Enabling Windows XP visual effects before any controls are created - Application::EnableVisualStyles(); - Application::SetCompatibleTextRenderingDefault(false); - - // Create the main window and run it - Application::Run(gcnew SCPPad()); - return 0; -} diff --git a/Scp/ScpUser/ScpUser.rc b/Scp/ScpUser/ScpUser.rc deleted file mode 100644 index 6444a65..0000000 --- a/Scp/ScpUser/ScpUser.rc +++ /dev/null @@ -1,50 +0,0 @@ -#include "resource.h" -#include "winres.h" - -///////////////////////////////////////////////////////////////////////////// -// English (United Kingdom) resources - -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK -#pragma code_page(1252) - -1 ICON "ARPIcon.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,5,2,138 - PRODUCTVERSION 2,5,2,138 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "080904b0" - BEGIN - VALUE "CompanyName", "Scarlet.Crush Productions" - VALUE "FileDescription", "SCPUser Managed Application" - VALUE "FileVersion", "2.5.2.138" - VALUE "InternalName", "SCPUser.exe" - VALUE "LegalCopyright", "Copyright (C) Scarlet.Crush Productions 2012, 2013, 2014" - VALUE "OriginalFilename", "SCPUser.exe" - VALUE "ProductName", "SCPUser Managed Application" - VALUE "ProductVersion", "2.5.2.138" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x809, 1200 - END -END - -///////////////////////////////////////////////////////////////////////////// diff --git a/Scp/ScpUser/ScpUser.vcxproj b/Scp/ScpUser/ScpUser.vcxproj deleted file mode 100644 index 98cdbf7..0000000 --- a/Scp/ScpUser/ScpUser.vcxproj +++ /dev/null @@ -1,236 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817} - SCPUser - ManagedCProj - SCPUser - - - - Application - Unicode - true - false - v120_xp - - - Application - Unicode - true - v120_xp - - - Application - Unicode - true - false - v120 - - - Application - Unicode - true - v120 - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)..\bin\Win32\ - Build\Win32\$(Configuration)\ - true - $(SolutionDir)..\bin\Win32\ - Build\Win32\$(Configuration)\ - false - $(SolutionDir)..\bin\Win64\ - Build\Win64\$(Configuration)\ - true - $(SolutionDir)..\bin\Win64\ - Build\Win64\$(Configuration)\ - false - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\Lib\x64;$(LibraryPath) - $(DXSDK_DIR)\Lib\x64;$(LibraryPath) - $(DXSDK_DIR)\Lib\x86;$(LibraryPath) - $(DXSDK_DIR)\Lib\x86;$(LibraryPath) - - - - Disabled - WIN32;_DEBUG;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - Use - Level3 - ProgramDatabase - - - XInput.lib - true - true - Windows - main - MachineX86 - - - - - WIN32;NDEBUG;%(PreprocessorDefinitions) - MultiThreadedDLL - Use - Level3 - ProgramDatabase - - - XInput.lib - true - Windows - main - MachineX86 - - - - - X64 - - - Disabled - WIN32;_DEBUG;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - Use - Level3 - ProgramDatabase - - - XInput.lib - true - true - Windows - main - MachineX64 - - - - - X64 - - - WIN32;NDEBUG;%(PreprocessorDefinitions) - MultiThreadedDLL - Use - Level3 - ProgramDatabase - - - XInput.lib - true - Windows - main - MachineX64 - - - - - true - true - - - - true - true - - - true - true - - - - - - - - - - Create - Create - Create - Create - - - - - CppForm - - - - CppForm - - - - - - - - - - - - - SCPExtended.h - - - SCPPad.h - Designer - - - - - - \ No newline at end of file diff --git a/Scp/ScpUser/ScpUser.vcxproj.filters b/Scp/ScpUser/ScpUser.vcxproj.filters deleted file mode 100644 index 3ea5b03..0000000 --- a/Scp/ScpUser/ScpUser.vcxproj.filters +++ /dev/null @@ -1,69 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Resource Files - - - - - Resource Files - - - Resource Files - - - - - Resource Files - - - \ No newline at end of file diff --git a/Scp/ScpUser/ScpUser_2010.vcxproj b/Scp/ScpUser/ScpUser_2010.vcxproj deleted file mode 100644 index daf3eef..0000000 --- a/Scp/ScpUser/ScpUser_2010.vcxproj +++ /dev/null @@ -1,236 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817} - SCPUser - ManagedCProj - SCPUser - - - - Application - Unicode - true - false - v100 - - - Application - Unicode - true - v100 - - - Application - Unicode - true - false - v100 - - - Application - Unicode - true - v100 - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)..\bin\Win32\ - Build\Win32\$(Configuration)\ - true - $(SolutionDir)..\bin\Win32\ - Build\Win32\$(Configuration)\ - false - $(SolutionDir)..\bin\Win64\ - Build\Win64\$(Configuration)\ - true - $(SolutionDir)..\bin\Win64\ - Build\Win64\$(Configuration)\ - false - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\Lib\x64;$(LibraryPath) - $(DXSDK_DIR)\Lib\x64;$(LibraryPath) - $(DXSDK_DIR)\Lib\x86;$(LibraryPath) - $(DXSDK_DIR)\Lib\x86;$(LibraryPath) - - - - Disabled - WIN32;_DEBUG;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - Use - Level3 - ProgramDatabase - - - XInput.lib - true - true - Windows - main - MachineX86 - - - - - WIN32;NDEBUG;%(PreprocessorDefinitions) - MultiThreadedDLL - Use - Level3 - ProgramDatabase - - - XInput.lib - true - Windows - main - MachineX86 - - - - - X64 - - - Disabled - WIN32;_DEBUG;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - Use - Level3 - ProgramDatabase - - - XInput.lib - true - true - Windows - main - MachineX64 - - - - - X64 - - - WIN32;NDEBUG;%(PreprocessorDefinitions) - MultiThreadedDLL - Use - Level3 - ProgramDatabase - - - XInput.lib - true - Windows - main - MachineX64 - - - - - true - true - - - - true - true - - - true - true - - - - - - - - - - Create - Create - Create - Create - - - - - CppForm - - - - CppForm - - - - - - - - - - - - - SCPExtended.h - - - SCPPad.h - Designer - - - - - - \ No newline at end of file diff --git a/Scp/ScpUser/ScpUser_2010.vcxproj.filters b/Scp/ScpUser/ScpUser_2010.vcxproj.filters deleted file mode 100644 index 3ea5b03..0000000 --- a/Scp/ScpUser/ScpUser_2010.vcxproj.filters +++ /dev/null @@ -1,69 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Resource Files - - - - - Resource Files - - - Resource Files - - - - - Resource Files - - - \ No newline at end of file diff --git a/Scp/ScpUser/resource.h b/Scp/ScpUser/resource.h deleted file mode 100644 index b963220..0000000 --- a/Scp/ScpUser/resource.h +++ /dev/null @@ -1,15 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by app.rc -// - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/Scp/ScpUser/stdafx.cpp b/Scp/ScpUser/stdafx.cpp deleted file mode 100644 index 197eafe..0000000 --- a/Scp/ScpUser/stdafx.cpp +++ /dev/null @@ -1,5 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// SCPUser.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" diff --git a/Scp/ScpUser/stdafx.h b/Scp/ScpUser/stdafx.h deleted file mode 100644 index e8c1629..0000000 --- a/Scp/ScpUser/stdafx.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#define STRICT -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include "Resource.h" - -#define XINPUT_GAMEPAD_GUIDE 0x400 diff --git a/Scp/ScpUser_2010.sln b/Scp/ScpUser_2010.sln deleted file mode 100644 index d72f916..0000000 --- a/Scp/ScpUser_2010.sln +++ /dev/null @@ -1,36 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SCPUser", "SCPUser\SCPUser_2010.vcxproj", "{295687B3-0DDD-4EB1-A12A-3F2AA6B86817}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XInput_SCP", "XInput_SCP\XInput_SCP_2010.vcxproj", "{00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Debug|Win32.ActiveCfg = Debug|Win32 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Debug|Win32.Build.0 = Debug|Win32 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Debug|x64.ActiveCfg = Debug|x64 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Debug|x64.Build.0 = Debug|x64 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Release|Win32.ActiveCfg = Release|Win32 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Release|Win32.Build.0 = Release|Win32 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Release|x64.ActiveCfg = Release|x64 - {295687B3-0DDD-4EB1-A12A-3F2AA6B86817}.Release|x64.Build.0 = Release|x64 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Debug|Win32.ActiveCfg = Debug|Win32 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Debug|Win32.Build.0 = Debug|Win32 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Debug|x64.ActiveCfg = Debug|x64 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Debug|x64.Build.0 = Debug|x64 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Release|Win32.ActiveCfg = Release|Win32 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Release|Win32.Build.0 = Release|Win32 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Release|x64.ActiveCfg = Release|x64 - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Scp/XInput_Scp/BTConnection.cpp b/Scp/XInput_Scp/BTConnection.cpp deleted file mode 100644 index cd8389f..0000000 --- a/Scp/XInput_Scp/BTConnection.cpp +++ /dev/null @@ -1,354 +0,0 @@ -#include "StdAfx.h" - -CBTConnection::CBTConnection(void) -{ - WSADATA wsaData; - - CollectionSize = 0; - m_bInited = false; - - sockaddr_in Control, Report; - - Control.sin_family = AF_INET; - Control.sin_addr.s_addr = inet_addr("127.0.0.1"); - Control.sin_port = htons(ControlPort); - - Report.sin_family = AF_INET; - Report.sin_addr.s_addr = inet_addr("127.0.0.1"); - Report.sin_port = htons(ReportPort); - - for (int Index = 0; Index < 4; Index++) - { - memset(&(m_padState [Index]), 0, sizeof(XINPUT_STATE)); - memset(&(m_padVibration[Index]), 0, sizeof(XINPUT_VIBRATION)); - memset(&(m_Extended [Index]), 0, sizeof(SCP_EXTN)); - } - - if (WSAStartup(MAKEWORD(2, 2), &wsaData) == NO_ERROR) - { - if ((m_Control = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) - { - WSACleanup(); - return; - } - - if (connect(m_Control, (SOCKADDR*) &Control, sizeof(Control)) == SOCKET_ERROR) - { - closesocket(m_Control); - - WSACleanup(); - return; - } - - if ((m_Report = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) - { - closesocket(m_Control); - - WSACleanup(); - return; - } - - if (bind(m_Report, (SOCKADDR*) &Report, sizeof(Report)) == SOCKET_ERROR) - { - closesocket(m_Control); - closesocket(m_Report); - - WSACleanup(); - return; - } - } - - m_bInited = true; -} - -BOOL CBTConnection::Open() -{ - UCHAR Buffer[6]; - - Buffer[0] = 0; - Buffer[1] = 0; - - if (m_bInited) - { - CollectionSize = 0; - - if (send(m_Control, (CHAR*) Buffer, 6, 0) != SOCKET_ERROR) - { - if (recv(m_Control, (CHAR*) Buffer, 6, 0) > 0) - { - for (int Index = 2; Index < 6; Index++) - { - if (Buffer[Index] > 0) CollectionSize++; - } - } - } - } - - if (CollectionSize > 0) - { - m_bConnected = m_xConnected = true; - - _beginthread(ReadThread, 0, this); - } - - return CollectionSize > 0; -} - -BOOL CBTConnection::Close() -{ - if (m_bInited) - { - m_bInited = m_bConnected = m_xConnected = false; - - try - { - closesocket(m_Control); - closesocket(m_Report); - - WSACleanup(); - } - catch (...) - { - } - } - - return !m_bConnected; -} - - -void CBTConnection::Report(DWORD dwUserIndex) -{ - UCHAR Buffer[4]; - - Buffer[0] = (UCHAR) dwUserIndex; - Buffer[1] = 0x01; - Buffer[2] = m_padVibration[dwUserIndex].wLeftMotorSpeed >> 8; - Buffer[3] = m_padVibration[dwUserIndex].wRightMotorSpeed >> 8; - - if (m_bConnected) - { - send(m_Control, (CHAR*) Buffer, 4, 0); - } -} - -BOOL CBTConnection::Read(UCHAR* Buffer) -{ - int bRead = 0; - - if (m_bConnected) - { - bRead = recv(m_Report, (CHAR*) Buffer, 96, 0); - } - - return bRead > 0; -} - -void CBTConnection::ReadThread(void *lpController) -{ - CBTConnection* Pad = (CBTConnection *) lpController; - - UCHAR Buffer[96]; - - while (Pad->m_bConnected) - { - if (Pad->Read(Buffer)) - { - if (Buffer[1] == 2) - { - Pad->XInputMapState(Buffer[0], &Buffer[8], Buffer[89]); - } - else - { - memset(&(Pad->m_padState [Buffer[0]]), 0, sizeof(XINPUT_STATE)); - memset(&(Pad->m_padVibration[Buffer[0]]), 0, sizeof(XINPUT_VIBRATION)); - memset(&(Pad->m_Extended [Buffer[0]]), 0, sizeof(SCP_EXTN)); - } - } - else - { - Pad->m_bConnected = false; - } - } - - _endthread(); -} - -void CBTConnection::XInputMapState(DWORD Pad, UCHAR* Report, UCHAR Model) -{ - m_padState[Pad].Gamepad.wButtons = 0; - - if (Model == 1) // DS3 - { - DWORD Buttons = Report[2] << 0 | Report[3] << 8 | Report[4] << 16 | Report[5] << 24; - - if (Buttons & (0x1 << 0)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_BACK; - if (Buttons & (0x1 << 1)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_LEFT_THUMB; - if (Buttons & (0x1 << 2)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_RIGHT_THUMB; - if (Buttons & (0x1 << 3)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_START; - - if (Buttons & (0x1 << 4)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_UP; - if (Buttons & (0x1 << 5)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_RIGHT; - if (Buttons & (0x1 << 6)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_DOWN; - if (Buttons & (0x1 << 7)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_LEFT; - - if (Buttons & (0x1 << 10)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_LEFT_SHOULDER; - if (Buttons & (0x1 << 11)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_RIGHT_SHOULDER; - - if (Buttons & (0x1 << 12)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_Y; - if (Buttons & (0x1 << 13)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_B; - if (Buttons & (0x1 << 14)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_A; - if (Buttons & (0x1 << 15)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_X; - - if (Buttons & (0x1 << 16)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_GUIDE; - - m_padState[Pad].Gamepad.sThumbRY = -Scale((SHORT) Report[9]); - m_padState[Pad].Gamepad.sThumbRX = Scale((SHORT) Report[8]); - m_padState[Pad].Gamepad.sThumbLY = -Scale((SHORT) Report[7]); - m_padState[Pad].Gamepad.sThumbLX = Scale((SHORT) Report[6]); - - // Remap for Triggers - Not Unpacked as Axis by UnpackReport - m_padState[Pad].Gamepad.bLeftTrigger = Report[18]; - m_padState[Pad].Gamepad.bRightTrigger = Report[19]; - - // Convert for Extension - m_Extended[Pad].SCP_UP = ToPressure(Report[14]); - m_Extended[Pad].SCP_RIGHT = ToPressure(Report[15]); - m_Extended[Pad].SCP_DOWN = ToPressure(Report[16]); - m_Extended[Pad].SCP_LEFT = ToPressure(Report[17]); - - m_Extended[Pad].SCP_LX = ToAxis(m_padState[Pad].Gamepad.sThumbLX); - m_Extended[Pad].SCP_LY = ToAxis(m_padState[Pad].Gamepad.sThumbLY); - - m_Extended[Pad].SCP_L1 = ToPressure(Report[20]); - m_Extended[Pad].SCP_L2 = ToPressure(Report[18]); - m_Extended[Pad].SCP_L3 = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB ? 1.0f : 0.0f; - - m_Extended[Pad].SCP_RX = ToAxis(m_padState[Pad].Gamepad.sThumbRX); - m_Extended[Pad].SCP_RY = ToAxis(m_padState[Pad].Gamepad.sThumbRY); - - m_Extended[Pad].SCP_R1 = ToPressure(Report[21]); - m_Extended[Pad].SCP_R2 = ToPressure(Report[19]); - m_Extended[Pad].SCP_R3 = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB ? 1.0f : 0.0f; - - m_Extended[Pad].SCP_T = ToPressure(Report[22]); - m_Extended[Pad].SCP_C = ToPressure(Report[23]); - m_Extended[Pad].SCP_X = ToPressure(Report[24]); - m_Extended[Pad].SCP_S = ToPressure(Report[25]); - - m_Extended[Pad].SCP_SELECT = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_BACK ? 1.0f : 0.0f; - m_Extended[Pad].SCP_START = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_START ? 1.0f : 0.0f; - - m_Extended[Pad].SCP_PS = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_GUIDE ? 1.0f : 0.0f; - } - - if (Model == 2) // DS4 - { - DWORD Buttons = Report[5] << 0 | Report[6] << 8 | Report[7] << 16; - - if (Buttons & (0x1 << 12)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_BACK; - if (Buttons & (0x1 << 14)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_LEFT_THUMB; - if (Buttons & (0x1 << 15)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_RIGHT_THUMB; - if (Buttons & (0x1 << 13)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_START; - - if (Buttons & (0x1 << 0)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_UP; - if (Buttons & (0x1 << 1)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_RIGHT; - if (Buttons & (0x1 << 2)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_DOWN; - if (Buttons & (0x1 << 3)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_LEFT; - - if (Buttons & (0x1 << 8)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_LEFT_SHOULDER; - if (Buttons & (0x1 << 9)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_RIGHT_SHOULDER; - - if (Buttons & (0x1 << 7)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_Y; - if (Buttons & (0x1 << 6)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_B; - if (Buttons & (0x1 << 5)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_A; - if (Buttons & (0x1 << 4)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_X; - - if (Buttons & (0x1 << 16)) m_padState[Pad].Gamepad.wButtons |= XINPUT_GAMEPAD_GUIDE; - - m_padState[Pad].Gamepad.sThumbRY = -Scale((SHORT) Report[4]); - m_padState[Pad].Gamepad.sThumbRX = Scale((SHORT) Report[3]); - m_padState[Pad].Gamepad.sThumbLY = -Scale((SHORT) Report[2]); - m_padState[Pad].Gamepad.sThumbLX = Scale((SHORT) Report[1]); - - // Remap for Triggers - m_padState[Pad].Gamepad.bLeftTrigger = Report[8]; - m_padState[Pad].Gamepad.bRightTrigger = Report[9]; - - // Convert for Extension - m_Extended[Pad].SCP_UP = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP ? 1.0f : 0.0f; - m_Extended[Pad].SCP_RIGHT = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT ? 1.0f : 0.0f; - m_Extended[Pad].SCP_DOWN = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN ? 1.0f : 0.0f; - m_Extended[Pad].SCP_LEFT = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT ? 1.0f : 0.0f; - - m_Extended[Pad].SCP_LX = ToAxis(m_padState[Pad].Gamepad.sThumbLX); - m_Extended[Pad].SCP_LY = ToAxis(m_padState[Pad].Gamepad.sThumbLY); - - m_Extended[Pad].SCP_L1 = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER ? 1.0f : 0.0f; - m_Extended[Pad].SCP_L2 = ToPressure(Report[8]); - m_Extended[Pad].SCP_L3 = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB ? 1.0f : 0.0f; - - m_Extended[Pad].SCP_RX = ToAxis(m_padState[Pad].Gamepad.sThumbRX); - m_Extended[Pad].SCP_RY = ToAxis(m_padState[Pad].Gamepad.sThumbRY); - - m_Extended[Pad].SCP_R1 = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER ? 1.0f : 0.0f; - m_Extended[Pad].SCP_R2 = ToPressure(Report[9]); - m_Extended[Pad].SCP_R3 = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB ? 1.0f : 0.0f; - - m_Extended[Pad].SCP_T = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_Y ? 1.0f : 0.0f; - m_Extended[Pad].SCP_C = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_B ? 1.0f : 0.0f; - m_Extended[Pad].SCP_X = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_A ? 1.0f : 0.0f; - m_Extended[Pad].SCP_S = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_X ? 1.0f : 0.0f; - - m_Extended[Pad].SCP_SELECT = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_BACK ? 1.0f : 0.0f; - m_Extended[Pad].SCP_START = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_START ? 1.0f : 0.0f; - - m_Extended[Pad].SCP_PS = m_padState[Pad].Gamepad.wButtons & XINPUT_GAMEPAD_GUIDE ? 1.0f : 0.0f; - } -} - - -DWORD CBTConnection::GetState(DWORD dwUserIndex, XINPUT_STATE* pState) -{ - if (m_bConnected) - { - m_padState[dwUserIndex].dwPacketNumber++; - - memcpy(pState, &(m_padState[dwUserIndex]), sizeof(XINPUT_STATE)); - } - - return m_bConnected ? ERROR_SUCCESS : ERROR_DEVICE_NOT_CONNECTED; -} - -DWORD CBTConnection::SetState(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration) -{ - if (m_bConnected) - { - if ((pVibration->wLeftMotorSpeed != m_padVibration[dwUserIndex].wLeftMotorSpeed) - || (pVibration->wRightMotorSpeed != m_padVibration[dwUserIndex].wRightMotorSpeed)) - { - m_padVibration[dwUserIndex].wRightMotorSpeed = pVibration->wRightMotorSpeed; - m_padVibration[dwUserIndex].wLeftMotorSpeed = pVibration->wLeftMotorSpeed; - - Report(dwUserIndex); - } - } - - return m_bConnected ? ERROR_SUCCESS : ERROR_DEVICE_NOT_CONNECTED; -} - -DWORD CBTConnection::GetExtended(DWORD dwUserIndex, SCP_EXTN* pPressure) -{ - if (m_bConnected) - { - memcpy(pPressure, &m_Extended[dwUserIndex], sizeof(SCP_EXTN)); - } - - return m_bConnected ? ERROR_SUCCESS : ERROR_DEVICE_NOT_CONNECTED;; -} - -// UNDOCUMENTED - -DWORD CBTConnection::GetStateEx(DWORD dwUserIndex, XINPUT_STATE *pState) -{ - return GetState(dwUserIndex, pState); -} diff --git a/Scp/XInput_Scp/BTConnection.h b/Scp/XInput_Scp/BTConnection.h deleted file mode 100644 index b6efb21..0000000 --- a/Scp/XInput_Scp/BTConnection.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -class CBTConnection : public CSCPController -{ -public: - - DWORD CollectionSize; - - CBTConnection(void); - - virtual BOOL Open(); - - virtual BOOL Close(); - - virtual DWORD GetState(DWORD dwUserIndex, XINPUT_STATE* pState); - - virtual DWORD SetState(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration); - - virtual DWORD GetExtended(DWORD dwUserIndex, SCP_EXTN* pPressure); - - // UNDOCUMENTED - - virtual DWORD GetStateEx(DWORD dwUserIndex, XINPUT_STATE *pState); - -protected: - - static const unsigned short ControlPort = 26760; - static const unsigned short ReportPort = 26761; - - XINPUT_STATE m_padState [4]; - XINPUT_VIBRATION m_padVibration [4]; - SCP_EXTN m_Extended [4]; - - volatile bool m_bInited, m_bConnected; - - SOCKET m_Control; - SOCKET m_Report; - - virtual void Report(DWORD dwUserIndex); - - virtual void XInputMapState(DWORD dwUserIndex, UCHAR* Buffer, UCHAR Model); - - virtual BOOL Read(UCHAR* Buffer); - - static void ReadThread(void *lpController); -}; diff --git a/Scp/XInput_Scp/DS2Controller.cpp b/Scp/XInput_Scp/DS2Controller.cpp deleted file mode 100644 index 04847ed..0000000 --- a/Scp/XInput_Scp/DS2Controller.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "StdAfx.h" -#define REPORT_SIZE 4 - -// Byte 2 Right Motor -// Byte 3 Left Motor - -static BYTE l_Report[REPORT_SIZE] = -{ - 0x01, 0x00, 0x00, 0x00, -}; - -CDS2Controller::CDS2Controller(DWORD dwIndex) : CSCPController(dwIndex, REPORT_SIZE) -{ - m_deviceId = _tcsdup(dwIndex % CollectionSize == 0 ? _T("vid_0b43&pid_0003&col01") : _T("vid_0b43&pid_0003&col02")); - - memcpy(m_Report, l_Report, m_dwReportSize); - - m_dwIndex /= CollectionSize; - - m_bReportEnabled = false; -} - -void CDS2Controller::FormatReport(void) -{ - m_Report[0] = (BYTE) m_lpHidDevice->OutputData[0].ReportID; - - m_Report[2] = (BYTE) (m_padVibration.wRightMotorSpeed > 0 ? 0x01 : 0); // Only has [ON|OFF] - m_Report[3] = (BYTE) (m_padVibration.wLeftMotorSpeed >> 8); -} - -void CDS2Controller::XInputMapState(void) -{ - m_padState.Gamepad.wButtons = 0; - m_padState.Gamepad.bLeftTrigger = 0; - m_padState.Gamepad.bRightTrigger = 0; - - for (ULONG Index = 0, Axis = 0; Index < m_lpHidDevice->InputDataLength; Index++) - { - if (m_lpHidDevice->InputData[Index].IsButtonData) - { - for (ULONG j = 0; j < m_lpHidDevice->InputData[Index].ButtonData.MaxUsageLength; j++) - { - // Remap for Buttons + Triggers - switch(m_lpHidDevice->InputData[Index].ButtonData.Usages[j]) - { - case 1: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_Y; break; - case 2: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_B; break; - case 3: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_A; break; - case 4: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_X; break; - - case 5: m_padState.Gamepad.bLeftTrigger = (BYTE) 0xFF; break; - case 6: m_padState.Gamepad.bRightTrigger = (BYTE) 0xFF; break; - - case 7: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_LEFT_SHOULDER; break; - case 8: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_RIGHT_SHOULDER; break; - - case 9: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_BACK; break; - case 10: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_START; break; - - case 11: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_LEFT_THUMB; break; - case 12: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_RIGHT_THUMB; break; - - case 13: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_UP; break; - case 14: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_RIGHT; break; - case 15: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_DOWN; break; - case 16: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_LEFT; break; - } - } - } - else - { - // Remap for Axis - switch(Axis++) - { - case 0: m_padState.Gamepad.sThumbRY = -Scale((SHORT) m_lpHidDevice->InputData[Index].ValueData.Value); break; - case 1: m_padState.Gamepad.sThumbRX = Scale((SHORT) m_lpHidDevice->InputData[Index].ValueData.Value); break; - case 2: m_padState.Gamepad.sThumbLY = -Scale((SHORT) m_lpHidDevice->InputData[Index].ValueData.Value); break; - case 3: m_padState.Gamepad.sThumbLX = Scale((SHORT) m_lpHidDevice->InputData[Index].ValueData.Value); break; - case 4: // Digital Mode - if ((m_lpHidDevice->InputData[Index].ValueData.Value == 0x41) || (m_lpHidDevice->InputData[Index].ValueData.Value == 0xFF)) - { - m_padState.Gamepad.sThumbLX = m_padState.Gamepad.sThumbLY = m_padState.Gamepad.sThumbRX = m_padState.Gamepad.sThumbRY = 0; - } - break; - } - } - } -} - -DWORD CDS2Controller::GetExtended(DWORD dwUserIndex, SCP_EXTN *Pressure) -{ - return m_xConnected ? ERROR_NOT_SUPPORTED : ERROR_DEVICE_NOT_CONNECTED;; -} diff --git a/Scp/XInput_Scp/DS2Controller.h b/Scp/XInput_Scp/DS2Controller.h deleted file mode 100644 index 7924c67..0000000 --- a/Scp/XInput_Scp/DS2Controller.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -// Play.com USB Adapter only (vid_0b43&pid_0003) - -class CDS2Controller : public CSCPController -{ -public: - - static const DWORD CollectionSize = 2; - -public: - - CDS2Controller(DWORD dwIndex); - - virtual DWORD GetExtended(DWORD dwUserIndex, SCP_EXTN *Pressure); - -protected: - - virtual void FormatReport(void); - - virtual void XInputMapState(void); -}; diff --git a/Scp/XInput_Scp/DS3Controller.cpp b/Scp/XInput_Scp/DS3Controller.cpp deleted file mode 100644 index 1958266..0000000 --- a/Scp/XInput_Scp/DS3Controller.cpp +++ /dev/null @@ -1,123 +0,0 @@ -#include "StdAfx.h" -#define REPORT_SIZE 49 - -// Byte 3 Right Motor -// Byte 5 Left Motor -// Byte 10 LEDs - Bit Flags: 0x2 LED 1, 0x4 LED 2, 0x8 LED 3, 0x10 LED 4 - -static BYTE l_Report[REPORT_SIZE] = -{ - 0x01, - 0x00, 0xFF, 0x00, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0x27, 0x10, 0x00, 0x32, - 0xFF, 0x27, 0x10, 0x00, 0x32, - 0xFF, 0x27, 0x10, 0x00, 0x32, - 0xFF, 0x27, 0x10, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, -}; - -static BYTE l_Flags[4] = { 0x02, 0x04, 0x08, 0x10 }; - -CDS3Controller::CDS3Controller(DWORD dwIndex) : CSCPController(dwIndex, REPORT_SIZE) -{ - m_deviceId = _tcsdup(_T("vid_054c&pid_0268")); - - memcpy(m_Report, l_Report, m_dwReportSize); -} - -void CDS3Controller::FormatReport(void) -{ - m_Report[ 0] = (BYTE) m_lpHidDevice->OutputData[0].ReportID; - - m_Report[ 3] = (BYTE) (m_padVibration.wRightMotorSpeed > 0 ? 0x01 : 0); // Only has [ON|OFF] - m_Report[ 5] = (BYTE) (m_padVibration.wLeftMotorSpeed >> 8); - - m_Report[10] = (BYTE) l_Flags[m_dwIndex]; -} - -void CDS3Controller::XInputMapState(void) -{ - m_padState.Gamepad.wButtons = 0; - - for (ULONG Index = 0, Axis = 0; Index < m_lpHidDevice->InputDataLength; Index++) - { - if (m_lpHidDevice->InputData[Index].IsButtonData) - { - for (ULONG j = 0; j < m_lpHidDevice->InputData[Index].ButtonData.MaxUsageLength; j++) - { - // Remap for Buttons - switch(m_lpHidDevice->InputData[Index].ButtonData.Usages[j]) - { - case 1: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_BACK; break; - case 2: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_LEFT_THUMB; break; - case 3: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_RIGHT_THUMB; break; - case 4: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_START; break; - - case 5: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_UP; break; - case 6: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_RIGHT; break; - case 7: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_DOWN; break; - case 8: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_LEFT; break; - - case 11: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_LEFT_SHOULDER; break; - case 12: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_RIGHT_SHOULDER; break; - - case 13: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_Y; break; - case 14: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_B; break; - case 15: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_A; break; - case 16: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_X; break; - - case 17: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_GUIDE; break; - } - } - } - else - { - // Remap for Axis - switch(Axis++) - { - case 0: m_padState.Gamepad.sThumbRY = -Scale((SHORT) m_lpHidDevice->InputData[Index].ValueData.Value); break; - case 1: m_padState.Gamepad.sThumbRX = Scale((SHORT) m_lpHidDevice->InputData[Index].ValueData.Value); break; - case 2: m_padState.Gamepad.sThumbLY = -Scale((SHORT) m_lpHidDevice->InputData[Index].ValueData.Value); break; - case 3: m_padState.Gamepad.sThumbLX = Scale((SHORT) m_lpHidDevice->InputData[Index].ValueData.Value); break; - } - } - } - - // Remap for Triggers - Not Unpacked as Axis by UnpackReport - m_padState.Gamepad.bLeftTrigger = m_lpHidDevice->InputReportBuffer[18]; - m_padState.Gamepad.bRightTrigger = m_lpHidDevice->InputReportBuffer[19]; - - // Convert for Extension - m_Extended.SCP_UP = ToPressure(m_lpHidDevice->InputReportBuffer[14]); - m_Extended.SCP_RIGHT = ToPressure(m_lpHidDevice->InputReportBuffer[15]); - m_Extended.SCP_DOWN = ToPressure(m_lpHidDevice->InputReportBuffer[16]); - m_Extended.SCP_LEFT = ToPressure(m_lpHidDevice->InputReportBuffer[17]); - - m_Extended.SCP_LX = ToAxis(m_padState.Gamepad.sThumbLX); - m_Extended.SCP_LY = ToAxis(m_padState.Gamepad.sThumbLY); - - m_Extended.SCP_L1 = ToPressure(m_lpHidDevice->InputReportBuffer[20]); - m_Extended.SCP_L2 = ToPressure(m_lpHidDevice->InputReportBuffer[18]); - m_Extended.SCP_L3 = m_padState.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB ? 1.0f : 0.0f; - - m_Extended.SCP_RX = ToAxis(m_padState.Gamepad.sThumbRX); - m_Extended.SCP_RY = ToAxis(m_padState.Gamepad.sThumbRY); - - m_Extended.SCP_R1 = ToPressure(m_lpHidDevice->InputReportBuffer[21]); - m_Extended.SCP_R2 = ToPressure(m_lpHidDevice->InputReportBuffer[19]); - m_Extended.SCP_R3 = m_padState.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB ? 1.0f : 0.0f; - - m_Extended.SCP_T = ToPressure(m_lpHidDevice->InputReportBuffer[22]); - m_Extended.SCP_C = ToPressure(m_lpHidDevice->InputReportBuffer[23]); - m_Extended.SCP_X = ToPressure(m_lpHidDevice->InputReportBuffer[24]); - m_Extended.SCP_S = ToPressure(m_lpHidDevice->InputReportBuffer[25]); - - m_Extended.SCP_SELECT = m_padState.Gamepad.wButtons & XINPUT_GAMEPAD_BACK ? 1.0f : 0.0f; - m_Extended.SCP_START = m_padState.Gamepad.wButtons & XINPUT_GAMEPAD_START ? 1.0f : 0.0f; - - m_Extended.SCP_PS = m_padState.Gamepad.wButtons & XINPUT_GAMEPAD_GUIDE ? 1.0f : 0.0f; -} diff --git a/Scp/XInput_Scp/DS3Controller.h b/Scp/XInput_Scp/DS3Controller.h deleted file mode 100644 index 28a8335..0000000 --- a/Scp/XInput_Scp/DS3Controller.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -class CDS3Controller : public CSCPController -{ -public: - - static const DWORD CollectionSize = 1; - -public: - - CDS3Controller(DWORD dwIndex); - -protected: - - virtual void FormatReport(void); - - virtual void XInputMapState(void); -}; diff --git a/Scp/XInput_Scp/LibUsbApi.cpp b/Scp/XInput_Scp/LibUsbApi.cpp deleted file mode 100644 index 97434b8..0000000 --- a/Scp/XInput_Scp/LibUsbApi.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include "StdAfx.h" -#include "lusb0_usb.h" - -static HMODULE l_hLibUsbDll = NULL; -static FARPROC l_hLibUsbFunc[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; - -static unsigned short idVendor = 0x054c; -static unsigned short idProduct = 0x0268; - -#define DS3_REQUEST_CODE 0x09 -#define DS3_REQUEST_VALUE 0x03F4 -#define DS3_REQUEST_SIZE 0x04 - -static CHAR l_hwStartData[DS3_REQUEST_SIZE] = { 0x42, 0x0C, 0x00, 0x00 }; - -static volatile bool bInited = false; - -typedef void (__cdecl *usb_initFunction)(void); -typedef int (__cdecl *usb_find_bussesFunction)(void); -typedef int (__cdecl *usb_find_devicesFunction)(void); -typedef struct usb_bus *(__cdecl *usb_get_bussesFunction)(void); -typedef usb_dev_handle *(__cdecl *usb_openFunction)(struct usb_device *dev); -typedef int (__cdecl *usb_control_msgFunction)(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout); -typedef int (__cdecl *usb_closeFunction)(usb_dev_handle *dev); - -void load_lib_usb() -{ - if (!bInited) - { - if ((l_hLibUsbDll = LoadLibrary(_T("C:\\Windows\\System32\\libusb0.dll"))) != NULL) - { - if ((l_hLibUsbFunc[0] = GetProcAddress(l_hLibUsbDll, "usb_init")) - && (l_hLibUsbFunc[1] = GetProcAddress(l_hLibUsbDll, "usb_find_busses")) - && (l_hLibUsbFunc[2] = GetProcAddress(l_hLibUsbDll, "usb_find_devices")) - && (l_hLibUsbFunc[3] = GetProcAddress(l_hLibUsbDll, "usb_get_busses")) - && (l_hLibUsbFunc[4] = GetProcAddress(l_hLibUsbDll, "usb_open")) - && (l_hLibUsbFunc[5] = GetProcAddress(l_hLibUsbDll, "usb_control_msg")) - && (l_hLibUsbFunc[6] = GetProcAddress(l_hLibUsbDll, "usb_close"))) - { - ((usb_initFunction) l_hLibUsbFunc[0])(); - bInited = true; - } - } - } -} - -void init_lib_usb() -{ - bool bFound = false; - - if (bInited) - { - struct usb_bus* bus; - struct usb_device* dev; - struct usb_dev_handle* udev; - - ((usb_find_bussesFunction) l_hLibUsbFunc[1])(); - ((usb_find_devicesFunction) l_hLibUsbFunc[2]()); - - for (bus = ((usb_get_bussesFunction) l_hLibUsbFunc[3])(); bus; bus = bus->next) - { - for (dev = bus->devices; dev; dev = dev->next) - { - if (dev->descriptor.idVendor == idVendor && dev->descriptor.idProduct == idProduct) - { - if ((udev = ((usb_openFunction) l_hLibUsbFunc[4])(dev))) - { - ((usb_control_msgFunction) l_hLibUsbFunc[5])(udev, - USB_ENDPOINT_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, DS3_REQUEST_CODE, - DS3_REQUEST_VALUE, dev->config->interface->altsetting->bInterfaceNumber, - l_hwStartData, DS3_REQUEST_SIZE, 500); - - ((usb_closeFunction) l_hLibUsbFunc[6])(udev); bFound = true; - } - } - } - } - } - - if (bFound) Sleep(100); -} diff --git a/Scp/XInput_Scp/LibUsbApi.h b/Scp/XInput_Scp/LibUsbApi.h deleted file mode 100644 index 453a6d4..0000000 --- a/Scp/XInput_Scp/LibUsbApi.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -extern void load_lib_usb(); -extern void init_lib_usb(); diff --git a/Scp/XInput_Scp/SCPController.cpp b/Scp/XInput_Scp/SCPController.cpp deleted file mode 100644 index 98a8b48..0000000 --- a/Scp/XInput_Scp/SCPController.cpp +++ /dev/null @@ -1,340 +0,0 @@ -#include "StdAfx.h" - -CSCPController::CSCPController() -{ - m_bConnected = false; - m_xConnected = false; - - m_Report = NULL; - m_deviceId = NULL; - m_devicePath = NULL; - m_lpHidDevice = NULL; -} - -CSCPController::CSCPController(DWORD dwIndex, DWORD dwReportSize) -{ - m_bConnected = false; - m_xConnected = false; - - m_bReportEnabled = true; - - m_dwIndex = dwIndex; - - m_deviceId = NULL; - m_devicePath = NULL; - - m_dwReportSize = dwReportSize; - - if (m_dwReportSize) m_Report = (BYTE *) calloc(m_dwReportSize, sizeof(BYTE)); - else m_Report = NULL; - - m_lpHidDevice = new HID_DEVICE(); - - memset(&m_Writer, 0, sizeof(OVERLAPPED)); - m_Writer.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL); - - memset(&m_Reader, 0, sizeof(OVERLAPPED)); - m_Reader.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL); -} - -CSCPController::~CSCPController(void) -{ - if (m_deviceId ) free(m_deviceId); - if (m_devicePath) free(m_devicePath); - - if (m_Report) free(m_Report); - - Close(); - - if (m_lpHidDevice) - { - delete m_lpHidDevice; m_lpHidDevice = NULL; - - CloseHandle(m_Writer.hEvent); - CloseHandle(m_Reader.hEvent); - } -} - - -SHORT CSCPController::Scale(SHORT Value) -{ - Value -= 0x80; - - if(Value == -128) Value = -127; - - return (SHORT) (((float) Value / 127.0f) * 32767.0f); -} - - -BOOL CSCPController::Open(void) -{ - PHID_DEVICE lpHidDevice = NULL; - ULONG nDevices = 0; - DWORD nDevice = 0; - - FindKnownHidDevices(&lpHidDevice, &nDevices); - - // Look for our Device - for (ULONG nCurrent = 0; nCurrent < nDevices; nCurrent++) - { - _tstring devicePath(lpHidDevice[nCurrent].DevicePath); - - if (!m_bConnected && devicePath.find(m_deviceId) != _tstring::npos) - { - if (nDevice == m_dwIndex) - { - m_devicePath = _tcsdup(lpHidDevice[nCurrent].DevicePath); - - init_lib_usb(); - - if (OpenHidDevice(m_devicePath, true, true, true, false, m_lpHidDevice)) - { - InitReport(); - - m_bConnected = m_xConnected = true; - - _beginthread(ReadThread, 0, this); - } - } - - nDevice++; - } - - CloseHidDevice(&lpHidDevice[nCurrent]); - } - - if (lpHidDevice != NULL) free(lpHidDevice); - - return m_bConnected; -} - -BOOL CSCPController::Close(void) -{ - if (m_bConnected) - { - m_bConnected = false; - - if (m_xConnected) - { - InitReport(); Sleep(100); - - CloseHidDevice(m_lpHidDevice); - } - } - - return !m_bConnected; -} - - -DWORD CSCPController::GetState(DWORD dwUserIndex, XINPUT_STATE* pState) -{ - if (m_xConnected) - { - m_padState.dwPacketNumber++; - - memcpy(pState, &m_padState, sizeof(XINPUT_STATE)); - } - - return m_xConnected ? ERROR_SUCCESS : ERROR_DEVICE_NOT_CONNECTED; -} - -DWORD CSCPController::SetState(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration) -{ - if (m_xConnected) - { - if ((pVibration->wLeftMotorSpeed != m_padVibration.wLeftMotorSpeed) - || (pVibration->wRightMotorSpeed != m_padVibration.wRightMotorSpeed)) - { - m_padVibration.wRightMotorSpeed = pVibration->wRightMotorSpeed; - m_padVibration.wLeftMotorSpeed = pVibration->wLeftMotorSpeed; - - Report(); - } - } - - return m_xConnected ? ERROR_SUCCESS : ERROR_DEVICE_NOT_CONNECTED; -} - -DWORD CSCPController::GetCapabilities(DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities) -{ - if (m_xConnected) - { - if (dwFlags == XINPUT_FLAG_GAMEPAD || dwFlags == 0) - { - memset(pCapabilities, 0, sizeof(XINPUT_CAPABILITIES)); - - pCapabilities->Flags = XINPUT_CAPS_VOICE_SUPPORTED; - pCapabilities->Type = XINPUT_DEVTYPE_GAMEPAD; - pCapabilities->SubType = XINPUT_DEVSUBTYPE_GAMEPAD; - - pCapabilities->Gamepad.wButtons = 0xF3FF; - - pCapabilities->Gamepad.bLeftTrigger = - pCapabilities->Gamepad.bRightTrigger = 0xFF; - - pCapabilities->Gamepad.sThumbLX = - pCapabilities->Gamepad.sThumbLY = - pCapabilities->Gamepad.sThumbRX = - pCapabilities->Gamepad.sThumbRY = (SHORT) 0xFFC0; - - pCapabilities->Vibration.wLeftMotorSpeed = - pCapabilities->Vibration.wRightMotorSpeed = 0xFF; - - return ERROR_SUCCESS; - } - } - else - { - return ERROR_BAD_ARGUMENTS; - } - - return ERROR_DEVICE_NOT_CONNECTED; -} - -DWORD CSCPController::GetDSoundAudioDeviceGuids(DWORD dwUserIndex, GUID* pDSoundRenderGuid, GUID* pDSoundCaptureGuid) -{ - if (m_xConnected) - { - memset(pDSoundRenderGuid, 0, sizeof(GUID)); - memset(pDSoundCaptureGuid, 0, sizeof(GUID)); - } - - return m_xConnected ? ERROR_SUCCESS : ERROR_DEVICE_NOT_CONNECTED; -} - -DWORD CSCPController::GetBatteryInformation(DWORD dwUserIndex, BYTE devType, XINPUT_BATTERY_INFORMATION* pBatteryInformation) -{ - if (m_xConnected) - { - pBatteryInformation->BatteryType = BATTERY_TYPE_WIRED; - pBatteryInformation->BatteryLevel = BATTERY_LEVEL_FULL; - } - - return m_xConnected ? ERROR_SUCCESS : ERROR_DEVICE_NOT_CONNECTED; -} - -DWORD CSCPController::GetKeystroke(DWORD dwUserIndex, DWORD dwReserved, PXINPUT_KEYSTROKE pKeystroke) -{ - return m_xConnected ? ERROR_EMPTY : ERROR_DEVICE_NOT_CONNECTED; -} - -DWORD CSCPController::GetExtended(DWORD dwUserIndex, SCP_EXTN* pPressure) -{ - if (m_xConnected) - { - memcpy(pPressure, &m_Extended, sizeof(SCP_EXTN)); - } - - return m_xConnected ? ERROR_SUCCESS : ERROR_DEVICE_NOT_CONNECTED;; -} - - -BOOL CSCPController::Reopen(void) -{ - init_lib_usb(); - - if (OpenHidDevice(m_devicePath, true, true, true, false, m_lpHidDevice)) - { - InitReport(); - - m_xConnected = true; - } - - return m_xConnected; -} - -BOOL CSCPController::Read(void) -{ - if (m_bConnected) - { - if(ReadOverlapped(m_lpHidDevice, &m_Reader)) - { - if (WaitForSingleObject(m_Reader.hEvent, 250) == WAIT_OBJECT_0) - { - UnpackReport(m_lpHidDevice->InputReportBuffer, m_lpHidDevice->Caps.InputReportByteLength, HidP_Input, m_lpHidDevice->InputData, m_lpHidDevice->InputDataLength, m_lpHidDevice->Ppd); - - return true; - } - else - { - SetEvent(m_Reader.hEvent); - } - } - } - - return false; -} - -void CSCPController::ReadThread(void *lpController) -{ - CSCPController* Pad = (CSCPController *) lpController; - - while (Pad->m_bConnected) - { - if (Pad->Read()) - { - Pad->m_xConnected = true; - Pad->XInputMapState(); - } - else - { - Pad->m_xConnected = false; - CloseHidDevice(Pad->m_lpHidDevice); - - do { Sleep(500); } - while (Pad->m_bConnected && !Pad->Reopen()); - } - } - - _endthread(); -} - -void CSCPController::Report(void) -{ - if (m_bReportEnabled) - { - DWORD bytesWritten = 0; - - FormatReport(); - - if (WaitForSingleObject(m_Writer.hEvent, 100) == WAIT_OBJECT_0) - { - WriteFile(m_lpHidDevice->HidDevice, m_Report, m_dwReportSize, &bytesWritten, &m_Writer); - } - else - { - SetEvent(m_Writer.hEvent); - } - } -} - -void CSCPController::InitReport(void) -{ - memset(&m_padState, 0, sizeof(XINPUT_STATE)); - memset(&m_padVibration, 0, sizeof(XINPUT_VIBRATION)); - - Report(); -} - - -// UNDOCUMENTED - -DWORD CSCPController::GetStateEx(DWORD dwUserIndex, XINPUT_STATE *pState) -{ - return GetState(m_dwIndex, pState); -} - -DWORD CSCPController::WaitForGuideButton(DWORD dwUserIndex, DWORD dwFlag, LPVOID pVoid) -{ - return m_xConnected ? ERROR_SUCCESS : ERROR_DEVICE_NOT_CONNECTED; -} - -DWORD CSCPController::CancelGuideButtonWait(DWORD dwUserIndex) -{ - return m_xConnected ? ERROR_SUCCESS : ERROR_DEVICE_NOT_CONNECTED; -} - -DWORD CSCPController::PowerOffController(DWORD dwUserIndex) -{ - return m_xConnected ? ERROR_SUCCESS : ERROR_DEVICE_NOT_CONNECTED; -} diff --git a/Scp/XInput_Scp/SCPController.h b/Scp/XInput_Scp/SCPController.h deleted file mode 100644 index 3702e65..0000000 --- a/Scp/XInput_Scp/SCPController.h +++ /dev/null @@ -1,87 +0,0 @@ -#pragma once - -class CSCPController -{ -protected: - - PTCHAR m_deviceId, m_devicePath; - - volatile BOOL m_bConnected, m_xConnected; - - PHID_DEVICE m_lpHidDevice; - XINPUT_STATE m_padState; - XINPUT_VIBRATION m_padVibration; - - OVERLAPPED m_Reader, m_Writer; - - DWORD m_dwIndex; - - DWORD m_dwReportSize; - BYTE* m_Report; - - BOOL m_bReportEnabled; - - SCP_EXTN m_Extended; - -protected: - - CSCPController(); - CSCPController(DWORD dwIndex, DWORD dwReportSize); - - static inline float ToPressure(BYTE Value) { return ((int) Value & 0xFF) / 255.0f; } - - static inline float ClampAxis(float Value) { if (Value > 1.0f) return 1.0f; else if (Value < -1.0f) return -1.0f; else return Value; } - static inline float ToAxis (SHORT Value) { return ClampAxis(Value / 32767.0f); } - -public: - - virtual ~CSCPController(void); - - - virtual BOOL Open(void); - - virtual BOOL Close(void); - - - virtual DWORD GetState(DWORD dwUserIndex, XINPUT_STATE* pState); - - virtual DWORD SetState(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration); - - virtual DWORD GetCapabilities(DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities); - - virtual DWORD GetDSoundAudioDeviceGuids(DWORD dwUserIndex, GUID* pDSoundRenderGuid, GUID* pDSoundCaptureGuid); - - virtual DWORD GetBatteryInformation(DWORD dwUserIndex, BYTE devType, XINPUT_BATTERY_INFORMATION* pBatteryInformation); - - virtual DWORD GetKeystroke(DWORD dwUserIndex, DWORD dwReserved, PXINPUT_KEYSTROKE pKeystroke); - - virtual DWORD GetExtended(DWORD dwUserIndex, SCP_EXTN* pPressure); - - // UNDOCUMENTED - - virtual DWORD GetStateEx(DWORD dwUserIndex, XINPUT_STATE *pState); - - virtual DWORD WaitForGuideButton(DWORD dwUserIndex, DWORD dwFlag, LPVOID pVoid); - - virtual DWORD CancelGuideButtonWait(DWORD dwUserIndex); - - virtual DWORD PowerOffController(DWORD dwUserIndex); - -protected: - - virtual BOOL Reopen(void); - - virtual BOOL Read(void); - - static void ReadThread(void *lpController); - - virtual void Report(void); - - virtual void InitReport(void); - - virtual SHORT Scale(SHORT Value); - - virtual void FormatReport(void) { }; - - virtual void XInputMapState(void) { }; -}; diff --git a/Scp/XInput_Scp/SL3Controller.cpp b/Scp/XInput_Scp/SL3Controller.cpp deleted file mode 100644 index b97f8fc..0000000 --- a/Scp/XInput_Scp/SL3Controller.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include "StdAfx.h" -#define REPORT_SIZE 9 - -// Byte 3 Right Motor -// Byte 4 Left Motor - -static BYTE l_Report[REPORT_SIZE] = -{ - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -CSL3Controller::CSL3Controller(DWORD dwIndex) : CSCPController(dwIndex, REPORT_SIZE) -{ - m_deviceId = _tcsdup(_T("vid_0e8f&pid_3075")); - - memcpy(m_Report, l_Report, m_dwReportSize); -} - -void CSL3Controller::FormatReport(void) -{ - m_Report[0] = (BYTE) m_lpHidDevice->OutputData[0].ReportID; - - m_Report[3] = (BYTE) (m_padVibration.wLeftMotorSpeed >> 8); - m_Report[4] = (BYTE) (m_padVibration.wRightMotorSpeed >> 8); -} - -void CSL3Controller::XInputMapState(void) -{ - m_padState.Gamepad.wButtons = 0; - - for (ULONG Index = 0, Axis = 0; Index < m_lpHidDevice->InputDataLength; Index++) - { - if (m_lpHidDevice->InputData[Index].IsButtonData) - { - for (ULONG j = 0; j < m_lpHidDevice->InputData[Index].ButtonData.MaxUsageLength; j++) - { - // Remap for Buttons - switch(m_lpHidDevice->InputData[Index].ButtonData.Usages[j]) - { - case 1: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_Y; break; - case 2: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_B; break; - case 3: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_A; break; - case 4: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_X; break; - - case 5: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_LEFT_SHOULDER; break; - case 6: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_RIGHT_SHOULDER; break; - - case 9: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_BACK; break; - case 10: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_START; break; - - case 11: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_LEFT_THUMB; break; - case 12: m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_RIGHT_THUMB; break; - } - } - } - else - { - // Remap for Axis + Normalize - switch(Axis++) - { - case 1: m_padState.Gamepad.sThumbRY = -Scale((SHORT) m_lpHidDevice->InputData[Index].ValueData.Value); break; - case 2: m_padState.Gamepad.sThumbRX = Scale((SHORT) m_lpHidDevice->InputData[Index].ValueData.Value); break; - case 3: m_padState.Gamepad.sThumbLY = -Scale((SHORT) m_lpHidDevice->InputData[Index].ValueData.Value); break; - case 4: m_padState.Gamepad.sThumbLX = Scale((SHORT) m_lpHidDevice->InputData[Index].ValueData.Value); break; - - case 5: m_padState.Gamepad.bRightTrigger = (BYTE) m_lpHidDevice->InputData[Index].ValueData.Value; break; - case 6: m_padState.Gamepad.bLeftTrigger = (BYTE) m_lpHidDevice->InputData[Index].ValueData.Value; break; - - case 13: if (m_lpHidDevice->InputData[Index].ValueData.Value > 0) m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_DOWN; break; - case 14: if (m_lpHidDevice->InputData[Index].ValueData.Value > 0) m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_UP; break; - case 15: if (m_lpHidDevice->InputData[Index].ValueData.Value > 0) m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_LEFT; break; - case 16: if (m_lpHidDevice->InputData[Index].ValueData.Value > 0) m_padState.Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_RIGHT; break; - } - } - } - - // Convert for Extension - m_Extended.SCP_UP = ToPressure(m_lpHidDevice->InputReportBuffer[10]); - m_Extended.SCP_RIGHT = ToPressure(m_lpHidDevice->InputReportBuffer[ 8]); - m_Extended.SCP_DOWN = ToPressure(m_lpHidDevice->InputReportBuffer[11]); - m_Extended.SCP_LEFT = ToPressure(m_lpHidDevice->InputReportBuffer[ 9]); - - m_Extended.SCP_LX = ToAxis(m_padState.Gamepad.sThumbLX); - m_Extended.SCP_LY = ToAxis(m_padState.Gamepad.sThumbLY); - - m_Extended.SCP_L1 = ToPressure(m_lpHidDevice->InputReportBuffer[16]); - m_Extended.SCP_L2 = ToPressure(m_lpHidDevice->InputReportBuffer[18]); - m_Extended.SCP_L3 = m_padState.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB ? 1.0f : 0.0f; - - m_Extended.SCP_RX = ToAxis(m_padState.Gamepad.sThumbRX); - m_Extended.SCP_RY = ToAxis(m_padState.Gamepad.sThumbRY); - - m_Extended.SCP_R1 = ToPressure(m_lpHidDevice->InputReportBuffer[17]); - m_Extended.SCP_R2 = ToPressure(m_lpHidDevice->InputReportBuffer[19]); - m_Extended.SCP_R3 = m_padState.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB ? 1.0f : 0.0f; - - m_Extended.SCP_T = ToPressure(m_lpHidDevice->InputReportBuffer[12]); - m_Extended.SCP_C = ToPressure(m_lpHidDevice->InputReportBuffer[13]); - m_Extended.SCP_X = ToPressure(m_lpHidDevice->InputReportBuffer[14]); - m_Extended.SCP_S = ToPressure(m_lpHidDevice->InputReportBuffer[15]); - - m_Extended.SCP_SELECT = m_padState.Gamepad.wButtons & XINPUT_GAMEPAD_BACK ? 1.0f : 0.0f; - m_Extended.SCP_START = m_padState.Gamepad.wButtons & XINPUT_GAMEPAD_START ? 1.0f : 0.0f; - - m_Extended.SCP_PS = 0.0f; -} diff --git a/Scp/XInput_Scp/SL3Controller.h b/Scp/XInput_Scp/SL3Controller.h deleted file mode 100644 index 2ae8f24..0000000 --- a/Scp/XInput_Scp/SL3Controller.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -class CSL3Controller : public CSCPController -{ -public: - - static const DWORD CollectionSize = 1; - -public: - - CSL3Controller(DWORD dwIndex); - -protected: - - virtual void FormatReport(void); - - virtual void XInputMapState(void); -}; - diff --git a/Scp/XInput_Scp/X360Controller.cpp b/Scp/XInput_Scp/X360Controller.cpp deleted file mode 100644 index 04b68bb..0000000 --- a/Scp/XInput_Scp/X360Controller.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "StdAfx.h" -#define REPORT_SIZE 0 - - -CX360Controller::CX360Controller(DWORD dwIndex) : CSCPController(dwIndex, REPORT_SIZE) -{ - m_bReportEnabled = false; -} - -BOOL CX360Controller::Open(void) -{ - return WRAP_XInputGetState(m_dwIndex, &m_State) == ERROR_SUCCESS; -} - -BOOL CX360Controller::Close(void) -{ - return true; -} - -DWORD CX360Controller::GetState(DWORD dwUserIndex, XINPUT_STATE* pState) -{ - return WRAP_XInputGetState(m_dwIndex, pState); -} - -DWORD CX360Controller::SetState(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration) -{ - return WRAP_XInputSetState(m_dwIndex, pVibration); -} - -DWORD CX360Controller::GetCapabilities(DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities) -{ - return WRAP_XInputGetCapabilities(m_dwIndex, dwFlags, pCapabilities); -} - -DWORD CX360Controller::GetDSoundAudioDeviceGuids(DWORD dwUserIndex, GUID* pDSoundRenderGuid, GUID* pDSoundCaptureGuid) -{ - return WRAP_XInputGetDSoundAudioDeviceGuids(m_dwIndex, pDSoundRenderGuid, pDSoundCaptureGuid); -} - -DWORD CX360Controller::GetBatteryInformation(DWORD dwUserIndex, BYTE devType, XINPUT_BATTERY_INFORMATION* pBatteryInformation) -{ - return WRAP_XInputGetBatteryInformation(m_dwIndex, devType, pBatteryInformation); -} - -DWORD CX360Controller::GetKeystroke(DWORD dwUserIndex, DWORD dwReserved, PXINPUT_KEYSTROKE pKeystroke) -{ - return WRAP_XInputGetKeystroke(m_dwIndex, dwReserved, pKeystroke); -} - -DWORD CX360Controller::GetExtended(DWORD dwUserIndex, SCP_EXTN* pPressure) -{ - return WRAP_XInputGetState(m_dwIndex, &m_State) == ERROR_SUCCESS ? ERROR_NOT_SUPPORTED : ERROR_DEVICE_NOT_CONNECTED; -} - -// UNDOCUMENTED - -DWORD CX360Controller::GetStateEx(DWORD dwUserIndex, XINPUT_STATE *pState) -{ - return WRAP_XInputGetStateEx(m_dwIndex, pState); -} - -DWORD CX360Controller::WaitForGuideButton(DWORD dwUserIndex, DWORD dwFlag, LPVOID pVoid) -{ - return WRAP_XInputWaitForGuideButton(m_dwIndex, dwFlag, pVoid); -} - -DWORD CX360Controller::CancelGuideButtonWait(DWORD dwUserIndex) -{ - return WRAP_XInputCancelGuideButtonWait(m_dwIndex); -} - -DWORD CX360Controller::PowerOffController(DWORD dwUserIndex) -{ - return WRAP_XInputPowerOffController(m_dwIndex); -} diff --git a/Scp/XInput_Scp/X360Controller.h b/Scp/XInput_Scp/X360Controller.h deleted file mode 100644 index 47c1e82..0000000 --- a/Scp/XInput_Scp/X360Controller.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -class CX360Controller : public CSCPController -{ -public: - - static const DWORD CollectionSize = 1; - -protected: - - XINPUT_STATE m_State; - -public: - - CX360Controller(DWORD dwIndex); - - - virtual BOOL Open(void); - - virtual BOOL Close(void); - - - virtual DWORD GetState(DWORD dwUserIndex, XINPUT_STATE* pState); - - virtual DWORD SetState(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration); - - virtual DWORD GetCapabilities(DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities); - - virtual DWORD GetDSoundAudioDeviceGuids(DWORD dwUserIndex, GUID* pDSoundRenderGuid, GUID* pDSoundCaptureGuid); - - virtual DWORD GetBatteryInformation(DWORD dwUserIndex, BYTE devType, XINPUT_BATTERY_INFORMATION* pBatteryInformation); - - virtual DWORD GetKeystroke(DWORD dwUserIndex, DWORD dwReserved, PXINPUT_KEYSTROKE pKeystroke); - - virtual DWORD GetExtended(DWORD dwUserIndex, SCP_EXTN *Pressure); - - // UNDOCUMENTED - - virtual DWORD GetStateEx(DWORD dwUserIndex, XINPUT_STATE *pState); - - virtual DWORD WaitForGuideButton(DWORD dwUserIndex, DWORD dwFlag, LPVOID pVoid); - - virtual DWORD CancelGuideButtonWait(DWORD dwUserIndex); - - virtual DWORD PowerOffController(DWORD dwUserIndex); -}; - diff --git a/Scp/XInput_Scp/XInput_SCP.cpp b/Scp/XInput_Scp/XInput_SCP.cpp deleted file mode 100644 index e5925ae..0000000 --- a/Scp/XInput_Scp/XInput_SCP.cpp +++ /dev/null @@ -1,386 +0,0 @@ -#include "stdafx.h" - -static CSCPController* l_Pad[XUSER_MAX_COUNT]; -static BOOL l_bPassThrough = false, l_bStarted = false, l_bUnloaded = false; -static DWORD l_nPads = 0, l_nAttached = 0, l_nBtPads = 0; - -BOOL LoadApi(BOOL bEnable) -{ - if (bEnable) l_nAttached++; else l_nAttached--; - - if (bEnable && !l_bStarted && !l_bUnloaded) - { - load_lib_usb(); - WRAP_LoadXInput(true); - - // Load Bluetooth DS3s - CBTConnection* BtPad = new CBTConnection(); - - if (BtPad->Open()) - { - l_nBtPads = BtPad->CollectionSize; - - for(DWORD Index = 0; Index < BtPad->CollectionSize; Index++) - { - l_Pad[l_nPads++] = BtPad; - } - } - else delete BtPad; - - CSCPController* Pad; - - // Load DS3s - if (l_nBtPads == 0) // Only if not using BTH Server - { - for (DWORD Index = 0; Index < XUSER_MAX_COUNT * CDS3Controller::CollectionSize && l_nPads < XUSER_MAX_COUNT; Index++) - { - Pad = new CDS3Controller(Index); - - if (Pad->Open()) l_Pad[l_nPads++] = Pad; - else { delete Pad; break; } - } - } - - // Load SL3s - for (DWORD Index = 0; Index < XUSER_MAX_COUNT * CSL3Controller::CollectionSize && l_nPads < XUSER_MAX_COUNT; Index++) - { - Pad = new CSL3Controller(Index); - - if (Pad->Open()) l_Pad[l_nPads++] = Pad; - else { delete Pad; break; } - } - - // Load DS2s - for (DWORD Index = 0; Index < XUSER_MAX_COUNT * CDS2Controller::CollectionSize && l_nPads < XUSER_MAX_COUNT; Index++) - { - Pad = new CDS2Controller(Index); - - if (Pad->Open()) l_Pad[l_nPads++] = Pad; - else delete Pad; - } - - // Load X360s - if (l_nBtPads == 0) // Only if not using BTH Server - { - for (DWORD Index = 0; Index < XUSER_MAX_COUNT * CX360Controller::CollectionSize && l_nPads < XUSER_MAX_COUNT; Index++) - { - Pad = new CX360Controller(Index); - - if (Pad->Open()) l_Pad[l_nPads++] = Pad; - else delete Pad; - } - } - - l_bStarted = true; - - if (l_nPads == 0) - { - // No Devices found, PassThrough only - l_bPassThrough = true; - } - } - else if (!bEnable && l_bStarted && !l_bUnloaded && l_nAttached == 0) - { - l_bStarted = false; - l_bUnloaded = true; - - if (l_nBtPads > 0) - { - l_Pad[0]->Close(); - delete l_Pad[0]; - } - - for (DWORD Index = l_nBtPads; Index < l_nPads; Index++) - { - l_Pad[Index]->Close(); - delete l_Pad[Index]; - } - - return WRAP_LoadXInput(bEnable); - } - - return true; -} - -DWORD WINAPI XInputGetState -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __out XINPUT_STATE* pState // Receives the current state -) -{ - if (l_bUnloaded) return ERROR_DEVICE_NOT_CONNECTED; - - if (!l_bStarted) LoadApi(true); - - if (!l_bPassThrough) - { - if (dwUserIndex < l_nPads) - { - return l_Pad[dwUserIndex]->GetState(dwUserIndex, pState); - } - else - { - return ERROR_DEVICE_NOT_CONNECTED; - } - } - - return WRAP_XInputGetState(dwUserIndex, pState); -} - -DWORD WINAPI XInputSetState -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __in XINPUT_VIBRATION* pVibration // The vibration information to send to the controller -) -{ - if (l_bUnloaded) return ERROR_DEVICE_NOT_CONNECTED; - - if (!l_bStarted) LoadApi(true); - - if (!l_bPassThrough) - { - if (dwUserIndex < l_nPads) - { - return l_Pad[dwUserIndex]->SetState(dwUserIndex, pVibration); - } - else - { - return ERROR_DEVICE_NOT_CONNECTED; - } - } - - return WRAP_XInputSetState(dwUserIndex, pVibration); -} - -DWORD WINAPI XInputGetCapabilities -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __in DWORD dwFlags, // Input flags that identify the device type - __out XINPUT_CAPABILITIES* pCapabilities // Receives the capabilities -) -{ - if (l_bUnloaded) return ERROR_DEVICE_NOT_CONNECTED; - - if (!l_bStarted) LoadApi(true); - - if (!l_bPassThrough) - { - if (dwUserIndex < l_nPads) - { - return l_Pad[dwUserIndex]->GetCapabilities(dwUserIndex, dwFlags, pCapabilities); - } - else - { - return ERROR_DEVICE_NOT_CONNECTED; - } - } - - return WRAP_XInputGetCapabilities(dwUserIndex, dwFlags, pCapabilities); -} - -void WINAPI XInputEnable -( - __in BOOL enable // [in] Indicates whether xinput is enabled or disabled. -) -{ - if (l_bUnloaded) return; - - if (!l_bStarted) LoadApi(true); - - if (!enable) - { - XINPUT_VIBRATION Vibration = { 0, 0 }; - - for (DWORD nPad = 0; nPad < l_nPads; nPad++) - { - XInputSetState(nPad, &Vibration); - } - } - - WRAP_XInputEnable(enable); -} - -DWORD WINAPI XInputGetDSoundAudioDeviceGuids -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __out GUID* pDSoundRenderGuid, // DSound device ID for render - __out GUID* pDSoundCaptureGuid // DSound device ID for capture -) -{ - if (l_bUnloaded) return ERROR_DEVICE_NOT_CONNECTED; - - if (!l_bStarted) LoadApi(true); - - if (!l_bPassThrough) - { - if (dwUserIndex < l_nPads) - { - return l_Pad[dwUserIndex]->GetDSoundAudioDeviceGuids(dwUserIndex, pDSoundRenderGuid, pDSoundCaptureGuid); - } - else - { - return ERROR_DEVICE_NOT_CONNECTED; - } - } - - return WRAP_XInputGetDSoundAudioDeviceGuids(dwUserIndex, pDSoundRenderGuid, pDSoundCaptureGuid); -} - -DWORD WINAPI XInputGetBatteryInformation -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __in BYTE devType, // Which device on this user index - __out XINPUT_BATTERY_INFORMATION* pBatteryInformation // Contains the level and types of batteries -) -{ - if (l_bUnloaded) return ERROR_DEVICE_NOT_CONNECTED; - - if (!l_bStarted) LoadApi(true); - - if (!l_bPassThrough) - { - if (dwUserIndex < l_nPads) - { - return l_Pad[dwUserIndex]->GetBatteryInformation(dwUserIndex, devType, pBatteryInformation); - } - else - { - return ERROR_DEVICE_NOT_CONNECTED; - } - } - - return WRAP_XInputGetBatteryInformation(dwUserIndex, devType, pBatteryInformation); -} - -DWORD WINAPI XInputGetKeystroke -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __reserved DWORD dwReserved, // Reserved for future use - __out PXINPUT_KEYSTROKE pKeystroke // Pointer to an XINPUT_KEYSTROKE structure that receives an input event. -) -{ - if (l_bUnloaded) return ERROR_DEVICE_NOT_CONNECTED; - - if (!l_bStarted) LoadApi(true); - - if (!l_bPassThrough) - { - if (dwUserIndex < l_nPads) - { - return l_Pad[dwUserIndex]->GetKeystroke(dwUserIndex, dwReserved, pKeystroke); - } - else - { - return ERROR_DEVICE_NOT_CONNECTED; - } - } - - return WRAP_XInputGetKeystroke(dwUserIndex, dwReserved, pKeystroke); -} - -DWORD WINAPI XInputGetExtended(DWORD dwUserIndex, SCP_EXTN* pPressure) -{ - if (l_bUnloaded) return ERROR_DEVICE_NOT_CONNECTED; - - if (!l_bStarted) LoadApi(true); - - if (!l_bPassThrough) - { - if (dwUserIndex < l_nPads) - { - return l_Pad[dwUserIndex]->GetExtended(dwUserIndex, pPressure); - } - else - { - return ERROR_DEVICE_NOT_CONNECTED; - } - } - - return ERROR_NOT_SUPPORTED; -} - -// UNDOCUMENTED - -DWORD WINAPI XInputGetStateEx(DWORD dwUserIndex, XINPUT_STATE* pState) -{ - if (l_bUnloaded) return ERROR_DEVICE_NOT_CONNECTED; - - if (!l_bStarted) LoadApi(true); - - if (!l_bPassThrough) - { - if (dwUserIndex < l_nPads) - { - return l_Pad[dwUserIndex]->GetStateEx(dwUserIndex, pState); - } - else - { - return ERROR_DEVICE_NOT_CONNECTED; - } - } - - return WRAP_XInputGetStateEx(dwUserIndex, pState); -} - -DWORD WINAPI XInputWaitForGuideButton(DWORD dwUserIndex, DWORD dwFlag, LPVOID pVoid) -{ - if (l_bUnloaded) return ERROR_DEVICE_NOT_CONNECTED; - - if (!l_bStarted) LoadApi(true); - - if (!l_bPassThrough) - { - if (dwUserIndex < l_nPads) - { - return l_Pad[dwUserIndex]->WaitForGuideButton(dwUserIndex, dwFlag, pVoid); - } - else - { - return ERROR_DEVICE_NOT_CONNECTED; - } - } - - return WRAP_XInputWaitForGuideButton(dwUserIndex, dwFlag, pVoid); -} - -DWORD WINAPI XInputCancelGuideButtonWait(DWORD dwUserIndex) -{ - if (l_bUnloaded) return ERROR_DEVICE_NOT_CONNECTED; - - if (!l_bStarted) LoadApi(true); - - if (!l_bPassThrough) - { - if (dwUserIndex < l_nPads) - { - return l_Pad[dwUserIndex]->CancelGuideButtonWait(dwUserIndex); - } - else - { - return ERROR_DEVICE_NOT_CONNECTED; - } - } - - return WRAP_XInputCancelGuideButtonWait(dwUserIndex); -} - -DWORD WINAPI XInputPowerOffController(DWORD dwUserIndex) -{ - if (l_bUnloaded) return ERROR_DEVICE_NOT_CONNECTED; - - if (!l_bStarted) LoadApi(true); - - if (!l_bPassThrough) - { - if (dwUserIndex < l_nPads) - { - return l_Pad[dwUserIndex]->PowerOffController(dwUserIndex); - } - else - { - return ERROR_DEVICE_NOT_CONNECTED; - } - } - - return WRAP_XInputPowerOffController(dwUserIndex); -} diff --git a/Scp/XInput_Scp/XInput_SCP.def b/Scp/XInput_Scp/XInput_SCP.def deleted file mode 100644 index 4d4132d..0000000 --- a/Scp/XInput_Scp/XInput_SCP.def +++ /dev/null @@ -1,18 +0,0 @@ -LIBRARY "XInput1_3" - -EXPORTS - DllMain @1 - XInputGetState @2 - XInputSetState @3 - XInputGetCapabilities @4 - XInputEnable @5 - XInputGetDSoundAudioDeviceGuids @6 - XInputGetBatteryInformation @7 - XInputGetKeystroke @8 - XInputGetExtended @9 - - ; Undocumented - XInputGetStateEx @100 - XInputWaitForGuideButton @101 - XInputCancelGuideButtonWait @102 - XInputPowerOffController @103 diff --git a/Scp/XInput_Scp/XInput_SCP.h b/Scp/XInput_Scp/XInput_SCP.h deleted file mode 100644 index f159767..0000000 --- a/Scp/XInput_Scp/XInput_SCP.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -extern BOOL LoadApi(BOOL bEnable); - -typedef struct -{ - float SCP_UP; - float SCP_RIGHT; - float SCP_DOWN; - float SCP_LEFT; - - float SCP_LX; - float SCP_LY; - - float SCP_L1; - float SCP_L2; - float SCP_L3; - - float SCP_RX; - float SCP_RY; - - float SCP_R1; - float SCP_R2; - float SCP_R3; - - float SCP_T; - float SCP_C; - float SCP_X; - float SCP_S; - - float SCP_SELECT; - float SCP_START; - - float SCP_PS; - -} SCP_EXTN; - -DWORD WINAPI XInputGetExtended(DWORD dwUserIndex, SCP_EXTN* pPressure); diff --git a/Scp/XInput_Scp/XInput_SCP.rc b/Scp/XInput_Scp/XInput_SCP.rc deleted file mode 100644 index f988597..0000000 --- a/Scp/XInput_Scp/XInput_SCP.rc +++ /dev/null @@ -1,48 +0,0 @@ -#include "resource.h" -#include "winres.h" - -///////////////////////////////////////////////////////////////////////////// -// English (United Kingdom) resources - -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK -#pragma code_page(1252) - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,5,2,138 - PRODUCTVERSION 2,5,2,138 - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "080904b0" - BEGIN - VALUE "CompanyName", "Scarlet.Crush Productions" - VALUE "FileDescription", "XInput_SCP Dynamic Link Library" - VALUE "FileVersion", "2.5.2.138" - VALUE "InternalName", "XInput_SCP.dll" - VALUE "LegalCopyright", "Copyright (C) Scarlet.Crush Productions 2012, 2013, 2014" - VALUE "OriginalFilename", "XInput_SCP.dll" - VALUE "ProductName", "XInput_SCP Dynamic Link Library" - VALUE "ProductVersion", "2.5.2.138" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x809, 1200 - END -END - -///////////////////////////////////////////////////////////////////////////// diff --git a/Scp/XInput_Scp/XInput_SCP.vcxproj b/Scp/XInput_Scp/XInput_SCP.vcxproj deleted file mode 100644 index 0d2ba73..0000000 --- a/Scp/XInput_Scp/XInput_SCP.vcxproj +++ /dev/null @@ -1,259 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B} - XInput_DS3 - Win32Proj - XInput_SCP - - - - DynamicLibrary - Unicode - true - v120_xp - - - DynamicLibrary - Unicode - v120_xp - - - DynamicLibrary - Unicode - true - v120 - - - DynamicLibrary - Unicode - v120 - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)..\bin\Win32\ - Build\Win32\$(Configuration)\ - true - $(SolutionDir)..\bin\Win64\ - Build\Win64\$(Configuration)\ - true - $(SolutionDir)..\bin\Win32\ - Build\Win32\$(Configuration)\ - false - $(SolutionDir)..\bin\Win64\ - Build\Win64\$(Configuration)\ - false - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - $(DXSDK_DIR)\lib\x64;$(LibraryPath) - $(DXSDK_DIR)\lib\x64;$(LibraryPath) - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\include;$(IncludePath) - $DXSDK_DIR)\lib\x86;$(LibraryPath) - $DXSDK_DIR)\lib\x86;$(LibraryPath) - - - - Disabled - $(SolutionDir)DDK\inc;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_USRDLL;XINPUT_DS3_EXPORTS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - Use - Level3 - EditAndContinue - - - hid.lib;hidclass.lib;setupapi.lib;ws2_32.lib - $(OutDir)XInput1_3$(TargetExt) - $(SolutionDir)DDK\lib\x86;%(AdditionalLibraryDirectories) - XInput_SCP.def - true - Windows - MachineX86 - - - - - X64 - - - Disabled - $(SolutionDir)DDK\inc;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_USRDLL;XINPUT_DS3_EXPORTS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - Use - Level3 - ProgramDatabase - - - hid.lib;hidclass.lib;setupapi.lib;ws2_32.lib - $(OutDir)XInput1_3$(TargetExt) - $(SolutionDir)DDK\lib\x64;%(AdditionalLibraryDirectories) - XInput_SCP.def - true - Windows - MachineX64 - - - - - MaxSpeed - true - $(SolutionDir)DDK\inc;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;XINPUT_DS3_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - Use - Level3 - ProgramDatabase - - - hid.lib;hidclass.lib;setupapi.lib;ws2_32.lib;user32.lib - $(OutDir)XInput1_3$(TargetExt) - $(SolutionDir)DDK\lib\x86;%(AdditionalLibraryDirectories) - XInput_SCP.def - true - Windows - true - true - MachineX86 - - - $(SolutionDir)DDK\inc;%(AdditionalIncludeDirectories) - - - - - X64 - - - MaxSpeed - true - $(SolutionDir)DDK\inc;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;XINPUT_DS3_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - Use - Level3 - ProgramDatabase - - - hid.lib;hidclass.lib;setupapi.lib;ws2_32.lib - $(OutDir)XInput1_3$(TargetExt) - $(SolutionDir)DDK\lib\x64;%(AdditionalLibraryDirectories) - XInput_SCP.def - true - Windows - true - true - MachineX64 - - - - - - - - false - - - false - - - false - - - false - - - - - - - - - - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Scp/XInput_Scp/XInput_SCP.vcxproj.filters b/Scp/XInput_Scp/XInput_SCP.vcxproj.filters deleted file mode 100644 index 7b3d03f..0000000 --- a/Scp/XInput_Scp/XInput_SCP.vcxproj.filters +++ /dev/null @@ -1,109 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Resource Files - - - - - Resource Files - - - \ No newline at end of file diff --git a/Scp/XInput_Scp/XInput_SCP_2010.vcxproj b/Scp/XInput_Scp/XInput_SCP_2010.vcxproj deleted file mode 100644 index 52eee6b..0000000 --- a/Scp/XInput_Scp/XInput_SCP_2010.vcxproj +++ /dev/null @@ -1,259 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {00A6D2C5-24C6-4AFA-BA21-F7C847C3F36B} - XInput_DS3 - Win32Proj - XInput_SCP - - - - DynamicLibrary - Unicode - true - v100 - - - DynamicLibrary - Unicode - v100 - - - DynamicLibrary - Unicode - true - v100 - - - DynamicLibrary - Unicode - v100 - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)..\bin\Win32\ - Build\Win32\$(Configuration)\ - true - $(SolutionDir)..\bin\Win64\ - Build\Win64\$(Configuration)\ - true - $(SolutionDir)..\bin\Win32\ - Build\Win32\$(Configuration)\ - false - $(SolutionDir)..\bin\Win64\ - Build\Win64\$(Configuration)\ - false - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - $(DXSDK_DIR)\lib\x64;$(LibraryPath) - $(DXSDK_DIR)\lib\x64;$(LibraryPath) - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\include;$(IncludePath) - $(DXSDK_DIR)\include;$(IncludePath) - $DXSDK_DIR)\lib\x86;$(LibraryPath) - $DXSDK_DIR)\lib\x86;$(LibraryPath) - - - - Disabled - $(SolutionDir)DDK\inc;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_USRDLL;XINPUT_DS3_EXPORTS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - Use - Level3 - EditAndContinue - - - hid.lib;hidclass.lib;setupapi.lib;ws2_32.lib - $(OutDir)XInput1_3$(TargetExt) - $(SolutionDir)DDK\lib\x86;%(AdditionalLibraryDirectories) - XInput_SCP.def - true - Windows - MachineX86 - - - - - X64 - - - Disabled - $(SolutionDir)DDK\inc;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_USRDLL;XINPUT_DS3_EXPORTS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - Use - Level3 - ProgramDatabase - - - hid.lib;hidclass.lib;setupapi.lib;ws2_32.lib - $(OutDir)XInput1_3$(TargetExt) - $(SolutionDir)DDK\lib\x64;%(AdditionalLibraryDirectories) - XInput_SCP.def - true - Windows - MachineX64 - - - - - MaxSpeed - true - $(SolutionDir)DDK\inc;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;XINPUT_DS3_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - Use - Level3 - ProgramDatabase - - - hid.lib;hidclass.lib;setupapi.lib;ws2_32.lib;user32.lib - $(OutDir)XInput1_3$(TargetExt) - $(SolutionDir)DDK\lib\x86;%(AdditionalLibraryDirectories) - XInput_SCP.def - true - Windows - true - true - MachineX86 - - - $(SolutionDir)DDK\inc;%(AdditionalIncludeDirectories) - - - - - X64 - - - MaxSpeed - true - $(SolutionDir)DDK\inc;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;XINPUT_DS3_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - Use - Level3 - ProgramDatabase - - - hid.lib;hidclass.lib;setupapi.lib;ws2_32.lib - $(OutDir)XInput1_3$(TargetExt) - $(SolutionDir)DDK\lib\x64;%(AdditionalLibraryDirectories) - XInput_SCP.def - true - Windows - true - true - MachineX64 - - - - - - - - false - - - false - - - false - - - false - - - - - - - - - - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Scp/XInput_Scp/XInput_SCP_2010.vcxproj.filters b/Scp/XInput_Scp/XInput_SCP_2010.vcxproj.filters deleted file mode 100644 index 7b3d03f..0000000 --- a/Scp/XInput_Scp/XInput_SCP_2010.vcxproj.filters +++ /dev/null @@ -1,109 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Resource Files - - - - - Resource Files - - - \ No newline at end of file diff --git a/Scp/XInput_Scp/XInput_Wrap.cpp b/Scp/XInput_Scp/XInput_Wrap.cpp deleted file mode 100644 index 7ac5a29..0000000 --- a/Scp/XInput_Scp/XInput_Wrap.cpp +++ /dev/null @@ -1,191 +0,0 @@ -#include "StdAfx.h" -#define XINPUT_FUNCTIONS 11 - -static BOOL l_bInited = false; - -static HMODULE l_hXInputDll = NULL; -static FARPROC l_hXInputFunc[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; - -typedef DWORD (WINAPI *XInputGetStateFunction)(__in DWORD dwUserIndex, __out XINPUT_STATE* pState); -typedef DWORD (WINAPI *XInputSetStateFunction)(__in DWORD dwUserIndex, __in XINPUT_VIBRATION* pVibration); -typedef DWORD (WINAPI *XInputGetCapabilitiesFunction)(__in DWORD dwUserIndex, __in DWORD dwFlags, __out XINPUT_CAPABILITIES* pCapabilities); -typedef void (WINAPI *XInputEnableFunction)(__in BOOL enable); -typedef DWORD (WINAPI *XInputGetDSoundAudioDeviceGuidsFunction)(__in DWORD dwUserIndex, __out GUID* pDSoundRenderGuid, __out GUID* pDSoundCaptureGuid); -typedef DWORD (WINAPI *XInputGetBatteryInformationFunction)(__in DWORD dwUserIndex, __in BYTE devType, __out XINPUT_BATTERY_INFORMATION* pBatteryInformation); -typedef DWORD (WINAPI *XInputGetKeystrokeFunction)(__in DWORD dwUserIndex, __reserved DWORD dwReserved, __out PXINPUT_KEYSTROKE pKeystroke); - -// UNDOCUMENTED -typedef DWORD (WINAPI *XInputGetStateExFunction)(__in DWORD dwUserIndex, __out XINPUT_STATE* pState); -typedef DWORD (WINAPI *InputWaitForGuideButtonFunction)(__in DWORD dwUserIndex, __in DWORD dwFlag, __out LPVOID pVoid); -typedef DWORD (WINAPI *XInputCancelGuideButtonWaitFunction)(__in DWORD dwUserIndex); -typedef DWORD (WINAPI *XInputPowerOffControllerFunction)(__in DWORD dwUserIndex); - -BOOL WINAPI WRAP_LoadXInput -( - __in BOOL enable -) -{ - if (enable && !l_bInited) - { - TCHAR libdir[MAX_PATH]; - - GetSystemDirectory(libdir, MAX_PATH); _stprintf_s(libdir, _T("%s\\XInput1_3.dll"), libdir); - - if ((l_hXInputDll = LoadLibrary(libdir)) != NULL) - { - l_hXInputFunc[ 0] = GetProcAddress(l_hXInputDll, "XInputGetState"); - l_hXInputFunc[ 1] = GetProcAddress(l_hXInputDll, "XInputSetState"); - l_hXInputFunc[ 2] = GetProcAddress(l_hXInputDll, "XInputGetCapabilities"); - l_hXInputFunc[ 3] = GetProcAddress(l_hXInputDll, "XInputEnable"); - l_hXInputFunc[ 4] = GetProcAddress(l_hXInputDll, "XInputGetDSoundAudioDeviceGuids"); - l_hXInputFunc[ 5] = GetProcAddress(l_hXInputDll, "XInputGetBatteryInformation"); - l_hXInputFunc[ 6] = GetProcAddress(l_hXInputDll, "XInputGetKeystroke"); - - l_hXInputFunc[ 7] = GetProcAddress(l_hXInputDll, (LPCSTR) 100); // XInputGetStateEx - l_hXInputFunc[ 8] = GetProcAddress(l_hXInputDll, (LPCSTR) 101); // XInputWaitForGuideButton - l_hXInputFunc[ 9] = GetProcAddress(l_hXInputDll, (LPCSTR) 102); // XInputCancelGuideButtonWait - l_hXInputFunc[10] = GetProcAddress(l_hXInputDll, (LPCSTR) 103); // XInputPowerOffController - - l_bInited = true; - } - } - else if (!enable && l_bInited) - { - for (int i = 0; i < XINPUT_FUNCTIONS; i++) l_hXInputFunc[i] = NULL; - - if (l_hXInputDll) - { - FreeLibrary(l_hXInputDll); - l_hXInputDll = NULL; - } - - l_bInited = false; - } - - return true; -} - -DWORD WINAPI WRAP_XInputGetState -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __out XINPUT_STATE* pState // Receives the current state -) -{ - if (!l_bInited || !l_hXInputFunc[0]) return ERROR_DEVICE_NOT_CONNECTED; - - return ((XInputGetStateFunction)(l_hXInputFunc[0]))(dwUserIndex, pState); -} - -DWORD WINAPI WRAP_XInputSetState -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __in XINPUT_VIBRATION* pVibration // The vibration information to send to the controller -) -{ - if (!l_bInited || !l_hXInputFunc[1]) return ERROR_DEVICE_NOT_CONNECTED; - - return ((XInputSetStateFunction)(l_hXInputFunc[1]))(dwUserIndex, pVibration); -} - -DWORD WINAPI WRAP_XInputGetCapabilities -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __in DWORD dwFlags, // Input flags that identify the device type - __out XINPUT_CAPABILITIES* pCapabilities // Receives the capabilities -) -{ - if (!l_bInited || !l_hXInputFunc[2]) return ERROR_DEVICE_NOT_CONNECTED; - - return ((XInputGetCapabilitiesFunction)(l_hXInputFunc[2]))(dwUserIndex, dwFlags, pCapabilities); -} - -void WINAPI WRAP_XInputEnable -( - __in BOOL enable // [in] Indicates whether xinput is enabled or disabled. -) -{ - if (!l_bInited || !l_hXInputFunc[3]) return; - - return ((XInputEnableFunction)(l_hXInputFunc[3]))(enable); -} - -DWORD WINAPI WRAP_XInputGetDSoundAudioDeviceGuids -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __out GUID* pDSoundRenderGuid, // DSound device ID for render - __out GUID* pDSoundCaptureGuid // DSound device ID for capture -) -{ - if (!l_bInited || !l_hXInputFunc[4]) return ERROR_DEVICE_NOT_CONNECTED; - - return ((XInputGetDSoundAudioDeviceGuidsFunction)(l_hXInputFunc[4]))(dwUserIndex, pDSoundRenderGuid, pDSoundCaptureGuid); -} - -DWORD WINAPI WRAP_XInputGetBatteryInformation -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __in BYTE devType, // Which device on this user index - __out XINPUT_BATTERY_INFORMATION* pBatteryInformation // Contains the level and types of batteries -) -{ - if (!l_bInited || !l_hXInputFunc[5]) return ERROR_DEVICE_NOT_CONNECTED; - - return ((XInputGetBatteryInformationFunction)(l_hXInputFunc[5]))(dwUserIndex, devType, pBatteryInformation); -} - -DWORD WINAPI WRAP_XInputGetKeystroke -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __reserved DWORD dwReserved, // Reserved for future use - __out PXINPUT_KEYSTROKE pKeystroke // Pointer to an XINPUT_KEYSTROKE structure that receives an input event. -) -{ - if (!l_bInited || !l_hXInputFunc[6]) return ERROR_DEVICE_NOT_CONNECTED; - - return ((XInputGetKeystrokeFunction)(l_hXInputFunc[6]))(dwUserIndex, dwReserved, pKeystroke); -} - -// UNDOCUMENTED - -DWORD WINAPI WRAP_XInputGetStateEx -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __out XINPUT_STATE* pState // Receives the current state + the Guide/Home button -) -{ - if (!l_bInited || !l_hXInputFunc[7]) return ERROR_DEVICE_NOT_CONNECTED; - - return ((XInputGetStateExFunction)(l_hXInputFunc[7]))(dwUserIndex, pState); -} - -DWORD WINAPI WRAP_XInputWaitForGuideButton -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __in DWORD dwFlag, // ??? - __out LPVOID pVoid // ??? -) -{ - if (!l_bInited || !l_hXInputFunc[8]) return ERROR_DEVICE_NOT_CONNECTED; - - return ((InputWaitForGuideButtonFunction)(l_hXInputFunc[8]))(dwUserIndex, dwFlag, pVoid); -} - -DWORD WINAPI WRAP_XInputCancelGuideButtonWait -( - __in DWORD dwUserIndex // Index of the gamer associated with the device -) -{ - if (!l_bInited || !l_hXInputFunc[9]) return ERROR_DEVICE_NOT_CONNECTED; - - return ((XInputCancelGuideButtonWaitFunction)(l_hXInputFunc[9]))(dwUserIndex); -} - -DWORD WINAPI WRAP_XInputPowerOffController -( - __in DWORD dwUserIndex // Index of the gamer associated with the device -) -{ - if (!l_bInited || !l_hXInputFunc[10]) return ERROR_DEVICE_NOT_CONNECTED; - - return ((XInputPowerOffControllerFunction)(l_hXInputFunc[10]))(dwUserIndex); -} diff --git a/Scp/XInput_Scp/XInput_Wrap.h b/Scp/XInput_Scp/XInput_Wrap.h deleted file mode 100644 index 15bde06..0000000 --- a/Scp/XInput_Scp/XInput_Wrap.h +++ /dev/null @@ -1,76 +0,0 @@ -#pragma once - -BOOL WINAPI WRAP_LoadXInput -( - __in BOOL enable -); - -DWORD WINAPI WRAP_XInputGetState -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __out XINPUT_STATE* pState // Receives the current state -); - -DWORD WINAPI WRAP_XInputSetState -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __in XINPUT_VIBRATION* pVibration // The vibration information to send to the controller -); - -DWORD WINAPI WRAP_XInputGetCapabilities -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __in DWORD dwFlags, // Input flags that identify the device type - __out XINPUT_CAPABILITIES* pCapabilities // Receives the capabilities -); - -void WINAPI WRAP_XInputEnable -( - __in BOOL enable // [in] Indicates whether xinput is enabled or disabled. -); - -DWORD WINAPI WRAP_XInputGetDSoundAudioDeviceGuids -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __out GUID* pDSoundRenderGuid, // DSound device ID for render - __out GUID* pDSoundCaptureGuid // DSound device ID for capture -); - -DWORD WINAPI WRAP_XInputGetBatteryInformation -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __in BYTE devType, // Which device on this user index - __out XINPUT_BATTERY_INFORMATION* pBatteryInformation // Contains the level and types of batteries -); - -DWORD WINAPI WRAP_XInputGetKeystroke -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __reserved DWORD dwReserved, // Reserved for future use - __out PXINPUT_KEYSTROKE pKeystroke // Pointer to an XINPUT_KEYSTROKE structure that receives an input event. -); - -// UNDOCUMENTED - -DWORD WINAPI WRAP_XInputGetStateEx -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __out XINPUT_STATE* pState // Receives the current state + the Guide/Home button -); - -DWORD WINAPI WRAP_XInputWaitForGuideButton -( - __in DWORD dwUserIndex, // Index of the gamer associated with the device - __in DWORD dwFlag, // ??? - __out LPVOID pVoid // ??? -); - -DWORD WINAPI WRAP_XInputCancelGuideButtonWait -( - __in DWORD dwUserIndex // Index of the gamer associated with the device -); - -DWORD WINAPI WRAP_XInputPowerOffController -( - __in DWORD dwUserIndex // Index of the gamer associated with the device -); diff --git a/Scp/XInput_Scp/dllmain.cpp b/Scp/XInput_Scp/dllmain.cpp deleted file mode 100644 index 24acdf5..0000000 --- a/Scp/XInput_Scp/dllmain.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// dllmain.cpp : Defines the entry point for the DLL application. -#include "stdafx.h" - -BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - LoadApi(true); - break; - - case DLL_THREAD_ATTACH: - break; - - case DLL_THREAD_DETACH: - break; - - case DLL_PROCESS_DETACH: - LoadApi(false); - break; - } - - return TRUE; -} diff --git a/Scp/XInput_Scp/hid.h b/Scp/XInput_Scp/hid.h deleted file mode 100644 index 90a3d30..0000000 --- a/Scp/XInput_Scp/hid.h +++ /dev/null @@ -1,203 +0,0 @@ -/*++ - -Copyright (c) Microsoft 1998, All Rights Reserved - -Module Name: - - hid.h - -Abstract: - - This module contains the declarations and definitions for use with the - hid user mode client sample driver. - -Environment: - - Kernel & user mode - ---*/ - -#ifndef HID_H -#define HID_H - -#if _MSC_VER >= 1200 -#pragma warning(push) -#endif -#pragma warning(disable:4201) // nameless struct/union - -#include "hidsdi.h" -#include "setupapi.h" - -typedef struct _SP_FNCLASS_DEVICE_DATA { - DWORD cbSize; - GUID FunctionClassGuid; - TCHAR DevicePath [ANYSIZE_ARRAY]; -} SP_FNCLASS_DEVICE_DATA, *PSP_FNCLASS_DEVICE_DATA; - -BOOLEAN -SetupDiGetFunctionClassDeviceInfo ( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - OUT PSP_FNCLASS_DEVICE_DATA FunctionClassDeviceData, - IN DWORD FunctionClassDeviceDataSize, - OUT PDWORD RequiredSize - ); - -#define ASSERT(x) - -// -// A structure to hold the steady state data received from the hid device. -// Each time a read packet is received we fill in this structure. -// Each time we wish to write to a hid device we fill in this structure. -// This structure is here only for convenience. Most real applications will -// have a more efficient way of moving the hid data to the read, write, and -// feature routines. -// -typedef struct _HID_DATA { - BOOLEAN IsButtonData; - UCHAR Reserved; - USAGE UsagePage; // The usage page for which we are looking. - ULONG Status; // The last status returned from the accessor function - // when updating this field. - ULONG ReportID; // ReportID for this given data structure - BOOLEAN IsDataSet; // Variable to track whether a given data structure - // has already been added to a report structure - - union { - struct { - ULONG UsageMin; // Variables to track the usage minimum and max - ULONG UsageMax; // If equal, then only a single usage - ULONG MaxUsageLength; // Usages buffer length. - PUSAGE Usages; // list of usages (buttons ``down'' on the device. - - } ButtonData; - struct { - USAGE Usage; // The usage describing this value; - USHORT Reserved; - - ULONG Value; - LONG ScaledValue; - } ValueData; - }; -} HID_DATA, *PHID_DATA; - -typedef struct _HID_DEVICE { - PTCHAR DevicePath; - HANDLE HidDevice; // A file handle to the hid device. - BOOL OpenedForRead; - BOOL OpenedForWrite; - BOOL OpenedOverlapped; - BOOL OpenedExclusive; - - PHIDP_PREPARSED_DATA Ppd; // The opaque parser info describing this device - HIDP_CAPS Caps; // The Capabilities of this hid device. - HIDD_ATTRIBUTES Attributes; - - PCHAR InputReportBuffer; - __field_ecount(InputDataLength) - PHID_DATA InputData; // array of hid data structures - ULONG InputDataLength; // Num elements in this array. - PHIDP_BUTTON_CAPS InputButtonCaps; - PHIDP_VALUE_CAPS InputValueCaps; - - PCHAR OutputReportBuffer; - __field_ecount(OutputDataLength) - PHID_DATA OutputData; - ULONG OutputDataLength; - PHIDP_BUTTON_CAPS OutputButtonCaps; - PHIDP_VALUE_CAPS OutputValueCaps; - - PCHAR FeatureReportBuffer; - __field_ecount(FeatureDataLength) PHID_DATA FeatureData; - ULONG FeatureDataLength; - PHIDP_BUTTON_CAPS FeatureButtonCaps; - PHIDP_VALUE_CAPS FeatureValueCaps; -} HID_DEVICE, *PHID_DEVICE; - - -BOOLEAN -OpenHidDevice ( - __in LPTSTR DevicePath, - __in BOOL HasReadAccess, - __in BOOL HasWriteAccess, - __in BOOL IsOverlapped, - __in BOOL IsExclusive, - __inout PHID_DEVICE HidDevice -); - -BOOLEAN -FindKnownHidDevices ( - OUT PHID_DEVICE * HidDevices, // A array of struct _HID_DEVICE - OUT PULONG NumberDevices // the length of this array. - ); - -BOOLEAN -FillDeviceInfo( - IN PHID_DEVICE HidDevice -); - -VOID -CloseHidDevices ( - OUT PHID_DEVICE HidDevices, // A array of struct _HID_DEVICE - OUT ULONG NumberDevices // the length of this array. - ); - -VOID -CloseHidDevice ( - IN PHID_DEVICE HidDevice - ); - - -BOOLEAN -Read ( - PHID_DEVICE HidDevice - ); - -BOOLEAN -ReadOverlapped ( - PHID_DEVICE HidDevice, - LPOVERLAPPED lpOverlapped - ); - -BOOLEAN -Write ( - PHID_DEVICE HidDevice - ); - -BOOLEAN -UnpackReport ( - __in_bcount(ReportBufferLength)PCHAR ReportBuffer, - IN USHORT ReportBufferLength, - IN HIDP_REPORT_TYPE ReportType, - IN OUT PHID_DATA Data, - IN ULONG DataLength, - IN PHIDP_PREPARSED_DATA Ppd - ); - -BOOLEAN -PackReport ( - __out_bcount(ReportBufferLength)PCHAR ReportBuffer, - IN USHORT ReportBufferLength, - IN HIDP_REPORT_TYPE ReportType, - IN PHID_DATA Data, - IN ULONG DataLength, - IN PHIDP_PREPARSED_DATA Ppd - ); - -BOOLEAN -SetFeature ( - PHID_DEVICE HidDevice - ); - -BOOLEAN -GetFeature ( - PHID_DEVICE HidDevice - ); - -#if _MSC_VER >= 1200 -#pragma warning(pop) -#else -#pragma warning(default:4201) -#endif - -#endif diff --git a/Scp/XInput_Scp/pnp.cpp b/Scp/XInput_Scp/pnp.cpp deleted file mode 100644 index ec7fd12..0000000 --- a/Scp/XInput_Scp/pnp.cpp +++ /dev/null @@ -1,752 +0,0 @@ -#include "StdAfx.h" - -BOOLEAN FindKnownHidDevices(OUT PHID_DEVICE* HidDevices, OUT PULONG NumberDevices) -{ - HDEVINFO hardwareDeviceInfo; - SP_DEVICE_INTERFACE_DATA deviceInfoData; - ULONG i = 0; - BOOLEAN done; - PHID_DEVICE hidDeviceInst; - GUID hidGuid; - PSP_DEVICE_INTERFACE_DETAIL_DATA functionClassDeviceData = NULL; - ULONG predictedLength = 0; - ULONG requiredLength = 0; - PHID_DEVICE newHidDevices; - - HidD_GetHidGuid(&hidGuid); - - *HidDevices = NULL; - *NumberDevices = 0; - - // - // Open a handle to the plug and play dev node. - // - hardwareDeviceInfo = SetupDiGetClassDevs(&hidGuid, - NULL, // Define no enumerator (global) - NULL, // Define no - (DIGCF_PRESENT | // Only Devices present - DIGCF_DEVICEINTERFACE)); // Function class devices. - - if (hardwareDeviceInfo == INVALID_HANDLE_VALUE) - { - return FALSE; - } - - // - // Take a wild guess to start - // - *NumberDevices = 4; - done = FALSE; - deviceInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); - - while (!done) - { - *NumberDevices *= 2; - - if (*HidDevices) - { - newHidDevices = (PHID_DEVICE) realloc(*HidDevices, (*NumberDevices * sizeof(HID_DEVICE))); - - if (newHidDevices == NULL) - { - free(*HidDevices); - } - - *HidDevices = newHidDevices; - } - else - { - *HidDevices = (PHID_DEVICE) calloc(*NumberDevices, sizeof(HID_DEVICE)); - } - - if (*HidDevices == NULL) - { - SetupDiDestroyDeviceInfoList(hardwareDeviceInfo); - return FALSE; - } - - hidDeviceInst = *HidDevices + i; - - for (; i < *NumberDevices; i++, hidDeviceInst++) - { - if (SetupDiEnumDeviceInterfaces(hardwareDeviceInfo, - 0, // No care about specific PDOs - &hidGuid, - i, - &deviceInfoData)) - { - // - // allocate a function class device data structure to receive the - // goods about this particular device. - // - SetupDiGetDeviceInterfaceDetail( - hardwareDeviceInfo, - &deviceInfoData, - NULL, // probing so no output buffer yet - 0, // probing so output buffer length of zero - &requiredLength, - NULL); // not interested in the specific dev-node - - - predictedLength = requiredLength; - - functionClassDeviceData = (PSP_DEVICE_INTERFACE_DETAIL_DATA) malloc(predictedLength); - - if (functionClassDeviceData) - { - functionClassDeviceData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); - ZeroMemory(functionClassDeviceData->DevicePath, sizeof(functionClassDeviceData->DevicePath)); - } - else - { - SetupDiDestroyDeviceInfoList(hardwareDeviceInfo); - return FALSE; - } - - // - // Retrieve the information from Plug and Play. - // - if (! SetupDiGetDeviceInterfaceDetail( - hardwareDeviceInfo, - &deviceInfoData, - functionClassDeviceData, - predictedLength, - &requiredLength, - NULL)) - { - SetupDiDestroyDeviceInfoList(hardwareDeviceInfo); - free(functionClassDeviceData); - - return FALSE; - } - - // - // Open device with just generic query abilities to begin with - // - if (! OpenHidDevice(functionClassDeviceData->DevicePath, - FALSE, // ReadAccess - none - FALSE, // WriteAccess - none - FALSE, // Overlapped - no - FALSE, // Exclusive - no - hidDeviceInst)) - { - SetupDiDestroyDeviceInfoList(hardwareDeviceInfo); - free(functionClassDeviceData); - - return FALSE; - } - } - else - { - if (GetLastError() == ERROR_NO_MORE_ITEMS) - { - done = TRUE; - break; - } - } - } - } - - *NumberDevices = i; - - SetupDiDestroyDeviceInfoList(hardwareDeviceInfo); - free(functionClassDeviceData); - - return TRUE; -} - -BOOLEAN OpenHidDevice(IN LPTSTR DevicePath, IN BOOL HasReadAccess, IN BOOL HasWriteAccess, IN BOOL IsOverlapped, IN BOOL IsExclusive, __inout PHID_DEVICE HidDevice) -{ - DWORD accessFlags = 0; - DWORD sharingFlags = 0; - INT iDevicePathSize; - - if (DevicePath == NULL) - { - return FALSE; - } - - iDevicePathSize = (INT) (_tcslen(DevicePath) + 1) * sizeof(TCHAR); - - HidDevice->DevicePath = (PTCHAR) malloc(iDevicePathSize); - - if (HidDevice->DevicePath == NULL) - { - return FALSE; - } - - StringCbCopy(HidDevice->DevicePath, iDevicePathSize, DevicePath); - - if (HasReadAccess ) accessFlags |= GENERIC_READ; - if (HasWriteAccess) accessFlags |= GENERIC_WRITE; - - if (!IsExclusive ) sharingFlags = FILE_SHARE_READ | FILE_SHARE_WRITE; - - HidDevice->HidDevice = CreateFile(DevicePath, accessFlags, sharingFlags, NULL, OPEN_EXISTING, 0, NULL); - - if (HidDevice->HidDevice == INVALID_HANDLE_VALUE) - { - free(HidDevice->DevicePath); - HidDevice->DevicePath = NULL; - - return FALSE; - } - - HidDevice->OpenedForRead = HasReadAccess; - HidDevice->OpenedForWrite = HasWriteAccess; - HidDevice->OpenedOverlapped = IsOverlapped; - HidDevice->OpenedExclusive = IsExclusive; - - if (!HidD_GetPreparsedData(HidDevice->HidDevice, &HidDevice->Ppd)) - { - free(HidDevice->DevicePath); - HidDevice->DevicePath = NULL; - - CloseHandle(HidDevice->HidDevice); - HidDevice->HidDevice = INVALID_HANDLE_VALUE; - - return FALSE; - } - - if (!HidD_GetAttributes(HidDevice->HidDevice, &HidDevice->Attributes)) - { - free(HidDevice->DevicePath); - HidDevice->DevicePath = NULL; - - CloseHandle(HidDevice->HidDevice); - HidDevice->HidDevice = INVALID_HANDLE_VALUE; - - HidD_FreePreparsedData(HidDevice->Ppd); - HidDevice->Ppd = NULL; - - return FALSE; - } - - if (!HidP_GetCaps(HidDevice->Ppd, &HidDevice->Caps)) - { - free(HidDevice->DevicePath); - HidDevice->DevicePath = NULL; - - CloseHandle(HidDevice->HidDevice); - HidDevice->HidDevice = INVALID_HANDLE_VALUE; - - HidD_FreePreparsedData(HidDevice->Ppd); - HidDevice->Ppd = NULL; - - return FALSE; - } - - if (!FillDeviceInfo(HidDevice)) - { - CloseHidDevice(HidDevice); - - return FALSE; - } - - if (IsOverlapped) - { - CloseHandle(HidDevice->HidDevice); - - HidDevice->HidDevice = CreateFile(DevicePath, accessFlags, sharingFlags, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); - - if (HidDevice->HidDevice == INVALID_HANDLE_VALUE) - { - CloseHidDevice(HidDevice); - - return FALSE; - } - } - - return TRUE; -} - -BOOLEAN FillDeviceInfo(IN PHID_DEVICE HidDevice) -{ - ULONG numValues; - USHORT numCaps; - PHIDP_BUTTON_CAPS buttonCaps; - PHIDP_VALUE_CAPS valueCaps; - PHID_DATA data; - ULONG i; - USAGE usage; - UINT dataIdx; - ULONG newFeatureDataLength; - ULONG tmpSum; - - HidDevice->InputReportBuffer = (PCHAR) calloc(HidDevice->Caps.InputReportByteLength, sizeof(CHAR)); - HidDevice->InputButtonCaps = buttonCaps = (PHIDP_BUTTON_CAPS) calloc(HidDevice->Caps.NumberInputButtonCaps, sizeof(HIDP_BUTTON_CAPS)); - - if (buttonCaps == NULL) - { - return FALSE; - } - - HidDevice->InputValueCaps = valueCaps = (PHIDP_VALUE_CAPS) calloc(HidDevice->Caps.NumberInputValueCaps, sizeof(HIDP_VALUE_CAPS)); - - if (valueCaps == NULL) - { - return FALSE; - } - - numCaps = HidDevice->Caps.NumberInputButtonCaps; - - if(numCaps > 0) - { - if(HidP_GetButtonCaps(HidP_Input, buttonCaps, &numCaps, HidDevice->Ppd) != HIDP_STATUS_SUCCESS) - { - return FALSE; - } - } - - numCaps = HidDevice->Caps.NumberInputValueCaps; - - if(numCaps > 0) - { - if(HidP_GetValueCaps(HidP_Input, valueCaps, &numCaps, HidDevice->Ppd) != HIDP_STATUS_SUCCESS) - { - return FALSE; - } - } - - numValues = 0; - - for (i = 0; i < HidDevice->Caps.NumberInputValueCaps; i++, valueCaps++) - { - if (valueCaps->IsRange) - { - numValues += valueCaps->Range.UsageMax - valueCaps->Range.UsageMin + 1; - - if(valueCaps->Range.UsageMin >= valueCaps->Range.UsageMax + (HidDevice->Caps).NumberInputButtonCaps) - { - return FALSE; - } - } - else - { - numValues++; - } - } - - valueCaps = HidDevice->InputValueCaps; - - HidDevice->InputDataLength = HidDevice->Caps.NumberInputButtonCaps + numValues; - HidDevice->InputData = data = (PHID_DATA) calloc(HidDevice->InputDataLength, sizeof(HID_DATA)); - - if (data == NULL) - { - return FALSE; - } - - dataIdx = 0; - - for (i = 0; i < HidDevice->Caps.NumberInputButtonCaps; i++, data++, buttonCaps++, dataIdx++) - { - data->IsButtonData = TRUE; - data->Status = HIDP_STATUS_SUCCESS; - data->UsagePage = buttonCaps->UsagePage; - - if (buttonCaps->IsRange) - { - data->ButtonData.UsageMin = buttonCaps->Range.UsageMin; - data->ButtonData.UsageMax = buttonCaps->Range.UsageMax; - } - else - { - data->ButtonData.UsageMin = data->ButtonData.UsageMax = buttonCaps->NotRange.Usage; - } - - data->ButtonData.MaxUsageLength = HidP_MaxUsageListLength(HidP_Input, buttonCaps->UsagePage, HidDevice->Ppd); - data->ButtonData.Usages = (PUSAGE) calloc(data->ButtonData.MaxUsageLength, sizeof(USAGE)); - - data->ReportID = buttonCaps->ReportID; - } - - for (i = 0; i < HidDevice->Caps.NumberInputValueCaps ; i++, valueCaps++) - { - if (valueCaps->IsRange) - { - for (usage = valueCaps->Range.UsageMin; usage <= valueCaps->Range.UsageMax; usage++) - { - if(dataIdx >= HidDevice->InputDataLength) - { - return FALSE; - } - - data->IsButtonData = FALSE; - data->Status = HIDP_STATUS_SUCCESS; - data->UsagePage = valueCaps->UsagePage; - data->ValueData.Usage = usage; - data->ReportID = valueCaps->ReportID; - - data++; dataIdx++; - } - } - else - { - if(dataIdx >= HidDevice->InputDataLength) - { - return FALSE; - } - - data->IsButtonData = FALSE; - data->Status = HIDP_STATUS_SUCCESS; - data->UsagePage = valueCaps->UsagePage; - data->ValueData.Usage = valueCaps->NotRange.Usage; - data->ReportID = valueCaps->ReportID; - - data++; dataIdx++; - } - } - - HidDevice->OutputReportBuffer = (PCHAR) calloc(HidDevice->Caps.OutputReportByteLength, sizeof(CHAR)); - HidDevice->OutputButtonCaps = buttonCaps = (PHIDP_BUTTON_CAPS) calloc(HidDevice->Caps.NumberOutputButtonCaps, sizeof(HIDP_BUTTON_CAPS)); - - if (buttonCaps == NULL) - { - return FALSE; - } - - HidDevice->OutputValueCaps = valueCaps = (PHIDP_VALUE_CAPS) calloc(HidDevice->Caps.NumberOutputValueCaps, sizeof(HIDP_VALUE_CAPS)); - - if (valueCaps == NULL) - { - return FALSE; - } - - numCaps = HidDevice->Caps.NumberOutputButtonCaps; - - if(numCaps > 0) - { - if(HidP_GetButtonCaps(HidP_Output, buttonCaps, &numCaps, HidDevice->Ppd) != HIDP_STATUS_SUCCESS) - { - return FALSE; - } - } - - numCaps = HidDevice->Caps.NumberOutputValueCaps; - - if(numCaps > 0) - { - if(HidP_GetValueCaps(HidP_Output, valueCaps, &numCaps, HidDevice->Ppd) != HIDP_STATUS_SUCCESS) - { - return FALSE; - } - } - - numValues = 0; - - for (i = 0; i < HidDevice->Caps.NumberOutputValueCaps; i++, valueCaps++) - { - if (valueCaps->IsRange) - { - numValues += valueCaps->Range.UsageMax - valueCaps->Range.UsageMin + 1; - } - else - { - numValues++; - } - } - - valueCaps = HidDevice->OutputValueCaps; - - HidDevice->OutputDataLength = HidDevice->Caps.NumberOutputButtonCaps + numValues; - HidDevice->OutputData = data = (PHID_DATA) calloc(HidDevice->OutputDataLength, sizeof(HID_DATA)); - - if (data == NULL) - { - return FALSE; - } - - for (i = 0; i < HidDevice->Caps.NumberOutputButtonCaps; i++, data++, buttonCaps++) - { - if (i >= HidDevice->OutputDataLength) - { - return FALSE; - } - - if(FAILED(ULongAdd(HidDevice->Caps.NumberOutputButtonCaps, valueCaps->Range.UsageMax, &tmpSum))) - { - return FALSE; - } - - if(valueCaps->Range.UsageMin == tmpSum) - { - return FALSE; - } - - data->IsButtonData = TRUE; - data->Status = HIDP_STATUS_SUCCESS; - data->UsagePage = buttonCaps->UsagePage; - - if (buttonCaps->IsRange) - { - data->ButtonData.UsageMin = buttonCaps->Range.UsageMin; - data->ButtonData.UsageMax = buttonCaps->Range.UsageMax; - } - else - { - data->ButtonData.UsageMin = data->ButtonData.UsageMax = buttonCaps->NotRange.Usage; - } - - data->ButtonData.MaxUsageLength = HidP_MaxUsageListLength(HidP_Output, buttonCaps->UsagePage, HidDevice->Ppd); - data->ButtonData.Usages = (PUSAGE) calloc(data->ButtonData.MaxUsageLength, sizeof(USAGE)); - data->ReportID = buttonCaps->ReportID; - } - - for (i = 0; i < HidDevice->Caps.NumberOutputValueCaps ; i++, valueCaps++) - { - if (valueCaps->IsRange) - { - for (usage = valueCaps->Range.UsageMin; usage <= valueCaps->Range.UsageMax; usage++) - { - data->IsButtonData = FALSE; - data->Status = HIDP_STATUS_SUCCESS; - data->UsagePage = valueCaps->UsagePage; - data->ValueData.Usage = usage; - data->ReportID = valueCaps->ReportID; - - data++; - } - } - else - { - data->IsButtonData = FALSE; - data->Status = HIDP_STATUS_SUCCESS; - data->UsagePage = valueCaps->UsagePage; - data->ValueData.Usage = valueCaps->NotRange.Usage; - data->ReportID = valueCaps->ReportID; - - data++; - } - } - - HidDevice->FeatureReportBuffer = (PCHAR) calloc(HidDevice->Caps.FeatureReportByteLength, sizeof(CHAR)); - HidDevice->FeatureButtonCaps = buttonCaps = (PHIDP_BUTTON_CAPS) calloc(HidDevice->Caps.NumberFeatureButtonCaps, sizeof(HIDP_BUTTON_CAPS)); - - if (buttonCaps == NULL) - { - return FALSE; - } - - HidDevice->FeatureValueCaps = valueCaps = (PHIDP_VALUE_CAPS) calloc(HidDevice->Caps.NumberFeatureValueCaps, sizeof(HIDP_VALUE_CAPS)); - - if (valueCaps == NULL) - { - return FALSE; - } - - numCaps = HidDevice->Caps.NumberFeatureButtonCaps; - - if(numCaps > 0) - { - if(HidP_GetButtonCaps(HidP_Feature, buttonCaps, &numCaps, HidDevice->Ppd) != HIDP_STATUS_SUCCESS) - { - return FALSE; - } - } - - numCaps = HidDevice->Caps.NumberFeatureValueCaps; - - if(numCaps > 0) - { - if(HidP_GetValueCaps(HidP_Feature, valueCaps, &numCaps, HidDevice->Ppd) != HIDP_STATUS_SUCCESS) - { - return FALSE; - } - } - - numValues = 0; - - for (i = 0; i < HidDevice->Caps.NumberFeatureValueCaps; i++, valueCaps++) - { - if (valueCaps->IsRange) - { - numValues += valueCaps->Range.UsageMax - valueCaps->Range.UsageMin + 1; - } - else - { - numValues++; - } - } - - valueCaps = HidDevice->FeatureValueCaps; - - if(FAILED(ULongAdd(HidDevice->Caps.NumberFeatureButtonCaps, numValues, &newFeatureDataLength))) - { - return FALSE; - } - - HidDevice->FeatureDataLength = newFeatureDataLength; - HidDevice->FeatureData = data = (PHID_DATA) calloc(HidDevice->FeatureDataLength, sizeof(HID_DATA)); - - if (data == NULL) - { - return FALSE; - } - - dataIdx = 0; - - for (i = 0; i < HidDevice->Caps.NumberFeatureButtonCaps; i++, data++, buttonCaps++, dataIdx++) - { - data->IsButtonData = TRUE; - data->Status = HIDP_STATUS_SUCCESS; - data->UsagePage = buttonCaps->UsagePage; - - if (buttonCaps->IsRange) - { - data->ButtonData.UsageMin = buttonCaps->Range.UsageMin; - data->ButtonData.UsageMax = buttonCaps->Range.UsageMax; - } - else - { - data->ButtonData.UsageMin = data->ButtonData.UsageMax = buttonCaps->NotRange.Usage; - } - - data->ButtonData.MaxUsageLength = HidP_MaxUsageListLength(HidP_Feature, buttonCaps->UsagePage, HidDevice->Ppd); - data->ButtonData.Usages = (PUSAGE) calloc(data->ButtonData.MaxUsageLength, sizeof(USAGE)); - - data->ReportID = buttonCaps->ReportID; - } - - for (i = 0; i < HidDevice->Caps.NumberFeatureValueCaps ; i++, valueCaps++) - { - if (valueCaps->IsRange) - { - for (usage = valueCaps->Range.UsageMin; usage <= valueCaps->Range.UsageMax; usage++) - { - if(dataIdx >= HidDevice->FeatureDataLength) - { - return FALSE; - } - - data->IsButtonData = FALSE; - data->Status = HIDP_STATUS_SUCCESS; - data->UsagePage = valueCaps->UsagePage; - data->ValueData.Usage = usage; - data->ReportID = valueCaps->ReportID; - - data++; dataIdx++; - } - } - else - { - if(dataIdx >= HidDevice->FeatureDataLength) - { - return FALSE; - } - - data->IsButtonData = FALSE; - data->Status = HIDP_STATUS_SUCCESS; - data->UsagePage = valueCaps->UsagePage; - data->ValueData.Usage = valueCaps->NotRange.Usage; - data->ReportID = valueCaps->ReportID; - - data++; dataIdx++; - } - } - - return TRUE; -} - -VOID CloseHidDevices(IN PHID_DEVICE HidDevices, IN ULONG NumberDevices) -{ - for (ULONG Index = 0; Index < NumberDevices; Index++) - { - CloseHidDevice(&HidDevices[Index]); - } -} - -VOID CloseHidDevice(IN PHID_DEVICE HidDevice) -{ - if (HidDevice->DevicePath != NULL) - { - free(HidDevice->DevicePath); - HidDevice->DevicePath = NULL; - } - - if (HidDevice->HidDevice != INVALID_HANDLE_VALUE) - { - CloseHandle(HidDevice->HidDevice); - HidDevice->HidDevice = INVALID_HANDLE_VALUE; - } - - if (HidDevice->Ppd != NULL) - { - HidD_FreePreparsedData(HidDevice->Ppd); - HidDevice->Ppd = NULL; - } - - if (HidDevice->InputReportBuffer != NULL) - { - free(HidDevice->InputReportBuffer); - HidDevice->InputReportBuffer = NULL; - } - - if (HidDevice->InputData != NULL) - { - free(HidDevice->InputData); - HidDevice->InputData = NULL; - } - - if (HidDevice->InputButtonCaps != NULL) - { - free(HidDevice->InputButtonCaps); - HidDevice->InputButtonCaps = NULL; - } - - if (HidDevice->InputValueCaps != NULL) - { - free(HidDevice->InputValueCaps); - HidDevice->InputValueCaps = NULL; - } - - if (HidDevice->OutputReportBuffer != NULL) - { - free(HidDevice->OutputReportBuffer); - HidDevice->OutputReportBuffer = NULL; - } - - if (HidDevice->OutputData != NULL) - { - free(HidDevice->OutputData); - HidDevice->OutputData = NULL; - } - - if (HidDevice->OutputButtonCaps != NULL) - { - free(HidDevice->OutputButtonCaps); - HidDevice->OutputButtonCaps = NULL; - } - - if (HidDevice->OutputValueCaps != NULL) - { - free(HidDevice->OutputValueCaps); - HidDevice->OutputValueCaps = NULL; - } - - if (HidDevice->FeatureReportBuffer != NULL) - { - free(HidDevice->FeatureReportBuffer); - HidDevice->FeatureReportBuffer = NULL; - } - - if (HidDevice->FeatureData != NULL) - { - free(HidDevice->FeatureData); - HidDevice->FeatureData = NULL; - } - - if (HidDevice->FeatureButtonCaps != NULL) - { - free(HidDevice->FeatureButtonCaps); - HidDevice->FeatureButtonCaps = NULL; - } - - if (HidDevice->FeatureValueCaps != NULL) - { - free(HidDevice->FeatureValueCaps); - HidDevice->FeatureValueCaps = NULL; - } - - return; -} diff --git a/Scp/XInput_Scp/report.cpp b/Scp/XInput_Scp/report.cpp deleted file mode 100644 index 1323f5a..0000000 --- a/Scp/XInput_Scp/report.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include "StdAfx.h" - -BOOLEAN ReadOverlapped(PHID_DEVICE HidDevice, LPOVERLAPPED lpOverlapped) -{ - DWORD bytesRead; - BOOL readStatus; - - readStatus = ReadFile(HidDevice->HidDevice, HidDevice->InputReportBuffer, HidDevice->Caps.InputReportByteLength, &bytesRead, lpOverlapped); - - if (!readStatus) - { - return GetLastError() == ERROR_IO_PENDING; - } - else - { - SetEvent(lpOverlapped->hEvent); - return TRUE; - } -} - -BOOLEAN UnpackReport(__in_bcount(ReportBufferLength) PCHAR ReportBuffer, IN USHORT ReportBufferLength, IN HIDP_REPORT_TYPE ReportType, IN OUT PHID_DATA Data, IN ULONG DataLength, IN PHIDP_PREPARSED_DATA Ppd) -{ - ULONG numUsages; - ULONG i; - UCHAR reportID; - ULONG Index; - ULONG nextUsage; - - reportID = ReportBuffer[0]; - - for (i = 0; i < DataLength; i++, Data++) - { - if (reportID == Data->ReportID) - { - if (Data->IsButtonData) - { - numUsages = Data->ButtonData.MaxUsageLength; - - Data->Status = HidP_GetUsages(ReportType, Data->UsagePage, 0, Data->ButtonData.Usages, &numUsages, Ppd, ReportBuffer, ReportBufferLength); - - for (Index = 0, nextUsage = 0; Index < numUsages; Index++) - { - if (Data->ButtonData.UsageMin <= Data->ButtonData.Usages[Index] && Data->ButtonData.Usages[Index] <= Data->ButtonData.UsageMax) - { - Data->ButtonData.Usages[nextUsage++] = Data->ButtonData.Usages[Index]; - } - } - - if (nextUsage < Data->ButtonData.MaxUsageLength) - { - Data->ButtonData.Usages[nextUsage] = 0; - } - } - else - { - Data->Status = HidP_GetUsageValue(ReportType, Data->UsagePage, 0, Data->ValueData.Usage, &Data->ValueData.Value, Ppd, ReportBuffer, ReportBufferLength); - - if (HIDP_STATUS_SUCCESS != Data->Status) - { - return FALSE; - } - - Data->Status = HidP_GetScaledUsageValue(ReportType, Data->UsagePage, 0, Data->ValueData.Usage, &Data->ValueData.ScaledValue, Ppd, ReportBuffer, ReportBufferLength); - } - - Data->IsDataSet = TRUE; - } - } - - return TRUE; -} diff --git a/Scp/XInput_Scp/resource.h b/Scp/XInput_Scp/resource.h deleted file mode 100644 index 780ab12..0000000 --- a/Scp/XInput_Scp/resource.h +++ /dev/null @@ -1,15 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by XInput_SCP.rc -// - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/Scp/XInput_Scp/stdafx.cpp b/Scp/XInput_Scp/stdafx.cpp deleted file mode 100644 index 1feca5d..0000000 --- a/Scp/XInput_Scp/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// XInput_DS3.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/Scp/XInput_Scp/stdafx.h b/Scp/XInput_Scp/stdafx.h deleted file mode 100644 index 4a6edf1..0000000 --- a/Scp/XInput_Scp/stdafx.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#include "targetver.h" - -#define STRICT -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#pragma warning(push) -#pragma warning(disable : 4995) -#include -#pragma warning(pop) - -typedef std::basic_string, std::allocator> _tstring; - -#define XINPUT_GAMEPAD_GUIDE 0x400 - -#include "XInput_SCP.h" -#include "XInput_Wrap.h" -#include "LibUsbApi.h" - -extern "C" { -#include "hid.h" -} - -#include "SCPController.h" -#include "BTConnection.h" -#include "DS2Controller.h" -#include "DS3Controller.h" -#include "SL3Controller.h" -#include "X360Controller.h" diff --git a/Scp/XInput_Scp/targetver.h b/Scp/XInput_Scp/targetver.h deleted file mode 100644 index 36ef75c..0000000 --- a/Scp/XInput_Scp/targetver.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -// The following macros define the minimum required platform. The minimum required platform -// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run -// your application. The macros work by enabling all features available on platform versions up to and -// including the version specified. - -// Modify the following defines if you have to target a platform prior to the ones specified below. -// Refer to MSDN for the latest info on corresponding values for different platforms. - -#ifndef WINVER // Specifies that the minimum required platform is Windows Vista. -#define WINVER 0x0600 // Change this to the appropriate value to target other versions of Windows. -#endif - -#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista. -#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows. -#endif - -#ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows 98. -#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. -#endif - -#ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0. -#define _WIN32_IE 0x0700 // Change this to the appropriate value to target other versions of IE. -#endif diff --git a/WiitarThing/App.xaml b/WiitarThing/App.xaml index 8407302..705eafc 100644 --- a/WiitarThing/App.xaml +++ b/WiitarThing/App.xaml @@ -1,4 +1,4 @@ - @@ -32,7 +32,7 @@ - - + + diff --git a/WiitarThing/App.xaml.cs b/WiitarThing/App.xaml.cs index e376068..fd2a355 100644 --- a/WiitarThing/App.xaml.cs +++ b/WiitarThing/App.xaml.cs @@ -3,15 +3,15 @@ using System.Collections.Generic; using System.Windows; -namespace WiinUSoft +namespace WiitarThing { /// /// Interaction logic for App.xaml /// public partial class App : Application, ISingleInstanceApp { - internal const string PROFILE_FILTER = "WiinUSoft Profile|*.wsp"; - private const string Unique = "wiinupro-or-wiinusoft-instance"; + internal const string PROFILE_FILTER = "WiitarThing Profile|*.wsp"; + private const string Unique = "wiitarthing-instance"; [STAThread] public static void Main() diff --git a/WiitarThing/Components/DeviceControl.xaml b/WiitarThing/Components/DeviceControl.xaml index 1d93455..2f3facb 100644 --- a/WiitarThing/Components/DeviceControl.xaml +++ b/WiitarThing/Components/DeviceControl.xaml @@ -1,4 +1,4 @@ - /// A Canvas which manages dragging of the UIElements it contains. diff --git a/WiitarThing/Components/NumPicker.xaml b/WiitarThing/Components/NumPicker.xaml index 4777c58..c81528d 100644 --- a/WiitarThing/Components/NumPicker.xaml +++ b/WiitarThing/Components/NumPicker.xaml @@ -1,4 +1,4 @@ - /// Interaction logic for NumPicker.xaml diff --git a/WiitarThing/Holders/Holder.cs b/WiitarThing/Holders/Holder.cs index e718324..8a69727 100644 --- a/WiitarThing/Holders/Holder.cs +++ b/WiitarThing/Holders/Holder.cs @@ -4,7 +4,7 @@ using WindowsInput; #endif -namespace WiinUSoft.Holders +namespace WiitarThing.Holders { public abstract class Holder { diff --git a/WiitarThing/Holders/XInputHolder.cs b/WiitarThing/Holders/XInputHolder.cs index 0d939a4..3f26dd9 100644 --- a/WiitarThing/Holders/XInputHolder.cs +++ b/WiitarThing/Holders/XInputHolder.cs @@ -6,7 +6,7 @@ using Nefarius.ViGEm.Client.Targets.Xbox360; using NintrollerLib; -namespace WiinUSoft.Holders +namespace WiitarThing.Holders { public class XInputHolder : Holder { @@ -237,26 +237,26 @@ public static Dictionary GetDefaultMapping(ControllerType type) case ControllerType.Guitar: - result.Add(Inputs.WiiGuitar.G, Inputs.Xbox360.A); - result.Add(Inputs.WiiGuitar.R, Inputs.Xbox360.B); - result.Add(Inputs.WiiGuitar.Y, Inputs.Xbox360.Y); - result.Add(Inputs.WiiGuitar.B, Inputs.Xbox360.X); - result.Add(Inputs.WiiGuitar.O, Inputs.Xbox360.LB); + result.Add(Inputs.Guitar.G, Inputs.Xbox360.A); + result.Add(Inputs.Guitar.R, Inputs.Xbox360.B); + result.Add(Inputs.Guitar.Y, Inputs.Xbox360.Y); + result.Add(Inputs.Guitar.B, Inputs.Xbox360.X); + result.Add(Inputs.Guitar.O, Inputs.Xbox360.LB); - result.Add(Inputs.WiiGuitar.UP, Inputs.Xbox360.UP); - result.Add(Inputs.WiiGuitar.DOWN, Inputs.Xbox360.DOWN); - result.Add(Inputs.WiiGuitar.LEFT, Inputs.Xbox360.LEFT); - result.Add(Inputs.WiiGuitar.RIGHT, Inputs.Xbox360.RIGHT); + result.Add(Inputs.Guitar.UP, Inputs.Xbox360.UP); + result.Add(Inputs.Guitar.DOWN, Inputs.Xbox360.DOWN); + result.Add(Inputs.Guitar.LEFT, Inputs.Xbox360.LEFT); + result.Add(Inputs.Guitar.RIGHT, Inputs.Xbox360.RIGHT); - result.Add(Inputs.WiiGuitar.SELECT, Inputs.Xbox360.BACK); - result.Add(Inputs.WiiGuitar.START, Inputs.Xbox360.START); - result.Add(Inputs.WiiGuitar.HOME, Inputs.Xbox360.GUIDE); + result.Add(Inputs.Guitar.SELECT, Inputs.Xbox360.BACK); + result.Add(Inputs.Guitar.START, Inputs.Xbox360.START); + result.Add(Inputs.Guitar.HOME, Inputs.Xbox360.GUIDE); - result.Add(Inputs.WiiGuitar.WHAMMYLOW, Inputs.Xbox360.RLEFT); - result.Add(Inputs.WiiGuitar.WHAMMYHIGH, Inputs.Xbox360.RRIGHT); + result.Add(Inputs.Guitar.WHAMMYLOW, Inputs.Xbox360.RLEFT); + result.Add(Inputs.Guitar.WHAMMYHIGH, Inputs.Xbox360.RRIGHT); - result.Add(Inputs.WiiGuitar.TILTLOW, Inputs.Xbox360.RDOWN); - result.Add(Inputs.WiiGuitar.TILTHIGH, Inputs.Xbox360.RUP); + result.Add(Inputs.Guitar.TILTLOW, Inputs.Xbox360.RDOWN); + result.Add(Inputs.Guitar.TILTHIGH, Inputs.Xbox360.RUP); //result.Add(Inputs.Wiimote.UP, ""); //result.Add(Inputs.Wiimote.DOWN, ""); @@ -284,21 +284,21 @@ public static Dictionary GetDefaultMapping(ControllerType type) break; case ControllerType.Drums: - result.Add(Inputs.WiiDrums.G, Inputs.Xbox360.A); - result.Add(Inputs.WiiDrums.R, Inputs.Xbox360.B); - result.Add(Inputs.WiiDrums.Y, Inputs.Xbox360.Y); - result.Add(Inputs.WiiDrums.B, Inputs.Xbox360.X); - result.Add(Inputs.WiiDrums.O, Inputs.Xbox360.RB); - result.Add(Inputs.WiiDrums.BASS, Inputs.Xbox360.LB); - - result.Add(Inputs.WiiDrums.UP, Inputs.Xbox360.UP); - result.Add(Inputs.WiiDrums.DOWN, Inputs.Xbox360.DOWN); - result.Add(Inputs.WiiDrums.LEFT, Inputs.Xbox360.LEFT); - result.Add(Inputs.WiiDrums.RIGHT, Inputs.Xbox360.RIGHT); - - result.Add(Inputs.WiiDrums.SELECT, Inputs.Xbox360.BACK); - result.Add(Inputs.WiiDrums.START, Inputs.Xbox360.START); - result.Add(Inputs.WiiDrums.HOME, Inputs.Xbox360.GUIDE); + result.Add(Inputs.Drums.G, Inputs.Xbox360.A); + result.Add(Inputs.Drums.R, Inputs.Xbox360.B); + result.Add(Inputs.Drums.Y, Inputs.Xbox360.Y); + result.Add(Inputs.Drums.B, Inputs.Xbox360.X); + result.Add(Inputs.Drums.O, Inputs.Xbox360.RB); + result.Add(Inputs.Drums.BASS, Inputs.Xbox360.LB); + + result.Add(Inputs.Drums.UP, Inputs.Xbox360.UP); + result.Add(Inputs.Drums.DOWN, Inputs.Xbox360.DOWN); + result.Add(Inputs.Drums.LEFT, Inputs.Xbox360.LEFT); + result.Add(Inputs.Drums.RIGHT, Inputs.Xbox360.RIGHT); + + result.Add(Inputs.Drums.SELECT, Inputs.Xbox360.BACK); + result.Add(Inputs.Drums.START, Inputs.Xbox360.START); + result.Add(Inputs.Drums.HOME, Inputs.Xbox360.GUIDE); break; } @@ -491,12 +491,12 @@ public override void Close() Flags[Inputs.Flags.RUMBLE] = false; bus.Unplug(ID); - if (ID > 0 && ID < 5) + if (ID > -1 && ID < 4) { - availabe[ID - 1] = true; + availabe[ID] = true; } - ID = 0; + ID = -1; connected = false; } @@ -515,9 +515,9 @@ public override void AddMapping(ControllerType controller) public bool ConnectXInput(int id) { - if (id > 0 && id < 5) + if (id > -1 && id < 4) { - availabe[id - 1] = false; + availabe[id] = false; } else { @@ -534,16 +534,16 @@ public bool ConnectXInput(int id) public bool RemoveXInput(int id) { - if (id > 0 && id < 5) + if (id > -1 && id < 4) { - availabe[id - 1] = true; + availabe[id] = true; } Flags[Inputs.Flags.RUMBLE] = false; if (bus.Unplug(id)) { - ID = 0; + ID = -1; connected = false; return true; } @@ -640,7 +640,11 @@ private void StopDevice(object sender, System.Windows.ExitEventArgs e) public void Plugin(int id, ushort vid = 0, ushort pid = 0) { - id -= 1; + if (targets.ContainsKey(id)) + { + return; + } + if (vid != 0 && pid != 0) { targets.Add(id, Client.CreateXbox360Controller(vid, pid)); @@ -656,8 +660,7 @@ public void Plugin(int id, ushort vid = 0, ushort pid = 0) public bool Unplug(int id) { - id -= 1; - if (targets.Count > id && targets[id] != null) + if (targets.ContainsKey(id) && targets[id] != null) { if (connected.Contains(targets[id])) { @@ -728,8 +731,8 @@ public int Parse(byte[] Input, byte[] Output) public virtual bool Report(byte[] input, byte[] output) { - byte id = (byte)(input[4] - 1); - if (targets.Count <= id || targets[id] == null) + byte id = (byte)(input[4]); + if (!targets.ContainsKey(id) || targets[id] == null) { return false; } diff --git a/WiitarThing/Inputs/ClassicController.cs b/WiitarThing/Inputs/ClassicController.cs index 5cd2293..7439ed6 100644 --- a/WiitarThing/Inputs/ClassicController.cs +++ b/WiitarThing/Inputs/ClassicController.cs @@ -1,4 +1,4 @@ -namespace WiinUSoft.Inputs +namespace WiitarThing.Inputs { public static class ClassicController { diff --git a/WiitarThing/Inputs/ClassicControllerPro.cs b/WiitarThing/Inputs/ClassicControllerPro.cs index d3f0842..27940e6 100644 --- a/WiitarThing/Inputs/ClassicControllerPro.cs +++ b/WiitarThing/Inputs/ClassicControllerPro.cs @@ -1,4 +1,4 @@ -namespace WiinUSoft.Inputs +namespace WiitarThing.Inputs { public static class ClassicControllerPro { diff --git a/WiitarThing/Inputs/Drums.cs b/WiitarThing/Inputs/Drums.cs new file mode 100644 index 0000000..e96bd89 --- /dev/null +++ b/WiitarThing/Inputs/Drums.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace WiitarThing.Inputs +{ + public static class Drums + { + public const string G = "drmG"; + public const string R = "drmR"; + public const string Y = "drmY"; + public const string B = "drmB"; + public const string O = "drmO"; + public const string BASS = "drmBASS"; + + public const string UP = "drmUP"; + public const string DOWN = "drmDOWN"; + public const string LEFT = "drmLEFT"; + public const string RIGHT = "drmRIGHT"; + + public const string SELECT = "drmSELECT"; + public const string START = "drmSTART"; + public const string HOME = "drmHOME"; + + } +} diff --git a/WiitarThing/Inputs/Flags.cs b/WiitarThing/Inputs/Flags.cs index 96fdfc1..f16c75f 100644 --- a/WiitarThing/Inputs/Flags.cs +++ b/WiitarThing/Inputs/Flags.cs @@ -1,4 +1,4 @@ -namespace WiinUSoft.Inputs +namespace WiitarThing.Inputs { public static class Flags { diff --git a/WiitarThing/Inputs/Guitar.cs b/WiitarThing/Inputs/Guitar.cs new file mode 100644 index 0000000..1062b71 --- /dev/null +++ b/WiitarThing/Inputs/Guitar.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace WiitarThing.Inputs +{ + public static class Guitar + { + public const string G = "gtrG"; + public const string R = "gtrR"; + public const string Y = "gtrY"; + public const string B = "gtrB"; + public const string O = "gtrO"; + + public const string UP = "gtrUP"; + public const string DOWN = "gtrDOWN"; + public const string LEFT = "gtrLEFT"; + public const string RIGHT = "gtrRIGHT"; + + public const string WHAMMYLOW = "gtrWHAMMYLOW"; + public const string WHAMMYHIGH = "gtrWHAMMYHIGH"; + + public const string TILTLOW = "gtrTILTLOW"; + public const string TILTHIGH = "gtrTILTHIGH"; + + public const string SELECT = "gtrSELECT"; + public const string START = "gtrSTART"; + public const string HOME = "gtrHOME"; + + } +} diff --git a/WiitarThing/Inputs/MotionPlus.cs b/WiitarThing/Inputs/MotionPlus.cs index acefa4e..681c0f6 100644 --- a/WiitarThing/Inputs/MotionPlus.cs +++ b/WiitarThing/Inputs/MotionPlus.cs @@ -1,4 +1,4 @@ -namespace WiinUSoft.Inputs +namespace WiitarThing.Inputs { public static class MotionPlus { diff --git a/WiitarThing/Inputs/Nunchuk.cs b/WiitarThing/Inputs/Nunchuk.cs index e1e7ef1..56fb07a 100644 --- a/WiitarThing/Inputs/Nunchuk.cs +++ b/WiitarThing/Inputs/Nunchuk.cs @@ -1,4 +1,4 @@ -namespace WiinUSoft.Inputs +namespace WiitarThing.Inputs { public static class Nunchuk { diff --git a/WiitarThing/Inputs/ProController.cs b/WiitarThing/Inputs/ProController.cs index f19a1f6..e916449 100644 --- a/WiitarThing/Inputs/ProController.cs +++ b/WiitarThing/Inputs/ProController.cs @@ -1,4 +1,4 @@ -namespace WiinUSoft.Inputs +namespace WiitarThing.Inputs { public class ProController { diff --git a/WiitarThing/Inputs/WiiDrums.cs b/WiitarThing/Inputs/WiiDrums.cs deleted file mode 100644 index c752266..0000000 --- a/WiitarThing/Inputs/WiiDrums.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace WiinUSoft.Inputs -{ - public static class WiiDrums - { - public const string G = "wdrG"; - public const string R = "wdrR"; - public const string Y = "wdrY"; - public const string B = "wdrB"; - public const string O = "wdrO"; - public const string BASS = "wdrBASS"; - - public const string UP = "wdrUP"; - public const string DOWN = "wdrDOWN"; - public const string LEFT = "wdrLEFT"; - public const string RIGHT = "wdrRIGHT"; - - public const string SELECT = "wdrSELECT"; - public const string START = "wdrSTART"; - public const string HOME = "wdrHOME"; - - } -} diff --git a/WiitarThing/Inputs/WiiGuitar.cs b/WiitarThing/Inputs/WiiGuitar.cs deleted file mode 100644 index 4aefe74..0000000 --- a/WiitarThing/Inputs/WiiGuitar.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace WiinUSoft.Inputs -{ - public static class WiiGuitar - { - public const string G = "wgtG"; - public const string R = "wgtR"; - public const string Y = "wgtY"; - public const string B = "wgtB"; - public const string O = "wgtO"; - - public const string UP = "wgtUP"; - public const string DOWN = "wgtDOWN"; - public const string LEFT = "wgtLEFT"; - public const string RIGHT = "wgtRIGHT"; - - public const string WHAMMYLOW = "wgtWHAMMYLOW"; - public const string WHAMMYHIGH = "wgtWHAMMYHIGH"; - - public const string TILTLOW = "wgtTILTLOW"; - public const string TILTHIGH = "wgtTILTHIGH"; - - public const string SELECT = "wgtSELECT"; - public const string START = "wgtSTART"; - public const string HOME = "wgtHOME"; - - } -} diff --git a/WiitarThing/Inputs/Wiimote.cs b/WiitarThing/Inputs/Wiimote.cs index a07784b..209120a 100644 --- a/WiitarThing/Inputs/Wiimote.cs +++ b/WiitarThing/Inputs/Wiimote.cs @@ -1,4 +1,4 @@ -namespace WiinUSoft.Inputs +namespace WiitarThing.Inputs { public static class Wiimote { diff --git a/WiitarThing/Inputs/Xbox360.cs b/WiitarThing/Inputs/Xbox360.cs index effd1eb..c2cdc21 100644 --- a/WiitarThing/Inputs/Xbox360.cs +++ b/WiitarThing/Inputs/Xbox360.cs @@ -1,4 +1,4 @@ -namespace WiinUSoft.Inputs +namespace WiitarThing.Inputs { public static class Xbox360 { diff --git a/WiitarThing/Properties/Resources.Designer.cs b/WiitarThing/Properties/Resources.Designer.cs index 58d3db3..cee23ea 100644 --- a/WiitarThing/Properties/Resources.Designer.cs +++ b/WiitarThing/Properties/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace WiinUSoft.Properties { +namespace WiitarThing.Properties { using System; @@ -39,7 +39,7 @@ internal Resources() { internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WiinUSoft.Properties.Resources", typeof(Resources).Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WiitarThing.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; diff --git a/WiitarThing/Properties/Settings.Designer.cs b/WiitarThing/Properties/Settings.Designer.cs index dfc7729..48abb13 100644 --- a/WiitarThing/Properties/Settings.Designer.cs +++ b/WiitarThing/Properties/Settings.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace WiinUSoft.Properties { +namespace WiitarThing.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] diff --git a/WiitarThing/UserPrefs.cs b/WiitarThing/UserPrefs.cs index a511355..e055b5f 100644 --- a/WiitarThing/UserPrefs.cs +++ b/WiitarThing/UserPrefs.cs @@ -4,7 +4,7 @@ using System.IO; using System.Xml.Serialization; -namespace WiinUSoft +namespace WiitarThing { public class UserPrefs { @@ -20,9 +20,9 @@ public static UserPrefs Instance DataPath = AppDomain.CurrentDomain.BaseDirectory + @"\prefs.config"; LoadPrefs(); } - else if (File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\WiinUSoft_prefs.config")) + else if (File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\WiitarThing_prefs.config")) { - DataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\WiinUSoft_prefs.config"; + DataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\WiitarThing_prefs.config"; LoadPrefs(); } else @@ -37,7 +37,7 @@ public static UserPrefs Instance if (!SavePrefs()) { - DataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\WiinUSoft_prefs.config"; + DataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\WiitarThing_prefs.config"; SavePrefs(); } } diff --git a/WiitarThing/WiitarDebug.cs b/WiitarThing/WiitarDebug.cs index 88afff5..1688474 100644 --- a/WiitarThing/WiitarDebug.cs +++ b/WiitarThing/WiitarDebug.cs @@ -5,7 +5,7 @@ using System.Text; using System.Windows; -namespace WiinUSoft +namespace WiitarThing { class WiitarDebug { diff --git a/WiitarThing/WiitarThing.csproj b/WiitarThing/WiitarThing.csproj index e46cc22..aeaca07 100644 --- a/WiitarThing/WiitarThing.csproj +++ b/WiitarThing/WiitarThing.csproj @@ -7,7 +7,7 @@ {4ED3CDAC-B467-497B-A80D-AAB4A395A7EE} WinExe Properties - WiinUSoft + WiitarThing WiitarThing v4.5.2 512 @@ -41,7 +41,7 @@ GHWT_Wii_Guitar.ico - WiinUSoft.App + WiitarThing.App @@ -99,8 +99,8 @@ - - + + RemoveAllWiimotesWindow.xaml diff --git a/WiitarThing/Windows/CalDefaultWindow.xaml b/WiitarThing/Windows/CalDefaultWindow.xaml index c6bca13..5f06443 100644 --- a/WiitarThing/Windows/CalDefaultWindow.xaml +++ b/WiitarThing/Windows/CalDefaultWindow.xaml @@ -1,9 +1,9 @@ - diff --git a/WiitarThing/Windows/CalDefaultWindow.xaml.cs b/WiitarThing/Windows/CalDefaultWindow.xaml.cs index 282b0b9..63fa6ad 100644 --- a/WiitarThing/Windows/CalDefaultWindow.xaml.cs +++ b/WiitarThing/Windows/CalDefaultWindow.xaml.cs @@ -1,6 +1,6 @@ using System.Windows; -namespace WiinUSoft.Windows +namespace WiitarThing.Windows { /// /// Interaction logic for CalDefaultWindow.xaml diff --git a/WiitarThing/Windows/CalibrateWindow.xaml b/WiitarThing/Windows/CalibrateWindow.xaml index 5cc7353..98a4029 100644 --- a/WiitarThing/Windows/CalibrateWindow.xaml +++ b/WiitarThing/Windows/CalibrateWindow.xaml @@ -1,7 +1,7 @@