From 7ef8d3545907824f5f02b18f9e6e953b9a2f0928 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sat, 16 Feb 2019 14:45:16 +0100 Subject: [PATCH 01/68] Update Qt version on AppVeyor The 5.11.2 version has been removed from AppVeyor leading to all builds failing due to lack of Qt install. The 5.12 folder is symlinked to the newest Qt version, preventing the need for changes during small updates and preventing failures when versions have been removed. This solves https://github.com/OpenVR-Advanced-Settings/OpenVR-AdvancedSettings/issues/53 --- .appveyor.yml | 4 ++-- .travis.yml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index b3c3408..2b84678 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -2,7 +2,7 @@ image: Visual Studio 2017 environment: matrix: - - QT_LOC: '"C:\Qt\5.11.2\msvc2017_64\bin\"' + - QT_LOC: '"C:\Qt\5.12\msvc2017_64\bin\"' VS_LOC: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat"' JOM_LOC: '"C:\Qt\Tools\QtCreator\bin\jom.exe"' NSIS_LOC: '"C:\Program Files (x86)\NSIS\"' @@ -11,7 +11,7 @@ environment: PYTHON_LOC: '"C:\Python37\"' BUILD_PACKAGE: "1" - - QT_LOC: '"C:\Qt\5.11.2\msvc2017_64\bin\"' + - QT_LOC: '"C:\Qt\5.12\msvc2017_64\bin\"' VS_LOC: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat"' JOM_LOC: '"C:\Qt\Tools\QtCreator\bin\jom.exe"' NSIS_LOC: '"C:\Program Files (x86)\NSIS\"' diff --git a/.travis.yml b/.travis.yml index ba22bb5..20c31ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,5 +27,6 @@ install: script: - mkdir build && cd build + - qmake --version - qmake .. -spec $QMAKE_SPEC - make From 56b5f516ac3d0a07a3f9c758cffccef8ca3fa02c Mon Sep 17 00:00:00 2001 From: Vasily Date: Sat, 16 Feb 2019 14:48:27 +0100 Subject: [PATCH 02/68] Update windows build docs with recommended Qt version --- docs/building_for_windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/building_for_windows.md b/docs/building_for_windows.md index f23731b..7f45ec3 100644 --- a/docs/building_for_windows.md +++ b/docs/building_for_windows.md @@ -14,7 +14,7 @@ For compiling: 1. [Microsoft Visual Studio](https://visualstudio.microsoft.com/downloads/) (tested on 2017 Community) -2. [Qt Framework](https://www.qt.io/download) version later than 5.6 (tested on 5.10 and 5.11) +2. [Qt Framework](https://www.qt.io/download) version later than 5.6 (Requires at least 5.6. 5.12 is recommended) 3. [Python 3](https://www.python.org/downloads/) (must be in `PATH` environment variable) For pushing changes to the repo: From 28cf033bec6935d89b67c8d38d5ad26b2fb1b5f9 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 15 Feb 2019 18:13:23 +0100 Subject: [PATCH 03/68] Add PushToTalk action --- src/ivrinput/ivrinput.cpp | 8 +++++++- src/ivrinput/ivrinput.h | 9 +++++++++ src/package_files/action_manifest.json | 9 ++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/ivrinput/ivrinput.cpp b/src/ivrinput/ivrinput.cpp index d793dd3..090ccd3 100644 --- a/src/ivrinput/ivrinput.cpp +++ b/src/ivrinput/ivrinput.cpp @@ -149,7 +149,8 @@ SteamIVRInput::SteamIVRInput() ActionType::Digital ), m_optionalOverrideRightHandRoomDrag( input_strings::k_actionOptionalOverrideRightHandRoomDrag, - ActionType::Digital ) + ActionType::Digital ), + m_pushToTalk( input_strings::k_actionPushToTalk, ActionType::Digital ) { m_activeActionSet.ulActionSet = m_mainSet.handle(); m_activeActionSet.ulRestrictedToDevice = vr::k_ulInvalidInputValueHandle; @@ -242,6 +243,11 @@ bool SteamIVRInput::optionalOverrideRightHandRoomDrag() m_optionalOverrideRightHandRoomDrag ); } +bool SteamIVRInput::pushToTalk() +{ + return isDigitalActionActivatedConstant( m_pushToTalk ); +} + /*! Updates the active action set(s). Should be called every frame, or however often you want the input system to diff --git a/src/ivrinput/ivrinput.h b/src/ivrinput/ivrinput.h index d212a83..53b8f4f 100644 --- a/src/ivrinput/ivrinput.h +++ b/src/ivrinput/ivrinput.h @@ -36,10 +36,12 @@ public: SteamIVRInput(); void UpdateStates(); + bool nextSong(); bool previousSong(); bool pausePlaySong(); bool stopSong(); + bool leftHandRoomTurn(); bool rightHandRoomTurn(); bool leftHandRoomDrag(); @@ -49,6 +51,8 @@ public: bool optionalOverrideLeftHandRoomDrag(); bool optionalOverrideRightHandRoomDrag(); + bool pushToTalk(); + // Destructor. There are no terminating calls for the IVRInput API, so it // is left blank. ~SteamIVRInput() {} @@ -87,6 +91,9 @@ private: Action m_optionalOverrideRightHandRoomTurn; Action m_optionalOverrideLeftHandRoomDrag; Action m_optionalOverrideRightHandRoomDrag; + + // Push To Talk + Action m_pushToTalk; }; /*! @@ -118,6 +125,8 @@ namespace input_strings constexpr auto k_actionOptionalOverrideRightHandRoomDrag = "/actions/main/in/OptionalOverrideRightHandRoomDrag"; + constexpr auto k_actionPushToTalk = "/actions/main/in/PushToTalk"; + constexpr auto k_setMain = "/actions/main"; } // namespace input_strings diff --git a/src/package_files/action_manifest.json b/src/package_files/action_manifest.json index 9225ab1..1acedca 100644 --- a/src/package_files/action_manifest.json +++ b/src/package_files/action_manifest.json @@ -65,6 +65,11 @@ "name": "/actions/main/in/OptionalOverrideRightHandRoomDrag", "requirement": "optional", "type": "boolean" + }, + { + "name": "/actions/main/in/PushToTalk", + "requirement": "optional", + "type": "boolean" } ], "action_sets": [ @@ -90,7 +95,9 @@ "/actions/main/in/OptionalOverrideLeftHandRoomTurn" : "Optional Override Left Hand Room Turn", "/actions/main/in/OptionalOverrideRightHandRoomTurn" : "Optional Override Right Hand Room Turn", "/actions/main/in/OptionalOverrideLeftHandRoomDrag" : "Optional Override Left Hand Room Drag", - "/actions/main/in/OptionalOverrideRightHandRoomDrag" : "Optional Override Right Hand Room Drag" + "/actions/main/in/OptionalOverrideRightHandRoomDrag" : "Optional Override Right Hand Room Drag", + + "/actions/main/in/PushToTalk" : "Push To Talk" } ] } \ No newline at end of file From 3c59a2b2ae7f8f85ffe012f6a4ab9e8fb56f67ea Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 15 Feb 2019 20:28:35 +0100 Subject: [PATCH 04/68] Move push to talk bindings to overlaycontroller The old system used the old OpenVR input system which is incompatible with the new IVRInput. This change broke the AccessbilityTabController, but that is to be removed because the functionality can be found elsewhere. --- src/overlaycontroller.cpp | 46 ++++++++-- src/overlaycontroller.h | 3 + src/tabcontrollers/AudioTabController.h | 4 +- src/tabcontrollers/PttController.cpp | 114 +----------------------- src/tabcontrollers/PttController.h | 10 ++- 5 files changed, 52 insertions(+), 125 deletions(-) diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index fbbf18f..e2cd4ee 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -464,14 +464,7 @@ QPoint OverlayController::getMousePositionForEvent( vr::VREvent_Mouse_t mouse ) return QPoint( mouse.x, y ); } -/*! -Checks if an action has been activated and dispatches the related action if it -has been. - -This function should probably be split into several functions that are specific -to a binding type as the amount of actions grows. -*/ -void OverlayController::processInputBindings() +void OverlayController::processMediaKeyBindings() { if ( m_actions.nextSong() ) { @@ -489,6 +482,10 @@ void OverlayController::processInputBindings() { m_utilitiesTabController.sendMediaStopSong(); } +} + +void OverlayController::processRoomBindings() +{ // Execution order for moveCenterTabController actions is important. Don't // reorder these. Override actions must always come after normal because // active priority is set based on which action is "newest" @@ -511,6 +508,39 @@ void OverlayController::processInputBindings() m_actions.optionalOverrideRightHandRoomTurn() ); } +void OverlayController::processPushToTalkBindings() +{ + const auto pushToTalkCannotChange = !m_audioTabController.pttChangeValid(); + if ( pushToTalkCannotChange ) + { + return; + } + + const auto pushToTalkButtonActivated = m_actions.pushToTalk(); + const auto pushToTalkCurrentlyActive = m_audioTabController.pttActive(); + if ( pushToTalkButtonActivated && !pushToTalkCurrentlyActive ) + { + m_audioTabController.startPtt(); + } + else if ( !pushToTalkButtonActivated && pushToTalkCurrentlyActive ) + { + m_audioTabController.stopPtt(); + } +} + +/*! +Checks if an action has been activated and dispatches the related action if it +has been. +*/ +void OverlayController::processInputBindings() +{ + processMediaKeyBindings(); + + processRoomBindings(); + + processPushToTalkBindings(); +} + // vsync implementation: // (this function triggers every 1ms) void OverlayController::OnTimeoutPumpEvents() diff --git a/src/overlaycontroller.h b/src/overlaycontroller.h index d06a097..252f258 100644 --- a/src/overlaycontroller.h +++ b/src/overlaycontroller.h @@ -123,6 +123,9 @@ public: // I know it's an ugly hack to make them public to enable external private: QPoint getMousePositionForEvent( vr::VREvent_Mouse_t mouse ); void processInputBindings(); + void processMediaKeyBindings(); + void processRoomBindings(); + void processPushToTalkBindings(); public: OverlayController( bool desktopMode, bool noSound, QQmlEngine& qmlEngine ); diff --git a/src/tabcontrollers/AudioTabController.h b/src/tabcontrollers/AudioTabController.h index c66f492..9c0f269 100644 --- a/src/tabcontrollers/AudioTabController.h +++ b/src/tabcontrollers/AudioTabController.h @@ -87,7 +87,7 @@ private: void onPttStop() override; void onPttEnabled() override; void onPttDisabled() override; - bool pttChangeValid() override; + virtual vr::VROverlayHandle_t getNotificationOverlayHandle() override { return m_ulNotificationOverlayHandle; @@ -114,6 +114,8 @@ public: void eventLoopTick(); + bool pttChangeValid() override; + int playbackDeviceIndex() const; int mirrorDeviceIndex() const; diff --git a/src/tabcontrollers/PttController.cpp b/src/tabcontrollers/PttController.cpp index cf2bdda..fc618c3 100644 --- a/src/tabcontrollers/PttController.cpp +++ b/src/tabcontrollers/PttController.cpp @@ -222,118 +222,8 @@ void PttController::savePttConfig() void PttController::checkPttStatus() { - static auto handleControllerState - = []( const vr::VRControllerState_t& state, - PttControllerConfig* config ) -> bool { - if ( state.ulButtonPressed & config->digitalButtonMask ) - { - return true; - } - if ( config->triggerMode ) - { - if ( state.ulButtonPressed - & vr::ButtonMaskFromId( vr::k_EButton_SteamVR_Trigger ) ) - { - return true; - } - } - if ( config->touchpadMode ) - { - if ( ( ( config->touchpadMode & 1 ) - && ( state.ulButtonTouched - & vr::ButtonMaskFromId( - vr::k_EButton_SteamVR_Touchpad ) ) ) - || ( ( config->touchpadMode & 2 ) - && ( state.ulButtonPressed - & vr::ButtonMaskFromId( - vr::k_EButton_SteamVR_Touchpad ) ) ) ) - { - if ( config->touchpadAreas - == ( PAD_AREA_LEFT + PAD_AREA_TOP + PAD_AREA_RIGHT - + PAD_AREA_BOTTOM ) ) - { - return true; - } - else - { - float x = state.rAxis[0].x; - float y = state.rAxis[0].y; - if ( std::abs( x ) >= 0.2 || std::abs( y ) >= 0.2 ) - { // deadzone in the middle - if ( x < 0 && std::abs( y ) < -x - && ( config->touchpadAreas & PAD_AREA_LEFT ) ) - { - return true; - } - else if ( y > 0 && std::abs( x ) < y - && ( config->touchpadAreas & PAD_AREA_TOP ) ) - { - return true; - } - else if ( x > 0 && std::abs( y ) < x - && ( config->touchpadAreas - & PAD_AREA_RIGHT ) ) - { - return true; - } - else if ( y < 0 && std::abs( x ) < -y - && ( config->touchpadAreas - & PAD_AREA_BOTTOM ) ) - { - return true; - } - } - } - } - } - return false; - }; - if ( m_pttEnabled ) - { - bool newState = false; - if ( m_pttLeftControllerEnabled ) - { - auto leftId - = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole( - vr::TrackedControllerRole_LeftHand ); - if ( leftId != vr::k_unTrackedDeviceIndexInvalid ) - { - vr::VRControllerState_t state; - if ( vr::VRSystem()->GetControllerState( - leftId, &state, sizeof( vr::VRControllerState_t ) ) ) - { - // logControllerState(state, "Left "); - newState |= handleControllerState( state, - m_pttControllerConfigs ); - } - } - } - if ( m_pttRightControllerEnabled ) - { - auto rightId - = vr::VRSystem()->GetTrackedDeviceIndexForControllerRole( - vr::TrackedControllerRole_RightHand ); - if ( rightId != vr::k_unTrackedDeviceIndexInvalid ) - { - vr::VRControllerState_t state; - if ( vr::VRSystem()->GetControllerState( - rightId, &state, sizeof( vr::VRControllerState_t ) ) ) - { - // logControllerState(state, "Right "); - newState |= handleControllerState( - state, m_pttControllerConfigs + 1 ); - } - } - } - if ( newState && !m_pttActive && pttChangeValid() ) - { - startPtt(); - } - else if ( !newState && m_pttActive && pttChangeValid() ) - { - stopPtt(); - } - } + // PTT Controls are now handled in the overlaycontroller using public + // functions. } void PttController::startPtt() diff --git a/src/tabcontrollers/PttController.h b/src/tabcontrollers/PttController.h index 3ffc980..fe78662 100644 --- a/src/tabcontrollers/PttController.h +++ b/src/tabcontrollers/PttController.h @@ -75,10 +75,7 @@ protected: virtual void onPttStop(){}; virtual void onPttEnabled(){}; virtual void onPttDisabled(){}; - virtual bool pttChangeValid() - { - return true; - } + virtual vr::VROverlayHandle_t getNotificationOverlayHandle() { return vr::k_ulOverlayHandleInvalid; @@ -100,6 +97,11 @@ public: void savePttProfiles(); void savePttConfig(); + virtual bool pttChangeValid() + { + return true; + } + Q_INVOKABLE QVariantList pttDigitalButtons( unsigned controller ); Q_INVOKABLE unsigned long pttDigitalButtonMask( unsigned controller ); Q_INVOKABLE unsigned pttTouchpadMode( unsigned controller ); From c62c85a08fe8075e873d257f85566f70afc1e9ef Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 16 Feb 2019 13:49:34 +0100 Subject: [PATCH 05/68] Remove deprecated elements from AudioPage There are still many elements remaining from the old input system. These have not been removed due to time constraints. They should be removed as part of a general clean up process. The PTT profile buttons have been replaced with a text telling users to use the SteamVR bindings interface. This is for people who don't read changelogs. --- docs/screenshots/AudioPage.png | Bin 70555 -> 68747 bytes .../audio_page/profiles/ProfileButtons.qml | 82 ++---------------- .../audio_page/push_to_talk/PttButtons.qml | 48 ++-------- 3 files changed, 10 insertions(+), 120 deletions(-) diff --git a/docs/screenshots/AudioPage.png b/docs/screenshots/AudioPage.png index eedc31c0e91cec5291f99a41c0430e4640816a23..f0f534224e274fe22889058d6d7d9176fc273fa0 100644 GIT binary patch literal 68747 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 Qmx@Y9(?Fx@>C5;33;MWjmjD0& diff --git a/src/res/qml/RootPage.qml b/src/res/qml/RootPage.qml index bfb9bae..84a083b 100644 --- a/src/res/qml/RootPage.qml +++ b/src/res/qml/RootPage.qml @@ -351,39 +351,6 @@ MyStackViewPage { AudioTabController.pttEnabled = checked } } - RowLayout { - spacing: 18 - - MyComboBox { - Layout.leftMargin: 78 - id: summaryPttProfileComboBox - Layout.maximumWidth: 378 - Layout.minimumWidth: 378 - Layout.preferredWidth: 378 - Layout.fillWidth: true - model: [""] - onCurrentIndexChanged: { - if (currentIndex > 0) { - summaryPttProfileApplyButton.enabled = true - } else { - summaryPttProfileApplyButton.enabled = false - } - } - } - - MyPushButton { - id: summaryPttProfileApplyButton - enabled: false - Layout.preferredWidth: 150 - text: "Apply" - onClicked: { - if (summaryPttProfileComboBox.currentIndex > 0) { - AudioTabController.applyPttProfile(summaryPttProfileComboBox.currentIndex - 1) - summaryPttProfileComboBox.currentIndex = 0 - } - } - } - } } Item { @@ -406,7 +373,6 @@ MyStackViewPage { Component.onCompleted: { reloadChaperoneProfiles() reloadSteamVRProfiles() - reloadPttProfiles() summaryVersionText.text = applicationVersion @@ -443,9 +409,6 @@ MyStackViewPage { Connections { target: AudioTabController - onPttProfilesUpdated: { - reloadPttProfiles() - } onMicVolumeChanged: { summaryMicVolumeSlider.value = AudioTabController.micVolume } @@ -529,14 +492,4 @@ MyStackViewPage { summarySteamVRProfileComboBox.currentIndex = 0 summarySteamVRProfileComboBox.model = profiles } - - function reloadPttProfiles() { - var profiles = [""] - var profileCount = AudioTabController.getPttProfileCount() - for (var i = 0; i < profileCount; i++) { - profiles.push(AudioTabController.getPttProfileName(i)) - } - summaryPttProfileComboBox.currentIndex = 0 - summaryPttProfileComboBox.model = profiles - } } From 6142e1a032785d18f054cdec647eb554a91ec69b Mon Sep 17 00:00:00 2001 From: Vasily Date: Sat, 16 Feb 2019 15:18:01 +0100 Subject: [PATCH 08/68] Remove commented out code in PttButtons.qml --- src/res/qml/audio_page/push_to_talk/PttButtons.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/res/qml/audio_page/push_to_talk/PttButtons.qml b/src/res/qml/audio_page/push_to_talk/PttButtons.qml index d8eaf3d..1867fd3 100644 --- a/src/res/qml/audio_page/push_to_talk/PttButtons.qml +++ b/src/res/qml/audio_page/push_to_talk/PttButtons.qml @@ -14,7 +14,6 @@ ColumnLayout { MyToggleButton { id: audioPttEnabledToggle - //Layout.preferredWidth: 260 Layout.fillWidth: true text: "Push-to-Talk:" onClicked: { From 60418279b5df9c17950e005efd8f3bd5afd23976 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sat, 16 Feb 2019 17:59:17 +0100 Subject: [PATCH 09/68] Remove unused Ptt component --- advancedSettings.pro | 1 - .../audio_page/push_to_talk/PttButtons.qml | 6 - .../qml/common/PttControllerConfigDialog.qml | 148 ------------------ 3 files changed, 155 deletions(-) delete mode 100644 src/res/qml/common/PttControllerConfigDialog.qml diff --git a/advancedSettings.pro b/advancedSettings.pro index 1e54896..b4de45a 100644 --- a/advancedSettings.pro +++ b/advancedSettings.pro @@ -126,7 +126,6 @@ DISTFILES += \ src/res/qml/ChaperoneWarningsPage.qml \ src/res/qml/FixFloorPage.qml \ src/res/qml/PlayspacePage.qml \ - src/res/qml/PttControllerConfigDialog.qml \ src/res/qml/RevivePage.qml \ src/res/qml/RootPage.qml \ src/res/qml/SettingsPage.qml \ diff --git a/src/res/qml/audio_page/push_to_talk/PttButtons.qml b/src/res/qml/audio_page/push_to_talk/PttButtons.qml index 1867fd3..2014c51 100644 --- a/src/res/qml/audio_page/push_to_talk/PttButtons.qml +++ b/src/res/qml/audio_page/push_to_talk/PttButtons.qml @@ -6,12 +6,6 @@ import "../../common" ColumnLayout { RowLayout { - Layout.fillWidth: true - PttControllerConfigDialog { - id: pttControllerConfigDialog - pttControllerConfigClass: AudioTabController - } - MyToggleButton { id: audioPttEnabledToggle Layout.fillWidth: true diff --git a/src/res/qml/common/PttControllerConfigDialog.qml b/src/res/qml/common/PttControllerConfigDialog.qml deleted file mode 100644 index c1d5ddd..0000000 --- a/src/res/qml/common/PttControllerConfigDialog.qml +++ /dev/null @@ -1,148 +0,0 @@ -import QtQuick 2.7 -import QtQuick.Controls 2.0 -import QtQuick.Layouts 1.3 -import matzman666.advsettings 1.0 - -MyDialogOkCancelPopup { - id: pttControllerConfigDialog - property var pttControllerConfigClass - property int controllerIndex: -1 - dialogTitle: "Controller Configuration" - dialogWidth: 600 - dialogHeight: 620 - dialogContentItem: ColumnLayout { - MyText { - text: "Buttons" - } - Rectangle { - color: "#cccccc" - height: 1 - Layout.fillWidth: true - } - MyToggleButton { - id: pttControllerConfigGripButtonToggle - text: "Grip" - } - MyToggleButton { - id: pttControllerConfigMenuButtonToggle - text: "Menu" - } - MyToggleButton { - id: pttControllerConfigTriggerButtonToggle - text: "Trigger" - } - - MyText { - Layout.topMargin: 32 - text: "Touchpad" - } - Rectangle { - color: "#cccccc" - height: 1 - Layout.fillWidth: true - } - RowLayout { - spacing: 64 - MyToggleButton { - id: pttControllerConfigPadLeftToggle - text: "Left" - } - MyToggleButton { - id: pttControllerConfigPadRightToggle - text: "Right" - } - } - RowLayout { - spacing: 64 - MyToggleButton { - id: pttControllerConfigPadTopToggle - text: "Top" - } - MyToggleButton { - id: pttControllerConfigPadBottomToggle - text: "Bottom" - } - } - RowLayout { - MyText { - text: "Mode:" - } - MyComboBox { - id: pttControllerConfigPadModeCombo - Layout.preferredWidth: 250 - model: ["Disabled", "Touched", "Pressed"] - } - } - } - onClosed: { - if (okClicked) { - var buttons = [] - if (pttControllerConfigGripButtonToggle.checked) { - buttons.push(2) - } - if (pttControllerConfigMenuButtonToggle.checked) { - buttons.push(1) - } - var triggerMode = 0 - if (pttControllerConfigTriggerButtonToggle.checked) { - triggerMode = 1 - } - var padAreas = 0 - if (pttControllerConfigPadLeftToggle.checked) { - padAreas |= (1 << 0) - } - if (pttControllerConfigPadTopToggle.checked) { - padAreas |= (1 << 1) - } - if (pttControllerConfigPadRightToggle.checked) { - padAreas |= (1 << 2) - } - if (pttControllerConfigPadBottomToggle.checked) { - padAreas |= (1 << 3) - } - pttControllerConfigClass.setPttControllerConfig(controllerIndex, buttons, triggerMode, pttControllerConfigPadModeCombo.currentIndex, padAreas); - } - } - function openPopup(controller) { - if (controller === 0) { - dialogTitle = "Left Controller Configuration" - controllerIndex = 0 - } else { - dialogTitle = "Right Controller Configuration" - controllerIndex = 1 - } - pttControllerConfigGripButtonToggle.checked = false - pttControllerConfigMenuButtonToggle.checked = false - pttControllerConfigTriggerButtonToggle.checked = false - pttControllerConfigPadLeftToggle.checked = false - pttControllerConfigPadTopToggle.checked = false - pttControllerConfigPadRightToggle.checked = false - pttControllerConfigPadBottomToggle.checked = false - pttControllerConfigPadModeCombo.currentIndex = pttControllerConfigClass.pttTouchpadMode(controllerIndex) - var buttons = pttControllerConfigClass.pttDigitalButtons(controllerIndex) - for (var i = 0; i < buttons.length; i++) { - if (buttons[i] == 1) { - pttControllerConfigMenuButtonToggle.checked = true - } else if (buttons[i] == 2) { - pttControllerConfigGripButtonToggle.checked = true - } - } - if (pttControllerConfigClass.pttTriggerMode(controllerIndex) > 0) { - pttControllerConfigTriggerButtonToggle.checked = true - } - var padAreas = pttControllerConfigClass.pttTouchpadArea(controllerIndex) - if (padAreas & (1 << 0)) { - pttControllerConfigPadLeftToggle.checked = true - } - if (padAreas & (1 << 1)) { - pttControllerConfigPadTopToggle.checked = true - } - if (padAreas & (1 << 2)) { - pttControllerConfigPadRightToggle.checked = true - } - if (padAreas & (1 << 3)) { - pttControllerConfigPadBottomToggle.checked = true - } - open() - } -} From f49ade20a494dd7f9538b0b7bf208eccca2b7ccd Mon Sep 17 00:00:00 2001 From: Vasily Date: Sat, 16 Feb 2019 17:59:59 +0100 Subject: [PATCH 10/68] Fix bug in MirrorDeviceSelector.qml It was mistakenly referring to the playback device list, instead of the mirror device list. --- src/res/qml/audio_page/device_selector/MirrorDeviceSelector.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/res/qml/audio_page/device_selector/MirrorDeviceSelector.qml b/src/res/qml/audio_page/device_selector/MirrorDeviceSelector.qml index d27acde..72f51c0 100644 --- a/src/res/qml/audio_page/device_selector/MirrorDeviceSelector.qml +++ b/src/res/qml/audio_page/device_selector/MirrorDeviceSelector.qml @@ -45,7 +45,7 @@ RowLayout { setShownAudioDevice(index) } onPlaybackDeviceListChanged: { - audioPlaybackNameCombo.devices = getAudioDeviceList() + audioMirrorNameCombo.devices = getAudioDeviceList() setShownAudioDevice(AudioTabController.playbackDeviceIndex) } } From adcbb474c589d8577e7ea41968324da9ce9630e7 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sat, 16 Feb 2019 22:14:25 +0100 Subject: [PATCH 11/68] Add Qt project files to .gitignore --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitattributes b/.gitattributes index 2c1b613..1bfe6b5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -89,6 +89,8 @@ #Qt Specific *.qml text +*.pri text +*.pro text #Linux Shell Scripts #Windows Subsystem for Linux will not run CLRF files. From 4b48d051c8a73d9d72fcc65ff166d1c107e03a34 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 16 Feb 2019 22:38:07 +0100 Subject: [PATCH 12/68] Refactor Qt project file into compiler specific subfiles Encapsulating compiler specific options in a separate file makes it easier to reason about what is going to happen on a specific qmake call. clang-msvc and msvc are separate because they don't support exactly the same compiler switches. --- advancedSettings.pro | 35 +++++----------------- build_scripts/qt/compilers/clang-msvc.pri | 9 ++++++ build_scripts/qt/compilers/clang.pri | 3 ++ build_scripts/qt/compilers/common-msvc.pri | 11 +++++++ build_scripts/qt/compilers/gcc.pri | 3 ++ build_scripts/qt/compilers/msvc.pri | 3 ++ 6 files changed, 37 insertions(+), 27 deletions(-) create mode 100644 build_scripts/qt/compilers/clang-msvc.pri create mode 100644 build_scripts/qt/compilers/clang.pri create mode 100644 build_scripts/qt/compilers/common-msvc.pri create mode 100644 build_scripts/qt/compilers/gcc.pri create mode 100644 build_scripts/qt/compilers/msvc.pri diff --git a/advancedSettings.pro b/advancedSettings.pro index b4de45a..ba53e04 100644 --- a/advancedSettings.pro +++ b/advancedSettings.pro @@ -15,45 +15,26 @@ lessThan(QT_MINOR_VERSION, 6): error("requires Qt 5.6 or higher") TARGET = AdvancedSettings TEMPLATE = app -*msvc* { - #Removing -W3 from both FLAGS is necessary, otherwise compiler will give - #D9025: overriding '/W4' with '/W3' - QMAKE_CFLAGS_WARN_ON -= -W3 - QMAKE_CXXFLAGS_WARN_ON -= -W3 - #C4127 is a warning in qvarlengtharray.h that can not be turned off - #on the current version of MSVC. - QMAKE_CXXFLAGS += /W4 /wd4127 - # The codecvt header being used in AudioManagerWindows.cpp is deprecated by the standard, - # but no suitable replacement has been standardized yet. It is possible to use the Windows - # specific MultiByteToWideChar() and WideCharToMultiByte() from - DEFINES += _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING - !*clang-msvc { - #win32-clang-msvc is unable to correctly build the first time - #with warnings as errors on. There seems to be an issue with the moc_predefs.h - #file not being built correctly when /WX is on. Until the issue is fixed, - #win32-clang-msvc is built without /WX. - QMAKE_CXXFLAGS += /WX - } +include_dir = $$PWD/build_scripts/qt/ + +win32-msvc { + include($$include_dir/compilers/msvc.pri) } win32-clang-msvc{ - #clang-msvc does not enable the c++17 flag with qmake's c++1z flag. - QMAKE_CXXFLAGS += /std:c++17 + include($$include_dir/compilers/clang-msvc.pri) } *g++* { - #g++-7 is needed for C++17 features. travis does not supply this by default. - QMAKE_CXX = g++-7 - QMAKE_CXXFLAGS += -Werror + include($$include_dir/compilers/gcc.pri) } #Look for anything clang that is not clang-msvc, since it does not #allow all the same switches as regular clang. *clang|*clang-g++|*clang-libc++ { - QMAKE_CXXFLAGS += -Werror - #All includes from the third-party directory will not warn. - QMAKE_CXXFLAGS += --system-header-prefix=third-party + include($$include_dir/compilers/clang.pri) } + SOURCES += src/main.cpp\ src/overlaycontroller.cpp \ src/tabcontrollers/AudioTabController.cpp \ diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri new file mode 100644 index 0000000..a443dd0 --- /dev/null +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -0,0 +1,9 @@ +include(common-msvc.pri) + +#win32-clang-msvc is unable to correctly build the first time +#with warnings as errors on. There seems to be an issue with the moc_predefs.h +#file not being built correctly when /WX is on. Until the issue is fixed, +#win32-clang-msvc is built without /WX. + +#clang-msvc does not enable the c++17 flag with qmake's c++1z flag. +QMAKE_CXXFLAGS += /std:c++17 diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri new file mode 100644 index 0000000..bcb6d19 --- /dev/null +++ b/build_scripts/qt/compilers/clang.pri @@ -0,0 +1,3 @@ +QMAKE_CXXFLAGS += -Werror +#All includes from the third-party directory will not warn. +QMAKE_CXXFLAGS += --system-header-prefix=third-party diff --git a/build_scripts/qt/compilers/common-msvc.pri b/build_scripts/qt/compilers/common-msvc.pri new file mode 100644 index 0000000..3de3c13 --- /dev/null +++ b/build_scripts/qt/compilers/common-msvc.pri @@ -0,0 +1,11 @@ +#Removing -W3 from both FLAGS is necessary, otherwise compiler will give +#D9025: overriding '/W4' with '/W3' +QMAKE_CFLAGS_WARN_ON -= -W3 +QMAKE_CXXFLAGS_WARN_ON -= -W3 +#C4127 is a warning in qvarlengtharray.h that can not be turned off +#on the current version of MSVC. +QMAKE_CXXFLAGS += /W4 /wd4127 +# The codecvt header being used in AudioManagerWindows.cpp is deprecated by the standard, +# but no suitable replacement has been standardized yet. It is possible to use the Windows +# specific MultiByteToWideChar() and WideCharToMultiByte() from +DEFINES += _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri new file mode 100644 index 0000000..ed10788 --- /dev/null +++ b/build_scripts/qt/compilers/gcc.pri @@ -0,0 +1,3 @@ +#g++-7 is needed for C++17 features. travis does not supply this by default. +QMAKE_CXX = g++-7 +QMAKE_CXXFLAGS += -Werror diff --git a/build_scripts/qt/compilers/msvc.pri b/build_scripts/qt/compilers/msvc.pri new file mode 100644 index 0000000..e48a8a1 --- /dev/null +++ b/build_scripts/qt/compilers/msvc.pri @@ -0,0 +1,3 @@ +include(common-msvc.pri) + +QMAKE_CXXFLAGS += /WX From ab25124d7b5d9ed880a7852d133f43f77c6fdb68 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sat, 16 Feb 2019 23:01:14 +0100 Subject: [PATCH 13/68] Move source files and resources file into separate .pri files --- advancedSettings.pro | 97 ++-------------------------------- build_scripts/qt/resources.pri | 36 +++++++++++++ build_scripts/qt/sources.pri | 53 +++++++++++++++++++ 3 files changed, 94 insertions(+), 92 deletions(-) create mode 100644 build_scripts/qt/resources.pri create mode 100644 build_scripts/qt/sources.pri diff --git a/advancedSettings.pro b/advancedSettings.pro index ba53e04..055a989 100644 --- a/advancedSettings.pro +++ b/advancedSettings.pro @@ -15,113 +15,26 @@ lessThan(QT_MINOR_VERSION, 6): error("requires Qt 5.6 or higher") TARGET = AdvancedSettings TEMPLATE = app +win32:DESTDIR = bin/win64/AdvancedSettings +unix:DESTDIR = bin/linux/AdvancedSettings + include_dir = $$PWD/build_scripts/qt/ win32-msvc { include($$include_dir/compilers/msvc.pri) } - win32-clang-msvc{ include($$include_dir/compilers/clang-msvc.pri) } - *g++* { include($$include_dir/compilers/gcc.pri) } - #Look for anything clang that is not clang-msvc, since it does not #allow all the same switches as regular clang. *clang|*clang-g++|*clang-libc++ { include($$include_dir/compilers/clang.pri) } -SOURCES += src/main.cpp\ - src/overlaycontroller.cpp \ - src/tabcontrollers/AudioTabController.cpp \ - src/tabcontrollers/ChaperoneTabController.cpp \ - src/tabcontrollers/FixFloorTabController.cpp \ - src/tabcontrollers/MoveCenterTabController.cpp \ - src/tabcontrollers/SettingsTabController.cpp \ - src/tabcontrollers/StatisticsTabController.cpp \ - src/tabcontrollers/SteamVRTabController.cpp \ - src/tabcontrollers/ReviveTabController.cpp \ - src/tabcontrollers/UtilitiesTabController.cpp \ - src/tabcontrollers/PttController.cpp \ - src/utils/ChaperoneUtils.cpp \ - src/tabcontrollers/audiomanager/AudioManagerDummy.cpp \ - src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp \ - src/overlaycontroller/openvr_init.cpp \ - src/ivrinput/ivrinput.cpp +include($$include_dir/sources.pri) -HEADERS += src/overlaycontroller.h \ - src/tabcontrollers/AudioTabController.h \ - src/tabcontrollers/ChaperoneTabController.h \ - src/tabcontrollers/FixFloorTabController.h \ - src/tabcontrollers/MoveCenterTabController.h \ - src/tabcontrollers/SettingsTabController.h \ - src/tabcontrollers/StatisticsTabController.h \ - src/tabcontrollers/SteamVRTabController.h \ - src/tabcontrollers/ReviveTabController.h \ - src/tabcontrollers/UtilitiesTabController.h \ - src/tabcontrollers/AudioManager.h \ - src/tabcontrollers/PttController.h \ - src/tabcontrollers/KeyboardInput.h \ - src/utils/Matrix.h \ - src/utils/ChaperoneUtils.h \ - src/tabcontrollers/audiomanager/AudioManagerDummy.h \ - src/tabcontrollers/keyboardinput/KeyboardInputDummy.h \ - src/overlaycontroller/openvr_init.h \ - src/ivrinput/ivrinput_action.h \ - src/ivrinput/ivrinput_manifest.h \ - src/ivrinput/ivrinput_action_set.h \ - src/ivrinput/ivrinput.h - -win32 { - SOURCES += src/tabcontrollers/audiomanager/AudioManagerWindows.cpp \ - src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp - HEADERS += src/tabcontrollers/audiomanager/AudioManagerWindows.h \ - src/tabcontrollers/audiomanager/IPolicyConfig.h \ - src/tabcontrollers/keyboardinput/KeyboardInputWindows.h -} - -INCLUDEPATH += third-party/openvr/headers \ - third-party/easylogging++ -#easylogging++ used to be a header only lib. Now requires easylogging++.cc -SOURCES += third-party/easylogging++/easylogging++.cc -win32:LIBS += -L"$$PWD/third-party/openvr/lib/win64" -luser32 -lole32 -unix:LIBS += -L"$$PWD/third-party/openvr/lib/linux64" -LIBS += -lopenvr_api - -win32:DESTDIR = bin/win64/AdvancedSettings -unix:DESTDIR = bin/linux/AdvancedSettings - -DISTFILES += \ - src/res/sounds/alarm01.wav \ - src/res/img/audio/microphone/ptt_notification.png \ - src/res/img/audio/microphone/ptt_notification.svg \ - src/res/img/battery/* \ - src/res/img/icons/* \ - src/res/qml/qmldir \ - src/res/qml/audio_page/* \ - src/res/qml/ChaperonePage.qml \ - src/res/qml/ChaperoneWarningsPage.qml \ - src/res/qml/FixFloorPage.qml \ - src/res/qml/PlayspacePage.qml \ - src/res/qml/RevivePage.qml \ - src/res/qml/RootPage.qml \ - src/res/qml/SettingsPage.qml \ - src/res/qml/StatisticsPage.qml \ - src/res/qml/SteamVRPage.qml \ - src/res/qml/utilities_page/* \ - src/res/qml/utilities_page/media_keys/* \ - src/res/qml/utilities_page/keyboard_utils/* \ - src/res/qml/utilities_page/desktop_size/* \ - src/res/qml/utilities_page/alarm_clock/* \ - src/res/qml/audio_page/dialog_boxes/* \ - src/res/qml/audio_page/device_selector/* \ - src/res/qml/audio_page/proximity/* \ - src/res/qml/audio_page/push_to_talk/* \ - src/res/qml/audio_page/profiles/* \ - src/res/qml/common/* \ - -RESOURCES += src/res/resources.qrc +include($$include_dir/resources.pri) diff --git a/build_scripts/qt/resources.pri b/build_scripts/qt/resources.pri new file mode 100644 index 0000000..19a288f --- /dev/null +++ b/build_scripts/qt/resources.pri @@ -0,0 +1,36 @@ +project_dir = $$PWD/../../ + +win32:LIBS += -L"$$project_dir/third-party/openvr/lib/win64" -luser32 -lole32 +unix:LIBS += -L"$$project_dir/third-party/openvr/lib/linux64" +LIBS += -lopenvr_api + +RESOURCES += src/res/resources.qrc + +DISTFILES += \ + src/res/sounds/alarm01.wav \ + src/res/img/audio/microphone/ptt_notification.png \ + src/res/img/audio/microphone/ptt_notification.svg \ + src/res/img/battery/* \ + src/res/img/icons/* \ + src/res/qml/qmldir \ + src/res/qml/audio_page/* \ + src/res/qml/ChaperonePage.qml \ + src/res/qml/ChaperoneWarningsPage.qml \ + src/res/qml/FixFloorPage.qml \ + src/res/qml/PlayspacePage.qml \ + src/res/qml/RevivePage.qml \ + src/res/qml/RootPage.qml \ + src/res/qml/SettingsPage.qml \ + src/res/qml/StatisticsPage.qml \ + src/res/qml/SteamVRPage.qml \ + src/res/qml/utilities_page/* \ + src/res/qml/utilities_page/media_keys/* \ + src/res/qml/utilities_page/keyboard_utils/* \ + src/res/qml/utilities_page/desktop_size/* \ + src/res/qml/utilities_page/alarm_clock/* \ + src/res/qml/audio_page/dialog_boxes/* \ + src/res/qml/audio_page/device_selector/* \ + src/res/qml/audio_page/proximity/* \ + src/res/qml/audio_page/push_to_talk/* \ + src/res/qml/audio_page/profiles/* \ + src/res/qml/common/* \ diff --git a/build_scripts/qt/sources.pri b/build_scripts/qt/sources.pri new file mode 100644 index 0000000..71b5f90 --- /dev/null +++ b/build_scripts/qt/sources.pri @@ -0,0 +1,53 @@ +SOURCES += src/main.cpp\ + src/overlaycontroller.cpp \ + src/tabcontrollers/AudioTabController.cpp \ + src/tabcontrollers/ChaperoneTabController.cpp \ + src/tabcontrollers/FixFloorTabController.cpp \ + src/tabcontrollers/MoveCenterTabController.cpp \ + src/tabcontrollers/SettingsTabController.cpp \ + src/tabcontrollers/StatisticsTabController.cpp \ + src/tabcontrollers/SteamVRTabController.cpp \ + src/tabcontrollers/ReviveTabController.cpp \ + src/tabcontrollers/UtilitiesTabController.cpp \ + src/tabcontrollers/PttController.cpp \ + src/utils/ChaperoneUtils.cpp \ + src/tabcontrollers/audiomanager/AudioManagerDummy.cpp \ + src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp \ + src/overlaycontroller/openvr_init.cpp \ + src/ivrinput/ivrinput.cpp + +HEADERS += src/overlaycontroller.h \ + src/tabcontrollers/AudioTabController.h \ + src/tabcontrollers/ChaperoneTabController.h \ + src/tabcontrollers/FixFloorTabController.h \ + src/tabcontrollers/MoveCenterTabController.h \ + src/tabcontrollers/SettingsTabController.h \ + src/tabcontrollers/StatisticsTabController.h \ + src/tabcontrollers/SteamVRTabController.h \ + src/tabcontrollers/ReviveTabController.h \ + src/tabcontrollers/UtilitiesTabController.h \ + src/tabcontrollers/AudioManager.h \ + src/tabcontrollers/PttController.h \ + src/tabcontrollers/KeyboardInput.h \ + src/utils/Matrix.h \ + src/utils/ChaperoneUtils.h \ + src/tabcontrollers/audiomanager/AudioManagerDummy.h \ + src/tabcontrollers/keyboardinput/KeyboardInputDummy.h \ + src/overlaycontroller/openvr_init.h \ + src/ivrinput/ivrinput_action.h \ + src/ivrinput/ivrinput_manifest.h \ + src/ivrinput/ivrinput_action_set.h \ + src/ivrinput/ivrinput.h + +win32 { + SOURCES += src/tabcontrollers/audiomanager/AudioManagerWindows.cpp \ + src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp + HEADERS += src/tabcontrollers/audiomanager/AudioManagerWindows.h \ + src/tabcontrollers/audiomanager/IPolicyConfig.h \ + src/tabcontrollers/keyboardinput/KeyboardInputWindows.h +} + +INCLUDEPATH += third-party/openvr/headers \ + third-party/easylogging++ +#easylogging++ used to be a header only lib. Now requires easylogging++.cc +SOURCES += third-party/easylogging++/easylogging++.cc From a7706c1b0b72809fb06adc289fc4fcde6cff4104 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sat, 16 Feb 2019 23:19:36 +0100 Subject: [PATCH 14/68] Remove generated banner from .pro file The banner does not add anything to the file and is only wasted space. --- advancedSettings.pro | 6 ------ 1 file changed, 6 deletions(-) diff --git a/advancedSettings.pro b/advancedSettings.pro index 055a989..918af1f 100644 --- a/advancedSettings.pro +++ b/advancedSettings.pro @@ -1,9 +1,3 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2015-06-10T16:57:45 -# -#------------------------------------------------- - QT += core gui qml quick multimedia widgets CONFIG += c++1z From 68a72ded1fd0a9461a2c11f79fb59d2e3104cde9 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 16:52:11 +0100 Subject: [PATCH 15/68] Add whole program optimization to MSVC --- build_scripts/qt/compilers/common-msvc.pri | 3 +++ build_scripts/qt/compilers/msvc.pri | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/build_scripts/qt/compilers/common-msvc.pri b/build_scripts/qt/compilers/common-msvc.pri index 3de3c13..a925c5a 100644 --- a/build_scripts/qt/compilers/common-msvc.pri +++ b/build_scripts/qt/compilers/common-msvc.pri @@ -9,3 +9,6 @@ QMAKE_CXXFLAGS += /W4 /wd4127 # but no suitable replacement has been standardized yet. It is possible to use the Windows # specific MultiByteToWideChar() and WideCharToMultiByte() from DEFINES += _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING + +# Enables Whole Program Optimization +QMAKE_CXXFLAGS += /Gw diff --git a/build_scripts/qt/compilers/msvc.pri b/build_scripts/qt/compilers/msvc.pri index e48a8a1..22ea14b 100644 --- a/build_scripts/qt/compilers/msvc.pri +++ b/build_scripts/qt/compilers/msvc.pri @@ -1,3 +1,7 @@ include(common-msvc.pri) +# Warnings as errors QMAKE_CXXFLAGS += /WX + +# Enables Link Time Optimization +QMAKE_CXXFLAGS += /GL From fdc096bb61c1b98375a8ab8b6708061e49bed4fd Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 17:21:48 +0100 Subject: [PATCH 16/68] Add recommended compiler switches From https://github.com/lefticus/cppbestpractices/blob/master/02-Use_the_Tools_Available.md#MSVC The '/w14619' switch creates errors in qglobal.h and qvector.h. --- build_scripts/qt/compilers/common-msvc.pri | 37 ++++++++++++++++++++++ build_scripts/qt/compilers/msvc.pri | 3 ++ 2 files changed, 40 insertions(+) diff --git a/build_scripts/qt/compilers/common-msvc.pri b/build_scripts/qt/compilers/common-msvc.pri index a925c5a..188c50f 100644 --- a/build_scripts/qt/compilers/common-msvc.pri +++ b/build_scripts/qt/compilers/common-msvc.pri @@ -12,3 +12,40 @@ DEFINES += _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING # Enables Whole Program Optimization QMAKE_CXXFLAGS += /Gw + +# 'identfier': conversion from 'type1' to 'type1', possible loss of data +QMAKE_CXXFLAGS += /w14242 +# 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data +QMAKE_CXXFLAGS += /w14254 +# 'function': member function does not override any base class virtual member function +QMAKE_CXXFLAGS += /w14263 +# 'classname': class has virtual functions, but destructor is not virtual instances of this class may not be destructed correctly +QMAKE_CXXFLAGS += /w14265 +# 'operator': unsigned/negative constant mismatch +QMAKE_CXXFLAGS += /w14287 +# nonstandard extension used: 'variable': loop control variable declared in the for-loop is used outside the for-loop scope +QMAKE_CXXFLAGS += /we4289 +# 'operator': expression is always 'boolean_value' +QMAKE_CXXFLAGS += /w14296 +# 'variable': pointer truncation from 'type1' to 'type2' +QMAKE_CXXFLAGS += /w14311 +# expression before comma evaluates to a function which is missing an argument list +QMAKE_CXXFLAGS += /w14545 +# function call before comma missing argument list +QMAKE_CXXFLAGS += /w14546 +# 'operator': operator before comma has no effect; expected operator with side-effect +QMAKE_CXXFLAGS += /w14547 +# 'operator': operator before comma has no effect; did you intend 'operator'? +QMAKE_CXXFLAGS += /w14549 +# expression has no effect; expected expression with side-effect +QMAKE_CXXFLAGS += /w14555 +# Enable warning on thread un-safe static member initialization +QMAKE_CXXFLAGS += /w14640 +# Conversion from 'type1' to 'type_2' is sign-extended. This may cause unexpected runtime behavior. +QMAKE_CXXFLAGS += /w14826 +# wide string literal cast to 'LPSTR' +QMAKE_CXXFLAGS += /w14905 +# string literal cast to 'LPWSTR' +QMAKE_CXXFLAGS += /w14906 +# illegal copy-initialization; more than one user-defined conversion has been implicitly applied +QMAKE_CXXFLAGS += /w14928 diff --git a/build_scripts/qt/compilers/msvc.pri b/build_scripts/qt/compilers/msvc.pri index 22ea14b..6679151 100644 --- a/build_scripts/qt/compilers/msvc.pri +++ b/build_scripts/qt/compilers/msvc.pri @@ -5,3 +5,6 @@ QMAKE_CXXFLAGS += /WX # Enables Link Time Optimization QMAKE_CXXFLAGS += /GL + +# Force standards-conformance +QMAKE_CXXFLAGS += /permissive- From 89e026e71436bbc2ffa72998a9313998c96e9e74 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 17:55:32 +0100 Subject: [PATCH 17/68] Rename declaration parameter to fit definition --- src/tabcontrollers/UtilitiesTabController.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tabcontrollers/UtilitiesTabController.h b/src/tabcontrollers/UtilitiesTabController.h index bf41f6b..286142f 100644 --- a/src/tabcontrollers/UtilitiesTabController.h +++ b/src/tabcontrollers/UtilitiesTabController.h @@ -53,7 +53,7 @@ private: public: void initStage1(); - void initStage2( OverlayController* parent, QQuickWindow* widget ); + void initStage2( OverlayController* var_parent, QQuickWindow* var_widget ); void eventLoopTick(); From 81af2b9c729d84134da0722d47f9e5b43e68d3db Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 18:08:24 +0100 Subject: [PATCH 18/68] Add -Wshadow and solve warnings --- build_scripts/qt/compilers/clang-msvc.pri | 2 ++ build_scripts/qt/compilers/clang.pri | 2 ++ build_scripts/qt/compilers/gcc.pri | 3 +++ src/tabcontrollers/UtilitiesTabController.cpp | 6 +++--- src/tabcontrollers/UtilitiesTabController.h | 4 ++-- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri index a443dd0..28a5798 100644 --- a/build_scripts/qt/compilers/clang-msvc.pri +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -7,3 +7,5 @@ include(common-msvc.pri) #clang-msvc does not enable the c++17 flag with qmake's c++1z flag. QMAKE_CXXFLAGS += /std:c++17 + +QMAKE_CXXFLAGS += -Xclang -Wshadow diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index bcb6d19..66a4841 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -1,3 +1,5 @@ QMAKE_CXXFLAGS += -Werror #All includes from the third-party directory will not warn. QMAKE_CXXFLAGS += --system-header-prefix=third-party + +QMAKE_CXXFLAGS += -Wshadow diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index ed10788..96c9d59 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -1,3 +1,6 @@ #g++-7 is needed for C++17 features. travis does not supply this by default. QMAKE_CXX = g++-7 + QMAKE_CXXFLAGS += -Werror + +QMAKE_CXXFLAGS += -Wshadow diff --git a/src/tabcontrollers/UtilitiesTabController.cpp b/src/tabcontrollers/UtilitiesTabController.cpp index f4effb0..952d611 100644 --- a/src/tabcontrollers/UtilitiesTabController.cpp +++ b/src/tabcontrollers/UtilitiesTabController.cpp @@ -64,8 +64,8 @@ void UtilitiesTabController::initStage1() void UtilitiesTabController::initStage2( OverlayController* var_parent, QQuickWindow* var_widget ) { - this->parent = var_parent; - this->widget = var_widget; + this->m_parent = var_parent; + this->m_widget = var_widget; } void UtilitiesTabController::sendKeyboardInput( QString input ) @@ -467,7 +467,7 @@ void UtilitiesTabController::eventLoopTick() } */ auto nError = vrnotification->CreateNotification( - parent->overlayHandle(), + m_parent->overlayHandle(), 666, vr::EVRNotificationType_Transient, alarmMessageBuffer, diff --git a/src/tabcontrollers/UtilitiesTabController.h b/src/tabcontrollers/UtilitiesTabController.h index 286142f..10dc7ff 100644 --- a/src/tabcontrollers/UtilitiesTabController.h +++ b/src/tabcontrollers/UtilitiesTabController.h @@ -33,8 +33,8 @@ class UtilitiesTabController : public QObject setSteamDesktopOverlayWidth NOTIFY steamDesktopOverlayWidthChanged ) private: - OverlayController* parent; - QQuickWindow* widget; + OverlayController* m_parent; + QQuickWindow* m_widget; unsigned settingsUpdateCounter = 0; From acb666a1422c9b1b80eca31fc5ff4ee0cda5d66a Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sun, 17 Feb 2019 19:48:17 +0100 Subject: [PATCH 19/68] Remove old style casts and enable warnings for them --- build_scripts/qt/compilers/clang-msvc.pri | 2 ++ build_scripts/qt/compilers/clang.pri | 2 ++ build_scripts/qt/compilers/gcc.pri | 2 ++ src/overlaycontroller.cpp | 13 +++++---- src/tabcontrollers/ChaperoneTabController.cpp | 4 +-- src/tabcontrollers/FixFloorTabController.cpp | 17 ++++++------ src/tabcontrollers/MoveCenterTabController.h | 2 +- src/tabcontrollers/PttController.cpp | 17 +++++++----- src/tabcontrollers/ReviveTabController.cpp | 10 +++---- .../StatisticsTabController.cpp | 8 +++--- src/tabcontrollers/UtilitiesTabController.cpp | 5 ++-- .../audiomanager/AudioManagerWindows.cpp | 27 ++++++++++--------- src/utils/ChaperoneUtils.cpp | 3 ++- 13 files changed, 65 insertions(+), 47 deletions(-) diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri index 28a5798..16f704c 100644 --- a/build_scripts/qt/compilers/clang-msvc.pri +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -9,3 +9,5 @@ include(common-msvc.pri) QMAKE_CXXFLAGS += /std:c++17 QMAKE_CXXFLAGS += -Xclang -Wshadow + +QMAKE_CXXFLAGS += -Wold-style-cast diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index 66a4841..2ede6ee 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -3,3 +3,5 @@ QMAKE_CXXFLAGS += -Werror QMAKE_CXXFLAGS += --system-header-prefix=third-party QMAKE_CXXFLAGS += -Wshadow + +QMAKE_CXXFLAGS += -Wold-style-cast diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index 96c9d59..54f25b0 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -4,3 +4,5 @@ QMAKE_CXX = g++-7 QMAKE_CXXFLAGS += -Werror QMAKE_CXXFLAGS += -Wshadow + +QMAKE_CXXFLAGS += -Wold-style-cast diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index e2cd4ee..e90e250 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -361,7 +361,8 @@ void OverlayController::SetWidget( QQuickItem* quickItem, m_pRenderControl->initialize( m_pOpenGLContext.get() ); vr::HmdVector2_t vecWindowSize - = { ( float ) quickItem->width(), ( float ) quickItem->height() }; + = { static_cast( quickItem->width() ), + static_cast( quickItem->height() ) }; vr::VROverlay()->SetOverlayMouseScale( m_ulOverlayHandle, &vecWindowSize ); @@ -425,11 +426,13 @@ void OverlayController::renderOverlay() #if defined _WIN64 || defined _LP64 // To avoid any compiler warning because of cast to a larger pointer // type (warning C4312 on VC) - vr::Texture_t texture = { ( void* ) ( ( uint64_t ) unTexture ), - vr::TextureType_OpenGL, - vr::ColorSpace_Auto }; + vr::Texture_t texture + = { reinterpret_cast( + ( static_cast( unTexture ) ) ), + vr::TextureType_OpenGL, + vr::ColorSpace_Auto }; #else - vr::Texture_t texture = { ( void* ) unTexture, + vr::Texture_t texture = { reinterpret_cast( unTexture ), vr::TextureType_OpenGL, vr::ColorSpace_Auto }; #endif diff --git a/src/tabcontrollers/ChaperoneTabController.cpp b/src/tabcontrollers/ChaperoneTabController.cpp index f8d20e8..2528854 100644 --- a/src/tabcontrollers/ChaperoneTabController.cpp +++ b/src/tabcontrollers/ChaperoneTabController.cpp @@ -928,7 +928,7 @@ float ChaperoneTabController::chaperoneVelocityModifier() const Q_INVOKABLE unsigned ChaperoneTabController::getChaperoneProfileCount() { - return ( unsigned ) chaperoneProfiles.size(); + return static_cast( chaperoneProfiles.size() ); } Q_INVOKABLE QString @@ -1244,7 +1244,7 @@ void ChaperoneTabController::flipOrientation() { parent->m_moveCenterTabController.reset(); parent->RotateUniverseCenter( vr::TrackingUniverseStanding, - ( float ) M_PI ); + static_cast( M_PI ) ); } void ChaperoneTabController::reloadFromDisk() diff --git a/src/tabcontrollers/FixFloorTabController.cpp b/src/tabcontrollers/FixFloorTabController.cpp index bc254e6..d3a58f0 100644 --- a/src/tabcontrollers/FixFloorTabController.cpp +++ b/src/tabcontrollers/FixFloorTabController.cpp @@ -86,9 +86,9 @@ void FixFloorTabController::eventLoopTick( auto& m = devicePoses[referenceController] .mDeviceToAbsoluteTracking.m; - tempOffsetX = ( double ) m[0][3]; - tempOffsetY = ( double ) m[1][3]; - tempOffsetZ = ( double ) m[2][3]; + tempOffsetX = static_cast( m[0][3] ); + tempOffsetY = static_cast( m[1][3] ); + tempOffsetZ = static_cast( m[2][3] ); /* | Intrinsic y-x'-z" rotation matrix: | cr*cy+sp*sr*sy | cr*sp*sy-cy*sr | cp*sy | @@ -99,7 +99,8 @@ void FixFloorTabController::eventLoopTick( pitch = -asin(-sp) [pi/2, -pi/2] roll = atan2(cp*sr, cp*cr) [pi, -pi], CW */ - tempRoll = std::atan2( ( double ) m[1][0], ( double ) m[1][1] ); + tempRoll = std::atan2( static_cast( m[1][0] ), + static_cast( m[1][1] ) ); measurementCount = 1; } } @@ -109,9 +110,9 @@ void FixFloorTabController::eventLoopTick( auto& m = devicePoses[referenceController].mDeviceToAbsoluteTracking.m; - double rollDiff - = std::atan2( ( double ) m[1][0], ( double ) m[1][1] ) - - tempRoll; + double rollDiff = std::atan2( static_cast( m[1][0] ), + static_cast( m[1][1] ) ) + - tempRoll; if ( rollDiff > M_PI ) { rollDiff -= 2.0 * M_PI; @@ -120,7 +121,7 @@ void FixFloorTabController::eventLoopTick( { rollDiff += 2.0 * M_PI; } - tempRoll += rollDiff / ( double ) measurementCount; + tempRoll += rollDiff / static_cast( measurementCount ); if ( tempRoll > M_PI ) { tempRoll -= 2.0 * M_PI; diff --git a/src/tabcontrollers/MoveCenterTabController.h b/src/tabcontrollers/MoveCenterTabController.h index d326aaa..5d81b52 100644 --- a/src/tabcontrollers/MoveCenterTabController.h +++ b/src/tabcontrollers/MoveCenterTabController.h @@ -52,7 +52,7 @@ private: OverlayController* parent; QQuickWindow* widget; - int m_trackingUniverse = ( int ) vr::TrackingUniverseStanding; + int m_trackingUniverse = static_cast( vr::TrackingUniverseStanding ); float m_offsetX = 0.0f; float m_offsetY = 0.0f; float m_offsetZ = 0.0f; diff --git a/src/tabcontrollers/PttController.cpp b/src/tabcontrollers/PttController.cpp index fc618c3..99412f6 100644 --- a/src/tabcontrollers/PttController.cpp +++ b/src/tabcontrollers/PttController.cpp @@ -43,7 +43,8 @@ void PttController::setPttControllerConfig( unsigned controller, uint64_t buttonMask = 0; for ( auto b : buttons ) { - buttonMask |= vr::ButtonMaskFromId( ( vr::EVRButtonId ) b.toInt() ); + buttonMask |= vr::ButtonMaskFromId( + ( static_cast( b.toInt() ) ) ); } m_pttControllerConfigs[controller].digitalButtons = buttons; m_pttControllerConfigs[controller].digitalButtonMask = buttonMask; @@ -78,7 +79,8 @@ void PttController::reloadPttProfiles() uint64_t buttonMask = 0; for ( auto b : entry.controllerConfigs[0].digitalButtons ) { - buttonMask |= vr::ButtonMaskFromId( ( vr::EVRButtonId ) b.toInt() ); + buttonMask |= vr::ButtonMaskFromId( + static_cast( b.toInt() ) ); } entry.controllerConfigs[0].digitalButtonMask = buttonMask; entry.controllerConfigs[0].triggerMode @@ -92,7 +94,8 @@ void PttController::reloadPttProfiles() buttonMask = 0; for ( auto b : entry.controllerConfigs[1].digitalButtons ) { - buttonMask |= vr::ButtonMaskFromId( ( vr::EVRButtonId ) b.toInt() ); + buttonMask |= vr::ButtonMaskFromId( + static_cast( b.toInt() ) ); } entry.controllerConfigs[1].digitalButtonMask = buttonMask; entry.controllerConfigs[1].triggerMode @@ -165,7 +168,8 @@ void PttController::reloadPttConfig() uint64_t buttonMask = 0; for ( auto b : m_pttControllerConfigs[0].digitalButtons ) { - buttonMask |= vr::ButtonMaskFromId( ( vr::EVRButtonId ) b.toInt() ); + buttonMask |= vr::ButtonMaskFromId( + static_cast( b.toInt() ) ); } m_pttControllerConfigs[0].digitalButtonMask = buttonMask; m_pttControllerConfigs[0].triggerMode @@ -179,7 +183,8 @@ void PttController::reloadPttConfig() buttonMask = 0; for ( auto b : m_pttControllerConfigs[0].digitalButtons ) { - buttonMask |= vr::ButtonMaskFromId( ( vr::EVRButtonId ) b.toInt() ); + buttonMask |= vr::ButtonMaskFromId( + static_cast( b.toInt() ) ); } m_pttControllerConfigs[1].digitalButtonMask = buttonMask; m_pttControllerConfigs[1].triggerMode @@ -388,7 +393,7 @@ unsigned PttController::pttTouchpadArea( unsigned controller ) unsigned PttController::getPttProfileCount() { - return ( unsigned ) pttProfiles.size(); + return static_cast( pttProfiles.size() ); } QString PttController::getPttProfileName( unsigned index ) diff --git a/src/tabcontrollers/ReviveTabController.cpp b/src/tabcontrollers/ReviveTabController.cpp index 99126d9..39e2334 100644 --- a/src/tabcontrollers/ReviveTabController.cpp +++ b/src/tabcontrollers/ReviveTabController.cpp @@ -1015,17 +1015,17 @@ void ReviveTabController::setPiGender( int value, bool notify ) { m_piGender = value; vr::EVRSettingsError vrSettingsError; - char* txt; + const char* txt; switch ( value ) { case 1: - txt = ( char* ) "Male"; + txt = static_cast( "Male" ); break; case 2: - txt = ( char* ) "Female"; + txt = static_cast( "Female" ); break; default: - txt = ( char* ) "Unknown"; + txt = static_cast( "Unknown" ); break; } vr::VRSettings()->SetString( @@ -1255,7 +1255,7 @@ void ReviveTabController::saveControllerProfiles() Q_INVOKABLE unsigned ReviveTabController::getControllerProfileCount() { - return ( unsigned ) controllerProfiles.size(); + return static_cast( controllerProfiles.size() ); } Q_INVOKABLE QString diff --git a/src/tabcontrollers/StatisticsTabController.cpp b/src/tabcontrollers/StatisticsTabController.cpp index e97aeb0..2d5474d 100644 --- a/src/tabcontrollers/StatisticsTabController.cpp +++ b/src/tabcontrollers/StatisticsTabController.cpp @@ -133,10 +133,10 @@ unsigned StatisticsTabController::timedOut() const float StatisticsTabController::totalReprojectedRatio() const { - float totalFrames = ( float ) ( m_cumStats.m_nNumFramePresents - - m_totalRatioPresentedOffset ); - float reprojectedFrames = ( float ) ( m_cumStats.m_nNumReprojectedFrames - - m_totalRatioReprojectedOffset ); + float totalFrames = static_cast( + ( m_cumStats.m_nNumFramePresents - m_totalRatioPresentedOffset ) ); + float reprojectedFrames = static_cast( ( + m_cumStats.m_nNumReprojectedFrames - m_totalRatioReprojectedOffset ) ); if ( totalFrames != 0.0f ) { return reprojectedFrames / totalFrames; diff --git a/src/tabcontrollers/UtilitiesTabController.cpp b/src/tabcontrollers/UtilitiesTabController.cpp index 952d611..6e4903e 100644 --- a/src/tabcontrollers/UtilitiesTabController.cpp +++ b/src/tabcontrollers/UtilitiesTabController.cpp @@ -422,8 +422,9 @@ void UtilitiesTabController::eventLoopTick() vr::VRNotificationId notificationId; vr::EVRInitError eError; vr::IVRNotifications* vrnotification - = ( vr::IVRNotifications* ) vr::VR_GetGenericInterface( - vr::IVRNotifications_Version, &eError ); + = static_cast( + vr::VR_GetGenericInterface( + vr::IVRNotifications_Version, &eError ) ); if ( eError != vr::VRInitError_None ) { LOG( ERROR ) diff --git a/src/tabcontrollers/audiomanager/AudioManagerWindows.cpp b/src/tabcontrollers/audiomanager/AudioManagerWindows.cpp index fc3947f..bc0a5ce 100644 --- a/src/tabcontrollers/audiomanager/AudioManagerWindows.cpp +++ b/src/tabcontrollers/audiomanager/AudioManagerWindows.cpp @@ -13,7 +13,7 @@ AudioManagerWindows::~AudioManagerWindows() { std::lock_guard lock( _mutex ); audioDeviceEnumerator->UnregisterEndpointNotificationCallback( - ( IMMNotificationClient* ) this ); + static_cast( this ) ); if ( mirrorAudioEndpointVolume ) { mirrorAudioEndpointVolume->Release(); @@ -61,7 +61,7 @@ void AudioManagerWindows::init( AudioTabController* var_controller ) } this->controller = var_controller; audioDeviceEnumerator->RegisterEndpointNotificationCallback( - ( IMMNotificationClient* ) this ); + static_cast( this ) ); policyConfig = getPolicyConfig(); if ( !policyConfig ) { @@ -373,7 +373,7 @@ IMMDeviceEnumerator* AudioManagerWindows::getAudioDeviceEnumerator() NULL, CLSCTX_ALL, __uuidof( IMMDeviceEnumerator ), - ( void** ) &pEnumerator ) + reinterpret_cast( &pEnumerator ) ) < 0 ) { return nullptr; @@ -385,18 +385,19 @@ IPolicyConfig* AudioManagerWindows::getPolicyConfig() { IPolicyConfig* var_policyConfig = nullptr; // for Win 10 - auto hr = CoCreateInstance( __uuidof( CPolicyConfigClient ), - NULL, - CLSCTX_INPROC, - IID_IPolicyConfig2, - ( LPVOID* ) &var_policyConfig ); + auto hr + = CoCreateInstance( __uuidof( CPolicyConfigClient ), + NULL, + CLSCTX_INPROC, + IID_IPolicyConfig2, + reinterpret_cast( &var_policyConfig ) ); if ( hr != S_OK ) { hr = CoCreateInstance( __uuidof( CPolicyConfigClient ), NULL, CLSCTX_INPROC, IID_IPolicyConfig1, - ( LPVOID* ) &var_policyConfig ); + reinterpret_cast( &var_policyConfig ) ); } // for Win Vista, 7, 8, 8.1 if ( hr != S_OK ) @@ -405,7 +406,7 @@ IPolicyConfig* AudioManagerWindows::getPolicyConfig() NULL, CLSCTX_INPROC, IID_IPolicyConfig0, - ( LPVOID* ) &var_policyConfig ); + reinterpret_cast( &var_policyConfig ) ); } if ( hr != S_OK ) { @@ -471,7 +472,7 @@ IAudioEndpointVolume* if ( device->Activate( __uuidof( IAudioEndpointVolume ), CLSCTX_INPROC_SERVER, NULL, - ( void** ) &pEndpointVolume ) + reinterpret_cast( &pEndpointVolume ) ) < 0 ) { return nullptr; @@ -536,12 +537,12 @@ HRESULT AudioManagerWindows::QueryInterface( REFIID riid, void** ppvObject ) if ( IID_IUnknown == riid ) { AddRef(); - *ppvObject = ( IUnknown* ) this; + *ppvObject = static_cast( this ); } else if ( __uuidof( IMMNotificationClient ) == riid ) { AddRef(); - *ppvObject = ( IMMNotificationClient* ) this; + *ppvObject = static_cast( this ); } else { diff --git a/src/utils/ChaperoneUtils.cpp b/src/utils/ChaperoneUtils.cpp index 1ae5723..43b8017 100644 --- a/src/utils/ChaperoneUtils.cpp +++ b/src/utils/ChaperoneUtils.cpp @@ -77,7 +77,8 @@ void ChaperoneUtils::loadChaperoneData() std::unique_ptr quadsBuffer( new vr::HmdQuad_t[_quadsCount] ); vr::HmdQuad_t* quadsBufferPtr = quadsBuffer.get(); - _corners.reset( ( vr::HmdVector3_t* ) new vr::HmdQuad_t[_quadsCount] ); + _corners.reset( reinterpret_cast( + new vr::HmdQuad_t[_quadsCount] ) ); vr::HmdVector3_t* _cornersPtr = _corners.get(); vr::VRChaperoneSetup()->GetLiveCollisionBoundsInfo( quadsBufferPtr, &_quadsCount ); From 4ed6e806453ae714881125ba8b378254927ddcbe Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 20:03:51 +0100 Subject: [PATCH 20/68] Include third party headers system headers for clang/g++ --- build_scripts/qt/sources.pri | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/build_scripts/qt/sources.pri b/build_scripts/qt/sources.pri index 71b5f90..c2b247b 100644 --- a/build_scripts/qt/sources.pri +++ b/build_scripts/qt/sources.pri @@ -46,8 +46,13 @@ win32 { src/tabcontrollers/audiomanager/IPolicyConfig.h \ src/tabcontrollers/keyboardinput/KeyboardInputWindows.h } - -INCLUDEPATH += third-party/openvr/headers \ - third-party/easylogging++ -#easylogging++ used to be a header only lib. Now requires easylogging++.cc -SOURCES += third-party/easylogging++/easylogging++.cc +*msvc* { + INCLUDEPATH += third-party/openvr/headers \ + third-party/easylogging++ + #easylogging++ used to be a header only lib. Now requires easylogging++.cc + SOURCES += third-party/easylogging++/easylogging++.cc +} else { + QMAKE_CXXFLAGS += -isystem third-party/openvr/headers + QMAKE_CXXFLAGS += -isystem third-party/easylogging++ + SOURCES += third-party/easylogging++/easylogging++.cc +} From 1b6cc47238357bc0306f5851009904a166599f44 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 20:10:51 +0100 Subject: [PATCH 21/68] Add .. to linux include paths --- build_scripts/qt/sources.pri | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build_scripts/qt/sources.pri b/build_scripts/qt/sources.pri index c2b247b..9f861f6 100644 --- a/build_scripts/qt/sources.pri +++ b/build_scripts/qt/sources.pri @@ -52,7 +52,7 @@ win32 { #easylogging++ used to be a header only lib. Now requires easylogging++.cc SOURCES += third-party/easylogging++/easylogging++.cc } else { - QMAKE_CXXFLAGS += -isystem third-party/openvr/headers - QMAKE_CXXFLAGS += -isystem third-party/easylogging++ + QMAKE_CXXFLAGS += -isystem ../third-party/openvr/headers + QMAKE_CXXFLAGS += -isystem ../third-party/easylogging++ SOURCES += third-party/easylogging++/easylogging++.cc } From 7234e2ba6cc6d2dc293f98c2b43d73813b65a8a3 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 20:18:38 +0100 Subject: [PATCH 22/68] Convert Linux only cast from old style --- src/overlaycontroller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index e90e250..0497861 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -461,7 +461,7 @@ QPoint OverlayController::getMousePositionForEvent( vr::VREvent_Mouse_t mouse ) { float y = mouse.y; #ifdef __linux__ - float h = ( float ) m_pWindow->height(); + float h = static_cast( m_pWindow->height() ); y = h - y; #endif return QPoint( mouse.x, y ); From 9019270df8e8fa4ce3fa81e4281b027e2ac1b640 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 20:28:56 +0100 Subject: [PATCH 23/68] Refine compiler system includes for different platforms MSVC seems to be the only platform that doesn't have a non-experimental way to include files that don't give warnings. --- build_scripts/qt/sources.pri | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/build_scripts/qt/sources.pri b/build_scripts/qt/sources.pri index 9f861f6..ff02bf9 100644 --- a/build_scripts/qt/sources.pri +++ b/build_scripts/qt/sources.pri @@ -46,13 +46,23 @@ win32 { src/tabcontrollers/audiomanager/IPolicyConfig.h \ src/tabcontrollers/keyboardinput/KeyboardInputWindows.h } -*msvc* { + +win32-msvc { INCLUDEPATH += third-party/openvr/headers \ third-party/easylogging++ - #easylogging++ used to be a header only lib. Now requires easylogging++.cc - SOURCES += third-party/easylogging++/easylogging++.cc -} else { +} + +win32-clang-msvc { + QMAKE_CXXFLAGS += /imsvc "$$PWD/../../third-party/openvr/headers" + QMAKE_CXXFLAGS += /imsvc "$$PWD/../../third-party/easylogging++" +} + +# Anything g++ or clang +# In order to suppress warnings in third party headers +*clang|*clang-g++|*clang-libc++|*g++* { QMAKE_CXXFLAGS += -isystem ../third-party/openvr/headers QMAKE_CXXFLAGS += -isystem ../third-party/easylogging++ - SOURCES += third-party/easylogging++/easylogging++.cc } + +# easylogging++ used to be a header only lib. Now requires easylogging++.cc +SOURCES += third-party/easylogging++/easylogging++.cc From 940ad48923e61624e6e066e1d1d647a389575ee3 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 21:15:58 +0100 Subject: [PATCH 24/68] Attempt -i switch in order to ignore warnings in file --- build_scripts/qt/sources.pri | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/build_scripts/qt/sources.pri b/build_scripts/qt/sources.pri index ff02bf9..0ab72b8 100644 --- a/build_scripts/qt/sources.pri +++ b/build_scripts/qt/sources.pri @@ -63,6 +63,9 @@ win32-clang-msvc { QMAKE_CXXFLAGS += -isystem ../third-party/openvr/headers QMAKE_CXXFLAGS += -isystem ../third-party/easylogging++ } - -# easylogging++ used to be a header only lib. Now requires easylogging++.cc -SOURCES += third-party/easylogging++/easylogging++.cc +!*gcc* { + # easylogging++ used to be a header only lib. Now requires easylogging++.cc + SOURCES += third-party/easylogging++/easylogging++.cc +} else { + QMAKE_CXXFLAGS += -i ../third-party/easylogging++ +} From 5c70aba09838971585c40a6364abc3c2c3cb5ffa Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 21:34:46 +0100 Subject: [PATCH 25/68] Revert easylogging++ include and attempt changing easylogging++.cc --- build_scripts/qt/sources.pri | 9 +++------ third-party/easylogging++/easylogging++.cc | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/build_scripts/qt/sources.pri b/build_scripts/qt/sources.pri index 0ab72b8..ff02bf9 100644 --- a/build_scripts/qt/sources.pri +++ b/build_scripts/qt/sources.pri @@ -63,9 +63,6 @@ win32-clang-msvc { QMAKE_CXXFLAGS += -isystem ../third-party/openvr/headers QMAKE_CXXFLAGS += -isystem ../third-party/easylogging++ } -!*gcc* { - # easylogging++ used to be a header only lib. Now requires easylogging++.cc - SOURCES += third-party/easylogging++/easylogging++.cc -} else { - QMAKE_CXXFLAGS += -i ../third-party/easylogging++ -} + +# easylogging++ used to be a header only lib. Now requires easylogging++.cc +SOURCES += third-party/easylogging++/easylogging++.cc diff --git a/third-party/easylogging++/easylogging++.cc b/third-party/easylogging++/easylogging++.cc index d763ee7..04b6492 100644 --- a/third-party/easylogging++/easylogging++.cc +++ b/third-party/easylogging++/easylogging++.cc @@ -14,7 +14,7 @@ // http://muflihun.com // -#include "easylogging++.h" +#include #if defined(AUTO_INITIALIZE_EASYLOGGINGPP) INITIALIZE_EASYLOGGINGPP From 60bd0a54c1664ea75395c1912087b3b76f344932 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 22:00:48 +0100 Subject: [PATCH 26/68] Fix shadowed variable in easylogging++.cc The _var was chosen because it conflicts with the naming convention in the rest of the file. Fixing the error was easier than getting GCC to ignore errors in one file, or using a pragma to mute the warning. Introducing a GCC pragma would require disabling C4068 on MSVC (unknown pragma). --- third-party/easylogging++/easylogging++.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/third-party/easylogging++/easylogging++.cc b/third-party/easylogging++/easylogging++.cc index 04b6492..6e85715 100644 --- a/third-party/easylogging++/easylogging++.cc +++ b/third-party/easylogging++/easylogging++.cc @@ -1789,26 +1789,26 @@ void TypedConfigurations::insertFile(Level level, const std::string& fullFilenam if (filePath.size() < resolvedFilename.size()) { base::utils::File::createPath(filePath); } - auto create = [&](Level level) { + auto create = [&](Level level_var) { base::LogStreamsReferenceMap::iterator filestreamIter = m_logStreamsReference->find(resolvedFilename); base::type::fstream_t* fs = nullptr; if (filestreamIter == m_logStreamsReference->end()) { // We need a completely new stream, nothing to share with fs = base::utils::File::newFileStream(resolvedFilename); - m_filenameMap.insert(std::make_pair(level, resolvedFilename)); - m_fileStreamMap.insert(std::make_pair(level, base::FileStreamPtr(fs))); - m_logStreamsReference->insert(std::make_pair(resolvedFilename, base::FileStreamPtr(m_fileStreamMap.at(level)))); + m_filenameMap.insert(std::make_pair(level_var, resolvedFilename)); + m_fileStreamMap.insert(std::make_pair(level_var, base::FileStreamPtr(fs))); + m_logStreamsReference->insert(std::make_pair(resolvedFilename, base::FileStreamPtr(m_fileStreamMap.at(level_var)))); } else { // Woops! we have an existing one, share it! - m_filenameMap.insert(std::make_pair(level, filestreamIter->first)); - m_fileStreamMap.insert(std::make_pair(level, base::FileStreamPtr(filestreamIter->second))); + m_filenameMap.insert(std::make_pair(level_var, filestreamIter->first)); + m_fileStreamMap.insert(std::make_pair(level_var, base::FileStreamPtr(filestreamIter->second))); fs = filestreamIter->second.get(); } if (fs == nullptr) { // We display bad file error from newFileStream() ELPP_INTERNAL_ERROR("Setting [TO_FILE] of [" - << LevelHelper::convertToString(level) << "] to FALSE", false); - setValue(level, false, &m_toFileMap); + << LevelHelper::convertToString(level_var) << "] to FALSE", false); + setValue(level_var, false, &m_toFileMap); } }; // If we dont have file conf for any level, create it for Level::Global first From 34204d2441e7ab154971ed103bf381c23ab1e7cb Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 23:00:04 +0100 Subject: [PATCH 27/68] Add -Wnon-virtual-dtor and resolve issues The IPolicyConfig file is a third party file and since it describes a third party API we can't make changes to it. Adding it via the system includes disables warnings on most compilers. --- build_scripts/qt/compilers/clang-msvc.pri | 2 ++ build_scripts/qt/compilers/clang.pri | 2 ++ build_scripts/qt/compilers/gcc.pri | 2 ++ build_scripts/qt/sources.pri | 5 +++-- src/tabcontrollers/audiomanager/AudioManagerWindows.h | 2 +- .../policyconfig}/IPolicyConfig.h | 0 6 files changed, 10 insertions(+), 3 deletions(-) rename {src/tabcontrollers/audiomanager => third-party/policyconfig}/IPolicyConfig.h (100%) diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri index 16f704c..213cb96 100644 --- a/build_scripts/qt/compilers/clang-msvc.pri +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -11,3 +11,5 @@ QMAKE_CXXFLAGS += /std:c++17 QMAKE_CXXFLAGS += -Xclang -Wshadow QMAKE_CXXFLAGS += -Wold-style-cast + +QMAKE_CXXFLAGS += -Wnon-virtual-dtor diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index 2ede6ee..cb16a71 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -5,3 +5,5 @@ QMAKE_CXXFLAGS += --system-header-prefix=third-party QMAKE_CXXFLAGS += -Wshadow QMAKE_CXXFLAGS += -Wold-style-cast + +QMAKE_CXXFLAGS += -Wnon-virtual-dtor diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index 54f25b0..4f26c33 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -6,3 +6,5 @@ QMAKE_CXXFLAGS += -Werror QMAKE_CXXFLAGS += -Wshadow QMAKE_CXXFLAGS += -Wold-style-cast + +QMAKE_CXXFLAGS += -Wnon-virtual-dtor diff --git a/build_scripts/qt/sources.pri b/build_scripts/qt/sources.pri index ff02bf9..1ade168 100644 --- a/build_scripts/qt/sources.pri +++ b/build_scripts/qt/sources.pri @@ -43,18 +43,19 @@ win32 { SOURCES += src/tabcontrollers/audiomanager/AudioManagerWindows.cpp \ src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp HEADERS += src/tabcontrollers/audiomanager/AudioManagerWindows.h \ - src/tabcontrollers/audiomanager/IPolicyConfig.h \ src/tabcontrollers/keyboardinput/KeyboardInputWindows.h } win32-msvc { INCLUDEPATH += third-party/openvr/headers \ - third-party/easylogging++ + third-party/easylogging++ \ + third-party/policyconfig } win32-clang-msvc { QMAKE_CXXFLAGS += /imsvc "$$PWD/../../third-party/openvr/headers" QMAKE_CXXFLAGS += /imsvc "$$PWD/../../third-party/easylogging++" + QMAKE_CXXFLAGS += /imsvc "$$PWD/../../third-party/policyconfig" } # Anything g++ or clang diff --git a/src/tabcontrollers/audiomanager/AudioManagerWindows.h b/src/tabcontrollers/audiomanager/AudioManagerWindows.h index 7651b05..105da6f 100644 --- a/src/tabcontrollers/audiomanager/AudioManagerWindows.h +++ b/src/tabcontrollers/audiomanager/AudioManagerWindows.h @@ -5,7 +5,7 @@ #include #include #include -#include "IPolicyConfig.h" +#include #include // application namespace diff --git a/src/tabcontrollers/audiomanager/IPolicyConfig.h b/third-party/policyconfig/IPolicyConfig.h similarity index 100% rename from src/tabcontrollers/audiomanager/IPolicyConfig.h rename to third-party/policyconfig/IPolicyConfig.h From cc4f0d4bc8b0eafc43cc253da238087159bc6c7c Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 23:13:26 +0100 Subject: [PATCH 28/68] Remove unneeded -Xclang --- build_scripts/qt/compilers/clang-msvc.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri index 213cb96..187db03 100644 --- a/build_scripts/qt/compilers/clang-msvc.pri +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -8,7 +8,7 @@ include(common-msvc.pri) #clang-msvc does not enable the c++17 flag with qmake's c++1z flag. QMAKE_CXXFLAGS += /std:c++17 -QMAKE_CXXFLAGS += -Xclang -Wshadow +QMAKE_CXXFLAGS += -Wshadow QMAKE_CXXFLAGS += -Wold-style-cast From 82ac83d6490a464ef3b16ad5883e702d6ccf376d Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 23:14:39 +0100 Subject: [PATCH 29/68] Add -Wextra to supported compilers --- build_scripts/qt/compilers/clang-msvc.pri | 2 ++ build_scripts/qt/compilers/clang.pri | 2 ++ build_scripts/qt/compilers/gcc.pri | 2 ++ 3 files changed, 6 insertions(+) diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri index 187db03..5f070cb 100644 --- a/build_scripts/qt/compilers/clang-msvc.pri +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -8,6 +8,8 @@ include(common-msvc.pri) #clang-msvc does not enable the c++17 flag with qmake's c++1z flag. QMAKE_CXXFLAGS += /std:c++17 +QMAKE_CXXFLAGS += -Wextra + QMAKE_CXXFLAGS += -Wshadow QMAKE_CXXFLAGS += -Wold-style-cast diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index cb16a71..67764aa 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -1,3 +1,5 @@ +QMAKE_CXXFLAGS += -Wextra + QMAKE_CXXFLAGS += -Werror #All includes from the third-party directory will not warn. QMAKE_CXXFLAGS += --system-header-prefix=third-party diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index 4f26c33..6f1e1ea 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -1,6 +1,8 @@ #g++-7 is needed for C++17 features. travis does not supply this by default. QMAKE_CXX = g++-7 +QMAKE_CXXFLAGS += -Wextra + QMAKE_CXXFLAGS += -Werror QMAKE_CXXFLAGS += -Wshadow From d87338d195fca12789621cb6f0a47e7facd51b48 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 23:20:18 +0100 Subject: [PATCH 30/68] Add -pedantic to Linux compilers clang-msvc does not support -pedantic. --- build_scripts/qt/compilers/clang.pri | 2 ++ build_scripts/qt/compilers/gcc.pri | 2 ++ 2 files changed, 4 insertions(+) diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index 67764aa..8567683 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -9,3 +9,5 @@ QMAKE_CXXFLAGS += -Wshadow QMAKE_CXXFLAGS += -Wold-style-cast QMAKE_CXXFLAGS += -Wnon-virtual-dtor + +QMAKE_CXXFLAGS += -pedantic diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index 6f1e1ea..0401a0d 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -10,3 +10,5 @@ QMAKE_CXXFLAGS += -Wshadow QMAKE_CXXFLAGS += -Wold-style-cast QMAKE_CXXFLAGS += -Wnon-virtual-dtor + +QMAKE_CXXFLAGS += -pedantic From ac614c36e6fb5adc68b394946e908dbf063a06f9 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 17 Feb 2019 23:34:55 +0100 Subject: [PATCH 31/68] Replace -pedantic with -Wpedantic --- build_scripts/qt/compilers/clang-msvc.pri | 2 ++ build_scripts/qt/compilers/clang.pri | 2 +- build_scripts/qt/compilers/gcc.pri | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri index 5f070cb..0ebf1b9 100644 --- a/build_scripts/qt/compilers/clang-msvc.pri +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -15,3 +15,5 @@ QMAKE_CXXFLAGS += -Wshadow QMAKE_CXXFLAGS += -Wold-style-cast QMAKE_CXXFLAGS += -Wnon-virtual-dtor + +QMAKE_CXXFLAGS += -Wpedantic diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index 8567683..5e18ff5 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -10,4 +10,4 @@ QMAKE_CXXFLAGS += -Wold-style-cast QMAKE_CXXFLAGS += -Wnon-virtual-dtor -QMAKE_CXXFLAGS += -pedantic +QMAKE_CXXFLAGS += -Wpedantic diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index 0401a0d..1fc82af 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -11,4 +11,4 @@ QMAKE_CXXFLAGS += -Wold-style-cast QMAKE_CXXFLAGS += -Wnon-virtual-dtor -QMAKE_CXXFLAGS += -pedantic +QMAKE_CXXFLAGS += -Wpedantic From fddae4278bf0e5e55f78599ece07d76185d8840e Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 00:11:29 +0100 Subject: [PATCH 32/68] Add more recommended switches Commented out switches still give errors. --- build_scripts/qt/compilers/clang-msvc.pri | 9 +++++++-- build_scripts/qt/compilers/clang.pri | 4 +++- build_scripts/qt/compilers/gcc.pri | 7 ++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri index 0ebf1b9..2ad4460 100644 --- a/build_scripts/qt/compilers/clang-msvc.pri +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -8,7 +8,7 @@ include(common-msvc.pri) #clang-msvc does not enable the c++17 flag with qmake's c++1z flag. QMAKE_CXXFLAGS += /std:c++17 -QMAKE_CXXFLAGS += -Wextra +QMAKE_CXXFLAGS += -Wextra -Wmost QMAKE_CXXFLAGS += -Wshadow @@ -16,4 +16,9 @@ QMAKE_CXXFLAGS += -Wold-style-cast QMAKE_CXXFLAGS += -Wnon-virtual-dtor -QMAKE_CXXFLAGS += -Wpedantic +#QMAKE_CXXFLAGS += -Wpedantic + +QMAKE_CXXFLAGS += -Wcast-align -Wunused -Woverloaded-virtual -Wformat=2 +#QMAKE_CXXFLAGS += -Wconversion +#QMAKE_CXXFLAGS += -Wdouble-promotion +#QMAKE_CXXFLAGS += -Wsign-conversion diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index 5e18ff5..b2af85e 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -1,4 +1,4 @@ -QMAKE_CXXFLAGS += -Wextra +QMAKE_CXXFLAGS += -Wextra -Wmost QMAKE_CXXFLAGS += -Werror #All includes from the third-party directory will not warn. @@ -11,3 +11,5 @@ QMAKE_CXXFLAGS += -Wold-style-cast QMAKE_CXXFLAGS += -Wnon-virtual-dtor QMAKE_CXXFLAGS += -Wpedantic + +QMAKE_CXXFLAGS += -Wcast-align -Wunused -Woverloaded-virtual -Wformat=2 diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index 1fc82af..00eacf6 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -1,7 +1,7 @@ #g++-7 is needed for C++17 features. travis does not supply this by default. QMAKE_CXX = g++-7 -QMAKE_CXXFLAGS += -Wextra +QMAKE_CXXFLAGS += -Wextra -Wmost QMAKE_CXXFLAGS += -Werror @@ -12,3 +12,8 @@ QMAKE_CXXFLAGS += -Wold-style-cast QMAKE_CXXFLAGS += -Wnon-virtual-dtor QMAKE_CXXFLAGS += -Wpedantic + +QMAKE_CXXFLAGS += -Wcast-align -Wunused -Woverloaded-virtual -Wformat=2 + +# GCC only switches +QMAKE_CXXFLAGS += -Wduplicated-branches -Wduplicated-cond -Wlogical-op -Wrestrict -Wnull-dereference From 106727a5b922baab9a2dddc858d2e910355bec7f Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 00:22:07 +0100 Subject: [PATCH 33/68] Remove -Wmost from GCC -Wmost is a clang only switch. --- build_scripts/qt/compilers/gcc.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index 00eacf6..4223ce6 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -1,7 +1,7 @@ #g++-7 is needed for C++17 features. travis does not supply this by default. QMAKE_CXX = g++-7 -QMAKE_CXXFLAGS += -Wextra -Wmost +QMAKE_CXXFLAGS += -Wextra QMAKE_CXXFLAGS += -Werror From 473e9281062ac9d72bd0f467bfa654f32d7d11d2 Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 00:30:52 +0100 Subject: [PATCH 34/68] Refactor common switches into file --- .../qt/compilers/clang-gcc-common-switches.pri | 9 +++++++++ build_scripts/qt/compilers/clang-msvc.pri | 11 ++--------- build_scripts/qt/compilers/clang.pri | 16 +++++----------- build_scripts/qt/compilers/gcc.pri | 12 ++---------- 4 files changed, 18 insertions(+), 30 deletions(-) create mode 100644 build_scripts/qt/compilers/clang-gcc-common-switches.pri diff --git a/build_scripts/qt/compilers/clang-gcc-common-switches.pri b/build_scripts/qt/compilers/clang-gcc-common-switches.pri new file mode 100644 index 0000000..c7a339b --- /dev/null +++ b/build_scripts/qt/compilers/clang-gcc-common-switches.pri @@ -0,0 +1,9 @@ +QMAKE_CXXFLAGS += -Wextra + +QMAKE_CXXFLAGS += -Wshadow + +QMAKE_CXXFLAGS += -Wold-style-cast + +QMAKE_CXXFLAGS += -Wnon-virtual-dtor + +QMAKE_CXXFLAGS += -Wcast-align -Wunused -Woverloaded-virtual -Wformat=2 diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri index 2ad4460..c549144 100644 --- a/build_scripts/qt/compilers/clang-msvc.pri +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -8,17 +8,10 @@ include(common-msvc.pri) #clang-msvc does not enable the c++17 flag with qmake's c++1z flag. QMAKE_CXXFLAGS += /std:c++17 -QMAKE_CXXFLAGS += -Wextra -Wmost +include(clang-gcc-common-switches.pri) -QMAKE_CXXFLAGS += -Wshadow +QMAKE_CXXFLAGS += -Wmost -QMAKE_CXXFLAGS += -Wold-style-cast - -QMAKE_CXXFLAGS += -Wnon-virtual-dtor - -#QMAKE_CXXFLAGS += -Wpedantic - -QMAKE_CXXFLAGS += -Wcast-align -Wunused -Woverloaded-virtual -Wformat=2 #QMAKE_CXXFLAGS += -Wconversion #QMAKE_CXXFLAGS += -Wdouble-promotion #QMAKE_CXXFLAGS += -Wsign-conversion diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index b2af85e..ba39d33 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -1,15 +1,9 @@ -QMAKE_CXXFLAGS += -Wextra -Wmost +include(clang-gcc-common-switches.pri) + +QMAKE_CXXFLAGS += -Wmost + +QMAKE_CXXFLAGS += -Wpedantic QMAKE_CXXFLAGS += -Werror #All includes from the third-party directory will not warn. QMAKE_CXXFLAGS += --system-header-prefix=third-party - -QMAKE_CXXFLAGS += -Wshadow - -QMAKE_CXXFLAGS += -Wold-style-cast - -QMAKE_CXXFLAGS += -Wnon-virtual-dtor - -QMAKE_CXXFLAGS += -Wpedantic - -QMAKE_CXXFLAGS += -Wcast-align -Wunused -Woverloaded-virtual -Wformat=2 diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index 4223ce6..df05be5 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -1,19 +1,11 @@ #g++-7 is needed for C++17 features. travis does not supply this by default. QMAKE_CXX = g++-7 -QMAKE_CXXFLAGS += -Wextra - -QMAKE_CXXFLAGS += -Werror - -QMAKE_CXXFLAGS += -Wshadow - -QMAKE_CXXFLAGS += -Wold-style-cast - -QMAKE_CXXFLAGS += -Wnon-virtual-dtor +include(clang-gcc-common-switches.pri) QMAKE_CXXFLAGS += -Wpedantic -QMAKE_CXXFLAGS += -Wcast-align -Wunused -Woverloaded-virtual -Wformat=2 +QMAKE_CXXFLAGS += -Werror # GCC only switches QMAKE_CXXFLAGS += -Wduplicated-branches -Wduplicated-cond -Wlogical-op -Wrestrict -Wnull-dereference From 0caff37251250e5aa721cdc8b629bef8ee110a25 Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 00:38:27 +0100 Subject: [PATCH 35/68] Add -Weffc++ switch to clang/gcc --- build_scripts/qt/compilers/clang-gcc-common-switches.pri | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build_scripts/qt/compilers/clang-gcc-common-switches.pri b/build_scripts/qt/compilers/clang-gcc-common-switches.pri index c7a339b..52af3d9 100644 --- a/build_scripts/qt/compilers/clang-gcc-common-switches.pri +++ b/build_scripts/qt/compilers/clang-gcc-common-switches.pri @@ -7,3 +7,5 @@ QMAKE_CXXFLAGS += -Wold-style-cast QMAKE_CXXFLAGS += -Wnon-virtual-dtor QMAKE_CXXFLAGS += -Wcast-align -Wunused -Woverloaded-virtual -Wformat=2 + +QMAKE_CXXFLAGS += -Weffc++ From fe3bbc29599cb6245cb53042e50fba53b54fbd2e Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 00:47:40 +0100 Subject: [PATCH 36/68] Remove -Weffc++ from GCC The "should be initialized in the member initialization list" is incorrectly implemented on GCC. https://stackoverflow.com/questions/14002454/can-i-ignore-the-gcc-warning-foom-bar-should-be-initialized-in-the-member-i --- build_scripts/qt/compilers/clang-gcc-common-switches.pri | 2 -- build_scripts/qt/compilers/clang-msvc.pri | 2 ++ build_scripts/qt/compilers/clang.pri | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/build_scripts/qt/compilers/clang-gcc-common-switches.pri b/build_scripts/qt/compilers/clang-gcc-common-switches.pri index 52af3d9..c7a339b 100644 --- a/build_scripts/qt/compilers/clang-gcc-common-switches.pri +++ b/build_scripts/qt/compilers/clang-gcc-common-switches.pri @@ -7,5 +7,3 @@ QMAKE_CXXFLAGS += -Wold-style-cast QMAKE_CXXFLAGS += -Wnon-virtual-dtor QMAKE_CXXFLAGS += -Wcast-align -Wunused -Woverloaded-virtual -Wformat=2 - -QMAKE_CXXFLAGS += -Weffc++ diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri index c549144..65e7957 100644 --- a/build_scripts/qt/compilers/clang-msvc.pri +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -12,6 +12,8 @@ include(clang-gcc-common-switches.pri) QMAKE_CXXFLAGS += -Wmost +QMAKE_CXXFLAGS += -Weffc++ + #QMAKE_CXXFLAGS += -Wconversion #QMAKE_CXXFLAGS += -Wdouble-promotion #QMAKE_CXXFLAGS += -Wsign-conversion diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index ba39d33..39ebd07 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -7,3 +7,5 @@ QMAKE_CXXFLAGS += -Wpedantic QMAKE_CXXFLAGS += -Werror #All includes from the third-party directory will not warn. QMAKE_CXXFLAGS += --system-header-prefix=third-party + +QMAKE_CXXFLAGS += -Weffc++ From ec014a1e74f9378b3676da2441c0456a68de50d9 Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 01:20:47 +0100 Subject: [PATCH 37/68] Add -Wdouble-promotion switch to clang/gcc compilers It introduces a lot of ugly casts. Long term the floats should probably be changed to doubles everywhere since we're only compiling for 64 bit x86. --- .../compilers/clang-gcc-common-switches.pri | 2 + build_scripts/qt/compilers/clang-msvc.pri | 1 - src/overlaycontroller.cpp | 2 +- src/tabcontrollers/ChaperoneTabController.cpp | 2 +- src/tabcontrollers/FixFloorTabController.cpp | 10 +++-- .../MoveCenterTabController.cpp | 38 +++++++++++-------- src/tabcontrollers/ReviveTabController.cpp | 4 +- .../StatisticsTabController.cpp | 6 +-- src/tabcontrollers/SteamVRTabController.cpp | 2 +- src/tabcontrollers/UtilitiesTabController.cpp | 2 +- 10 files changed, 40 insertions(+), 29 deletions(-) diff --git a/build_scripts/qt/compilers/clang-gcc-common-switches.pri b/build_scripts/qt/compilers/clang-gcc-common-switches.pri index c7a339b..fca9988 100644 --- a/build_scripts/qt/compilers/clang-gcc-common-switches.pri +++ b/build_scripts/qt/compilers/clang-gcc-common-switches.pri @@ -7,3 +7,5 @@ QMAKE_CXXFLAGS += -Wold-style-cast QMAKE_CXXFLAGS += -Wnon-virtual-dtor QMAKE_CXXFLAGS += -Wcast-align -Wunused -Woverloaded-virtual -Wformat=2 + +QMAKE_CXXFLAGS += -Wdouble-promotion diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri index 65e7957..b7f3398 100644 --- a/build_scripts/qt/compilers/clang-msvc.pri +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -15,5 +15,4 @@ QMAKE_CXXFLAGS += -Wmost QMAKE_CXXFLAGS += -Weffc++ #QMAKE_CXXFLAGS += -Wconversion -#QMAKE_CXXFLAGS += -Wdouble-promotion #QMAKE_CXXFLAGS += -Wsign-conversion diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index 0497861..0b633bf 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -1076,7 +1076,7 @@ void OverlayController::playAlarm01Sound( bool loop ) void OverlayController::setAlarm01SoundVolume( float vol ) { - m_alarm01SoundEffect.setVolume( vol ); + m_alarm01SoundEffect.setVolume( static_cast( vol ) ); } void OverlayController::cancelAlarm01Sound() diff --git a/src/tabcontrollers/ChaperoneTabController.cpp b/src/tabcontrollers/ChaperoneTabController.cpp index 2528854..752c852 100644 --- a/src/tabcontrollers/ChaperoneTabController.cpp +++ b/src/tabcontrollers/ChaperoneTabController.cpp @@ -564,7 +564,7 @@ void ChaperoneTabController::eventLoopTick( { float mod = m_chaperoneVelocityModifier * std::max( { leftSpeed, rightSpeed, hmdSpeed } ); - if ( mod > 0.02 ) + if ( mod > 0.02f ) { m_chaperoneVelocityModifierCurrent += mod; } diff --git a/src/tabcontrollers/FixFloorTabController.cpp b/src/tabcontrollers/FixFloorTabController.cpp index d3a58f0..d30bb49 100644 --- a/src/tabcontrollers/FixFloorTabController.cpp +++ b/src/tabcontrollers/FixFloorTabController.cpp @@ -135,15 +135,17 @@ void FixFloorTabController::eventLoopTick( { if ( std::abs( tempRoll ) <= M_PI_2 ) { - floorOffsetY = tempOffsetY - controllerUpOffsetCorrection; + floorOffsetY = static_cast( tempOffsetY ) + - controllerUpOffsetCorrection; } else { - floorOffsetY = tempOffsetY - controllerDownOffsetCorrection; + floorOffsetY = static_cast( tempOffsetY ) + - controllerDownOffsetCorrection; } - floorOffsetX = tempOffsetX; - floorOffsetZ = tempOffsetZ; + floorOffsetX = static_cast( tempOffsetX ); + floorOffsetZ = static_cast( tempOffsetZ ); LOG( INFO ) << "Fix Floor and adjust room center: Floor Offset = [" diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index 0edecc8..c9e8acf 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -167,10 +167,12 @@ void MoveCenterTabController::setRotation( int value, bool notify ) = devicePosesForRot[0].mDeviceToAbsoluteTracking; // Set up xyz coordinate values from pose matrix. - double oldHmdXyz[3] - = { oldHmdPos.m[0][3], oldHmdPos.m[1][3], oldHmdPos.m[2][3] }; - double newHmdXyz[3] - = { oldHmdPos.m[0][3], oldHmdPos.m[1][3], oldHmdPos.m[2][3] }; + double oldHmdXyz[3] = { static_cast( oldHmdPos.m[0][3] ), + static_cast( oldHmdPos.m[1][3] ), + static_cast( oldHmdPos.m[2][3] ) }; + double newHmdXyz[3] = { static_cast( oldHmdPos.m[0][3] ), + static_cast( oldHmdPos.m[1][3] ), + static_cast( oldHmdPos.m[2][3] ) }; // Convert oldHmdXyz into un-rotated coordinates. double oldAngle = -m_rotation * k_centidegreesToRadians; @@ -261,9 +263,9 @@ void MoveCenterTabController::setAdjustChaperone( bool value, bool notify ) { double angle = m_rotation * k_centidegreesToRadians; double offsetdir = m_adjustChaperone ? -1.0 : 1.0; - double offset[3] = { offsetdir * m_offsetX, - offsetdir * m_offsetY, - offsetdir * m_offsetZ }; + double offset[3] = { offsetdir * static_cast( m_offsetX ), + offsetdir * static_cast( m_offsetY ), + offsetdir * static_cast( m_offsetZ ) }; rotateCoordinates( offset, angle ); // We're done with calculations so down-cast to float for @@ -407,7 +409,7 @@ void MoveCenterTabController::modOffsetX( float value, bool notify ) if ( !m_lockXToggle ) { double angle = m_rotation * k_centidegreesToRadians; - double offset[3] = { value, 0, 0 }; + double offset[3] = { static_cast( value ), 0, 0 }; rotateCoordinates( offset, angle ); float offsetFloat[3] = { static_cast( offset[0] ), static_cast( offset[1] ), @@ -446,7 +448,7 @@ void MoveCenterTabController::modOffsetZ( float value, bool notify ) if ( !m_lockZToggle ) { double angle = m_rotation * k_centidegreesToRadians; - double offset[3] = { 0, 0, value }; + double offset[3] = { 0, 0, static_cast( value ) }; rotateCoordinates( offset, angle ); float offsetFloat[3] = { static_cast( offset[0] ), static_cast( offset[1] ), @@ -964,9 +966,12 @@ void MoveCenterTabController::eventLoopTick( else { double relativeControllerPosition[] - = { movePose->mDeviceToAbsoluteTracking.m[0][3], - movePose->mDeviceToAbsoluteTracking.m[1][3], - movePose->mDeviceToAbsoluteTracking.m[2][3] }; + = { static_cast( + movePose->mDeviceToAbsoluteTracking.m[0][3] ), + static_cast( + movePose->mDeviceToAbsoluteTracking.m[1][3] ), + static_cast( + movePose->mDeviceToAbsoluteTracking.m[2][3] ) }; rotateCoordinates( relativeControllerPosition, -angle ); float absoluteControllerPosition[] = { @@ -978,9 +983,12 @@ void MoveCenterTabController::eventLoopTick( if ( m_lastMoveHand == m_activeDragHand ) { double diff[3] = { - absoluteControllerPosition[0] - m_lastControllerPosition[0], - absoluteControllerPosition[1] - m_lastControllerPosition[1], - absoluteControllerPosition[2] - m_lastControllerPosition[2], + static_cast( absoluteControllerPosition[0] + - m_lastControllerPosition[0] ), + static_cast( absoluteControllerPosition[1] + - m_lastControllerPosition[1] ), + static_cast( absoluteControllerPosition[2] + - m_lastControllerPosition[2] ), }; // offset is un-rotated coordinates diff --git a/src/tabcontrollers/ReviveTabController.cpp b/src/tabcontrollers/ReviveTabController.cpp index 39e2334..61b66d6 100644 --- a/src/tabcontrollers/ReviveTabController.cpp +++ b/src/tabcontrollers/ReviveTabController.cpp @@ -44,7 +44,7 @@ void ReviveTabController::initStage1( bool forceRevivePage ) } else { - if ( valuef == 0.0 ) + if ( valuef == 0.0f ) { m_pixelsPerDisplayPixelOverrideEnabled = false; m_pixelsPerDisplayPixelOverride = 1.0; @@ -321,7 +321,7 @@ void ReviveTabController::eventLoopTick() &vrSettingsError ); if ( vrSettingsError == vr::VRSettingsError_None ) { - if ( valuef == 0.0 ) + if ( valuef == 0.0f ) { setPixelsPerDisplayPixelOverrideEnabled( false ); } diff --git a/src/tabcontrollers/StatisticsTabController.cpp b/src/tabcontrollers/StatisticsTabController.cpp index 2d5474d..5c2c2ab 100644 --- a/src/tabcontrollers/StatisticsTabController.cpp +++ b/src/tabcontrollers/StatisticsTabController.cpp @@ -54,7 +54,7 @@ void StatisticsTabController::eventLoopTick( + std::pow( m[2][3] - lastHmdPos[2], 2 ) ); if ( delta >= 0.01f ) { - m_hmdDistanceMoved += delta; + m_hmdDistanceMoved += static_cast( delta ); } } lastHmdPos[0] = m[0][3]; @@ -164,7 +164,7 @@ void StatisticsTabController::statsRotationResetClicked() void StatisticsTabController::statsLeftControllerSpeedResetClicked() { - if ( m_leftControllerMaxSpeed != 0.0 ) + if ( m_leftControllerMaxSpeed != 0.0f ) { m_leftControllerMaxSpeed = 0.0; } @@ -172,7 +172,7 @@ void StatisticsTabController::statsLeftControllerSpeedResetClicked() void StatisticsTabController::statsRightControllerSpeedResetClicked() { - if ( m_rightControllerMaxSpeed != 0.0 ) + if ( m_rightControllerMaxSpeed != 0.0f ) { m_rightControllerMaxSpeed = 0.0; } diff --git a/src/tabcontrollers/SteamVRTabController.cpp b/src/tabcontrollers/SteamVRTabController.cpp index 04f771c..d94332d 100644 --- a/src/tabcontrollers/SteamVRTabController.cpp +++ b/src/tabcontrollers/SteamVRTabController.cpp @@ -56,7 +56,7 @@ void SteamVRTabController::eventLoopTick() << "\" setting: " << vr::VRSettings()->GetSettingsErrorNameFromEnum( vrSettingsError ); - if ( m_superSampling != 1.0 ) + if ( m_superSampling != 1.0f ) { LOG( DEBUG ) << "OpenVR returns an error and we have a custom " diff --git a/src/tabcontrollers/UtilitiesTabController.cpp b/src/tabcontrollers/UtilitiesTabController.cpp index 6e4903e..065d309 100644 --- a/src/tabcontrollers/UtilitiesTabController.cpp +++ b/src/tabcontrollers/UtilitiesTabController.cpp @@ -583,7 +583,7 @@ void UtilitiesTabController::setSteamDesktopOverlayWidth( float width, bool notify, bool notifyOpenVr ) { - if ( std::abs( m_steamDesktopOverlayWidth - width ) > 0.01 ) + if ( std::abs( m_steamDesktopOverlayWidth - width ) > 0.01f ) { m_steamDesktopOverlayWidth = width; if ( notifyOpenVr ) From 88dad1087f5b37697aad4d54427539cf11565dfa Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 18:37:31 +0100 Subject: [PATCH 38/68] Fix clang -Wdouble-promotion issues --- src/utils/Matrix.h | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/utils/Matrix.h b/src/utils/Matrix.h index 8cba324..1185a33 100644 --- a/src/utils/Matrix.h +++ b/src/utils/Matrix.h @@ -111,21 +111,28 @@ inline vr::HmdQuaternion_t getQuaternion( vr::HmdMatrix34_t matrix ) { vr::HmdQuaternion_t q; - q.w = sqrt( - fmax( 0, 1 + matrix.m[0][0] + matrix.m[1][1] + matrix.m[2][2] ) ) + q.w = sqrt( fmax( 0, + static_cast( 1 + matrix.m[0][0] + matrix.m[1][1] + + matrix.m[2][2] ) ) ) / 2; - q.x = sqrt( - fmax( 0, 1 + matrix.m[0][0] - matrix.m[1][1] - matrix.m[2][2] ) ) + q.x = sqrt( fmax( 0, + static_cast( 1 + matrix.m[0][0] - matrix.m[1][1] + - matrix.m[2][2] ) ) ) / 2; - q.y = sqrt( - fmax( 0, 1 - matrix.m[0][0] + matrix.m[1][1] - matrix.m[2][2] ) ) + q.y = sqrt( fmax( 0, + static_cast( 1 - matrix.m[0][0] + matrix.m[1][1] + - matrix.m[2][2] ) ) ) / 2; - q.z = sqrt( - fmax( 0, 1 - matrix.m[0][0] - matrix.m[1][1] + matrix.m[2][2] ) ) + q.z = sqrt( fmax( 0, + static_cast( 1 - matrix.m[0][0] - matrix.m[1][1] + + matrix.m[2][2] ) ) ) / 2; - q.x = copysign( q.x, matrix.m[2][1] - matrix.m[1][2] ); - q.y = copysign( q.y, matrix.m[0][2] - matrix.m[2][0] ); - q.z = copysign( q.z, matrix.m[1][0] - matrix.m[0][1] ); + q.x = copysign( q.x, + static_cast( matrix.m[2][1] - matrix.m[1][2] ) ); + q.y = copysign( q.y, + static_cast( matrix.m[0][2] - matrix.m[2][0] ) ); + q.z = copysign( q.z, + static_cast( matrix.m[1][0] - matrix.m[0][1] ) ); return q; } From 400654898b1039c4c85594677564ed6de9151415 Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 18:43:40 +0100 Subject: [PATCH 39/68] Fix gcc -Wdouble-promotion issues --- src/tabcontrollers/MoveCenterTabController.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index c9e8acf..9b0dd2d 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -230,8 +230,8 @@ void MoveCenterTabController::setRotation( int value, bool notify ) vr::EChaperoneConfigFile_Live ); // Update UI offsets. - m_offsetX += hmdRotDiff[0]; - m_offsetZ += hmdRotDiff[2]; + m_offsetX += static_cast( hmdRotDiff[0] ); + m_offsetZ += static_cast( hmdRotDiff[2] ); if ( notify ) { emit offsetXChanged( m_offsetX ); @@ -996,15 +996,15 @@ void MoveCenterTabController::eventLoopTick( // prevents UI from updating if axis movement is locked if ( !m_lockXToggle ) { - m_offsetX += diff[0]; + m_offsetX += static_cast( diff[0] ); } if ( !m_lockYToggle ) { - m_offsetY += diff[1]; + m_offsetY += static_cast( diff[1] ); } if ( !m_lockZToggle ) { - m_offsetZ += diff[2]; + m_offsetZ += static_cast( diff[2] ); } rotateCoordinates( diff, angle ); From 8444a4972b8071ee076b0c20a3dc3df271a2cb75 Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 18:46:39 +0100 Subject: [PATCH 40/68] Attempt different fix for clang -Wdouble-promotion --- src/utils/Matrix.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/utils/Matrix.h b/src/utils/Matrix.h index 1185a33..9ee4183 100644 --- a/src/utils/Matrix.h +++ b/src/utils/Matrix.h @@ -112,27 +112,27 @@ inline vr::HmdQuaternion_t getQuaternion( vr::HmdMatrix34_t matrix ) vr::HmdQuaternion_t q; q.w = sqrt( fmax( 0, - static_cast( 1 + matrix.m[0][0] + matrix.m[1][1] - + matrix.m[2][2] ) ) ) + static_cast( 1 + matrix.m[0][0] + matrix.m[1][1] + + matrix.m[2][2] ) ) ) / 2; q.x = sqrt( fmax( 0, - static_cast( 1 + matrix.m[0][0] - matrix.m[1][1] - - matrix.m[2][2] ) ) ) + static_cast( 1 + matrix.m[0][0] - matrix.m[1][1] + - matrix.m[2][2] ) ) ) / 2; q.y = sqrt( fmax( 0, - static_cast( 1 - matrix.m[0][0] + matrix.m[1][1] - - matrix.m[2][2] ) ) ) + static_cast( 1 - matrix.m[0][0] + matrix.m[1][1] + - matrix.m[2][2] ) ) ) / 2; q.z = sqrt( fmax( 0, - static_cast( 1 - matrix.m[0][0] - matrix.m[1][1] - + matrix.m[2][2] ) ) ) + static_cast( 1 - matrix.m[0][0] - matrix.m[1][1] + + matrix.m[2][2] ) ) ) / 2; q.x = copysign( q.x, - static_cast( matrix.m[2][1] - matrix.m[1][2] ) ); + static_cast( matrix.m[2][1] - matrix.m[1][2] ) ); q.y = copysign( q.y, - static_cast( matrix.m[0][2] - matrix.m[2][0] ) ); + static_cast( matrix.m[0][2] - matrix.m[2][0] ) ); q.z = copysign( q.z, - static_cast( matrix.m[1][0] - matrix.m[0][1] ) ); + static_cast( matrix.m[1][0] - matrix.m[0][1] ) ); return q; } From 85fbbbbd423471cf37d54c96648a898652a2e7d1 Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 18:57:56 +0100 Subject: [PATCH 41/68] Gcc and clang fix for -Wdouble-promotion --- src/tabcontrollers/StatisticsTabController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tabcontrollers/StatisticsTabController.cpp b/src/tabcontrollers/StatisticsTabController.cpp index 5c2c2ab..89e7713 100644 --- a/src/tabcontrollers/StatisticsTabController.cpp +++ b/src/tabcontrollers/StatisticsTabController.cpp @@ -48,7 +48,7 @@ void StatisticsTabController::eventLoopTick( } else { - auto delta = std::sqrt( + float delta = std::sqrt( std::pow( m[0][3] - lastHmdPos[0], 2 ) /*+ std::pow(m[1][3] - lastHmdPos[1], 2)*/ + std::pow( m[2][3] - lastHmdPos[2], 2 ) ); From 4d06360c926f15f95aeaf08eaef5274cb534ee5e Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 19:08:57 +0100 Subject: [PATCH 42/68] Fix gcc and clang -Wdouble-promotion --- src/tabcontrollers/UtilitiesTabController.cpp | 3 ++- third-party/easylogging++/easylogging++.cc | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/tabcontrollers/UtilitiesTabController.cpp b/src/tabcontrollers/UtilitiesTabController.cpp index 065d309..68f379c 100644 --- a/src/tabcontrollers/UtilitiesTabController.cpp +++ b/src/tabcontrollers/UtilitiesTabController.cpp @@ -534,7 +534,8 @@ void UtilitiesTabController::eventLoopTick() i, vr::ETrackedDeviceProperty:: Prop_DeviceBatteryPercentage_Float ); - int batteryState = ceil( battery * 5 ); + int batteryState = static_cast( + ceil( static_cast( battery * 5 ) ) ); if ( batteryState != m_batteryState[i] ) { diff --git a/third-party/easylogging++/easylogging++.cc b/third-party/easylogging++/easylogging++.cc index 6e85715..fcbb6da 100644 --- a/third-party/easylogging++/easylogging++.cc +++ b/third-party/easylogging++/easylogging++.cc @@ -1202,7 +1202,7 @@ base::type::string_t DateTime::formatTime(unsigned long long time, base::Timesta if (time <= base::consts::kTimeFormats[i].value) { break; } - if (base::consts::kTimeFormats[i].value == 1000.0f && time / 1000.0f < 1.9f) { + if (base::consts::kTimeFormats[i].value == 1000.0 && time / 1000.0f < 1.9f) { break; } time /= static_cast(base::consts::kTimeFormats[i].value); From edf14b6bf956c1d768ac14201263ec768a7f966e Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 19:15:42 +0100 Subject: [PATCH 43/68] Fix clang -Wdouble-promotion gcc instance failed before compiling. --- src/tabcontrollers/UtilitiesTabController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tabcontrollers/UtilitiesTabController.cpp b/src/tabcontrollers/UtilitiesTabController.cpp index 68f379c..b525541 100644 --- a/src/tabcontrollers/UtilitiesTabController.cpp +++ b/src/tabcontrollers/UtilitiesTabController.cpp @@ -535,7 +535,7 @@ void UtilitiesTabController::eventLoopTick() vr::ETrackedDeviceProperty:: Prop_DeviceBatteryPercentage_Float ); int batteryState = static_cast( - ceil( static_cast( battery * 5 ) ) ); + ceil( static_cast( battery * 5 ) ) ); if ( batteryState != m_batteryState[i] ) { From 60b9f71b9ad533d657ea8f3bd0545ff3638f96fe Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 19:30:55 +0100 Subject: [PATCH 44/68] Fix gcc -Wdouble-promotion warnings For some reason GCC uses the float version of sqrt even though all arguments and results are floats. --- src/utils/ChaperoneUtils.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils/ChaperoneUtils.cpp b/src/utils/ChaperoneUtils.cpp index 43b8017..0422e6c 100644 --- a/src/utils/ChaperoneUtils.cpp +++ b/src/utils/ChaperoneUtils.cpp @@ -29,10 +29,10 @@ float ChaperoneUtils::_getDistanceToChaperone( { // projected point outside of segment float d_x = r0.v[0] - x.v[0]; float d_z = r0.v[2] - x.v[2]; - float d1 = sqrt( d_x * d_x + d_z * d_z ); + float d1 = sqrt( static_cast( d_x * d_x + d_z * d_z ) ); d_x = r1.v[0] - x.v[0]; d_z = r1.v[2] - x.v[2]; - float d2 = sqrt( d_x * d_x + d_z * d_z ); + float d2 = sqrt( static_cast( d_x * d_x + d_z * d_z ) ); if ( d1 < d2 ) { d = d1; @@ -52,7 +52,7 @@ float ChaperoneUtils::_getDistanceToChaperone( x1_z = r0.v[2] + r * u_z; float d_x = x1_x - x.v[0]; float d_z = x1_z - x.v[2]; - d = sqrt( d_x * d_x + d_z * d_z ); + d = sqrt( static_cast( d_x * d_x + d_z * d_z ) ); } if ( std::isnan( distance ) || d < distance ) { From bc8ab723637e7f6d6c96996a5d8e012fcca75907 Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 18 Feb 2019 19:45:16 +0100 Subject: [PATCH 45/68] Fix clang -Wdouble-promotion cast --- src/utils/ChaperoneUtils.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/utils/ChaperoneUtils.cpp b/src/utils/ChaperoneUtils.cpp index 0422e6c..3945694 100644 --- a/src/utils/ChaperoneUtils.cpp +++ b/src/utils/ChaperoneUtils.cpp @@ -29,10 +29,14 @@ float ChaperoneUtils::_getDistanceToChaperone( { // projected point outside of segment float d_x = r0.v[0] - x.v[0]; float d_z = r0.v[2] - x.v[2]; - float d1 = sqrt( static_cast( d_x * d_x + d_z * d_z ) ); + // Crazy casts because clang sees the sqrt call as wanting a double. + float d1 = static_cast( + sqrt( static_cast( d_x * d_x + d_z * d_z ) ) ); d_x = r1.v[0] - x.v[0]; d_z = r1.v[2] - x.v[2]; - float d2 = sqrt( static_cast( d_x * d_x + d_z * d_z ) ); + // Crazy casts because clang sees the sqrt call as wanting a double. + float d2 = static_cast( + sqrt( static_cast( d_x * d_x + d_z * d_z ) ) ); if ( d1 < d2 ) { d = d1; @@ -52,7 +56,9 @@ float ChaperoneUtils::_getDistanceToChaperone( x1_z = r0.v[2] + r * u_z; float d_x = x1_x - x.v[0]; float d_z = x1_z - x.v[2]; - d = sqrt( static_cast( d_x * d_x + d_z * d_z ) ); + // Crazy casts because clang sees the sqrt call as wanting a double. + d = static_cast( + sqrt( static_cast( d_x * d_x + d_z * d_z ) ) ); } if ( std::isnan( distance ) || d < distance ) { From cfefec59e358219af290426d82222871fa0f7fa0 Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 16:53:42 +0100 Subject: [PATCH 46/68] Fix -Wsign-conversion warnings --- build_scripts/qt/compilers/clang-msvc.pri | 2 +- src/tabcontrollers/AudioTabController.cpp | 4 ++-- src/tabcontrollers/ChaperoneTabController.cpp | 4 ++-- src/tabcontrollers/PttController.cpp | 7 ++++--- src/tabcontrollers/ReviveTabController.cpp | 4 ++-- src/tabcontrollers/SteamVRTabController.cpp | 4 ++-- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri index b7f3398..a554020 100644 --- a/build_scripts/qt/compilers/clang-msvc.pri +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -15,4 +15,4 @@ QMAKE_CXXFLAGS += -Wmost QMAKE_CXXFLAGS += -Weffc++ #QMAKE_CXXFLAGS += -Wconversion -#QMAKE_CXXFLAGS += -Wsign-conversion +QMAKE_CXXFLAGS += -Wsign-conversion diff --git a/src/tabcontrollers/AudioTabController.cpp b/src/tabcontrollers/AudioTabController.cpp index 9dcfedf..f1faebe 100644 --- a/src/tabcontrollers/AudioTabController.cpp +++ b/src/tabcontrollers/AudioTabController.cpp @@ -750,7 +750,7 @@ void AudioTabController::reloadAudioProfiles() { settings->setArrayIndex( i ); audioProfiles.emplace_back(); - auto& entry = audioProfiles[i]; + auto& entry = audioProfiles[static_cast( i )]; entry.profileName = settings->value( "profileName" ).toString().toStdString(); entry.playbackName @@ -1044,7 +1044,7 @@ void AudioTabController::applyDefaultProfile() if ( profile.defaultProfile ) { applyAudioProfile( i ); - m_defaultProfileIndex = i; + m_defaultProfileIndex = static_cast( i ); break; } } diff --git a/src/tabcontrollers/ChaperoneTabController.cpp b/src/tabcontrollers/ChaperoneTabController.cpp index 752c852..0fd5de3 100644 --- a/src/tabcontrollers/ChaperoneTabController.cpp +++ b/src/tabcontrollers/ChaperoneTabController.cpp @@ -70,7 +70,7 @@ void ChaperoneTabController::reloadChaperoneProfiles() { settings->setArrayIndex( i ); chaperoneProfiles.emplace_back(); - auto& entry = chaperoneProfiles[i]; + auto& entry = chaperoneProfiles[static_cast( i )]; entry.profileName = settings->value( "profileName" ).toString().toStdString(); entry.includesChaperoneGeometry @@ -229,7 +229,7 @@ void ChaperoneTabController::saveChaperoneProfiles() unsigned i = 0; for ( auto& p : chaperoneProfiles ) { - settings->setArrayIndex( i ); + settings->setArrayIndex( static_cast( i ) ); settings->setValue( "profileName", QString::fromStdString( p.profileName ) ); settings->setValue( "includesChaperoneGeometry", diff --git a/src/tabcontrollers/PttController.cpp b/src/tabcontrollers/PttController.cpp index 99412f6..5119cdf 100644 --- a/src/tabcontrollers/PttController.cpp +++ b/src/tabcontrollers/PttController.cpp @@ -65,7 +65,7 @@ void PttController::reloadPttProfiles() { settings->setArrayIndex( i ); pttProfiles.emplace_back(); - auto& entry = pttProfiles[i]; + auto& entry = pttProfiles[static_cast( i )]; entry.profileName = settings->value( "profileName" ).toString().toStdString(); entry.showNotification @@ -117,7 +117,7 @@ void PttController::savePttProfiles() unsigned i = 0; for ( auto& p : pttProfiles ) { - settings->setArrayIndex( i ); + settings->setArrayIndex( static_cast( i ) ); settings->setValue( "profileName", QString::fromStdString( p.profileName ) ); settings->setValue( "showNotification", p.showNotification ); @@ -359,7 +359,8 @@ unsigned long PttController::pttDigitalButtonMask( unsigned controller ) { if ( controller < 2 ) { - return m_pttControllerConfigs[controller].digitalButtonMask; + return static_cast( + m_pttControllerConfigs[controller].digitalButtonMask ); } return 0; } diff --git a/src/tabcontrollers/ReviveTabController.cpp b/src/tabcontrollers/ReviveTabController.cpp index 61b66d6..50a6f81 100644 --- a/src/tabcontrollers/ReviveTabController.cpp +++ b/src/tabcontrollers/ReviveTabController.cpp @@ -1207,7 +1207,7 @@ void ReviveTabController::reloadControllerProfiles() { settings->setArrayIndex( i ); controllerProfiles.emplace_back(); - auto& entry = controllerProfiles[i]; + auto& entry = controllerProfiles[static_cast( i )]; entry.profileName = settings->value( "profileName" ).toString().toStdString(); entry.gripButtonMode = settings->value( "gripButtonMode", 0 ).toInt(); @@ -1234,7 +1234,7 @@ void ReviveTabController::saveControllerProfiles() unsigned i = 0; for ( auto& p : controllerProfiles ) { - settings->setArrayIndex( i ); + settings->setArrayIndex( static_cast( i ) ); settings->setValue( "profileName", QString::fromStdString( p.profileName ) ); settings->setValue( "gripButtonMode", p.gripButtonMode ); diff --git a/src/tabcontrollers/SteamVRTabController.cpp b/src/tabcontrollers/SteamVRTabController.cpp index d94332d..d7912de 100644 --- a/src/tabcontrollers/SteamVRTabController.cpp +++ b/src/tabcontrollers/SteamVRTabController.cpp @@ -204,7 +204,7 @@ void SteamVRTabController::reloadSteamVRProfiles() { settings->setArrayIndex( i ); steamvrProfiles.emplace_back(); - auto& entry = steamvrProfiles[i]; + auto& entry = steamvrProfiles[static_cast( i )]; entry.profileName = settings->value( "profileName" ).toString().toStdString(); entry.includesSupersampling @@ -243,7 +243,7 @@ void SteamVRTabController::saveSteamVRProfiles() unsigned i = 0; for ( auto& p : steamvrProfiles ) { - settings->setArrayIndex( i ); + settings->setArrayIndex( static_cast( i ) ); settings->setValue( "profileName", QString::fromStdString( p.profileName ) ); settings->setValue( "includesSupersampling", p.includesSupersampling ); From 775d0e0e3640361d257389fd2b9ad86059b633b8 Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 18:11:54 +0100 Subject: [PATCH 47/68] Fix -Wsign-conversion warnings in easylogging++ --- third-party/easylogging++/easylogging++.cc | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/third-party/easylogging++/easylogging++.cc b/third-party/easylogging++/easylogging++.cc index fcbb6da..8995ea8 100644 --- a/third-party/easylogging++/easylogging++.cc +++ b/third-party/easylogging++/easylogging++.cc @@ -1190,7 +1190,7 @@ std::string DateTime::timevalToString(struct timeval tval, const char* format, buildTimeInfo(&tval, &timeInfo); const int kBuffSize = 30; char buff_[kBuffSize] = ""; - parseFormat(buff_, kBuffSize, format, &timeInfo, static_cast(tval.tv_usec / ssPrec->m_offset), + parseFormat(buff_, kBuffSize, format, &timeInfo, static_cast(tval.tv_usec) / ssPrec->m_offset, ssPrec); return std::string(buff_); } @@ -1264,7 +1264,7 @@ char* DateTime::parseFormat(char* buf, std::size_t bufSz, const char* format, co --format; break; case 'd': // Day - buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_mday, 2, buf, bufLim); + buf = base::utils::Str::convertAndAddToBuff(static_cast(tInfo->tm_mday), 2, buf, bufLim); continue; case 'a': // Day of week (short) buf = base::utils::Str::addToBuff(base::consts::kDaysAbbrev[tInfo->tm_wday], buf, bufLim); @@ -1273,7 +1273,7 @@ char* DateTime::parseFormat(char* buf, std::size_t bufSz, const char* format, co buf = base::utils::Str::addToBuff(base::consts::kDays[tInfo->tm_wday], buf, bufLim); continue; case 'M': // month - buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_mon + 1, 2, buf, bufLim); + buf = base::utils::Str::convertAndAddToBuff(static_cast(tInfo->tm_mon + 1), 2, buf, bufLim); continue; case 'b': // month (short) buf = base::utils::Str::addToBuff(base::consts::kMonthsAbbrev[tInfo->tm_mon], buf, bufLim); @@ -1282,22 +1282,22 @@ char* DateTime::parseFormat(char* buf, std::size_t bufSz, const char* format, co buf = base::utils::Str::addToBuff(base::consts::kMonths[tInfo->tm_mon], buf, bufLim); continue; case 'y': // year (two digits) - buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_year + base::consts::kYearBase, 2, buf, bufLim); + buf = base::utils::Str::convertAndAddToBuff(static_cast(tInfo->tm_year + base::consts::kYearBase), 2, buf, bufLim); continue; case 'Y': // year (four digits) - buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_year + base::consts::kYearBase, 4, buf, bufLim); + buf = base::utils::Str::convertAndAddToBuff(static_cast(tInfo->tm_year + base::consts::kYearBase), 4, buf, bufLim); continue; case 'h': // hour (12-hour) buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_hour % 12, 2, buf, bufLim); continue; case 'H': // hour (24-hour) - buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_hour, 2, buf, bufLim); + buf = base::utils::Str::convertAndAddToBuff(static_cast(tInfo->tm_hour), 2, buf, bufLim); continue; case 'm': // minute - buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_min, 2, buf, bufLim); + buf = base::utils::Str::convertAndAddToBuff(static_cast(tInfo->tm_min), 2, buf, bufLim); continue; case 's': // second - buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_sec, 2, buf, bufLim); + buf = base::utils::Str::convertAndAddToBuff(static_cast(tInfo->tm_sec), 2, buf, bufLim); continue; case 'z': // subsecond part case 'g': @@ -1553,7 +1553,7 @@ void LogFormat::updateDateFormat(std::size_t index, base::type::string_t& currFo } ss << static_cast(*ptr); } - currFormat.erase(index, count); + currFormat.erase(index, static_cast(count)); m_dateTimeFormat = ss.str(); } else { // No format provided, use default @@ -1737,7 +1737,7 @@ unsigned long TypedConfigurations::getULong(std::string confVal) { ELPP_ASSERT(valid, "Configuration value not a valid integer [" << confVal << "]"); return 0; } - return atol(confVal.c_str()); + return static_cast(atol(confVal.c_str())); } std::string TypedConfigurations::resolveFilename(const std::string& filename) { @@ -1765,7 +1765,7 @@ std::string TypedConfigurations::resolveFilename(const std::string& filename) { } ss << *ptr; } - resultingFilename.erase(dateIndex + dateTimeFormatSpecifierStr.size(), count); + resultingFilename.erase(dateIndex + dateTimeFormatSpecifierStr.size(), static_cast(count)); fmt = ss.str(); } else { fmt = std::string(base::consts::kDefaultDateTimeFormatInFilename); @@ -2219,7 +2219,7 @@ void DefaultLogDispatchCallback::dispatch(base::type::string_t&& logLine) { base::type::fstream_t* fs = m_data->logMessage()->logger()->m_typedConfigurations->fileStream( m_data->logMessage()->level()); if (fs != nullptr) { - fs->write(logLine.c_str(), logLine.size()); + fs->write(logLine.c_str(), static_cast(logLine.size())); if (fs->fail()) { ELPP_INTERNAL_ERROR("Unable to write log to file [" << m_data->logMessage()->logger()->m_typedConfigurations->filename(m_data->logMessage()->level()) << "].\n" @@ -2541,7 +2541,7 @@ Writer& Writer::construct(int count, const char* loggerIds, ...) { va_list loggersList; va_start(loggersList, loggerIds); const char* id = loggerIds; - m_loggerIds.reserve(count); + m_loggerIds.reserve(static_cast(count)); for (int i = 0; i < count; ++i) { m_loggerIds.push_back(std::string(id)); id = va_arg(loggersList, const char*); From 29d41b4ed0ab2f9a7699ac5f0cc35146ff6642d5 Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 18:29:22 +0100 Subject: [PATCH 48/68] Add -Wconversion to GCC and Clang clang-msvc spams warnings from the moc .cpp files that include Qt headers. --- build_scripts/qt/compilers/clang-msvc.pri | 4 ++-- build_scripts/qt/compilers/clang.pri | 2 +- build_scripts/qt/compilers/gcc.pri | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri index a554020..d80d1c5 100644 --- a/build_scripts/qt/compilers/clang-msvc.pri +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -14,5 +14,5 @@ QMAKE_CXXFLAGS += -Wmost QMAKE_CXXFLAGS += -Weffc++ -#QMAKE_CXXFLAGS += -Wconversion -QMAKE_CXXFLAGS += -Wsign-conversion +#clang-msvc spams warnings on -Wconversion and -Wsign-conversion +# from the moc .cpp files including Qt stuff. diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index 39ebd07..0c16ae1 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -8,4 +8,4 @@ QMAKE_CXXFLAGS += -Werror #All includes from the third-party directory will not warn. QMAKE_CXXFLAGS += --system-header-prefix=third-party -QMAKE_CXXFLAGS += -Weffc++ +QMAKE_CXXFLAGS += -Weffc++ -Wconversion diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index df05be5..984ccdf 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -9,3 +9,5 @@ QMAKE_CXXFLAGS += -Werror # GCC only switches QMAKE_CXXFLAGS += -Wduplicated-branches -Wduplicated-cond -Wlogical-op -Wrestrict -Wnull-dereference + +QMAKE_CXXFLAGS += -Wconversion From b861ae00751e413603e0352ae0795221e51e2810 Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 18:44:41 +0100 Subject: [PATCH 49/68] Fix -Wfloat-conversion warnings --- src/overlaycontroller.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index 0b633bf..fa2e92b 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -351,13 +351,18 @@ void OverlayController::SetWidget( QQuickItem* quickItem, QOpenGLFramebufferObject::CombinedDepthStencil ); fboFormat.setTextureTarget( GL_TEXTURE_2D ); m_pFbo.reset( new QOpenGLFramebufferObject( - quickItem->width(), quickItem->height(), fboFormat ) ); + static_cast( quickItem->width() ), + static_cast( quickItem->height() ), + fboFormat ) ); m_pRenderControl.reset( new QQuickRenderControl() ); m_pWindow.reset( new QQuickWindow( m_pRenderControl.get() ) ); m_pWindow->setRenderTarget( m_pFbo.get() ); quickItem->setParentItem( m_pWindow->contentItem() ); - m_pWindow->setGeometry( 0, 0, quickItem->width(), quickItem->height() ); + m_pWindow->setGeometry( 0, + 0, + static_cast( quickItem->width() ), + static_cast( quickItem->height() ) ); m_pRenderControl->initialize( m_pOpenGLContext.get() ); vr::HmdVector2_t vecWindowSize @@ -464,7 +469,7 @@ QPoint OverlayController::getMousePositionForEvent( vr::VREvent_Mouse_t mouse ) float h = static_cast( m_pWindow->height() ); y = h - y; #endif - return QPoint( mouse.x, y ); + return QPoint( static_cast( mouse.x ), static_cast( y ) ); } void OverlayController::processMediaKeyBindings() @@ -640,8 +645,10 @@ void OverlayController::mainEventLoop() m_ptLastMouse, m_pWindow->mapToGlobal( m_ptLastMouse ), QPoint(), - QPoint( vrEvent.data.scroll.xdelta * 360.0f * 8.0f, - vrEvent.data.scroll.ydelta * 360.0f * 8.0f ), + QPoint( static_cast( vrEvent.data.scroll.xdelta * 360.0f + * 8.0f ), + static_cast( vrEvent.data.scroll.ydelta * 360.0f + * 8.0f ) ), 0, Qt::Vertical, m_lastMouseButtons, @@ -688,7 +695,8 @@ void OverlayController::mainEventLoop() char keyboardBuffer[1024]; vr::VROverlay()->GetKeyboardText( keyboardBuffer, 1024 ); emit keyBoardInputSignal( QString( keyboardBuffer ), - vrEvent.data.keyboard.uUserValue ); + static_cast( + vrEvent.data.keyboard.uUserValue ) ); } break; From cff2fc7eba46264fb40531e89f28f8590fa6be48 Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 18:51:29 +0100 Subject: [PATCH 50/68] Fix more -Wfloat-conversion warnings --- src/tabcontrollers/ChaperoneTabController.cpp | 7 ++++--- src/tabcontrollers/StatisticsTabController.cpp | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/tabcontrollers/ChaperoneTabController.cpp b/src/tabcontrollers/ChaperoneTabController.cpp index 0fd5de3..eb4c372 100644 --- a/src/tabcontrollers/ChaperoneTabController.cpp +++ b/src/tabcontrollers/ChaperoneTabController.cpp @@ -733,9 +733,10 @@ void ChaperoneTabController::setBoundsVisibility( float value, bool notify ) if ( m_visibility != value ) { m_visibility = value; - vr::VRSettings()->SetInt32( vr::k_pch_CollisionBounds_Section, - vr::k_pch_CollisionBounds_ColorGammaA_Int32, - 255 * m_visibility ); + vr::VRSettings()->SetInt32( + vr::k_pch_CollisionBounds_Section, + vr::k_pch_CollisionBounds_ColorGammaA_Int32, + static_cast( 255 * m_visibility ) ); vr::VRSettings()->Sync(); if ( notify ) { diff --git a/src/tabcontrollers/StatisticsTabController.cpp b/src/tabcontrollers/StatisticsTabController.cpp index 89e7713..66ed5fe 100644 --- a/src/tabcontrollers/StatisticsTabController.cpp +++ b/src/tabcontrollers/StatisticsTabController.cpp @@ -93,7 +93,7 @@ void StatisticsTabController::eventLoopTick( float StatisticsTabController::hmdDistanceMoved() const { - return m_hmdDistanceMoved; + return static_cast( m_hmdDistanceMoved ); } float StatisticsTabController::hmdRotations() const From dacfe054254e89f76b8b4fa36447bac47b62f5dc Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 19:04:01 +0100 Subject: [PATCH 51/68] Fix -Wconversion --- src/tabcontrollers/ChaperoneTabController.cpp | 4 ++-- src/tabcontrollers/StatisticsTabController.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tabcontrollers/ChaperoneTabController.cpp b/src/tabcontrollers/ChaperoneTabController.cpp index eb4c372..dfbac39 100644 --- a/src/tabcontrollers/ChaperoneTabController.cpp +++ b/src/tabcontrollers/ChaperoneTabController.cpp @@ -654,10 +654,10 @@ void ChaperoneTabController::eventLoopTick( if ( parent->isDashboardVisible() ) { vr::EVRSettingsError vrSettingsError; - float vis = vr::VRSettings()->GetInt32( + float vis = static_cast( vr::VRSettings()->GetInt32( vr::k_pch_CollisionBounds_Section, vr::k_pch_CollisionBounds_ColorGammaA_Int32, - &vrSettingsError ); + &vrSettingsError ) ); if ( vrSettingsError != vr::VRSettingsError_None ) { LOG( WARNING ) diff --git a/src/tabcontrollers/StatisticsTabController.cpp b/src/tabcontrollers/StatisticsTabController.cpp index 66ed5fe..44fa847 100644 --- a/src/tabcontrollers/StatisticsTabController.cpp +++ b/src/tabcontrollers/StatisticsTabController.cpp @@ -48,10 +48,10 @@ void StatisticsTabController::eventLoopTick( } else { - float delta = std::sqrt( + float delta = static_cast( std::sqrt( std::pow( m[0][3] - lastHmdPos[0], 2 ) /*+ std::pow(m[1][3] - lastHmdPos[1], 2)*/ - + std::pow( m[2][3] - lastHmdPos[2], 2 ) ); + + std::pow( m[2][3] - lastHmdPos[2], 2 ) ) ); if ( delta >= 0.01f ) { m_hmdDistanceMoved += static_cast( delta ); From c8709888d0fca975cc4a4a1d2261456104a139c5 Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 19:21:35 +0100 Subject: [PATCH 52/68] Add -Wno-sign-conversion to GCC and clang The auto generated Qt MOC .cpp files contain warnings that can't be fixed. --- build_scripts/qt/compilers/clang.pri | 3 ++- build_scripts/qt/compilers/gcc.pri | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index 0c16ae1..228ca95 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -8,4 +8,5 @@ QMAKE_CXXFLAGS += -Werror #All includes from the third-party directory will not warn. QMAKE_CXXFLAGS += --system-header-prefix=third-party -QMAKE_CXXFLAGS += -Weffc++ -Wconversion +# Sign conversion warns on auto generated Qt MOC files. +QMAKE_CXXFLAGS += -Weffc++ -Wconversion -Wno-sign-conversion diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index 984ccdf..0da6167 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -10,4 +10,5 @@ QMAKE_CXXFLAGS += -Werror # GCC only switches QMAKE_CXXFLAGS += -Wduplicated-branches -Wduplicated-cond -Wlogical-op -Wrestrict -Wnull-dereference -QMAKE_CXXFLAGS += -Wconversion +# Sign conversion warns on auto generated Qt MOC files. +QMAKE_CXXFLAGS += -Wconversion -Wno-sign-conversion From e99b36f610970abe925e7bef44d169fa53497a2b Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 19:33:35 +0100 Subject: [PATCH 53/68] Fix GCC -Werror=conversion in easylogging++ --- third-party/easylogging++/easylogging++.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/third-party/easylogging++/easylogging++.cc b/third-party/easylogging++/easylogging++.cc index 8995ea8..7b9f51e 100644 --- a/third-party/easylogging++/easylogging++.cc +++ b/third-party/easylogging++/easylogging++.cc @@ -1199,10 +1199,10 @@ base::type::string_t DateTime::formatTime(unsigned long long time, base::Timesta base::type::EnumType start = static_cast(timestampUnit); const base::type::char_t* unit = base::consts::kTimeFormats[start].unit; for (base::type::EnumType i = start; i < base::consts::kTimeFormatsCount - 1; ++i) { - if (time <= base::consts::kTimeFormats[i].value) { + if (static_cast(time <= base::consts::kTimeFormats[i].value)) { break; } - if (base::consts::kTimeFormats[i].value == 1000.0 && time / 1000.0f < 1.9f) { + if (base::consts::kTimeFormats[i].value == 1000.0 && static_cast(time) / 1000.0f < 1.9f) { break; } time /= static_cast(base::consts::kTimeFormats[i].value); From a93c7500d30bfcfa37fb20fd3dd37370d8c41c13 Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 19:39:31 +0100 Subject: [PATCH 54/68] Fix GCC -Werror=conversion Was mistakenly cast to long long unsigned int instead of double. --- third-party/easylogging++/easylogging++.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/easylogging++/easylogging++.cc b/third-party/easylogging++/easylogging++.cc index 7b9f51e..816203c 100644 --- a/third-party/easylogging++/easylogging++.cc +++ b/third-party/easylogging++/easylogging++.cc @@ -1199,7 +1199,7 @@ base::type::string_t DateTime::formatTime(unsigned long long time, base::Timesta base::type::EnumType start = static_cast(timestampUnit); const base::type::char_t* unit = base::consts::kTimeFormats[start].unit; for (base::type::EnumType i = start; i < base::consts::kTimeFormatsCount - 1; ++i) { - if (static_cast(time <= base::consts::kTimeFormats[i].value)) { + if (static_cast(time <= base::consts::kTimeFormats[i].value)) { break; } if (base::consts::kTimeFormats[i].value == 1000.0 && static_cast(time) / 1000.0f < 1.9f) { From d66e50e318c13dbd946784bbc8630e802c481577 Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 19:52:52 +0100 Subject: [PATCH 55/68] Fix wrongly placed parens --- third-party/easylogging++/easylogging++.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/easylogging++/easylogging++.cc b/third-party/easylogging++/easylogging++.cc index 816203c..f876396 100644 --- a/third-party/easylogging++/easylogging++.cc +++ b/third-party/easylogging++/easylogging++.cc @@ -1199,7 +1199,7 @@ base::type::string_t DateTime::formatTime(unsigned long long time, base::Timesta base::type::EnumType start = static_cast(timestampUnit); const base::type::char_t* unit = base::consts::kTimeFormats[start].unit; for (base::type::EnumType i = start; i < base::consts::kTimeFormatsCount - 1; ++i) { - if (static_cast(time <= base::consts::kTimeFormats[i].value)) { + if (static_cast(time) <= base::consts::kTimeFormats[i].value) { break; } if (base::consts::kTimeFormats[i].value == 1000.0 && static_cast(time) / 1000.0f < 1.9f) { From 896559cc20cc63a7e50851feb57686a5f602fe5b Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 20:18:57 +0100 Subject: [PATCH 56/68] Add -Wextra-semi and fix occurences --- build_scripts/qt/compilers/clang.pri | 2 ++ build_scripts/qt/compilers/gcc.pri | 2 ++ src/overlaycontroller.h | 2 +- src/tabcontrollers/AudioManager.h | 2 +- src/tabcontrollers/KeyboardInput.h | 2 +- src/tabcontrollers/PttController.h | 8 ++++---- src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp | 2 +- 7 files changed, 12 insertions(+), 8 deletions(-) diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index 228ca95..f897c2c 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -10,3 +10,5 @@ QMAKE_CXXFLAGS += --system-header-prefix=third-party # Sign conversion warns on auto generated Qt MOC files. QMAKE_CXXFLAGS += -Weffc++ -Wconversion -Wno-sign-conversion + +QMAKE_CXXFLAGS += -Wextra-semi diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index 0da6167..593351a 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -12,3 +12,5 @@ QMAKE_CXXFLAGS += -Wduplicated-branches -Wduplicated-cond -Wlogical-op -Wrestric # Sign conversion warns on auto generated Qt MOC files. QMAKE_CXXFLAGS += -Wconversion -Wno-sign-conversion + +QMAKE_CXXFLAGS += -Wextra-semi diff --git a/src/overlaycontroller.h b/src/overlaycontroller.h index 252f258..2a9f94f 100644 --- a/src/overlaycontroller.h +++ b/src/overlaycontroller.h @@ -165,7 +165,7 @@ public: bool isDesktopMode() { return m_desktopMode; - }; + } utils::ChaperoneUtils& chaperoneUtils() noexcept { diff --git a/src/tabcontrollers/AudioManager.h b/src/tabcontrollers/AudioManager.h index a60bc15..db33cd5 100644 --- a/src/tabcontrollers/AudioManager.h +++ b/src/tabcontrollers/AudioManager.h @@ -11,7 +11,7 @@ class AudioTabController; class AudioManager { public: - virtual ~AudioManager(){}; + virtual ~AudioManager() {} virtual void init( AudioTabController* controller ) = 0; diff --git a/src/tabcontrollers/KeyboardInput.h b/src/tabcontrollers/KeyboardInput.h index 8821552..a4e1ba7 100644 --- a/src/tabcontrollers/KeyboardInput.h +++ b/src/tabcontrollers/KeyboardInput.h @@ -11,7 +11,7 @@ class AudioTabController; class KeyboardInput { public: - virtual ~KeyboardInput(){}; + virtual ~KeyboardInput() {} virtual void sendKeyboardInput( QString input ) = 0; virtual void sendKeyboardEnter() = 0; diff --git a/src/tabcontrollers/PttController.h b/src/tabcontrollers/PttController.h index fe78662..2106697 100644 --- a/src/tabcontrollers/PttController.h +++ b/src/tabcontrollers/PttController.h @@ -71,10 +71,10 @@ protected: protected: void checkPttStatus(); virtual QString getSettingsName() = 0; - virtual void onPttStart(){}; - virtual void onPttStop(){}; - virtual void onPttEnabled(){}; - virtual void onPttDisabled(){}; + virtual void onPttStart() {} + virtual void onPttStop() {} + virtual void onPttEnabled() {} + virtual void onPttDisabled() {} virtual vr::VROverlayHandle_t getNotificationOverlayHandle() { diff --git a/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp index 4dd2585..b43d91e 100644 --- a/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp +++ b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp @@ -33,7 +33,7 @@ void fillKiStruct( INPUT& ip, WORD scanCode, bool keyup ) ip.ki.wScan = 0; ip.ki.dwExtraInfo = 0; ip.ki.time = 0; -}; +} /*! Calls SendInput on an INPUT struct and has associated error handling. From 9d463583094fcc67f73b0121c223a8835e72f6ee Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 20:28:38 +0100 Subject: [PATCH 57/68] Add -Wzero-as-null-pointer-constant and fix occurences --- build_scripts/qt/compilers/clang.pri | 2 +- build_scripts/qt/compilers/gcc.pri | 2 +- src/overlaycontroller.cpp | 8 ++++---- src/overlaycontroller.h | 2 +- .../audiomanager/AudioManagerWindows.cpp | 12 ++++++------ 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index f897c2c..3c433c0 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -11,4 +11,4 @@ QMAKE_CXXFLAGS += --system-header-prefix=third-party # Sign conversion warns on auto generated Qt MOC files. QMAKE_CXXFLAGS += -Weffc++ -Wconversion -Wno-sign-conversion -QMAKE_CXXFLAGS += -Wextra-semi +QMAKE_CXXFLAGS += -Wextra-semi -Wzero-as-null-pointer-constant diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index 593351a..634354a 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -13,4 +13,4 @@ QMAKE_CXXFLAGS += -Wduplicated-branches -Wduplicated-cond -Wlogical-op -Wrestric # Sign conversion warns on auto generated Qt MOC files. QMAKE_CXXFLAGS += -Wconversion -Wno-sign-conversion -QMAKE_CXXFLAGS += -Wextra-semi +QMAKE_CXXFLAGS += -Wextra-semi -Wzero-as-null-pointer-constant diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index fa2e92b..e694a3d 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -594,7 +594,7 @@ void OverlayController::mainEventLoop() m_pWindow->mapToGlobal( ptNewMouse ), Qt::NoButton, m_lastMouseButtons, - 0 ); + nullptr ); m_ptLastMouse = ptNewMouse; QCoreApplication::sendEvent( m_pWindow.get(), &mouseEvent ); OnRenderRequest(); @@ -615,7 +615,7 @@ void OverlayController::mainEventLoop() m_pWindow->mapToGlobal( ptNewMouse ), button, m_lastMouseButtons, - 0 ); + nullptr ); QCoreApplication::sendEvent( m_pWindow.get(), &mouseEvent ); } break; @@ -633,7 +633,7 @@ void OverlayController::mainEventLoop() m_pWindow->mapToGlobal( ptNewMouse ), button, m_lastMouseButtons, - 0 ); + nullptr ); QCoreApplication::sendEvent( m_pWindow.get(), &mouseEvent ); } break; @@ -652,7 +652,7 @@ void OverlayController::mainEventLoop() 0, Qt::Vertical, m_lastMouseButtons, - 0 ); + nullptr ); QCoreApplication::sendEvent( m_pWindow.get(), &wheelEvent ); } break; diff --git a/src/overlaycontroller.h b/src/overlaycontroller.h index 2a9f94f..f4b48ae 100644 --- a/src/overlaycontroller.h +++ b/src/overlaycontroller.h @@ -85,7 +85,7 @@ private: bool m_dashboardVisible = false; QPoint m_ptLastMouse; - Qt::MouseButtons m_lastMouseButtons = 0; + Qt::MouseButtons m_lastMouseButtons = nullptr; bool m_desktopMode; bool m_noSound; diff --git a/src/tabcontrollers/audiomanager/AudioManagerWindows.cpp b/src/tabcontrollers/audiomanager/AudioManagerWindows.cpp index bc0a5ce..5e1fa93 100644 --- a/src/tabcontrollers/audiomanager/AudioManagerWindows.cpp +++ b/src/tabcontrollers/audiomanager/AudioManagerWindows.cpp @@ -370,7 +370,7 @@ IMMDeviceEnumerator* AudioManagerWindows::getAudioDeviceEnumerator() { IMMDeviceEnumerator* pEnumerator; if ( CoCreateInstance( __uuidof( MMDeviceEnumerator ), - NULL, + nullptr, CLSCTX_ALL, __uuidof( IMMDeviceEnumerator ), reinterpret_cast( &pEnumerator ) ) @@ -387,14 +387,14 @@ IPolicyConfig* AudioManagerWindows::getPolicyConfig() // for Win 10 auto hr = CoCreateInstance( __uuidof( CPolicyConfigClient ), - NULL, + nullptr, CLSCTX_INPROC, IID_IPolicyConfig2, reinterpret_cast( &var_policyConfig ) ); if ( hr != S_OK ) { hr = CoCreateInstance( __uuidof( CPolicyConfigClient ), - NULL, + nullptr, CLSCTX_INPROC, IID_IPolicyConfig1, reinterpret_cast( &var_policyConfig ) ); @@ -403,7 +403,7 @@ IPolicyConfig* AudioManagerWindows::getPolicyConfig() if ( hr != S_OK ) { hr = CoCreateInstance( __uuidof( CPolicyConfigClient ), - NULL, + nullptr, CLSCTX_INPROC, IID_IPolicyConfig0, reinterpret_cast( &var_policyConfig ) ); @@ -471,7 +471,7 @@ IAudioEndpointVolume* IAudioEndpointVolume* pEndpointVolume; if ( device->Activate( __uuidof( IAudioEndpointVolume ), CLSCTX_INPROC_SERVER, - NULL, + nullptr, reinterpret_cast( &pEndpointVolume ) ) < 0 ) { @@ -546,7 +546,7 @@ HRESULT AudioManagerWindows::QueryInterface( REFIID riid, void** ppvObject ) } else { - *ppvObject = NULL; + *ppvObject = nullptr; return E_NOINTERFACE; } return S_OK; From 9ab0b1d62d00b1ff584fa9766bbea36e50acd810 Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 20:29:25 +0100 Subject: [PATCH 58/68] Remove -Wextra-semi for GCC It is not currently supported yet by GCC. --- build_scripts/qt/compilers/gcc.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_scripts/qt/compilers/gcc.pri b/build_scripts/qt/compilers/gcc.pri index 634354a..70fada3 100644 --- a/build_scripts/qt/compilers/gcc.pri +++ b/build_scripts/qt/compilers/gcc.pri @@ -13,4 +13,4 @@ QMAKE_CXXFLAGS += -Wduplicated-branches -Wduplicated-cond -Wlogical-op -Wrestric # Sign conversion warns on auto generated Qt MOC files. QMAKE_CXXFLAGS += -Wconversion -Wno-sign-conversion -QMAKE_CXXFLAGS += -Wextra-semi -Wzero-as-null-pointer-constant +QMAKE_CXXFLAGS += -Wzero-as-null-pointer-constant From 81ae0efd1c94ea9268f033b9140a34a8565ba78c Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 20:55:01 +0100 Subject: [PATCH 59/68] Add -Wmissing-variable-declarations to all clang/gcc compilers --- .../compilers/clang-gcc-common-switches.pri | 2 +- src/tabcontrollers/ReviveTabController.cpp | 38 +++++++++---------- src/tabcontrollers/UtilitiesTabController.cpp | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/build_scripts/qt/compilers/clang-gcc-common-switches.pri b/build_scripts/qt/compilers/clang-gcc-common-switches.pri index fca9988..9436a7c 100644 --- a/build_scripts/qt/compilers/clang-gcc-common-switches.pri +++ b/build_scripts/qt/compilers/clang-gcc-common-switches.pri @@ -8,4 +8,4 @@ QMAKE_CXXFLAGS += -Wnon-virtual-dtor QMAKE_CXXFLAGS += -Wcast-align -Wunused -Woverloaded-virtual -Wformat=2 -QMAKE_CXXFLAGS += -Wdouble-promotion +QMAKE_CXXFLAGS += -Wdouble-promotion -Wmissing-variable-declarations diff --git a/src/tabcontrollers/ReviveTabController.cpp b/src/tabcontrollers/ReviveTabController.cpp index 50a6f81..8c8e5ae 100644 --- a/src/tabcontrollers/ReviveTabController.cpp +++ b/src/tabcontrollers/ReviveTabController.cpp @@ -5,25 +5,25 @@ // application namespace namespace advsettings { -const char* appkey_overlay = "revive.dashboard.overlay"; -const char* section_revive = "revive"; -const char* key_pixelsPerDisplayPixel = "pixelsPerDisplayPixel"; -const char* key_toggleGrip = "ToggleGrip"; -const char* key_triggerAsGrip = "TriggerAsGrip"; -const char* key_toggleDelay = "ToggleDelay"; -const char* key_thumbDeadzone = "ThumbDeadzone"; -const char* key_thumbSensitivity = "ThumbSensitivity"; -const char* key_touchPitch = "TouchPitch"; -const char* key_touchYaw = "TouchYaw"; -const char* key_touchRoll = "TouchRoll"; -const char* key_touchX = "TouchX"; -const char* key_touchY = "TouchY"; -const char* key_touchZ = "TouchZ"; -const char* key_playerHeight = "PlayerHeight"; -const char* key_eyeHeight = "EyeHeight"; -const char* key_piUser = "User"; -const char* key_piName = "Name"; -const char* key_piGender = "Gender"; +constexpr auto appkey_overlay = "revive.dashboard.overlay"; +constexpr auto section_revive = "revive"; +constexpr auto key_pixelsPerDisplayPixel = "pixelsPerDisplayPixel"; +constexpr auto key_toggleGrip = "ToggleGrip"; +constexpr auto key_triggerAsGrip = "TriggerAsGrip"; +constexpr auto key_toggleDelay = "ToggleDelay"; +constexpr auto key_thumbDeadzone = "ThumbDeadzone"; +constexpr auto key_thumbSensitivity = "ThumbSensitivity"; +constexpr auto key_touchPitch = "TouchPitch"; +constexpr auto key_touchYaw = "TouchYaw"; +constexpr auto key_touchRoll = "TouchRoll"; +constexpr auto key_touchX = "TouchX"; +constexpr auto key_touchY = "TouchY"; +constexpr auto key_touchZ = "TouchZ"; +constexpr auto key_playerHeight = "PlayerHeight"; +constexpr auto key_eyeHeight = "EyeHeight"; +constexpr auto key_piUser = "User"; +constexpr auto key_piName = "Name"; +constexpr auto key_piGender = "Gender"; void ReviveTabController::initStage1( bool forceRevivePage ) { diff --git a/src/tabcontrollers/UtilitiesTabController.cpp b/src/tabcontrollers/UtilitiesTabController.cpp index b525541..9d9b305 100644 --- a/src/tabcontrollers/UtilitiesTabController.cpp +++ b/src/tabcontrollers/UtilitiesTabController.cpp @@ -12,7 +12,7 @@ // application namespace namespace advsettings { -const char* steamDesktopOverlaykey = "valve.steam.desktop"; +constexpr auto steamDesktopOverlaykey = "valve.steam.desktop"; void UtilitiesTabController::initStage1() { From 2da88237f28548bd37cef9b8ac9026b7afd24258 Mon Sep 17 00:00:00 2001 From: Vasily Date: Tue, 19 Feb 2019 21:05:17 +0100 Subject: [PATCH 60/68] Remove -Wmissing-variable-declaration from GCC GCC does not support it. --- build_scripts/qt/compilers/clang-gcc-common-switches.pri | 2 +- build_scripts/qt/compilers/clang-msvc.pri | 2 +- build_scripts/qt/compilers/clang.pri | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build_scripts/qt/compilers/clang-gcc-common-switches.pri b/build_scripts/qt/compilers/clang-gcc-common-switches.pri index 9436a7c..fca9988 100644 --- a/build_scripts/qt/compilers/clang-gcc-common-switches.pri +++ b/build_scripts/qt/compilers/clang-gcc-common-switches.pri @@ -8,4 +8,4 @@ QMAKE_CXXFLAGS += -Wnon-virtual-dtor QMAKE_CXXFLAGS += -Wcast-align -Wunused -Woverloaded-virtual -Wformat=2 -QMAKE_CXXFLAGS += -Wdouble-promotion -Wmissing-variable-declarations +QMAKE_CXXFLAGS += -Wdouble-promotion diff --git a/build_scripts/qt/compilers/clang-msvc.pri b/build_scripts/qt/compilers/clang-msvc.pri index d80d1c5..bdd6f8a 100644 --- a/build_scripts/qt/compilers/clang-msvc.pri +++ b/build_scripts/qt/compilers/clang-msvc.pri @@ -12,7 +12,7 @@ include(clang-gcc-common-switches.pri) QMAKE_CXXFLAGS += -Wmost -QMAKE_CXXFLAGS += -Weffc++ +QMAKE_CXXFLAGS += -Weffc++ -Wmissing-variable-declarations #clang-msvc spams warnings on -Wconversion and -Wsign-conversion # from the moc .cpp files including Qt stuff. diff --git a/build_scripts/qt/compilers/clang.pri b/build_scripts/qt/compilers/clang.pri index 3c433c0..146318e 100644 --- a/build_scripts/qt/compilers/clang.pri +++ b/build_scripts/qt/compilers/clang.pri @@ -11,4 +11,4 @@ QMAKE_CXXFLAGS += --system-header-prefix=third-party # Sign conversion warns on auto generated Qt MOC files. QMAKE_CXXFLAGS += -Weffc++ -Wconversion -Wno-sign-conversion -QMAKE_CXXFLAGS += -Wextra-semi -Wzero-as-null-pointer-constant +QMAKE_CXXFLAGS += -Wextra-semi -Wzero-as-null-pointer-constant -Wmissing-variable-declarations From 90ad7e72701dbcae45aa4a4f451285671f8fae45 Mon Sep 17 00:00:00 2001 From: Vasily Date: Thu, 21 Feb 2019 16:08:24 +0100 Subject: [PATCH 61/68] Remove extra parens --- src/overlaycontroller.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index e694a3d..42c3a21 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -431,11 +431,10 @@ void OverlayController::renderOverlay() #if defined _WIN64 || defined _LP64 // To avoid any compiler warning because of cast to a larger pointer // type (warning C4312 on VC) - vr::Texture_t texture - = { reinterpret_cast( - ( static_cast( unTexture ) ) ), - vr::TextureType_OpenGL, - vr::ColorSpace_Auto }; + vr::Texture_t texture = { reinterpret_cast( + static_cast( unTexture ) ), + vr::TextureType_OpenGL, + vr::ColorSpace_Auto }; #else vr::Texture_t texture = { reinterpret_cast( unTexture ), vr::TextureType_OpenGL, From 4814c4686f20d39accc47e8c44c057a80d476599 Mon Sep 17 00:00:00 2001 From: Vasily Date: Thu, 21 Feb 2019 16:11:14 +0100 Subject: [PATCH 62/68] Add brackets to optimize statement Not having brackets forces the compiler to see the statement as (xdelta * 360.0) * 8.0, which requires two `mulsd` operations. Adding the brackets only requires one. More details here https://github.com/OpenVR-Advanced-Settings/OpenVR-AdvancedSettings/pull/87 --- src/overlaycontroller.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index 42c3a21..2b525b3 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -644,10 +644,10 @@ void OverlayController::mainEventLoop() m_ptLastMouse, m_pWindow->mapToGlobal( m_ptLastMouse ), QPoint(), - QPoint( static_cast( vrEvent.data.scroll.xdelta * 360.0f - * 8.0f ), - static_cast( vrEvent.data.scroll.ydelta * 360.0f - * 8.0f ) ), + QPoint( static_cast( vrEvent.data.scroll.xdelta + * ( 360.0f * 8.0f ) ), + static_cast( vrEvent.data.scroll.ydelta + * ( 360.0f * 8.0f ) ) ), 0, Qt::Vertical, m_lastMouseButtons, From dbb1ab70e5a4d569c28f22563eaf2f07efbe8567 Mon Sep 17 00:00:00 2001 From: Vasily Date: Thu, 21 Feb 2019 16:32:54 +0100 Subject: [PATCH 63/68] Clarify cast in easylogging++ `tval.tv_usec` is a (signed) `long` and `ssPrec->m_offset` is an `unsigned int`. Clang warns upon realizing that we are attempting to divide a signed `long` with an `unsigned int`. Casting the `long` to `unsigned long` makes both operands `unsigned` and allows for auto conversion to `size_t`. The `size_t` cast is to make it apparent that the cast is correct. --- third-party/easylogging++/easylogging++.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/easylogging++/easylogging++.cc b/third-party/easylogging++/easylogging++.cc index f876396..16ceda2 100644 --- a/third-party/easylogging++/easylogging++.cc +++ b/third-party/easylogging++/easylogging++.cc @@ -1190,7 +1190,7 @@ std::string DateTime::timevalToString(struct timeval tval, const char* format, buildTimeInfo(&tval, &timeInfo); const int kBuffSize = 30; char buff_[kBuffSize] = ""; - parseFormat(buff_, kBuffSize, format, &timeInfo, static_cast(tval.tv_usec) / ssPrec->m_offset, + parseFormat(buff_, kBuffSize, format, &timeInfo, static_cast(static_cast(tval.tv_usec) / ssPrec->m_offset), ssPrec); return std::string(buff_); } From da25e58cbbad5eee59fa5e26d9314fa9cebfd6c2 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sat, 23 Feb 2019 23:45:00 +0100 Subject: [PATCH 64/68] Add clang-tidy, create Linux build script clang-tidy is currently set up with errors for all checks that do not warn. This is to prevent regressing the repo. Gradually these warnings should be removed in order to prevent further regresssions in warnings that do not have many occurences. --- .clang-tidy | 353 +++++++++++++++++++++++ .travis.yml | 13 +- build_scripts/linux/build_linux.sh | 26 ++ build_scripts/linux/format.sh | 1 + build_scripts/linux/run-clang-tidy.sh | 15 + build_scripts/linux/verify_formatting.sh | 1 + 6 files changed, 405 insertions(+), 4 deletions(-) create mode 100644 .clang-tidy create mode 100755 build_scripts/linux/build_linux.sh mode change 100644 => 100755 build_scripts/linux/format.sh create mode 100755 build_scripts/linux/run-clang-tidy.sh mode change 100644 => 100755 build_scripts/linux/verify_formatting.sh diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000..3b4c7c5 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,353 @@ +--- +Checks: '*, + -cert-err58-cpp, + -cppcoreguidelines-owning-memory, + -cppcoreguidelines-pro-bounds-array-to-pointer-decay, + -cppcoreguidelines-pro-bounds-constant-array-index, + -cppcoreguidelines-pro-bounds-pointer-arithmetic, + -cppcoreguidelines-pro-type-member-init, + -cppcoreguidelines-pro-type-reinterpret-cast, + -cppcoreguidelines-pro-type-vararg, + -cppcoreguidelines-special-member-functions, + -fuchsia-default-arguments, + -fuchsia-statically-constructed-objects, + -google-default-arguments, + -google-explicit-constructor, + -google-readability-braces-around-statements, + -google-readability-todo, + -google-runtime-int, + -google-runtime-references, + -hicpp-braces-around-statements, + -hicpp-explicit-conversions, + -hicpp-member-init, + -hicpp-no-array-decay, + -hicpp-signed-bitwise, + -hicpp-special-member-functions, + -hicpp-use-auto, + -hicpp-use-equals-default, + -hicpp-use-override, + -hicpp-vararg, + -llvm-header-guard, + -llvm-include-order, + -misc-string-compare, + -misc-unused-using-decls, + -modernize-loop-convert, + -modernize-make-unique, + -modernize-use-auto, + -modernize-use-equals-default, + -modernize-use-override, + -modernize-use-using, + -performance-for-range-copy, + -performance-unnecessary-value-param, + -readability-avoid-const-params-in-decls, + -readability-braces-around-statements, + -readability-else-after-return, + -readability-implicit-bool-conversion, + -readability-inconsistent-declaration-parameter-name, + -readability-non-const-parameter, + -readability-string-compare, + -readability-redundant-declaration, + -readability-redundant-member-init, + -readability-static-accessed-through-instance' +WarningsAsErrors: '*, + -cert-err58-cpp, + -cppcoreguidelines-owning-memory, + -cppcoreguidelines-pro-bounds-array-to-pointer-decay, + -cppcoreguidelines-pro-bounds-constant-array-index, + -cppcoreguidelines-pro-bounds-pointer-arithmetic, + -cppcoreguidelines-pro-type-member-init, + -cppcoreguidelines-pro-type-reinterpret-cast, + -cppcoreguidelines-pro-type-vararg, + -cppcoreguidelines-special-member-functions, + -fuchsia-default-arguments, + -google-default-arguments, + -google-explicit-constructor, + -google-readability-braces-around-statements, + -google-readability-todo, + -google-runtime-int, + -google-runtime-references, + -hicpp-braces-around-statements, + -hicpp-explicit-conversions, + -hicpp-member-init, + -hicpp-no-array-decay, + -hicpp-signed-bitwise, + -hicpp-special-member-functions, + -hicpp-use-auto, + -hicpp-use-equals-default, + -hicpp-use-override, + -hicpp-vararg, + -llvm-header-guard, + -llvm-include-order, + -misc-string-compare, + -misc-unused-using-decls, + -modernize-loop-convert, + -modernize-make-unique, + -modernize-use-auto, + -modernize-use-equals-default, + -modernize-use-override, + -modernize-use-using, + -performance-for-range-copy, + -performance-unnecessary-value-param, + -readability-avoid-const-params-in-decls, + -readability-braces-around-statements, + -readability-else-after-return, + -readability-implicit-bool-conversion, + -readability-inconsistent-declaration-parameter-name, + -readability-non-const-parameter, + -readability-redundant-declaration, + -readability-redundant-member-init, + -readability-static-accessed-through-instance' +HeaderFilterRegex: '.*' +AnalyzeTemporaryDtors: false +FormatStyle: none +CheckOptions: + - key: bugprone-argument-comment.StrictMode + value: '0' + - key: bugprone-assert-side-effect.AssertMacros + value: assert + - key: bugprone-assert-side-effect.CheckFunctionCalls + value: '0' + - key: bugprone-dangling-handle.HandleClasses + value: 'std::basic_string_view;std::experimental::basic_string_view' + - key: bugprone-string-constructor.LargeLengthThreshold + value: '8388608' + - key: bugprone-string-constructor.WarnOnLargeLength + value: '1' + - key: cert-dcl59-cpp.HeaderFileExtensions + value: ',h,hh,hpp,hxx' + - key: cert-err09-cpp.CheckThrowTemporaries + value: '1' + - key: cert-err61-cpp.CheckThrowTemporaries + value: '1' + - key: cert-oop11-cpp.IncludeStyle + value: llvm + - key: cppcoreguidelines-no-malloc.Allocations + value: '::malloc;::calloc' + - key: cppcoreguidelines-no-malloc.Deallocations + value: '::free' + - key: cppcoreguidelines-no-malloc.Reallocations + value: '::realloc' + - key: cppcoreguidelines-owning-memory.LegacyResourceConsumers + value: '::free;::realloc;::freopen;::fclose' + - key: cppcoreguidelines-owning-memory.LegacyResourceProducers + value: '::malloc;::aligned_alloc;::realloc;::calloc;::fopen;::freopen;::tmpfile' + - key: cppcoreguidelines-pro-bounds-constant-array-index.GslHeader + value: '' + - key: cppcoreguidelines-pro-bounds-constant-array-index.IncludeStyle + value: '0' + - key: cppcoreguidelines-pro-type-member-init.IgnoreArrays + value: '0' + - key: cppcoreguidelines-special-member-functions.AllowMissingMoveFunctions + value: '0' + - key: cppcoreguidelines-special-member-functions.AllowSoleDefaultDtor + value: '0' + - key: google-build-namespaces.HeaderFileExtensions + value: ',h,hh,hpp,hxx' + - key: google-global-names-in-headers.HeaderFileExtensions + value: ',h,hh,hpp,hxx' + - key: google-readability-braces-around-statements.ShortStatementLines + value: '1' + - key: google-readability-function-size.BranchThreshold + value: '4294967295' + - key: google-readability-function-size.LineThreshold + value: '4294967295' + - key: google-readability-function-size.NestingThreshold + value: '4294967295' + - key: google-readability-function-size.ParameterThreshold + value: '4294967295' + - key: google-readability-function-size.StatementThreshold + value: '800' + - key: google-readability-namespace-comments.ShortNamespaceLines + value: '10' + - key: google-readability-namespace-comments.SpacesBeforeComments + value: '2' + - key: google-runtime-int.SignedTypePrefix + value: int + - key: google-runtime-int.TypeSuffix + value: '' + - key: google-runtime-int.UnsignedTypePrefix + value: uint + - key: google-runtime-references.WhiteListTypes + value: '' + - key: hicpp-braces-around-statements.ShortStatementLines + value: '0' + - key: hicpp-function-size.BranchThreshold + value: '4294967295' + - key: hicpp-function-size.LineThreshold + value: '4294967295' + - key: hicpp-function-size.NestingThreshold + value: '4294967295' + - key: hicpp-function-size.ParameterThreshold + value: '4294967295' + - key: hicpp-function-size.StatementThreshold + value: '800' + - key: hicpp-member-init.IgnoreArrays + value: '0' + - key: hicpp-move-const-arg.CheckTriviallyCopyableMove + value: '1' + - key: hicpp-named-parameter.IgnoreFailedSplit + value: '0' + - key: hicpp-no-malloc.Allocations + value: '::malloc;::calloc' + - key: hicpp-no-malloc.Deallocations + value: '::free' + - key: hicpp-no-malloc.Reallocations + value: '::realloc' + - key: hicpp-special-member-functions.AllowMissingMoveFunctions + value: '0' + - key: hicpp-special-member-functions.AllowSoleDefaultDtor + value: '0' + - key: hicpp-use-auto.RemoveStars + value: '0' + - key: hicpp-use-emplace.ContainersWithPushBack + value: '::std::vector;::std::list;::std::deque' + - key: hicpp-use-emplace.SmartPointers + value: '::std::shared_ptr;::std::unique_ptr;::std::auto_ptr;::std::weak_ptr' + - key: hicpp-use-emplace.TupleMakeFunctions + value: '::std::make_pair;::std::make_tuple' + - key: hicpp-use-emplace.TupleTypes + value: '::std::pair;::std::tuple' + - key: hicpp-use-equals-default.IgnoreMacros + value: '1' + - key: hicpp-use-noexcept.ReplacementString + value: '' + - key: hicpp-use-noexcept.UseNoexceptFalse + value: '1' + - key: hicpp-use-nullptr.NullMacros + value: '' + - key: llvm-namespace-comment.ShortNamespaceLines + value: '1' + - key: llvm-namespace-comment.SpacesBeforeComments + value: '1' + - key: misc-definitions-in-headers.HeaderFileExtensions + value: ',h,hh,hpp,hxx' + - key: misc-definitions-in-headers.UseHeaderFileExtension + value: '1' + - key: misc-misplaced-widening-cast.CheckImplicitCasts + value: '0' + - key: misc-sizeof-expression.WarnOnSizeOfCompareToConstant + value: '1' + - key: misc-sizeof-expression.WarnOnSizeOfConstant + value: '1' + - key: misc-sizeof-expression.WarnOnSizeOfThis + value: '1' + - key: misc-suspicious-enum-usage.StrictMode + value: '0' + - key: misc-suspicious-missing-comma.MaxConcatenatedTokens + value: '5' + - key: misc-suspicious-missing-comma.RatioThreshold + value: '0.200000' + - key: misc-suspicious-missing-comma.SizeThreshold + value: '5' + - key: misc-suspicious-string-compare.StringCompareLikeFunctions + value: '' + - key: misc-suspicious-string-compare.WarnOnImplicitComparison + value: '1' + - key: misc-suspicious-string-compare.WarnOnLogicalNotComparison + value: '0' + - key: misc-throw-by-value-catch-by-reference.CheckThrowTemporaries + value: '1' + - key: modernize-loop-convert.MaxCopySize + value: '16' + - key: modernize-loop-convert.MinConfidence + value: reasonable + - key: modernize-loop-convert.NamingStyle + value: CamelCase + - key: modernize-make-shared.IgnoreMacros + value: '1' + - key: modernize-make-shared.IncludeStyle + value: '0' + - key: modernize-make-shared.MakeSmartPtrFunction + value: 'std::make_shared' + - key: modernize-make-shared.MakeSmartPtrFunctionHeader + value: memory + - key: modernize-make-unique.IgnoreMacros + value: '1' + - key: modernize-make-unique.IncludeStyle + value: '0' + - key: modernize-make-unique.MakeSmartPtrFunction + value: 'std::make_unique' + - key: modernize-make-unique.MakeSmartPtrFunctionHeader + value: memory + - key: modernize-pass-by-value.IncludeStyle + value: llvm + - key: modernize-pass-by-value.ValuesOnly + value: '0' + - key: modernize-raw-string-literal.ReplaceShorterLiterals + value: '0' + - key: modernize-replace-auto-ptr.IncludeStyle + value: llvm + - key: modernize-replace-random-shuffle.IncludeStyle + value: llvm + - key: modernize-use-auto.RemoveStars + value: '0' + - key: modernize-use-default-member-init.IgnoreMacros + value: '1' + - key: modernize-use-default-member-init.UseAssignment + value: '0' + - key: modernize-use-emplace.ContainersWithPushBack + value: '::std::vector;::std::list;::std::deque' + - key: modernize-use-emplace.SmartPointers + value: '::std::shared_ptr;::std::unique_ptr;::std::auto_ptr;::std::weak_ptr' + - key: modernize-use-emplace.TupleMakeFunctions + value: '::std::make_pair;::std::make_tuple' + - key: modernize-use-emplace.TupleTypes + value: '::std::pair;::std::tuple' + - key: modernize-use-equals-default.IgnoreMacros + value: '1' + - key: modernize-use-noexcept.ReplacementString + value: '' + - key: modernize-use-noexcept.UseNoexceptFalse + value: '1' + - key: modernize-use-nullptr.NullMacros + value: 'NULL' + - key: modernize-use-transparent-functors.SafeMode + value: '0' + - key: modernize-use-using.IgnoreMacros + value: '1' + - key: objc-forbidden-subclassing.ForbiddenSuperClassNames + value: 'ABNewPersonViewController;ABPeoplePickerNavigationController;ABPersonViewController;ABUnknownPersonViewController;NSHashTable;NSMapTable;NSPointerArray;NSPointerFunctions;NSTimer;UIActionSheet;UIAlertView;UIImagePickerController;UITextInputMode;UIWebView' + - key: objc-property-declaration.Acronyms + value: 'ASCII;PDF;XML;HTML;URL;RTF;HTTP;TIFF;JPG;PNG;GIF;LZW;ROM;RGB;CMYK;MIDI;FTP' + - key: performance-faster-string-find.StringLikeClasses + value: 'std::basic_string' + - key: performance-for-range-copy.WarnOnAllAutoCopies + value: '0' + - key: performance-inefficient-string-concatenation.StrictMode + value: '0' + - key: performance-inefficient-vector-operation.VectorLikeClasses + value: '::std::vector' + - key: performance-move-const-arg.CheckTriviallyCopyableMove + value: '1' + - key: performance-move-constructor-init.IncludeStyle + value: llvm + - key: performance-type-promotion-in-math-fn.IncludeStyle + value: llvm + - key: performance-unnecessary-value-param.IncludeStyle + value: llvm + - key: readability-braces-around-statements.ShortStatementLines + value: '0' + - key: readability-function-size.BranchThreshold + value: '4294967295' + - key: readability-function-size.LineThreshold + value: '4294967295' + - key: readability-function-size.NestingThreshold + value: '4294967295' + - key: readability-function-size.ParameterThreshold + value: '4294967295' + - key: readability-function-size.StatementThreshold + value: '800' + - key: readability-identifier-naming.IgnoreFailedSplit + value: '0' + - key: readability-implicit-bool-conversion.AllowIntegerConditions + value: '0' + - key: readability-implicit-bool-conversion.AllowPointerConditions + value: '0' + - key: readability-simplify-boolean-expr.ChainedConditionalAssignment + value: '0' + - key: readability-simplify-boolean-expr.ChainedConditionalReturn + value: '0' + - key: readability-static-accessed-through-instance.NameSpecifierNestingThreshold + value: '3' +... + diff --git a/.travis.yml b/.travis.yml index 20c31ff..4e8e424 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,10 +12,17 @@ matrix: - g++-7 env: - QMAKE_SPEC=linux-g++ + compiler: gcc - os: linux env: - QMAKE_SPEC=linux-clang + compiler: clang + + - os: linux + env: + - USE_TIDY=TRUE + compiler: clang before_install: - python ./build_scripts/run-clang-format.py ./src -r --color always @@ -24,9 +31,7 @@ install: - sudo add-apt-repository ppa:kubuntu-ppa/backports -y - sudo apt-get update -qq - sudo apt-get install build-essential qtbase5-dev qttools5-dev qtdeclarative5-dev qtmultimedia5-dev qt5-default qttools5-dev-tools + - sudo apt-get install bear clang-tidy script: - - mkdir build && cd build - - qmake --version - - qmake .. -spec $QMAKE_SPEC - - make + - ./build_scripts/linux/build_linux.sh diff --git a/build_scripts/linux/build_linux.sh b/build_scripts/linux/build_linux.sh new file mode 100755 index 0000000..0505611 --- /dev/null +++ b/build_scripts/linux/build_linux.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -e +if [[ -z $QMAKE_SPEC ]]; then + QMAKE_SPEC='linux-g++' +fi + +if [[ -z $USE_TIDY ]]; then + MAKE_COMMAND='make --jobs' + CLANG_TIDY= +else + # Bear replaces the compile database, it does not update it. + # If you run 'bear make' and there is nothing to compile, you + # will get an empty database. + # Clean up the artifacts and run everything together in that case. + MAKE_COMMAND='bear make --jobs' + QMAKE_SPEC='linux-clang' + CLANG_TIDY='../build_scripts/linux/run-clang-tidy.sh' +fi + +echo $MAKE_COMMAND +mkdir -p build +cd build +qmake --version +qmake -spec $QMAKE_SPEC .. +$MAKE_COMMAND +$CLANG_TIDY diff --git a/build_scripts/linux/format.sh b/build_scripts/linux/format.sh old mode 100644 new mode 100755 index 36f978c..8720bc7 --- a/build_scripts/linux/format.sh +++ b/build_scripts/linux/format.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +set -e clang-format --version diff --git a/build_scripts/linux/run-clang-tidy.sh b/build_scripts/linux/run-clang-tidy.sh new file mode 100755 index 0000000..a0ac8fd --- /dev/null +++ b/build_scripts/linux/run-clang-tidy.sh @@ -0,0 +1,15 @@ +set +e +clang-tidy --version + +ERROR=0 +for file in $(find ../src -name "*.cpp"); do + echo $file + clang-tidy $file + + EXIT=$? + if [[ $EXIT != 0 ]]; then + ERROR=1 + fi +done +set -e +exit $ERROR diff --git a/build_scripts/linux/verify_formatting.sh b/build_scripts/linux/verify_formatting.sh old mode 100644 new mode 100755 index 8ddd177..cdc4d05 --- a/build_scripts/linux/verify_formatting.sh +++ b/build_scripts/linux/verify_formatting.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +set -e clang-format --version; From 1ea554ccb43035300769ddae804435f16baabd4d Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 24 Feb 2019 17:34:43 +0100 Subject: [PATCH 65/68] Update docs on building on Linux --- Readme.md | 5 +---- docs/building_for_linux.md | 43 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 docs/building_for_linux.md diff --git a/Readme.md b/Readme.md index bdfbc03..0c06ee1 100644 --- a/Readme.md +++ b/Readme.md @@ -291,10 +291,7 @@ Full build instructions can be found [here](docs/building_for_windows.md). ## Building on Linux -If you want to run Advanced Settings on linux you can build it yourself using `qmake` and `make` or using Qt Creator, you'll have to copy the `res` folder from the `src` folder into folder that contains the binary -and copy `third-party/openvr/lib/linux64/libopenvr_api.so` into your systems library path. - -If you want to contribute changes running `clang-format` is necessary. More details are in the [CONTRIBUTING.md](docs/CONTRIBUTING.md) file. +Full build instructions can be found [here](docs/building_for_linux.md). # Notes: diff --git a/docs/building_for_linux.md b/docs/building_for_linux.md new file mode 100644 index 0000000..3e987a1 --- /dev/null +++ b/docs/building_for_linux.md @@ -0,0 +1,43 @@ +# Building for Linux + +- [Requirements](#requirements) +- [Locations and Environment Variables](#locations-and-environment-variables) +- [Building](#building) +- [Contributing](#contributing) + +## Requirements + +The following packages are necessary for compiling: + +`sudo apt install build-essential qtbase5-dev qttools5-dev qtdeclarative5-dev qtmultimedia5-dev qt5-default qttools5-dev-tools` + +If you install Qt 5.12 you should have the above packages. + +Along with either `clang` or `g++`. At least `g++-7` is required, due to C++17 support. + +For linting with `clang-tidy` the following are necessary: + +`sudo apt install bear clang-tidy` + +All applications are required to be in the `PATH`. + +## Locations and Environment Variables + +The following environmental variables are relevant for building the project. + +| Environment Variable | Purpose | +| -------------------- | ------------- | +| `QMAKE_SPEC` | The [mkspec](https://forum.qt.io/topic/70970/what-is-mkspecs-used-for-how-to-configure-for-my-hardware) to compile to. Either `linux-g++` or `linux-clang`. Defaults to `linux-g++`. | +| `USE_TIDY` | If set a compilation database will be created and the project linted. Can only be used with `clang`. | + +If an environment variable isn't set a default value will be provided. The default values are shown in the table below. + +## Building + +With the programs above installed and environment variables set, go into the root folder of the repository and run `./build_scripts/linux/build_linux.sh`. + +You'll have to copy the `res` directory into the resulting binary location, and add `third-party/openvr/lib/linux64/libopenvr_api.so` to your systems library path. + +## Contributing + +For full details, see [CONTRIBUTING.md](CONTRIBUTING.md). From b75957fbaa74fcc4ccc08af8b61f1071d95e6d91 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 24 Feb 2019 17:57:13 +0100 Subject: [PATCH 66/68] Fix typo in .gitattributes --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 1bfe6b5..7b1ae8e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -94,4 +94,4 @@ #Linux Shell Scripts #Windows Subsystem for Linux will not run CLRF files. -*.sh text eof=lf +*.sh text eol=lf From 321137984498ff8097b4e64d97097fd74b62eadf Mon Sep 17 00:00:00 2001 From: Vasily Date: Sun, 24 Feb 2019 18:59:14 +0100 Subject: [PATCH 67/68] Fix installer not putting default manifests in correct folder Fixes this https://github.com/OpenVR-Advanced-Settings/OpenVR-AdvancedSettings/issues/80 Including things with File "FILE\*.json" includes the file in the base directory. Including it with /R recursively includes the directory. --- installer/installer.nsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installer/installer.nsi b/installer/installer.nsi index aec2452..3f27c48 100644 --- a/installer/installer.nsi +++ b/installer/installer.nsi @@ -114,7 +114,7 @@ Section "Install" SecInstall ;Any action manifests File "${BASEDIR}\*.json" ;And their defaults - File "${BASEDIR}\default_action_manifests\*.json" + File /r "${BASEDIR}\default_action_manifests" File "${THIRDDIR}\openvr\bin\win64\*.dll" File "${BASEDIR}\*.dll" From 38a2765b10195db60231037c7af23705f522afe5 Mon Sep 17 00:00:00 2001 From: Vasily Date: Fri, 1 Mar 2019 21:52:12 +0100 Subject: [PATCH 68/68] Add proper exit to shutdown code The old shutdown code did not correctly exit but instead just continuously called the QApplication notify function until it SEGFAULTed. This led to crashes whenever SteamVR was shut down. Users with Windows Error Reporting turned on would get a 100+ MB crashdump file along with increased shutdown time for SteamVR. For clarity the shutdown functions should probably be collected in a single function. --- src/overlaycontroller.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index 2b525b3..dc073e2 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -671,9 +671,11 @@ void OverlayController::mainEventLoop() m_chaperoneTabController.shutdown(); Shutdown(); QApplication::exit(); - return; + + LOG( INFO ) << "All systems exited."; + exit( EXIT_SUCCESS ); + // Does not fallthrough } - break; case vr::VREvent_DashboardActivated: {

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 SrB%%n{9}i9vU-B@P5BqWiV*Ms diff --git a/src/res/qml/audio_page/profiles/ProfileButtons.qml b/src/res/qml/audio_page/profiles/ProfileButtons.qml index b7c3d84..ca9c48d 100644 --- a/src/res/qml/audio_page/profiles/ProfileButtons.qml +++ b/src/res/qml/audio_page/profiles/ProfileButtons.qml @@ -10,18 +10,10 @@ ColumnLayout { id: audioMessageDialog } - PttDeleteProfileDialog { - id: pttDeleteProfileDialog - } - AudioDeleteProfileDialog { id: audioDeleteProfileDialog } - PttNewProfileDialog { - id: pttNewProfileDialog - } - AudioNewProfileDialog { id: audioNewProfileDialog } @@ -61,38 +53,9 @@ ColumnLayout { } } } - MyText { - text: "PTT Profile:" - Layout.preferredWidth: 150 - } - - MyComboBox { - id: pttProfileComboBox - Layout.preferredWidth: 250 - model: [""] - onCurrentIndexChanged: { - if (currentIndex > 0) { - pttApplyProfileButton.enabled = true - pttDeleteProfileButton.enabled = true - } else { - pttApplyProfileButton.enabled = false - pttDeleteProfileButton.enabled = false - } - } - } - - MyPushButton { - id: pttApplyProfileButton - enabled: true - Layout.preferredWidth: 150 - text: "Apply" - onClicked: { - if (pttProfileComboBox.currentIndex > 0) { - AudioTabController.applyPttProfile( - pttProfileComboBox.currentIndex - 1) - } - } + // Text continues in next RowLayout. + text: "Change the Push To Talk settings" } } RowLayout { @@ -117,62 +80,27 @@ ColumnLayout { audioNewProfileDialog.openPopup() } } - Item { - Layout.fillWidth: true - } - MyPushButton { - id: pttDeleteProfileButton - enabled: true - Layout.preferredWidth: 200 - text: "Delete Profile" - onClicked: { - if (pttProfileComboBox.currentIndex > 0) { - pttDeleteProfileDialog.profileIndex = pttProfileComboBox.currentIndex - 1 - pttDeleteProfileDialog.open() - } - } - } - MyPushButton { - Layout.preferredWidth: 200 - text: "New Profile" - onClicked: { - pttNewProfileDialog.openPopup() - } + MyText { + // Text continues from RowLayout above. + text: "\t\tin the SteamVR bindings menu." } } Component.onCompleted: { - reloadPttProfiles() reloadAudioProfiles() } Connections { target: AudioTabController - onPttProfilesUpdated: { - reloadPttProfiles() - } onAudioProfilesUpdated: { reloadAudioProfiles() } onAudioProfileAdded: { audioProfileComboBox.currentIndex = AudioTabController.getAudioProfileCount() } - onPttProfileAdded: { - pttProfileComboBox.currentIndex = AudioTabController.getPttProfileCount() - } onDefaultProfileDisplay: { audioProfileComboBox.currentIndex = AudioTabController.getDefaultAudioProfileIndex( ) + 1 } } - function reloadPttProfiles() { - var profiles = [""] - var profileCount = AudioTabController.getPttProfileCount() - for (var i = 0; i < profileCount; i++) { - profiles.push(AudioTabController.getPttProfileName(i)) - } - pttProfileComboBox.currentIndex = 0 - pttProfileComboBox.model = profiles - } - function reloadAudioProfiles() { var profiles = [""] var profileCount = AudioTabController.getAudioProfileCount() diff --git a/src/res/qml/audio_page/push_to_talk/PttButtons.qml b/src/res/qml/audio_page/push_to_talk/PttButtons.qml index 37e84e6..d8eaf3d 100644 --- a/src/res/qml/audio_page/push_to_talk/PttButtons.qml +++ b/src/res/qml/audio_page/push_to_talk/PttButtons.qml @@ -6,6 +6,7 @@ import "../../common" ColumnLayout { RowLayout { + Layout.fillWidth: true PttControllerConfigDialog { id: pttControllerConfigDialog pttControllerConfigClass: AudioTabController @@ -13,47 +14,16 @@ ColumnLayout { MyToggleButton { id: audioPttEnabledToggle - Layout.preferredWidth: 260 + //Layout.preferredWidth: 260 + Layout.fillWidth: true text: "Push-to-Talk:" onClicked: { AudioTabController.pttEnabled = checked } } - MyToggleButton { - id: audioPttLeftControllerToggle - text: "Left Controller" - onClicked: { - AudioTabController.setPttLeftControllerEnabled(checked, false) - } - } - MyPushButton { - text: "Configure" - onClicked: { - pttControllerConfigDialog.openPopup(0) - } - } - Item { - Layout.fillWidth: true - } - MyToggleButton { - id: audioPttRightControllerToggle - text: "Right Controller" - onClicked: { - AudioTabController.setPttRightControllerEnabled(checked, false) - } - } - MyPushButton { - text: "Configure" - onClicked: { - pttControllerConfigDialog.openPopup(1) - } - } - } - RowLayout { - MyToggleButton { id: audioPttShowNotificationToggle - Layout.leftMargin: 350 + Layout.fillWidth: true text: "Show notification in HMD" onCheckedChanged: { AudioTabController.setPttShowNotification(checked, false) @@ -61,7 +31,7 @@ ColumnLayout { } MyToggleButton { id: audioPttReverseToggle - Layout.leftMargin: 118 + Layout.fillWidth: true text: "Push-to-Mute" onClicked: { AudioTabController.setMicReversePtt(checked, false) @@ -71,8 +41,6 @@ ColumnLayout { Component.onCompleted: { audioPttEnabledToggle.checked = AudioTabController.pttEnabled - audioPttLeftControllerToggle.checked = AudioTabController.pttLeftControllerEnabled - audioPttRightControllerToggle.checked = AudioTabController.pttRightControllerEnabled audioPttShowNotificationToggle.checked = AudioTabController.pttShowNotification audioPttReverseToggle.checked = AudioTabController.micReversePtt } @@ -81,12 +49,6 @@ ColumnLayout { onPttEnabledChanged: { audioPttEnabledToggle.checked = AudioTabController.pttEnabled } - onPttLeftControllerEnabledChanged: { - audioPttLeftControllerToggle.checked = AudioTabController.pttLeftControllerEnabled - } - onPttRightControllerEnabledChanged: { - audioPttRightControllerToggle.checked = AudioTabController.pttRightControllerEnabled - } onMicReversePttChanged: { audioPttReverseToggle.checked = AudioTabController.micReversePtt } From bb90e7a48b34eec8e317f2ced1485d695058b801 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sat, 16 Feb 2019 14:26:47 +0100 Subject: [PATCH 06/68] Remove deprecated AudioPage features from readme --- Readme.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Readme.md b/Readme.md index 827331d..6c56bef 100644 --- a/Readme.md +++ b/Readme.md @@ -214,12 +214,9 @@ Allows to temporarily move and rotate the center of the playspace. This allows t - **Mirror Device**: Allows to select the mirror device, set its volume and to mute/unmute it. - **Microphone**: Allows to select the microphone device, set its volume and to mute/unmute it. - **Proximity Sensor Mutes/Unmutes Microphone**: Allows the proximity sensor to mute the microphone when the user is not wearing the HMD, and to unmute it when the user is wearing the HMD. -- **Push-to-Talk**: Enable/disable push-to-talk. When push-to-talk is activated the microphone gets muted unless one of the configured buttons is pressed on one of the configured controllers. -- **Left Controller**: Configure the left controller for push-to-talk. -- **Right Controller**: Configure the right controller for push-to-talk. -- **Show Notification**: Shows a notification icon in the headset when push-to-talk is enabled a configured button is pressed. +- **Push-to-Talk**: Enable/disable push-to-talk. When push-to-talk is activated the microphone gets muted unless the Push To Talk action is activated. +- **Show Notification**: Shows a notification icon in the headset when the Push To Talk action is activated. - **Push-to-Mute**: Inverse push-to-talk. The Microphone is unmuted by default and muted when any of the configured buttons is pressed. -- **PTT Profile**: Allows you to apply/define/delete push-to-talk profiles that save buttons, controller and notification settings. - **Audio Profile**: Allows you to apply/define/delete audio profiles that save playback devices, mute state, and volume. From ae47f064472c0f93f3879ae96527102d11124863 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sat, 16 Feb 2019 14:35:37 +0100 Subject: [PATCH 07/68] Remove deprecated features from root page --- Readme.md | 2 +- docs/screenshots/RootPage.png | Bin 109733 -> 58896 bytes src/res/qml/RootPage.qml | 47 ---------------------------------- 3 files changed, 1 insertion(+), 48 deletions(-) diff --git a/Readme.md b/Readme.md index 6c56bef..bdfbc03 100644 --- a/Readme.md +++ b/Readme.md @@ -143,7 +143,7 @@ These version are not stable and this should be considered for advanced users on - **Supersampling Profile**: Allows to apply supersampling profiles. Profiles can be created on the SteamVR page - **Chaperone Profile**: Allows to apply chaperone profiles. Profiles can be created on the Chaperone page - **Microphone**: Allows to set the microphone volume and to mute/unmute it. -- **Push-to-Talk**: Enable/disable push-to-talk and allows to apply push-to-talk profiles. Profiles can be created on the Audio page. +- **Push-to-Talk**: Enable/disable push-to-talk. ## - SteamVR Page: diff --git a/docs/screenshots/RootPage.png b/docs/screenshots/RootPage.png index e4e6c20295a23945fca54c57fd681b2a29b8e605..6298c6a9ba54962dc8ba57f041934b32d48eb308 100644 GIT binary patch literal 58896 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%0Dbq z*Aus?{|sEFo!4Zdd|xb=;-%QG+T$=^ptqcuYL!)}BgoQNCbM8%8o`tLY2ky_!B&v|EQ zx#Idr4pdF7doVC%PxJ_PXKMMzeX=}cZ}l1}s_lhB&|!a@^Q^9GKxW%1LXi zbOO8&4VG`-dkwkiB-(p!HVG0^^&+vEqQmp)iOrCxKvECQZ+zQjKM!}i&G#UL43}d8 z%Xp_Sg##`cm!GZQMS` z`hB_YdW`rF!nA!sX3v97@WbFA=eG`rt`!&r=KzP+%YO^;MHg%J-v`l;@uI+eh6_lx zs!Ss0x=*ZF^n|YM9wy=RFSenK*!iubIRV`mwexObfXJmaC=-m$0XZb+-A2j68gBa# z%9)awek&gK5{ZG-7M@zT8_X{R3e`458~u?L2Lml`d&-<$0$rCRL)p!?7R`LTb#T{M zx(i!ooEzP@o#Z4_V(ks%Dw~6D9Dj@T6(kld!@mfg-8u3Lu-uAP?iSbONAV$F?e+8M zW!@6z26KfnDVEQ8W><86aE=p=BCxPr_SjjF0VOQm!xA>d^I{7B8n49aJ&Vt4Z0FfH zg?P;F=?o!z{~^XyAJqtXv0#faR7;hM{w>;-HoCUmntYjM+anm7z}1@{yV&N02#HdM zaV1@VSF_^u_!=yupT)yss)-Vj3)4_T`11^`3Op0X->CWb6W4k7C99ui)2oXu<yh=U`L<=q$v_C#?JIa+1`` z{abIoDHM;Ss`L=TW+xoZQ0YQ1sh)(M^FvIuYmk-1KY`$BFk@W z(h*cJrYY1+nJ`R+e|6F_%8kW1IQ?=)VVHj(?t00%nF%9XOVLygNNC>AOho)yBk9IF zfR(I7Js2Is)WzD!vv3v0@C_Rc!ol-D93|YuYHz^wJ%M1}p+~IHcv_%#7Cz?&u?3ff-dJVVm1c&!P1U~fXjl>sW250heKm+1d=$$bLl zCe%JRH{JsQ*%5jOro!N_24l7(?+i_pX zSL0pKe(S~axr+R8H@Mfyn?3-mLa{MSK<<+{ z^Fv~fsQs|7D54Fmi81-xr{!q1e@VUNiAtjY%WYhK=tSMEY()JK2`9L&RenT0lWGGQM~=*U%X6t#;I;Fd?8SYFXO z**ze%^PzuJzC@VoUt4doZ9UX?JdbWbRI9x7gN9K;>G-w>>h+V33@y@K$yjDlwz2)a zzLg)1i09604ri1KU`Xea*rooq70SymI(X5?tWT(%gzA16X%N@bFgA~(`f2=8pIZAP z34xniE#PuvofP%mYRSk446)YWdA5}~YsQ$?}m%`hw|RM=1^v`0O8{Xa}gAv3kRJwz@D$=e#|Gg8Wz4|Ty; z$p~Js6>!N*?6#Icr@*lFrulIa{$BD#wRi}-oKm&$Vgc7a#0SbkDR}}++LidU; zhspSnE*2>QwV2&pkTPNM0hwB+eZ=TwU^6&0(rr@G2SPw>@0WJCZ~!qP+IBhfqotfA%2bGVQ_RtzA+X=mu`r|BkN-{3azDYVgTLZ3l?12V z0D7~(R)a^C#geGq5%r!eBd^%q{ShrE&|o+^sp`aXbvWMPJ*31+73dJ^etko_gG^yz z@pU9Qv~6aOec71k?W+q2M`e3Z zv6Tgj$hxU#s^2e32D)8nfYprsa*dh3BA-j;U~oDJW}G$}uh8^+I4~RlAKTl2mM>5y zhOI&pNk5~JdFKZS#5-*&&0bxJ`$ybyWr~_FP#0%q*L-s2b~MrGcSt28TTJRUm7qpH zR`*f#Nv$$=MrtEs24MD?lEi=gTYen4q;`{xEMDvOIXyV{vs-^W9lG5d%VbTln|Q5x zH<;7~<)JEsH1~~tpU6g>HIvw=B*eNiYE#TZa9d;#0=LxC^6x&27$_RP8n>e|(8z!6 zT>8B~zbpv0*uDK*#{p6yBOB1Uqa2D9OJ=Tlkz;Nh1SJ=Z^FbXkDJZ*dfsSM zsnDVO7cW@(o0C`^mN*$R_4C7OEvTc>RYm3<2>Gi&bP1JIb9m9*(k*v@{ms@&CNZ67 zo`tG}smyhUVb;q=Ue$Edw9U$(XlVS`;K3W{UOYY-qZ^ck z7og}eayY_VJbOGmx;@smvs5btGD;DLqWKjHG7@^|wt#GOG%X9<)>qNI;j^=OP|=YQ zn+BE?5I#7G!IWZe3>BXgNmOqkt6UG3K}3ywDdGobQxB=rR@#WeJxwziI6gU=2^=|F zxNs9Aox@7Nj88C{6g=C1Af2G1y$)T*h4zyx-_5sT(KA{Lae0Hcdo8lcYy^D7O0UB! zRF}O9c;apbu%h6Y8&HcWzw<6--mWYb(;)9NS1np<)=b#&A1CN#_Vjp|l&OHc)u0*n zKef?tMt53G+KnF=x_El(Azs2_lJ1B(0RWEcV5utD$#hPa-nEf?5LDH!Job`OHUwj* zvYK~1Yqw0uAb~s9=OrCwV*?i9|(;*wO9P8gGEzq zR(tmExK`Nh#-oQ-hOic_1bs*AZRlG%S^Sny_LBG=tm9dWTgOWWknk|~khR)87Q3s@ zd7&*&C>nF?93I{c-(If4PI+&Ow)ceHk1rq(O-A zVBCxaw}0-*lKrtv=NnbzK{d!z#nIZew#O0kU%Xs)!$gj6jRZ~qW^fJjewodZE*GJ`+41MM6X%viJRsqlMXn?BNnf6 z^$ATwG8A5!TMUW8yh@S_Wz^{~bXo<=Dg@x_3}c@LiQvoYcAGwpVwIIWWy2v)oA+I` zPmzkWp5Wb&NilY9)UEm^#$_V;ac3OS91HXHB6y9lEA?AEUh-_KzNc9V zXet`naTH_s^g@t;<{Wh;dB<#wGX+X*;zs=gjvL*sjOY zL)@Qg*}8PJIf#0qNAX6QzKfEUo<)H2y3gq^tLc#mciQ@xM7hXna(_dyr>(0N92fzm zk=ymuIp3uKQQLhY`Vv}kSGN8Ee4e)X%>05rdREVCO}WtK zl)HwueMB_^IRnTUJHiT@Jv@f_a{uaidupsf5GiYpho3Zu52a7I!eRC#56IGD@xM`z z+Hgbw>*oqQPY>m$QsC*Yz5}04kj}VD0JI^2wnIg{b#A+$bo%!nM?;H4ZBGA)Du;7P z?i=nvf@_QD?dEjSYO=ajP5&%^m8 z<)i1|rc+K1yXhFTjOvJq1dh=AWsYRB0Q{66k!OJ0Rrb=;eA(+{u_442;9Ww07Os&6 zYF_njjdU@Tjh&9fB?G}l!SL%5CvTf!L@e2WgtFC(!qGjB-4xacWCW^HD?H)kckOB`>yeF$yF!C8R+J%k zPE6Bg1%eTJEBeTilDGWjgv&BS4OA^yu}DhRme>^XHj&4Q*TlSP@-LgCfAfnASko3+ z!C9bVJ)my;hfIA+K_>K4CA0_Vl(AtG_$?WX5 zvS@uREAAvCahX&l7gzD9!|dYpbGz*;G9}~h1UVvY+|jS_H2VK;O+racFfv=5E%y$z z=`yP#UM(@sTT*^6DT6{I%_n=_Q?6q)n|$xH2aFisoMP`{VCw+R!4V@l&Hp)MN2)>@ zGQO$)nw&Lr({FS4R5c3V?WUyX0EU? z%U}XH%$on#z(${0cb7L|3t&@=bwfJ`5-D+>ydzi)D}n(DJNHMfU1neOaPlhaY7Kv+ zuXifW0xDPzC&!;op|q^PI^sp#YWbAj$PuZ^q1792xqy$J;YH8_8S2w@gOvU^RW_;-%p0 z`~IxoYO%=17^Q54_A4_9Q5?iakGB$IoJsYmM07Lkhuj{$wSA`%RJvo$f+f9nH0+fo zQ*H4V>Qkf?wLsaaXs>#~Bh;6kJ`px~fHe%Lm+S@;pw0q))p53K0B;`qC6TFqp>2S- zWHeJ3<59TFZfBQG=ZLbt77DC^Zv`@4wIo_5wNx{VG-poSf1dZ10J!mfH{OL5u^HzUr z>I;L}4TTLoe8^^nL#Meq??ac;X`lrj;FzZ3-Fop{pdI`@Y1D3YmVcWgGgKW3TfW7| z;Z&ni#T)sM>_j93VROBv6Ygr^u{Jd|${qgE_f(H9zES_1MV2ICwupDbJEt*wP?^zW zeS2n_X~wwx&E~>8yy;r}YCCxLGkHQ`#Io&;pSSb3Ea-Ho8yj7h20X0r59f;P zrWT-)B`j!wc7l%JUPf-fSaq^+(zXlr?2H3Yz=tF2e*joXEMS{PgZ@-oe6cu4l?37O z>Dz>|LL(p%A;MEiw)s!BA&Js5Ui_|fVn)*w{5F{#O1bwpf%y&5hrLJpMNR)VkUB&@ z?YqT-h{0>4N03)zzDa9M{hx9el-{4OJQ-_{GTk3vcCO|sT}=$gQl`q*EBKs`N*l3X z!xd}T8&p8xmCE54wsBzC?FGrT;4_d z0ll*`3*{fAp<))#jJ10RG!d4TalDOA)@C+E({7|_W{GO|V4Qh`9?2!*Td^XM?v%s7v4Cve(V32_489Fi zl`9HSmQO(*{LZmpM};)m|3x@a=1xjnAVQ}!uO;f7$ti3KU0okHvtn?)aJV>f|7XL% zJ%N&#dR)Ew*j6^+jVhHIv~+t^UO0a^6_15c9%kR$B?h2J|2n(b8L^SUcg!sk3G0kH zfXO5FxviZJa02Q$!@O*OpdnZ5-UhW3KX>b#hwmbM`l){sPoVlA7xILR-5z%3-%-~C z>9m9GOp8hj5sSt%na-Ndjf${Ihe#A96uX}l@^I(q3wrxeruKa>2ktRKU=c)pTIp~? zz@nSzjx-qgoDrmf?$Lar(oa^{*{uQcOm-bN1iVdIjzD;HT$&ylbML!qD)1#;80t^Z zK3S!5$has%nZa2aT)6$Y#?g}UDE%|Gh|14};-zPj?gZAxQ1*v2JVN!a=YvS5qg4|R zh^pxMDM!k>jN9*w;NT<$_D1iQ!gQK;Dxt40t_DCg-1$aT91v2m{%aT(bXPc=L4#MXWJ-C7DGmx-PyZ^Lm3P}O{DQt?145z4c$ z^wIZe|MvR`Q)E%$9C3OPd9DzU$Y<;BlQ@0dDC*F~j-ur#Qu3szO{l|q5kU4@C<|)B zqdn7tnMLW{0lX1mDCuXbMu;yROcI106RTNVqQ0Y~yoeTcXmM22ocnkGxsQ|&4c7u&2*ZV@p zFSbV%ao%Jj%O@%H6hfoiQJE!>l#nD+r~)$RWt!z|8LkYvtX8UwzkK!e*(`*`*pN6< z$so?WN#V?H#Ycazwnsser^DHHGbO9kgRRh%rM)^KA_3c4P3G^?)1qularucK{Y-5p z%zVhPe?9ag8UHTMJ;$JqmyM5$*f(Z8%r7&GDv$_{WjDd2Q0p zLVF9Kg&X#-`wi?xThx@>k6`pmgp{_;neS~Zzch-^jkymtv~M7A(9zI|f=XyaBznwa z;T!a=Huca|3Z)pPDX=38@T1eYdekh~R19m18mLzi5Q5`94nlNsn6mZb)+J4tPuM(M zYhtqd<2^{H2W&#+a|CT`=TbE8AEA9?YQ@kOo&QxX%V5ja=(fD(M-J@;@5w9J^gn0X&{E(TAb3@PYJ zlq@P-E13j#>*cO3(t64uye=G(Q8?1w zCu^E;ls!D>Wu&b1X+EQVwg=|$l^Svv(VjZ?lbH;?hEJWj-VuITU4n)(MQ^!bLGCsK`PHFz!uHvK(twO*FT)24`J zy5KMzTynrrXV9+od;+&6{*a);Dcgx8lYX();qLVp*DQ}3pFHQWohS{6q3)!wx>ovB zYXJU07(_^xMv7uhj9Eo=?MgYCz4VjN{uD9OMnrh4 zKTQYz6`&M$m-U7FB(fA1UDOn&Mx3qTT6TxVf&z{^@nfznLb|1`TvpB0}_tYplGoE}IUfGCob5 zJ1}n{Da#!uQw-^t-Ipy|e;VVKDJ(gnlX8!kLERS7s88aw59d>%Z7D(M=XHx&$R;iM zYZFt1IZ*_iA<3LVCW%LC@4Wi#l-x~f_&^)9o9@{j7|<|qIuIbOwR|iRP0fr6WnD*v zqIQR_$kg~p7IoW{RC~ZlU@4{!IENNvZP>LR&keUkT8lxVh+XiB*N4-de=el05IJjU zvCPHiAif52Nrq_PRo-oFi<|f2DG2ECQC#iPtb6=$F+t!H6J?nr;3$l8c8=Z{@8tb- z0*AJa!%-VUFVTMBs9K^>q?Yd>P%6Qo75Stn5K|&gPE&9}@zL!>-ZkaHXsy|eW~ETd z1r&2%>J6n!RHpWdA_RB?dMo;$IX_=dXM;>^fUe@tESeEvwGQ_H6m}3L|9PM*-EN>O}A?I;PMHHXVsy zu`3(rvWGjiUsChEdru&v$gRy}qRM`P{om#qeLnhk7r>@1j_z6%}Hb>w}8x43S z23)ksd2W|wk#r0TQxWU^L8RiCI#IU zzxcfP{>~bpA*XTH_%x_TxWCT5W+QY~#sot!m@{59xNcK8F?6?Say~eCc!)jDsECR^ z#(fj{XJdBh=QRz`&u<&8G#kW737|(|GwE{OS~5%Z?YiIP%AF+GSdT2*)^O58f|h40 zVq8~kfgxan28%+$Arf#Z$blYyq-qkxZ~F9a1w23gMvx0rHr27n6yA*hYIASKXhkc# zcsm?hk#{tnQpA3s{4hX8>;Cp9{uwG96$0hE1d!JQ%<2#HY5hzI8%->L2e9;@Vmm_} z;t()GgUKBPG5F_C@N|y8-s)2l>1etW19>5Fuxa0c{|OkF5t*|-E1tlAdq3HcpaNRL zMy3QfYbE19MNa%)p8)6?avhA)w;PG--;}~N0*@k^O!yy&G#T;&oQqT zy8K%)JFsefuL$}RJE3wmjD`qOe3n^>$o-G7X^#gCC-jNw=D78qV;I1*TafEPVjz@H z9tW_hx}kvE?p0k5fChheP}OF3lEB`!xbnXcCIiFWK9Ygd61e{IqjQ{(vtkMQ|4{=q zV7dtoKhQzoOfYDD6}8;ncwz#P4=P`?p-o1ncCUQ$Eh3Vj3@5SUL>a=|ujP0jApXxW za=MF$z*&GsLr_I~_l~BQlZKJfJwhN3fHXl>uaUBRi^BOE9EIA2FACYpmb}4FDEbZv z#wo3|WzaoOuw`6vSvc-1CBc>ZWonhcir+MkOP<>S92pV+)YhW`*P-yn2qq5VZatO% zru<=|?|#lr*w{!u$LdOoJ%SZ6#D+CO+Te}N&bTjLO?YKrIGLs;_xc__qGOnyeB<6e zm+F%F3_h3L+T-D-pY5x|`EbB`Iy}n;>9$(JI>sxDo^a=_%3BNS$)X(vH0=H|E$#b; z&tJ_iy8jXPuiatEpn-HJjksJkCszVprggDrBDx|7E`Y&hWVLn-L!rl3Mw8CT_?P3{>q9IhKRmm63RZ|S%nNS_b*2sF>XrcU|Bqg z<2nF`YfAqfapeO}2(JwC6{cxApP#_@;r~v|{~7cMYB!K@fqKttr|Xu))i0!diSQ|- z%Gb;U31(GC(JND8iejMtkIbX&(Z|JXr#?3p8EqTb=Y&Hlmv>f+!0#SU+>a6ma!N)+ ztecKDX8E!7a`||iy1uL1)COFz)#o;gpb;BaUrvkop9nxRYhaneIghi6eQopnuz1Cy z-GySp{vb!79ruhPvv@WOaG_?k(?_vofk>7^23x)2*dJLAp%lW#aB;f{13fUXiQV|V zkP?5%9oVO zE{Q4K7JAkmSbdiH13vLNhNuQT{BgQyy~D*sX6%Apt&d1W-DZu&@1DI)42uRCSa-3ZmtRNKW{s;hWir9R_(Gf>|gE#;FyQrr_fMvfX~>7O!V1)E74MV1$N zXEO+i_DW_*58nEF$lZMWh7;p_P~Hs3z+Q1ohe z)s8{8Yaa?^o4Zp>VViG50+^jNi#_AJCWk(7ow(jPJ-%N+75E?3YNedO_?PO9*XJcH ziD!5@2*%qxdj4llVM4#$MQ z>q+AX=%XRbsdG7C&+TITEPRxq!y=EX!E4=xYQKu9A)bt8a&5W;neZ6?3?ZBOAB5=m z>;&hec3kLZGjXK=gwe=Z&w)cgb}`MxY0vL$Q6P!XlRd44u_Ok)L09vWm-CCabYbuf zQvNFkoL!zm%0p2n@FAcO@+trr13$tZf zG2L=`vY^xlCCpF+zz)jhqqgGjN>6Qf23_7 z!}q1Tq0XT0O{q3`@5i59SoiwmUg>~HMs(M{k*$3p9Klh2S*32#hmWV*9NKCI7xP~a z`&NsCA)$O7nz=-u4rIhpqRc>Z*7p~bzH8dpks9qaB&aPBa~yTq`$qB7aAsNC?(0( zGET;<@q9x1b-2fY$Qnm^#8}y)VgC-i=>BwYd23))b%7b;C3Un%79_X4o+Mfz3{P=L zgFq{y--O*nmgh^~BngB{LeYf-h%@>U3tboB=aqM(tY)0G#`f+TPVd;m{t(rpzY}`c z7CEJx0_5{>PAr6wDuPTQ0rz$=>-u=50NLAAx2tbNBp2vJiL?SMTwZjAlh-f^FxJp+WmZGyF{_m%ec73Vc{YUIwiE70WPIR#aIQOXi@^=aVY8G*lMQ43qr9sh4c z;Ut$=0a)hW02xy>i|mCRVSFSN*5ko{TUUsFE^orx0(8}xE_=j{zf5rS)pWZlBWjY+(Al^;WXZ9Vql?fC3IL#u+8#IgAyLqC`#$7i&=c%#a8IKv9LP!{* z2~&y&ZO#+6YGHqudP|vL4<%Jg)6G+2BY^Sj!K@y|uxnQ#6ZfrbqLM*uh(U->S-Tk* z$%X^t9-29Bi{_sd5C>kMW@NhqTEvQPe~JF6`2%W*vkoVKSfzdIrmYf<>AGl1b8t{4 zt~D1^`2{mSuc$@3X2#^vur(XE7<0z@OSwLC5mj5O+8j2b>Sl4|Gn(vY#$a|!#>3~z zUb^0$w3?+OTj1RSIO|XCdwvfdh%a`z0nZ6$lhAiLv)DuxH5NJa^9v$reTDB36AKEK z%Mr-3-bmZ8#djCJYd4-&s^YGF7G=)tY@-?mU>#x)tHik9E@l!lxbA-y0$JCQHlCw{ zs;|6x+8%HWMHw%fss!`?D`Q7%e7D+uw73oVcOr(PJ<9hhm-ExOy~qHQ3@6+aHRnR+ zBuSkXQcdN_bV>K=@-jE#r7N_A(bbvsIyC}Y~pP)z!;WYcKT zyEfY+8Vx;LRqR2TP)gub!85TLbKLS7k&2Sx7b9*2ygzy`v99St%r3$$MvkSg^ovw? zEmt#NpEISsziqpVIrA|+rBEa=s zaoZ3!do{CT03urfMk`Yc2Y1`9JWx`4!Jo%=?$IC%^QA$`DAm-G$Edx2bqW(QVdHH~ zT`iyv6d~JN^S@B`mQith>(+0AYj6ne?(WuTa1HJuxO=bwjR$w9ad!_A+}+*X-Qjlr zd+&4JbH;e@xc6fZx){~9s%ot@pZS}Q%{y*}wnB3tR47us0p^SRk99Po2IVgrOP?W3 z-5YNw=$vkm-tj>~7F1ys@TfsBP{*t0D%{^CIK4{fQ)e5v zD6J51*RV)+NeOjiJfu3&R4BVi9#{FD++ci1mG&!%g(H=(g)W@9b<=y< z@sh`kU>+xc^<7aV(r<;WgS$rRTx1t=bZ)5u&-i{_O2idI38&_&VaQC*yxX+vB!3_L z|6hu5M8C&C?sfQ+Lb^Z`%DVPMWvfK8CPVS8Yv)w+t;&^rWQ8&+sL#R4;W9o(-ZKJ! zp+0q<@D0kT6Y0LcR&ksA*u*L?o|(dq4Iy{(X<#d$jEJv(cC8*iGC zvRg6=uQYThC-8fu7o;|)L7=%MHPXtbFHxuZI4Qc(3qD*xZpDM`%94(29OvBu$xNz6 zow)j2ffjGa@ZhFS*iSLuRc7;fyy5D7H}|&L!eb|~X-73Dj6zQst3uT&73E1g0~g@| zIyQrk@EJH_?&4`Gsa$Q^K|0Nwyit=$udNcFdo_TMft&b_Nl|5J7y0pa($N)fVJ7om z?*|VW4*TiI7~m0Ulbz5(iWWZBLpn>&Tecx5i{M!};0l9Qu|0_ogNa&!@lf^=4)#A9 z?fR#0DbI|ns^cVQ_dinLs)Km{m%iJLHNpsKAa0=}60}Qp(r`z>*B*Pdp+3&SJ*RR@ zWVC3QQiEJZ23T18phNw@TdXBG6d?<*>LYQ`rlnU*V$nH+az@=X1s51jWVhYGdP-yW zu}m*!$#l1jRi8mZ=6w`(U4Zojyif)^EI$iKpz%FPc*-TeYCqqBjSBL{p;XnH1gqvF zt&in0X(zM%cMeTI>&B{7)pwJe9KsYdu{~C?ZD?Lz!&(ov&UT0`ePL zYx=1#oPdAIB5kXb(fkzrCTQ4g-DCR zm}Rz{XFIV295KxnIxcP{y){1aoV8SMF0MFc9M1#5p0YvK|kEyax4xIaSa8js_IhTA^97{ zWGl^RPV2oULc;|*2F1LsXs~vCwSnr0YG0$G9~zkwM}v!90>sx*a|^2pf%uEg3TSt$ z4)7VvTSIeS$60jqw^uxDKZ-B>c*HR@S|1`~7#@vuf_$EW9(ov)O~?J?yty$Yk{F9! zX2bE$(c;jvObcLK%bBaDlL>vDryJYo*TBCD;!UJUn~OX;=v14*^{<3kidD`9;tft? zkou@p`Sh!o;^Y-zuO6b%tM_8Z-=x*q&wMbk9ru`~mQUq1yRCt?N*X;~sL9}HkS5Yw zvFiF&y-ii7*(JdqVdpR76{3QIXwS&A(KX6GUf;TKDCYpqb$112cjc;(|( zq_Z^tlyjn@yNs3Cop)R-1m$<`jRbV$62|=qywyA($?tMzr{&YjP}4sN&Zi1N-5BZ? zIA9YFmB&}64=HpuwMY(=W{IX=KX898BK);`cJQI+V}XjTB36hCI1qtfOd&2=5UFV} zf$V!TJUI_p2ENp|Q){hScI3_fP*h3E5f-<=BaD`bgsW;WjHik}gh~n5xo9a+c#O?a*2#Y{6*+6rG^=50(1g;3(16SKPc#nhpJs{-r6jzn+p+6N!k^_+rfc#n z?A2mOo5k_;LbA~0`o`yFO~NkRBX?B3I3GsiI_V^E`NkTtDg1qF$06`Kv}LpDO>_vZ z>#r^9l|+u3;?jjq?4g3h6RY;{f$d)5xiZEFNA}ldA{gaiaHcVb8FN07W9O>%T7eT1 z*yGsWq)qv<4^4Ln)q7vJFKhT`B89f zkXC7#;P5=99D|>On0F`y;nGb5R!u8UCJ3uI_UcoDqZ8T00uRFe*Z6)l-3G6ip<&DH zq8MHEZyqxHD(Y;$cmfXf67EEpWvIH_B zVNTzB{izI&s_gov@uk4Hk?Jw<5}m@G0er2xgwO*ylbyD(;izVG)67P(munWE;(vH! za~CCe->lP-wGxn3coTp|w|_hwPDA&#lzf#%YjKeR?k~iCGx{cG=Mj+GI5{}G-FotX z+qB6TW>Fv)DoDKm=C;=9C^(*b2+;r-(FQmu&L`^eqct2m!38r!)hMaSlHQIldbNq6 z_V;x@Ldpw^3GCK3KgziK<|xpFs3s(lSQ0YZ9^@fQn_pZBH-%vpn64~vx^n+7%5uGN zFTtD zrK3Bl*i|osk@hhYIYqAL_O}QX%;o~xi^WFeR zYq%l3hncw<-9i?zIIa-3P8>b{ ziugPo8|I{_M4`_qf6E>paE7+&v?t)3sxE}UA~+L+$_oxQ6nHBM(b5A^P;Jyti+|Vd zdlZmMJzu6Dr$ir&ktu8l_FFM7(Qb#kzy}&hbbqbTw+$KF4cxyoXg%LqWNs|iK}%gS zJ$!PZvU&xI@}oT!tWNBDuJbpzTuWLx2NAe&Bn2fO&z}i69s5NI30z(#mM>o;XhZ2Z zG@NQT&@UejQhKRM)>h*SJv@|d_eY@|tYz2?PEuhmq(eTUYm6>rdWA)EW$^AkD) z{!gH>CsAD+N&ZYGAweb<#NZYwn+9%128TO%rj;n+>qJ8qv*yK;TnASLuK{FufCf~Q z=1u-aW!?lP!B|<{Ru3Q*^ajaSFFH6YD$nE0JH+p-A_yu0!RfdjQ>;< zKn0f%WSHjG#;R;hN<@o4FIZ?YH}skQQZB3EC^HyvPypl|FiPXX=h3@FE~;NG2`+tb zMpI*M4!`90zY|WrB0p3#A^v}zFbqKa;e_Pxm;vzyhH1KXrcxhcz;5P$z9vA3 zMul@ZYC(Vzgp)}6Yh;ol;j8>L=0qP3T-VfR&}|B+*xIRuhR(o%F#^Lyx1FQl53fd+ zE?ND45yr3#O+$fGSM7P@M%>@($KUfPBmqlpduBOc&kx$Jk zE(WG9Sj%_&^)s&l#t!>t^Vz9}&UV2E1Y|lDL=lJUCF_#Onsb_-9;e{;ZUCw_Y8260 zyfiN`b*2CF@5ulP-#jNK=R8zX+qppJd9xh>iA=3H=!yAGH=33h2$X-Zj0T2=s#X-$ zEZvfju|Vl+!N%6dqDcDaek_ZvD^h**43tnKt!hRcf`mfZiad31V-QI-Y}x*E_p((! zckMS<+}0DqoBe%sS+R>0rfO;9aX&eNJu3=$y9t-=#)Id^*ZSLhJU=gDr%{1L;|D|EJAA5>%ev3drn+842BuKEpGU#I5ukAHJ*ej<_$ zG)_rQ?KCxk$U%!_3QYvPNH>kNR~oI=o$acV;Y}5YK+IcJp>mX( zIX6rAkjr{5x>_|AN%K?hGLNt8`xja5I_s2~?Z%_J9?QKRR zGY78F*^V}nRz#Cid2#sJqsW5|0*Y6I%XHbV*hZEi#f0G&U%X23v_u_mUR>QHpdACNne}@8T;nU@5 z4L%I8KnzkLK?y>h+s3P1!0L04ub2J$h$;VD5Y_fsb826lZ|fb()AP`8DWSK60l(hg zV__Eu&-3O=1bLVLF_YiL<@{nkKx!ufvc`OLyJJsvF9#r9Y*@>u9_etcYc zzU+1+1?SafW%RSdOq{ z&Hf}Zfo#K{^w&=Lo5ei~{Sq}lUiD~htn|rN{gUQqNjM5^D~E3Ur{UNn-#}ZU^^?Lf z&ZBbKgDtd7I$r671s|-UD~<4cE_t2hIWu}dN3hmZy_@G(S@*q{dEcMb6TQr1BL+(M&88@p!3=vh{v_(&d(C z4>?gyJ}Oq&O_`>s*IrZ&%Xs~R5|`so?fAZIaD!{O0C+UQlqLHWXhSm9a;P1W7h4~ zf*KY1<~_{^H8sfF-`x!R8zhe1nAe-E#^_cGP7Ko5zTe^;tO(iH3KfT#oFm0}Z$KOEA@!+FMyDfRv;rKcL6UixsJImsBL^?pzlMYQb z)1VDS_A9iE0-%R}hN#}R6R64lx;r?ELm2ErIdcf}Zfj8gV<}d?HpwQl&3gM+@9}ZL zH&pyk~ z^860>Q5t0!kgc@CQ5hDz=16JQ%5@s;-d^{|lPX?ZuDO7u-}NhV`t6NK3^?~Tke$6! z_$yByJ|eUHKtoa0VJ*0fdEm-&pncZ}f8a#E_gYUN zRF^6Y!@=N$YjQKJg3A8QVhp#H)S?%~mt33*xnIA$&~d;KYvICTNv?|7Ucm8(JfASV z+_>NMaFON%rK_;6bJS@CQ%HvdI>EkZsSC};EG=+In3zjDc!1g#PK%lw4ChxK+2s#A zq~YdDeD|LL232{XxuOzo;>jAy!1B^CR0eZ-i;>3f{C3Ee#^eJxuDW1d3Ro$c%7uKyrRNCq z>XevUMjkO{QiNVW*al6uqlJ%9t_2|rBd<3+0cB~!(WHfz=-s<|)haQNpwm^$=X}gw zr#CNDE@|@<5P3M6>vAue@f>Nb#7!yvEoZpQKAxTOd&3mWE)oL#EeaPnnGClkSSA5u%@36j&|k+24i8&9-LT7CTfxlR*mNl0|(|9aVKyiDi|MxLOrgIv~+&!39TVfM~2B7>6k5%%~s5L9ImsTDJ(We+Wr1Qet40+Wp);ZV!H z0TLv^ma-oOB;2(!-4NtRT4fe2Ak>$4-9L-Zf6pgvNzRMam+}#H;xAAVbs?=$tr-g- z9*UP*sfF;P^Czu!#KQJ^LX2=5Cy&UW<$6Lyiub*!LwSF7+?EalIcClvg$8i%sGv zevFMmYaz6fN6U)}f~wWG+NYI8sA+5qn~2%nhNyQDmFVzwS43k1$L%yTmfkm1b_mu9 zHn`em7knB`@3^|jg7Y4X>y27LdDQzArHC?-H!=E1&P7C5u}~?A{#rIxALC9(i$#VfaBJwhs4XC_h zV{5m`BKem#WQ(zG^>A>u&rhC&=Kk`+as^qVP+r&^(tzN&KdZ4L@Ce z9*Z%xsB9zD7RS?<9L;`bWA-p}72|!UE4qL8L~FHKpVevAPbT+g??5${x$b*Ueb%d> zG&ZP_n@P*{=3cRJ^oo^B@DeA|LBVq`Vq52WNUAPTRSahMVwXxXqf=>2EhF{tp#KAB z+Ugy_kmt*jH4WH@j#7N|#5QHE-UgNB-udngokWCe&!pQN2 z#j6_$U`T^xuZ?lX9O}=*BOKy32LhBzLbd1voU(n&ZG}ApVQ=5V zr40K(2vx@XSeHWnT~V@c;kw8+1hQ&F(-EY^P0t8?&GA!PTb!Y+fBeB=b4D9XK%a{| z&46|PTiyTI4E%pc(&*5`oh%+VC3(H-$)rQR`})}Lm-Qa|iX5y2b;g?wObp592jRXz zFU1?#i8SfO4r*~hY|a8quD|1=ya!YeYXO?CTOWU<_H@lJKs+SUdI|-qZr5%H3-dU* z>h`yC(RY-o_$i6TqS@)XMs}~aIS~^D`#NM1%WjV8jaAZ27!hvzQp9{n9?6 zV)2bim<$KvVb4H~3wGU|K5(VZ!NXcLh^n|Q$NEp8u8DVh`Jco^@Qu>%T=r=T#6r4h zL10xOm>V&aImltU(f=_n%)Nj^-I4r@cp_b~n$h@{wv$*KLV%5jiVoFy_0&~8e?w7- zm0aAm&pdj2b!JCNLskiPZ>Z-r-w%^H5|Ch&T?z9qrcjFoN%Tyrs?~0P5qa!Qu*Eue zd0&-`F}{*V39l3Lkj8*?7eh|jmJ(4|EXyWG*T2yKpm8^zEdW*!%MtbL>iX~39WJlV z9O7}Kq>qx)4u)o%OJzt`1`4v(MoC#pI8qRzRc%jFs3+`TzpL8jw9QYrElVnAk`Xt= zPZ_yT(h+?HGPPjOUZq0@p4317P9tUl(Fny~%+&atLByemwLe1qFmt5OYBA|d^JDUf z??}$^3O;+k-p?>8-T(}kji30P`EmJh8bCU9Ss?6r!$vK!7 zi?RP^Hu%lOCGY|d3k}v>XzYcK5H3-Fn5&#D)Kysh#?IuR6(f?Ij3q6Rh)*{zf~4G> zrHdYor}o{5L_FByZ}$=4Zdss2?|7$>r8hQ{2Z{(r0F5nZQ1+6=xE_WEl^byF) z+SLlaQVe8$^m8wsNGNACC@Ba<{c}X;YlYND${wtCp{r+H&G(T*tN0p~AomN+6xC{5 z{a2$Hna!G&Gm6p=pAp$;gXBs^dQ+&ekLgAd`8!;qiSFDc1% zYFCMUd7b9ED#Xkx+);!pl=+$T0@qc;oC4G}Ja*+JENkHYi$KHJ7;{VG*VE%L96J-E zZhv2#wC1n%Ly-1+|2^9X#V6Sb&Z#tL@S3p>X}&u^mgqkE}MD?~6!lh|ok`m$XVv_nyj+w zd66Euqhwb-o^>nyqIX#HX;`?pWd_A_W${PF$`z>RQn^c z0s*i>+(JE`gb z(|sp!Ss^bY>GEWxw5~sry}9KIt0-?$L&n^cMc}|V?KR;demn{`sL=cEdNbj7QwQ-y z*J1YCJt!!=%6cKZ@2r1rr1uqfzApkVLAz2k4O(h4DUFsWQR%dq%OXDrv3 zDZTAig-_K2rATKbRTo4!cAf-A(eH{!1VTMI_zQ;>4oQ@h6)7OL9r@Y2b&8>LMF=?; zut5tcP`O5;;uG4}q3eesN3@peStim4>l0MwO2MNKPe#BY0h-_%I$kU^+_92&#$0v6_X?g4S3{5SneoB{H83MG zDjUQEv1vHmSt#O3b|C-;c0{7kvwlwfq+QawejEFPbZR69=gwglPkzlxgK#sOXKcDz zn0Nu6rw@0VL9ihgM6xy={VL+Xaa4OyIq7$XHE+0c}QVWVwKq&@aL;O z*>Hrifq^@6!eMW`XJ=Rh6kMunC)L5WXkfed3<26yX{fz)Gu$lNS=SSbn^7YJi|Ehh ziyKa$(6UUk19%S^IdQLD4YfjEzU*Q?PgQC2_7NrV5@+a&s+$bb$%N)(`?pf2znqeh zg~vru`y;(BovX!iwZ}Ppzi%I8B3;pe^#u2HAP?0<%C{fa<_&~STTkP`isX`DxJFf?WRXs#QQ>}7nVNn zC{=j5IZ%mztq^HQ2))RVk+HJXfXdql9uCHw2dzAUnjw9}4z_2z>BCSpJDYmGNm{n zkYQ|Jj5g1)(#Ztd-E!6(rcWLH-bUwZ>`f?l*_TjQ4Sklk)q5(lkn+kB_*&4DTQnSA zh;Xkm<6YS`u|?nCXzzhg(Y0mK6JS-c17Csnvd4Mz2!jd|!8q&-c_6}GWS>m1>al4; zjUYwID&3u4+AODqZZIL|AA`m7_z%I9iv;@Ur9PW4>2hO8cZ9TvyxH(=hGuhC+yoI- zLUAdS_#;hLgW};~=M+1DqxiLv$0Tyx#_n9jM73HR^KzyV9iVhPq*RTCtqBCx!N+f&IYX<4YJ7wz5mV%e=X7n* zj0%qPfTzLHHlzx+{{ia{RjP!wnYX#GlxUG>5r|0fRJxgK0%-x zXtP3j-yi%~!}@3f#i(}4n2TajWxtP>05ga%Sl!6d$(_pM2OUSzO{C3uO61Vdx{r8yPlEm=# zn_x#ix%m0mtcE}Vlonb`Ogf43V8H74e*kD^GPDNA&r=?5EaHHq~k)x!a zJ)g?0pk&L;as@X`WH94M&E(pY9+GZGFA4#ithU`8j;c2AzQlj9a`uy-2?|lc{W+;N zjrz~Wd2{r)m#34=z;-e(fz2qyAv_;X#MQS$NK&a?rvIdU-Ib^LzQ1%gE^}8Xgw_3k zqa)rj?5z3L_}1*Qy&t}Ar^71yN5k=K8&E|eA0zN%bEs!v;JF!<;q$!nL6eVOXP{wc zcAk&YfN0?5UzKkDAL@&`B_UW#culHM5{q^-q)%xcc-+cHLC&L zXB7Y&7bglGVUU}`^;rh2d_QyVt4|}d?7o*hQ3VrZAk4cVq&!}vL1Esf!lnmVoQzl( zq8FtC0f;+AC21N8IMg7vZ)i#bA{DK>SIiUKIyAz#BgUzLocYdbxd_^;4U zA3)VBxg-ifBSY$%5Mc2RVDflNyM77H`Mxnh;_!JKZBP|BEnWc2tqES8;Y5sv8@b=x zIp1EW__p*cIWnb}u_0wXyX(YFMp&9G+0aD>}2js9@EwUHo$wd7A^ z)?DWc=jY|`8^jzH$~hf9TQZG4kR@qtA3>EFWI)-fO$pYsRwY#Q-EKwVU{0;|G84Wv zl?aEBDuEPYouTm*D2p1o2X-8Wn8@!VnRVZ`Q<2m7IL91}EOBEmMk;DaI!nHYwICB1 z#3xWi4xMxRti9~w?=k7>E@VgIOEHJiYF=+D9&}aDt-_#uW~0%>U2Yght(_cFmuQ(* zL-v%@s(0vrS)ATMSC1AzXGqpuYV`2I8`b8sJG~2ZDhL5^Sl4IJBP0LM9IgoK=HBR~ zmi4M?v_$DG00fBdVS4e>d*i086ccukeC0*lszc071Eu^b2G$%t@qvA{QE zB88+Nh!IiNoX`Dc;S05|m{ih=7?8uSrkn0!Rl)~VSOk4cU6Q3ok~^}Oz`_a=r(J!! z8|fu0HP;$`s4(n>_{^XQIX7U1E3C@tdi9eRyE z(|wJXNm>Q<70hFJ58boN2bHpR9nYKn{dZLqi>T{lU!|Ze_qHoLS2SzfAD0bYkwNZl zYvJXeFZ)b^Z-H6A-OjoRxp3|ur@r}ZKKz!=B3|LOx_lx=0r%(fp%hQ;`oj42}E!;&g65D>E1J4kuT9p(~F)>F8~qiiD(UI5&{o z@0?a)mvwp`BWCr=+d6Ejq6(>+{3T|8qn0velch`5ReMZ}!r!xF5y1WCFS!?}(*g!( z;p$y|BdxbU9g`_8w!8i7glKo;9Lkvh6y>f<{DW~Zr;U-z??)(WB3TUQvL3RnTIg9# z?Ny0ga9F!pP=46Tj$xor@j!M7zLyxPEWf6^!@$#nX<#rAD%8(4vdoqh@uPp{IgJabr%$r zMQs@p==JiWipOJ9!3*tw3oD&sF5u>S7~eyfTo#CUULWONKpd$etG16?H_M=_x4f{6 z1fzHwLWM>b$gqq6r0lQ@6Z*}eh88$zCFPJ>l1m^MTiu1!KO;r~XOMq=MPs4Y#sn0n zk~lL)8=pK9%3H^XKhoX3MmGF1zw#35zA*?@vK>CDxpP|R5`OENzjbeMp2AE~?hMR- z`X={CrjQ;p8=+2n*@g{en4dB4^R=Oce>z>L+$=-<;3ybE_HLN2i^@p|(BVUZD9_TL zAK05uE6*yc@b)~tW?@POb?I);SN?WYnZ=a7Z004v%F1{ z>897xVi$x+jfwty2$9rbTDlnYN(X0cz{Xy$@9ma4!^@UP-}nIgp7pU5ys||MVeuXj z0=9o+pH)C>&~`@9^IdODg@ZnVqZ6rpr3SXIA4;gMc*MO0h#xQw2dYjjy4?6~6V{Tg zxDWc0aB$4yO?@MMazva#TIKe7T}&0lM4l%dH9=OKs#hf!UvSvfx;Zu)kA^A`3M86; zAQ2~so%SPMd} z7p+zC*3?eT_Q!A;o?^jhM0u$q>5`ulyHH5hWldk zp(hPlYZ1sM-suCpDJ*5?4`u_-{A3!shLkniK5yX?uQp2^pn~YdHjVxmq!`S1{0S_U zJ8>gMv$VE-3j?c;g;v3!EUCug8E>$!4%Ydl9r1;A?rBRRncxH-uPRGx zedkrr#)*pRQCdmC5VsJPsi^XlaDMU12z*Yudi?+{#K@dVx5UtkX&Ex>qV3yt@7+Dv z@Qe)7|Iiv$f+>)$dM!SN71y3~XEk2ZD{MkD2^C|6RXd(M5d^BkPw*UC`P08dNYwlo z=lbu~fD?g+iBprDB}WZ!R?a?2u;A_4ntbSataLx|8zN{N+S(y73SvzISQYZ$JWCnN z(kG^vl*#*$`K3q8G-BE6D|%;l*M2HlAz_xbIDXlD+h$a~rENVc9)Pg$ATl7kFXUp0 z)sI)!pj6FJ+Ry5>GMuC7x7wp;T^Gk;|kZb6Pk%uOwbX zO=m?&Or8CmOH!g_T)b{Ex_@xT9aFssp0x3JH6>Y(-6_%h?UKnj30ru1>@@|zWjH#Rpe*Sr1EHfoiytsfJlk`gA<^zuYB_Jg zJngx-MP^cRHSx5&>V0(wyV^cxuJpLxNJ@tGFeI!7GiAEr=`9E@2H5Qk$}u@>k?3Mr zSyz0V0@>+F9?*Z3{Y(+QQ9RT>M?bOPok6B6^r0ew-gj&Xj3oW?y;pSJPEK-T8D@n@ z2X7^IEiK5p7u?>8h=`44@}Ntv3kd)Q=W7l`w__nc@w$=k*^T?0^ySjk$S zjIzlnDag8)CwBM%%hdN6l6x0%m&y5pwNk7c^)4O{iZw0(;+FQcpL#f(=-FQ#zh*O; zj4V%(bbMo(HJ!(Wg17Z?W8lpvIjpZomGpg|Y0=Wr`_! za{`LPfiy8=j0!Ckw!iQ7Rj|2NrQkI1f?=yoMF&Q15}npKQ93lOK2pqlMq4}Gg+&{K zL2Exm-So#eaAE-X&5b2$xm)tf=DCGjw5kFpX7H6$QAt84sIiff8*yBR-)J**oBDqL zo$ewXI0&==^#Z?(cRt%fX^=1VagN!mliVMnE82815}Q;J<_<3jGDf z@SKH@dtKA>s881TyYywkPmIwH(KyrchF2;k&54pjtBi!CEdLY2pcS4(Mcw325ZAO! zs84MwmiSIM#0|{RBwv4gy^E1h%cjVG|DL=ozzWv1M2aH80?t_215B0{A#K>ErS-@C z;pkSL4#NN%I|3keT{$?J1bM*&?bSo22a7#^!I$(&laynF!&NdQF~=NHNK|UyC0`es z1NZHNx5u8BM6$tWqAu6R0lbd}2>ajvMXNM`SLrhmCH;29(<4chCV5CfT5x)k*SiGu zqiLX3C-`@L_Poou6%r^*Ah=_uF!C~&(`27VscZW0P+On70tN=L@57euI~-5@3>tch zacXo3rSso=wQlC&6}2{rl^X9XM{BVT&=DcJwBG|Jex1p`V8Hw#8jPwWM9)w}w1G;Z zF0&W>2W-w?^gA>{cU>`W0_|Y zIpt|2z&Gc7UDxTr?q=-;G;+~O-C?DPA%5^V)oUsVY?s#UonoF8CLV!BYtVbdYH5N^ zmDx3hM4KaeqI$9LPjSRCf*}g`Fnc=Q+Hcd|Q5hM^pdbMl!Hi_g(Loz9TAsd{l9wp& z|8ft*zsA=6vy!6CEqxQGnL?U6^QM!|+P~k>=%%%gME-w>dzo8&#NF!)tngy?h&3*) zooTrt=dC@s@Y8_-vXELbzL}PP<9Z(03gHCfDOpO@<6BRAq;roJ8Kz`tH76G5zMBj^7(3vQ{swUr&5> zm5WQI+`jyX#by@n^76oC@S>jhp+LCfm4=*FNGZG7OhA?BtnbSUvd??f^eQV0XGrBq z^Cf?XIr_CYH=G|HS(hr@YrF06njJXT^hoNhleHvI<%{^!gImR$lOz8ytFr`Q2BEMa zKL?ZqmjGs!m_h?Xdr!1(7s{y66Uq|5(@#YtqKtJiM%fsp5k&e|B9K?izG86ORg0+zHw=I7BH+Jz8vAB8~3Qw_pvKlKA znlK|PIyR@2Vv|-z42Y;V=*TdJeXM8hZo8|158-Ez1NMS-O$GLu!R7z(@`k4l?;DFt z)3s=_!W<(Pj_m5a^r?3wh!EDzQVZ#+lqmDbao9Cd!g}~(y%eG?Dv(bv3yIYWxdr-h z`E9_VayDa4BUR)Spds+6rR&rp8TIf59g=)mHyCCBw)FFp^B3{H3vc0E<~z1gWKm#A zQILz&iNt|aB<_7^+t+mJh;Fi-puG$U^W{8!p=vCNg`!wEUnsQ5j$pXT4Ad?BIMbM^ zkYA2ybf>s?OjaafK-+vOj%aFuLup*F0S@)2Sic97dQ`DcsUyXw6?S>kbPKv3HSM7> zRSEm}hnMEG50$-rPAe!sSqL-;D1~C^7y`pPnSbAJ{Ob5kB8Aqey59D=tVyl62X%v% zyvdz0K}BfuQH-SZMooB_E_23hEH{iNsYPn1t*V=LTwU^_w0(YS?Q(3TtPUm92K~qt9Sjp-pYrO`?HtL_9u=Q z&Is_fZK~sIGGRRM9BoY%xJ;xBw07cSZ^78%%2V#VQGL(JLUFi3&TLf%zcT)Mpn-HV zaA>Z2zMocwFiz}aN3?}qdUQxYw5v-`2aZuIA_q}+k_y^YJEu;lixt^46lCo1C`S^W zbCrZ_Hpq1(cIit)h&F#p!y^{BR%yHXG*Gn{D$7-Yo<0(VbMh5rT}uw_K8wU-)Hz&9 zLD-ie1n=^%V3;zvESu;&FA6gFO}5x(zvK^r@2uaWt97O(?z(FjTnOMc1W*tln5!3X zj#pw277&UlUTPPdye5^U#!zpH*u@@*wm9^##UCDDVsafg#~|vSNRHd?2TM!YkX~~? zNs%;k!aD|gN?J|E*O&vHp{7?1X%FHkP)gFIVHzJoqiql_hW_|(!#j9z+R6TDoDM(+ zhFmQE`!b>at3w3X#t$|nD*-K(ngbBwQ38r>5&w0Zg+MzTG+x?5JQDcaxJU$$5Onx- z1=SWK{%N@04*u&$d(xSc|1`dU>T=o-{bvB6y28PF^j|#S|3xJJPa}75V30IXmb+TX ziOAm;9s+LQ-W@xBPf~#bN{assCKv>mIo!drih}a!#rx06?&L2=eegKs`sZ^9To&QK z=><|UFV}zn(w$u#5LLTUhLSGjRr7zm`Z!;JN67?{w2Txb*)lJXAHc~jLQO_rJncaX zsblcta~iVOBmdzB5Xr$d{c@jURDc!LCp4itM2Ss{(lOBRbJA1kF~c(^XgC;pd_3?! z+=Q~YCZ2Ic$HNUHD(TZ9%Y1UNV&7%Sf|rDD410u7u_ks#;TO7I;W#km(VR12UC?m% zqWbRB=JatoKJ&k<^dtZq0H`Ms8U9;!;8-=&VJTMw!X<{Zj`VjzbYcQfJY$14O9HInv?S>s8pj)pSA-yc~ zaEiq!Az+W3^EZ0l3xQFC>>Ar(Blbj!dBz!v1pA1?{B8~Fm3rTm1J-cir|Z)B{o0Wf zm*t4lmHH@w25GESCGE=PlUqCMrRGY-dm;v>xmt(6Vm(~nRJLjDUFF9>`DKX(V?FFwg&ty<8VCo14unu(p`h-iDh&v^O>QOG?GKa=;1&mPOWJq=A;xbD(9fk8W)0nly1^;~26r&Wss|O3>Rj|n#0(CQ55XUxi;fS>S{(o8K(HqA`5~<_W zbk2R{{#Kc34?PW_4NbP=pHy~z#4Ya^_qm;Fo~*Y z1o`KDSzXi~TQxrLUXVd)SV{nW8z48t$d-Csvu$yFshcm#+R!I*iaXF~RuH*{z4LNP06W@_yJ!51ppK+93`Ey6>@hQLZwyfuT`pfDzqqt8 z`@gb-)Df`EKX)7>!fhXpSE4f(kc2MwuORqDeD<#-x^TYDQz*FGErzvuzgy9Ww-YFk*P*Q z3TOV%4BU!f2>pWJKAZw6=bPcFQ8=+_Z2f#!%Kf#1|2m2MNxQC(#q!)k>T~_DG(xsw+370RK{ht8kgj~j8$Rg@!@ssh%J%t^7Kd`cx5?`~>w3YTmAKfs`06Vgt=Q+9p9R zA4op~g>zy~Bgu5FWg|kG9jQ`DS!i>Z^CzONPNbO9cIdpv?P0e#V`J#Km)iGid}4+i zfydWIU)al9Shr2-uJHa7Kl^HVF=+0ee};S_Xx$>i8BXy4$4~pJCoQNRUbp52BHdi3 z1npr$TKqX-aQNdw{=tbJk$iu2zcE`!DS$Q8_?^uK-H?2F8%S{ ze5o98z#XS13Ox{~9g)S~Le1fCg|diDyG)UC@K1K0KjqXsUKJz=5s(;L8j65k)Kd0{ z@LD$>m+u)W5z-%C@rLgGepc`_`h?v;oWA-}f9csF(UAp*+B+`fbKKS5D<>PtBs4GF zf-<8k0Y7*;=i}$|98zqPEz7ivZ#gdD`dk4QWtYP-`X*s+ykF3DK<2HYtYnT+gp7l7 zLK8-d@BMUBotZ1RhKmI3F!g6H zz&3urN?1X3Qzl@8zG3PCK{XgFTf&dqPNSuZ z&KahqBe6PCzS#s=RocLL@1Em#sYpJth{p*(6#keu-%e@jzIzT&V$y4e0B7T!2Yq)q zKNU{EV(uCEx^&QKIYbToe|Y=Kpfl;Ki-DyGwAl;!uhecPI`8f)^_e1sdGl z-QC^Y-CZ_)_gkBt{kuPzAxyZFdG71Tbqm9 zyR4!oS~Q@bc;8U^&v69_^t{#ikLqF9XB!VUeQm+7FO=eS1{Fj;7pm^tAK8MeGIE6^IVu zJf*?6A+=uY{u6Dohbhur7P10CJ-}a*>Y!{9xr^t3dd~5BML~-!cXYg^hKR&s4ZWu1 z^@b|lJzfd7qi!w|_siiZ+sq@g>_$pv3)QR7Boxm4qv^Rngj_E;3jD~ohZJ5fS`1xt z=o?yGpS@1f8f=@D{RTHptx;kWj8Qlm7`2SAG6_)M!oQL%fPZuO-+u^CfK*?ZP)V+I zoKFoJU9Y$tJo>qx3h+c9kIU*_e&TB_mn!Np`(~SSusz5nCoDy+sbVdN)egPC9In?q z*C?8waU>j|m27Cp_cHH)JK>;BmVbuRpKbRg)c(r%)5~z>feH7J0=22G- zIuZ3Hx;3?IV54AmVhB;*>~pi(;_U-r=Q=IXeAPG8JQ>>)N@vaWC6(%OMgHTUtU(9m z*~ETUHJz5P0MhmM(*{sAD^`Kj6KdqTy1Sv?oaojOr)-yDA;)Ig(z)l2z6+C zF_nm+DLF9jpY2=VWtUX>O5FU;IB0u}2a)UC(F_$PnU{fFIndKQr9It3cWE07;u(!l zipzye2hHpvTcrh+a(s#AMu0%+fM2iQ{_>Mw=ML1q{<>ANoH2U9ty@bKQ<0~W)(PUz z8=EB=U%0^}-3%V*5+_>f#|v z@%-f5X1wD2WBaWSO@$Ihmb`435_8iQi)NFmUTYWODD?u+HI3;0ZNdOCXuBRNp-g`1 z3}CP2WMWe9+b&l~UfgbC_WN0eNLGayEyVDU5{t=f9E9YNc?b$jg0rXzvG|~M^1ZE*V*zxp%g*v|@f00z z9p{*q0sa#M17I2p_|-kt5!3C8Bd$y&HY#ICZ<;X`F)mIQhWmZ;?iAo8V?GE``SB_) z?maj967?aiixXfv_G+cxV=#QlcqnRrQfM%Z-z_T3YFc-*PhEA>OL{7=Rc6(T7Ur6; zm3j^RpJ@^M_xL>cl^?ya^J>TA>L!lB^_6=6>L!W?q+Xwgic7)#Wq)u&ZS_xX_~_p< z*H;5z;U@w8r5*J!%DP#0$(bKn^a2aAVV8D1Clt4)d#(15f#IlN&MTtzhl-hC$ z?LkKqrq6YTBa8!m;8axR+{=?vK!G}V2A%@>1Xdrz%z3r*`N)XwUXh*1jETdLWQ10i$@9MQU9B75MIYB>SDbdKf{ZhAi zesrX%lwS1+2dYylJ~zomgu18emz5gNU#!vJSEN>Kki!CgnC=2#>izc&)cgW)579YAVT<|BEr@ONPlbs9O= zwqg*aq~CC$N{zH{3wy~`LdH0Ao>Wx&ydARM_e@5y)CN{;+AcyOWRr4aKjp1*_;T!k zJ5dQo_x5(+&}!4Wn^>7=@v-T)cjR6cZl~ni{lgPEAI(M#gghq(51eq(@aGN4RRX{; zDKrVwakHj_{lqr@l%r-2#~iJb`^gdDq78puF^C? zvAhh;NL-WSSqx^M(D8}@bIw+rkPZF>Vbp0nE?e%vIPVrbo46?&#Rv7UKFz=;GJqVlmlL%aQ^l3#1c51b7- zTuOY{XIox6F2v4Sr^;+%`1{)9b&)^mI(DU8q}{*z zqVh$+jG|za8w~EqQO$4mLZ(p?^?Q>wb!KWl7zVAQ$@9qwgk{Jv6NzOv8wVf2RFTFm z0;csO21g@Pa54l|9+}~kkn|(dH5%$?97=RcDtq!N5b~;C1oK+E$L1X~#(#H> zWWb<9@_@ot6Eq*t5@@5~fsx*4RD89|3nj8p49<)LjTip!dCAjf;NXrwi;q1xklx;z z&s5pCv?#TgTqN%Za^(6WWQzM#gjCL8{^59BD2|8v5$Qz#<40_@|B1BVXeEKf=chmc zeIrm`|Nkqp7_5o^AO3-~dGdd71ki(?@h<}8$qhTpK=XkO>B-X%=dkM?<)V3pAJiX% zVSLXaI@>Sn^o;4&D7yOYfTG^sb^v^TtLFe zV%u!7SXpMSO_njH{(q7G^{ZhqK1=V}7rla2^Lqp?M|sNfz*; zhTIs`FOd{3oPH4E^=$JzL_`u>#bUR1NJ08#RH;~2*WFuQzdACP8fb#qi!8; z^bBh?%{G10v3kbzc(_59QknMktHmD#I@|%En4TP|0MfCuU#8om3Qt2_$=dad0#Bck z<2>SNi{f4|G-E+}mEkI1;EsDJ&U<73QYg$w&5taOVGpVs51(wD+yJTP9xnCsQf06xkKTQGxVN2AtA4_J!m`|$DnjE zEekiFqB+SijLONlz0J`V=%aM75@AXssEw%98biU}#EO;9@R>pNHGT3>!qFB#JKH~- zSWikeVkDLJj+FTi1$z1i`-x+!QLvM*R(cxZZ#AI}VY2E>*Yu41&7$8V5!4uD?sNMT z@0p5$u6N{tj-o%KvZagJVX&>>(XYn?f@g^w z&oFy)(Kvc35=yrB94h%rTDsE7sbB1t`r0yw&XoNe)_5H471=$wF18Q6<=u>fQPWR< z2{hLWv**ULd+qcWl5$mB*`y=8#FIZDpgh;t?!dNrSvE=M-+Wtwta#t7lSA*{4dGyV zPFXoK^6RK{YSW^V_k;`iFKur(s~=o#_X9jjh~Gh7ky*JR=Yu|j?A?iFx#p~M=!+cL zF=gZXOo{;>UZ!omar}J}32+xjPdloWlIRb8iDy(j-H62xW^bb0LR#YPm+(BTLia-l zFIiN>A?#NC#UIID%xBCC-i@s5uZbm%#f3$LPONB>UlS!VITa*4G`>Dy@xzk0Ewjdt zs<4bK=&t(CS@*-Z-;T=s)=?98)W2As0(j>DVpMIPCl~%^kXU>jRwaDU?8=H#5UG2F}`2pW0-lP8Ci;2s?1&ZyT0|L9#^R#&-Vxo6{qgMi;m-BD8Zp^>5K)ifhYNXIl_84xPE8#e zjgzHud25ZK*pkT_ZDjIn_p3wAvF9#WV9SQ`YiA#SQc0x)_J)rD_UHE2W96l7W>hCr zNdwV*gytG>Otl@y5s>KQf=DA9S)im`W;HafcK$bs7L4UoMq!ne|(p9|q%( ze7!5Y5wTT~Y1wN)xTQkU*1-G{rdLpy1)wO+pr~AU_;99OoHkYT9oMW9p(L!ti~o4^ zGJv~vKv1OehWdK-xHK-R#v`V(3-eXn+;9%LzV>`OUyxU)bdhO%-fOMS+aWW!v{_7rBVm!a zTk~eg8MW|6cB-KSOPJ)9xqLl}>EeIGVD1M{^=`!t@*%!wXda(DwHN;!@Xrxy%k#{< z$eSAvFNeKoOB*u2mNwJmu}iI4t9!B2CY7j47;r_7ik1M}@Oc|`VHEw%qC_;S8eiZd z^vYmg)UB+AOU!@?tt(rtvT_#bVi`2p?NI&jRUjgm*jJKOSnneN`M9{pWidOd$PjjJ zTO?6WR!Y?FHQl6OHmPX(vNOn z^TTZ^BMOGma}My107o1e;zNjTxMJ7@mR5CH?pN;{sOw zEITzOLOPxuZZOkXh9YeK2iU`}x~)wwtAt@js-lx@=4^XrZfWG(vSP6AvFMMQr)Z3w za&u^-PJQIacjFv>95z;|f5@HD*t~y@2SFkr5?V~1=`-xEd#$w(0zVkDj^_hsvx~&Q zX{w$6*@mZs7yz?;t+=v!YoM^u=Z=^Yt5knN=%dL8#RsZlWu;QWeE$)AKlJs-ME2T_<$_L zcBs7@jFUw@oI(P86VTVnf*UIT?BSv3nqTi4X|DJnr*Lv!!X_AeHo*O_XH7nEP-kgm zf}x0dugT#i4!5o^fn*}bd%e7)X;3^Q^{4!m1^8CUS`3!v#a(vrCqc-GmG(0%UmhU2 z^@CW=a89pV76qFg>G?Xr^8>!GgtLe=B2TgIiZX6O(B+(0$an?p3ax>*h;%-Q!4_@g zMkqPN;^DDB_sh@DVA|V|jwmI8LIC7}-|dch|J-X(usfqHGwEK#wCs(#^KREUOCWwG z+@w5jaE8w{VKD*+)G$vP{HhK7>fetOK;>dP^UuF=Kh|MZ4YzhfD_ok{Nqh+_sdo_>T*iN1?|aexB62THM83reEub_D#$D9 zyw0gFZ$z*DmXw%us#qhNKupN;jby*;^XS<`RgZ^U5iE<<)24PAN`^ZMgg^?{lg-6C zv}4>BftaD|OCu|aI=gU1oTFw7f-jx3&1JX67VZf+dN8W#fgIH4CEzf6NcLuRCa|7G zvkKRo9h0ud+@N>XLfIhqfeZm%77@&$N+WxQD9x;zEv=p{eWuPgsor?~lV*N=3{gv2 zR2=Ki*-8_->bNhB<@V}}U>nQb>G1J#Mbp^m>9Oq?Nc7Ph@O8e#t=ibC{R~~3(K%{3 zu(wZ$P@T$>JP@b`Y_(Bu$J<&E18tuoWlo zdrJEQ=}5jWV~6;Zqrwl7_OJb<|CL4f&>IEz61Kjd&yiy4_}WMAp6z*PRREakJ@#j| zC?)OObJZu$XzrNg46{XQS~+5qA@7P~DqG{zA|$aLz|qkmdP}oT=Mu-t*b8Neqtz{q zUSSWqr^UY_EHR1v{^d(09jqn2%I9r+`H?_Y#)VyH2aw-;tRz)D)3I-)R-;3lV8FkoPEvu)$1Vb1<37I{;ZUv(erSKbv zeKjl1%7a%$JzcfixqacUwXsatN5tTtXOol6IAFd$!XUeGcGZjd5YOs4UK^0N#;eQc zwEUMeH>}LXfl|^~6MZA`LqbYf=uLrMLkC`$I-l44?kQ&Csi2q9-RMcnA}(9^F1mVb zqQ;qr6_lBF_$hiyV~}RexUJvCms8H>^)ehxF-4I@nMzpEbJGfg?d-8p z^jluqE7Z)m%D!gDTO}9POIK9A(HHdz&Iy7nnXT~rNu$spvj<~bw@J5)2d>QR8iaOS zQuTI+-sZ1r}2D=?4NS`QrMv^V!|o2ZbcsXdVcTA zpqxEfP%9h1je%vKONaB3tj|zqTUX#)BUG_AOzQI| zu4c-e$D*p8tQ)gRlds^_`ir!A)FqBn+PT{xnPe0F=y=ls%Gy(Of2Zd*=TEFh*ua@o zhO~XqnF*oOgmyMQlrJ)RMJ+Ss1Ussi=_%+U`o~OA(cm$#h&N^c=#=}w5}(#7wBXs! z<0DxhWB@im1o9Y#*a`|N)HxnV71;@-V$*bEh$OIw^nbAxMO*K*k2zTF+OB3w=sqq; zDESrmOc-CKN^CygBD+7Fe*11FMO^rtMf@+?_7NykKK%^#rt1!bMBcv^?0IIG?F#$B zIR4~?>|QDKeDiA%ExQG&`LTzkC8WrdJ2`8nV#(y_nvCpFJ_J zy*^1BRE>I}5dJ5C3*$0EXKjAk9eBLVkBbFAs8)RH}u=jG)~9 zEt)tjPNoMt^;#<*g}j*e`jdnc_r3RG{TPi#@)Pb)*go65F>ohGqrOM}weVFu5avSh z)i_UbAt<-^bO_;L;k!+#wK5G$9p5eg!se|(17IbFjI5BVsg2@kFKVY}n@)crRE!Jg zC_!1$b}Z&-vI?N%3pBP+bkHX#jgG*4Dt#2b9O;PfxWr0l47VFneMZ57c{L`V=5v4C zhD#2l%fjSySKobw2CMuka7dj!;g>UMT$gg&2l|ut3yU#g8^%_UcAm*&i}M)u&26ip z8?wudVS|@L98ApBNCuEPaXWAbdWiXKFxehAMGcd{gNkh1m2_*9EqM1k2kwN&%^I;Z4 z34B#Ybh@od{rpx2n+t3=X}Fk<}d%1S~2kL5~8R|MW`+osI7*R{I z8WnKw^lx*k*WORuTQh+K_K|Fc(nGN%9aur{5{g1VRyS0|{ zjoq6v-lMwcrk(7PL}Nz6CWp0wmtfQ!?vXQLSE;g6K?zp(0Nmr_g&h90q&7_Q!N)+A z3ip8BlV#uM~&e^_Mo zW!wwD2#_4$KMk@h17rxix&SZZP=ls*h$06E60|9DB7=QQY_Q3*oXIBcd{0RX4njh> z0wt5lDQn*ZiLuu@n@EhSa&)<6X4J#f3#$AL_wU+5-=i`68^j=z^|KXu3dVv3u3+jW7F}D@|TEvBe&5 zP>l!3-!?m>b#TS9uXa971OoiO^kR2vbXOA#xE?g(_Mw_Nk{pO;y$d_f*jmFTW7k~gN-Wea246n@So*Vdtb2CfZDaRWF z9O=D~*DYx1j4qezgulLlB!H95S#Bvle^=NKnCSFAb6^dzz5On>d1>+nljMWWo4qEKk3o(mpgF2>oE6#5yom24|}^F z)PL#cP8M}eSQLy4Q9g>(Qtb!~t9Q<(qDf1(zgFHcd)@=mF#PJhZrV*fuSi>GbB*6Ut;ik?;rpjJznCz zB_uF%hTz}6Rxn7mHcPH*bLRR3ApH5OUZKzDyU28v#|q7$_=w+iLBp|&(`A@a;k+x^ zAEC%b>a5wz;^~VEyv`q2sNtrR#kAi;S}@*P43|7)t}`~-^fNm`gYo(h556XzrjYI0 z7bfN-Yb)R-$Sah-}#?J4q5_n|FXv@ztX=-u>jsAwIZ9lck zkdLwOPZm95G{$x1sKQKUS^3+jwyk;8HYf&uu7{D?&H7-coayr8Z8Cn z@^`cQGHVo`GJ3~a5h%7BaoEhDD4u7GTm+ko{jD%1sRyuivU zW;YU!I}z_{U)O+Smj>IdrH;cJQv?}3ra4<|D#Q~4~|09x;7-R(YaXh06IWUnqo zzTa*TU^^B1G_XfNOZUf!hK8&gosz~2qK*xY;fo*VEG(lvQra}lGG5{a}*#vM6n=T(%@5cC(&68T2k zc?7@rc%e{Un-j4rVM~nk{lLwUy{$(a9l`;ASoU~yD2~sqqHkn)i2kE5}5l zavJvsY>u>-77XmCfxSk}iY$PLoPru&BBiHjCW-n#+yTnquTmot(q%TT5;W!qIEFM; zXT8j}B*|hb40IrkAQIQ{-Ln2b7px^lP^nRGs4V%f$;J=bjUTxOq^#2OcueUDoH1#? z;?FzyobATt;8s&BWclCz1V|m<&r)sOGQb2SMJZ!8>43Vixp#q=1m1fjL)wI8zio(Vy*jOl*%;ajI%9aAI{p z$9R%qBrH4{gVpA%?Jk#i$%x8K7X_$o#UI55k)%{e-X#0O15u*4NPijM*XpRyR>}EA zva5|l8sUziKHry(k%ceP&Q0!S{d>9v?;NDDUW7ce+4A^Q>Pl?Lr>q(qf&m7U-Ov*xrja%sRTir$AeGqBb%EL#d&PkP#lda zq`)K8#}wPeQsB;I3*~NxxH&_7gRJ0~)jtoH^v1a(&>}LBEUpR!;W~Q4ZcM?)y`xE3 zG|a2s$4df;SfeN$WH{mJ`fYZx2T4jPrRC_EQyOj93X8I0&QurmO}2jwms%mib@ipQ zpX7EV2MN(TNnjAA4+ZiX|l>5q5`=PAU|?ch+0Ulw|ar@r#PoCb2c zTL0oseLHR-VPDshjhxCwaJ%P%LmBk$QuiO|q(Ve+`{zUj8A2PvV28#VziF@-;Py{VnDMLM z@%>Qt%@;XiI{hYhRx5gBBxfl47)|3bArL6YF$l(i4k)*vn2BDIbS|xLCYtlH(5_Zy zkU9LS@|(!?Z-PVUWEUMK&X(mBz?V+DkcN?lg_w{12@I$NPhahaLPk}mUj6! zJd?n=YA4HLIrO-mzj9a&c3SL^+3tz zQUPzvnPF@i6{>BzBV2c(LJXaXk>r%8ow6_LmKE)jdfS6#NgHQy|MiC%$vG(Nb{o=l z+<*DNN1H9yc?Sqq1hTqzZ^jRm+`JA$sj=r(W;>r+O%i)Dt#UV<7mQm;1a*A?4#!@+ zraD7;-CJaIm6gFOwSLHdO=+mWTpXzd$F+OE=nP?6>#32r*@`J7dS7bFy02oUbMfG1 zt|Nl*tt*a!&nb@&s+y7W3$mMo>eRRa0QaC=yH!#gamM!x|EH!(KuujQLV= z-8PXAylK2)9wjxQ3yr5c>N~P}pU32NR~zI=OfgpCr#a0TT|hOwVUK}9U-naRhPDoJ zq_?iBuT={hc-X9x`tg`*FV6(8yD&K<1_|%DOiE%u zSE=`3olheI@$s=jDycw9rLKx_YsqCc%K0HpZ=_MCL%0#vxKN8~W9^HcmnGcOH!9>_G-Yn+g;m1tr;-h@ReF75sf4c-QB zhG1zOHC#kaR-YKhpiYETcsH7?r+PB)CU%lpNwh~(lCw!5OhKfG#SQKp3DiH_nKM*L zza=r_taE$TKd4Itteb~YP-KZul$cd)AZ;)yM__*)PJ-~Tb$?N{C-hiNSv1pX zwLK_xR=U)@ck_j zP`Y{C^_&2=EJ0H}F2?hBv>bW<6~g2yNS-3GLqM8 zss^UwF#`}UBpy(IRv0jd=$XPhYYDShdWLkNN^!wdX?|gMxJ9m(18& zZ?W4^LgHep(Yjn})CKYW9U7U*S^DjJ|A{!Bc)KBJum=^_NNjDMf#FVRA?#4J_pxiG z`{7R!`j-!XSR<55^g@NFPFpxnb$4>gUce*OUkYY?) zwDrP*Xv+JYr9PQ_bZz_U5$+^0Sm_SIyOKBCCHYo)2~y3iu1Sr9lb4yqneJIr+I(r= zxEyk9h!OvbV>i4uUwZ=H5et^Q7aE-Z^sjyzg+x=5XscivVIgcf=}$F@(Qn38`-w*$ zY~yz43DrMG?48rY!<3apBk8MeFTceuKcXzKKogJmxbbU(^;WmWCLYA`)_GjTi|$#p ztslsVQx@5@;Phx}bNH89%D-JfhT1xnL~VU5l`N&%Z}dd_Bk-hxxN0I=Mc>aY{OG(~ z>05m|emc4~eD&*z4NzCO^+J;*#NDAAr`)ZVaFbxLWAS-I13wFS_8v=W+a&ewvT4!} zwG_&N6EsLWQ7|*qT>{q69BOk@upZM zFX<@=P;?Tas-OihGf5EIQF$CI&hS-lzJ_Wi(B4X=KWoC&xOya4H=JCwU*B5>kQed)NTxF zymeaVPMIld$()*G^Zbl^xy9dAdKo3R*DIeCGh4YeJ2p_UbB7BV{XH7am|lIs^YX}_ z!WP#u;cI4u5&~0|Tbop)Z8rr8p{}y@({JJ6q zD-Msu@x_GPYXD`e4gn|mh4Rz6sU|WlBbf#|y0)|~0H-N%j$VZP|!%1ZnFZT7*- ze6`Vt=*Ua*p4&}MPrV90Ij!n*PA7X{ubuJ3e3p^^69bS=`)`@y0R-<2_&5K)=(&Qg z59MBAv2YzxbuHcNblS5TsjEUJoVD-VQHNz>da^^egI)>R>YXfU)f3lTUvTdZ*F@(? zdN7{$`9&NY8#qe73PzT^izHMUCPBwDeOWW$TEs7~;B%Z5Z&{TLl)>T#nRA2o$yS=VJOvf=QI|`Ux9fQZvwobDy)i#67}d9Rs2*hzK5}7GUZ4du*Kv8bg&h zk=OHY^l|(E6dxZ(iZp$Ue2zu5wuBK8e{JTc3FJ_K%W}ch%$^*TU|B+l0QSq|^A=M6 z&-%j~B}?5X)#|*ZTy)TqzxHoYUFJ6jj|S$kd*L<)1381JVobVBElJ(1=b(~ckl;r) zYpgtXltk1uCV8Bpm?WIeaeVdgdv-kJ^mX`X;br^09x<*Eou4wcb!@Mn zQkJj{de#8^krgZ>g%Zm8Wm&?#hC=fXUk+xevl zxppM#CMigE_Th0ko!{D(5xLDI+F=x)xQwKc&9|nrs&4$6iJqa5-5-(KI*;G!?B%RgaJ*j$_ag12%5ufHLU zL?iGhqu$0%&fJK5SxbO5G;p&`=k}rEzB!7@F2dp}ipi5yn#0j#8j3;!|nl4T8_i-|A zB&En<>P}Uu%5~rV+V3W}F{prm7`lvNu^g^?BifE`II_@ zc?Fe@4<(5(*fKU#r^w8Deh4AfSe7G8S$>;7L$VsXtx!^fu*q>hswVr#g+`xJRuu067PxbeuyYZ2ifAZSM2}a; ziRq?2#rqL)@Qc)$>L`;}M1z(0nOTAmt09Bn^8M;H1ozs|0#vE9zUT%eMW#%zxVr-3 z1(AY`pzb#u!y9G-bWX=T*X?b$_>kZ=k$9t zxG3*K+_=8Glg=IKUHK1@{Lq|x+Gt3i1ZKNR#DeF|+iaUipe#r=7}HU#Bdd%df%()g zpOO4p#EP~-I#nL+PXRjfL>|_Wn(RK1eg|qL9ja{VQsF2=mDfTx03gl=~&*$I4!GGw;=oX0KxE z+pQ+}Pr6d*z7<&5+hcbp8EKX<6TV+yhGjOf0I%*0j<+HS2f~z2!8*@B60EI@JK|wG zEWhuz!q>p^GiOgaqSrS3po5Jeo_R>C=8|2GM)+p62)&uhW^gDL$2K^Q4_tS_Mz+?% zZ#r7ok>;4b;uhN66o!bomiH>1)Ar9dVLT|#^N#Z6wGmoac$P@C!Y30a{1Ia*VVFqR zs>Fv)SuhGo({=yn`E>@2F~J*WlwULobu$?+m$S}c#{Q>S zkS@@<0W=7MJ?d3_wB)+YGi`?~U!UBo@?q{@PYUKzL<+kFkD7JX99{{1QVG+i8uNkW zf(cbMqM%xn`#&d7ktBT1=BK{~JklB>(@$McPG64)=k8ACYb&%f>7|dq4KaN3&TShn zlLJpXQ5Vyz{$=})w)o@xn%_*$ERq1L`^!ZQQ)IXKF(Uc1YP;$cXN6EaJvW|ly=*Yr z(z5sFWJ|Ep@oGbh<`XDro-ot$a`I5$?nHQ;vCLgHFO(Ve5Sy%KEzifrI$Ox%>zo1-%=<6cgdU`D~V5504in3&cF{yF?3Td*ZYfh1$N|W^XXef2mRQt*z** zo>Oe|e9txJR>cca;mXD0G7RD{oc4ENicQwYn#CTSGC|Q(_IS-&A;6L8Q9q;fA^nfk z2DKiHizP`R6MtjGO6}~{c)WEliKXR&M{*YR@=ogSRF6yR9^;bsZg~6#xma!4W*gE+ z^00TxUe1l=9pN>ICuh4=vev2 zotenzF=SCY<8l`vC6+JF+6vb7{a;!S1CZ!-#=A0nwQ=Q)Q2lohBdkrW!TsGT6DI`^ zlTcTLc^m@thD3w0<{|rVH!E&6h6#h4GQ_QZXWN0-KLv;M%la466uF|9fe>in+;lxI)zk(rioSie z8zY|Y_+2N(`R5D2DrWHr-&>-1zRTtH016wlSP97j8wL4|J{nK4{1b+V$rqQ?CP{Ytg(P1tumBCP|GDI`r zAK@q3j1N_7NCBHO|6wN4%l^YGLiy)^Bqn-yk?22lmGmph|Cg6Orvhq9Sz>6l{-Q;& z3DGDc4uVkB551t@6X<(*lhJaN(l4D&%qjc;W2g~7T!Uke$Kkec7!e$mwp?yAcZjky z`vs1?XwI(1j_^{9mIjGaAPh<6Kd%)OaXDx>k(C?sdOP8UM*q;k3nirUeyn<>XSy~k zTII8^F5hAol9#wyO-ECc36v8QY4j)q%8F{|zdtNcbsG84F+AV>6ha4_-L2WaTu()* z|0D%quzjIbMKT;BVhrOO({1GYnN`3Ro)?B`splQsdVXMLu-xhm|9VSs>o2kec8mX` zjAQxJ<8Lipl_lWcfo``2Gt0rI36HPNSYpB$;+W*CX5(NG+oadnH*nPgmGouos?Vn# zm`Akb>6Dm9zQQ;p>9Vqm|Aotkw=BXdrPoM1dZ-0yzO>HI6gbk$KgM3DdpN z3xSJnP|6f!UBGeYK>CIM(2>J>h63dXgq}?vr481h7Bkw>#JAhr>@PMXH?E%_oLdf` z@(eXsOX}}d?M6IF&=n zT*Ah&+j=uihy}rYk5irJdOYn}-UZbC&R@dL##bvbCrZ@l43uRglp5V1V5X*~6q1B0 zsA9t>OmB~3;XLe(=%U29Q7T}Nf?hdI#okp`jpdR)ZX;+uENM1ik4gV-bACg<^!FCm zpZ}ZV>>uTOUKv6o=6jk-p? zZ2jIUx0t(Le(e(hpJ+`WD_`zl+M5q=5zHIIt64Izd&y0Y9Lti>1@!r%C9z8~g+|?R ze>5YU>Lm)Hb z9!YIJ_&}C{&|sO~dw>fO6z%_0I?`o|Mg^L0e>mjXzslKj{VDM!gA~H=L-DHyE5$$$YcO9wuAs6TtD;Bb_=~0@P%{9 zc@}qZ$h=MFCP{NUcl-n*(By_(GAy7S-JSO-eDdm~nmb*S<#E;C5O@S6MC@d*tvE$IwGxGY(xPG-S zfQt?J>rbc&&=z7TLlv7fU4Y+SBpZxU3Pe)#siTJs>r`uFuD_pZJ2flW;UiBur4)_6Yp*ak4^xWOBfZcB4JyNB8WQkhjxFCFYv@rd*KV$BB7;RJ>8R^~{qX!!JyS^m-{1wu1j3=InH<+z(U0kk6?)rRWD7OU+B-RB-+& zbkU`fUhfpJ-MC7&-4}p#cGMY7WBg7toK%SttH*~y5IXQHv1Eji0G8sX7(wa74D`t| z{X`!P;7GdaFCCtITHQ^Ab|@BaKJv0P8T=flQ(k~zFdKsu)Y@|aFc%~+6cU6p)5cmXGvM~npL6bT^j z5vz;$Yw$QOP5P9q75{Y@s*TPU5+&RPeQ-=LU=RnAbLPl{Nv!|UypEFePa1mrl2Xca zN08JPWCE@jGlQ6+GIrMAcACh=0X05Q{UD#MaLst=;W@I4_T}@ZzJU|9*ACV6UhKgb zoDsUu+)*m6%fP1AmPSuL?A*-)!Y|P{sAy{`v&p~5XSh@V{-0Sp7%u*nXuk5)fDuEQ zMEk2FBc8L4Kg6dQaW^XTXV>1)z}k%DB0~79OvY!2eE;akK4_O>OmeEo&&1!0hZOKB z_D?a+U=)NPZPI*%*}Y_^+!-fdhRTlVTEta=sk6{%?2<9UH@M^XJParX1SFqw4(iv5 zF0Ty3*bK-`4%(m5D*}YP@zW3_sDxKS5NB*!Kt6BB^JI_xKj0;3nY%8k#q{19Zle9t zh1PmDLF#u7hU&mUqI6AOh8PEqb8W3fTaSmC7>1C z>S+vz&0x!7;v@mAoxFMqC{kpC)L;L^r_u6BV_t)p7V2$$xXE8xTjQ;m?o0EdVAW}4 z_8XjkUu?+V*3#-*O5&Y4iQTEf@cPrM`UfSHm#Kt3?O+3fM%b;Ge#eH>sF1-d&9O_; z{ZY{|(+|3sC)vKiT~zta<@}vLjaM}vf+nHFn0cT6YMx_Z{)p}Z2rIZ=pt6my zTakv}k^xBlwJL-5*Z6)OMf|-<1w+Mc4*)N=#d9HyC)nH+{rTmkhd5a0k zE(<7qr_^VRIbNHm=#x3={+X0!faE25L3y2<>*mIQ;4JC0F9EhDCB7P!~7o#@e{GlJ1Z?>(aTI*Ag4AbKYlJxD~aXFSjQU+0|n z>$}!D^Krh+o@-tAzW4r>y-ALYPif9Ag?cBv{2 z+3VN{FCy6D=JQJ1e$=yP+MVZguF!p$}Uuehj2D<)w_dHaU6V|_dTH%B-L^lt1ov(D7(QMBeM=Ts zo%XK_Bw2!WG6Z4j9tQQsGLpI!7MBXdO8Qi5j5!?)H!uTlz8nfc-uOWFY_{w&-Bv={ zx&Z+3+Z&}nF>VvF6K2jgt-C|mqv7(X!2fz_xM+qNhhSK(o>xK?8jUkr3ZWH_P<1^Y zo(4J2BkIR;ICENILSt9L@-GBK_{8!Q5^5O-tp%Sc#1k!B?=uxnl0ToW!S-%AHh||1k@wd1{GW~9(XihQ9#+Tdo_d8nlNLP_OIg`qYUZVHZ^-jR`978d)EIH+vx54Gk3Jqv zjrA2|CAv!)gZ?9zfmp0s%p-wMDhuxS1o1?5{?!HtymC!$Z!57(1;5^ZYK;*XsS8Zp z+jo0;+&iihY4axnJ+uu9&fhzw@=4*okDXU*c~ZE6<8^bkw#t!H#=vF43~_4PU%ZU@ zfP{wwdJYy^AV}|fXdY?0(0?nFzhkHU)bqBaOGIPT-<0-Q(MIBf#MY_0owiDOQvG$$SP{@e|;%@I% zRb)$9Px6ADats(rxK4#Ux%dg3=&HBLyl+KjN`GZ-$ocK&8;r!HdB?zwIH+;uxvxQK z2ZnB6imUoBcS`|fg4Qp3_IihK zm8?Zho{I`M7YczD!3ZofmO9mAd1jkKCO;#vjl6Q-^C?eoB8+NS2*!eulyMoiG?-qFLX?hT;4^~?D9Bulfj{;4 zY)*^@);@j6xS=t7X!up{S@qB&2j8OaS9PT$KUmWpN|F@arVE9EFctg>IU4v$fPOvV&A+tHZW!IBI!t>&|BBQmD z%Up&CYJIDx8|PaoY5Cia;lUp=#vA~hrb&y-QgBhC_4k~*qlT8m2%#R)|I;eb-ty*6 z`z(E4uJhmZmq+=98g!>w626V@J3kn2c(OKep&zR1=MN*)=;lB#EkhQgG5V!x>&gY+ zoesC6>-k1PipBX&9dzgY0u#=fxgBdB)AKpa>4AeW=3E&}_oQYpdUveeSYN_cD0#N- z89%0Sq_o-Q;0=pb%Pzs`LXglnKHS(1#tDC!CWnFbtY7<~bJ_X8mH>>o;Q{VQ$M1T8 zm%r~`#jH+bQh=kdNlDwM0V`Q&ua5OqR7G{9Om-!1nuV%cC_a(w57xZ+d+HeP@@}wV zJ`O2A`cEWA0}9*kSmLMW*@|sD#ZsL45`v@HxMOM^TT&eXSeWP88*EE%zDKS50!38{ z1>;=EbY?FF>7aB;^;i9$v=aG-U^?r_s?G8>*STXXf{psUd$y4>3w2ec04aC6GTsjW z4#xACOw$cU9*74Y#)U%qdm-_HmVIjvU$`<~W8{cNxD}EETq_yAPugYnQtrX(vnFU9 ziCK5(1oPRa$NnJ;J?P>EJLh3}67(N1GPUVw#O%B8hV&KGbYvIz_TVr7B8U9;_VAvh z6&IMvG`kPGGnKl`K>+kDXP+`nGyhefVGSpZ~jWy84@>^N>5CXMi7 zsXYBKYGY1mIXa#nmvuUD04ePU^HVb{W|D}Ob@4okq%hjtY;KWh`a3iO6-cJV;C|_6 z@QGXIHxeoGW1acDQdJoIUnc_nR*MO*f!Hqj6!l#BAd}J|62QOBs?LUl~##2Bt=? zs_*>di?``a)*hsS1w@@{Y(M+7aSo5wda?D1cx>$FDh>XAMtbJK0}O0tp9b59vN!TY zJ84s1J@=7a_lmgBBpoYSq>xeR1HtfG)m9mNhHvOGZFM^pMc(wENahCwjcKi$O-4=o zS1y}VG4_3@2M(i50?%5D<64QSOF8J<6;x7gdIx>K2FDLf{2|a~?dzRHVHRsEM?2@X zG&$eiT<+ORn|Ao@;j%j2%A$_7fyhq;cjfO17ivksRAIYSCSN@>whT11D(Ok)Y%H;hgz9{Tja2?=9q5?B{-H{69P^J*!lqQ2{X z3j!$ZU!7n!{CVi7S9888MH!nG(&v4X{gW=&(4l>NbDw;0aSdHgzruWB@wb}EB3UDQ zs$YlAi}ngUa>Fv`wcU1We<-)T%eIK?d2s8uym_J6@1RyD^4&z#*r5ocoB&KZ=H7_9 zsHlwJBf}A>2ZW_R51+Xo^I1ncm`PKD6I_Mu_dAl=0gw4=1&fk7nk0i0xy7K@KiR?m z>aadIp=VyWm8|W0x%EP2p6F0)ylmD^@41=C%FinF8S|$~ z8&qQzeoKq_O6{cYQV?P5vyEK!oOrXqprhD5U+1sVdP{^ByZc!k6RllgvD_C-f{eK%-iAUoiFvOg$7@U(u1uaczFb=3Q?cZ%!gz7WG`&l%TY z9_mli36DX;Hd&z)vKup+wv;>S*>Yuma6?9J(ee`t`R%i~6DOeuvNuL|O6)$Cu7l-V zPCiO1N{V^xT3#RaM8VTg`SfD7&;n0?uf2*i9WCYuzHEb~Oli`pGgb!u9xQgW_S622O(_%f0MlB(QPJ8pUZ-&EpAhi8Ee*@O1~X;K+{*JLZYj(7ESGfB+>={*```Gj=Pe%tu9+Fv^v5YO|&!2Z%nT1Fk^% zV$)?w`0pO{7p)jkfFIpkfA8&#jQtnZ)9QqP6dduKFn2c6{S5VUdljJ1@%2rI?*IiZ ztc+-7d>RnwXRpgpsa)!L#%b7nx-dRyGS2BF!RjMcqcq?UFu?rs)YdK< z-lt%@=Evgjgsc`l`_ZS{%*(o@B&DsW%|u^4wDo!Dt zG$#Ny&#EU0Rfp$7s9!XgNY&4XeGr58HDPS($7>mwb|fcL%K6+qSR+Aaq0)Z2>yiJQ zyKiLxl$kOa--W~?bb{8#h4`2IHjRpP(w)&j`cQIK^v1SR=)g4of~eUJlh_U^b!BN6 zL;S2aKQV%QK0zM_04>cGF&2_;CDpi`Fl6s>1#k?nnG%D7a{LqT7RD2gnAOBlWhoM6 ztjKwvH$e4khv0mCLa=y%21PW3x(IRWn-;MmHgk`X$x%HjqTHxHO=eRk1WGk9qf69`%`V`z!Nq2lM`0 z9cqgQpqIyVhr@ycViI77Lhx!JE~)Mg=~#(k;`6VXRac>KI*ItCu+vvektsoUsV)vM zh&z~s^Hnn-feIdYTn&b;8a`AEa^~Ah)lh!e=#<)Psa(n=RkR175fr%!n(r)Q?$S_Z zZ*9`+q;SlX=2)Qv>k(}JKEQn7c77P3)01gm~(m8EQ)no7CZ_+r9 zgagN<8h+9P50t{+mC6`ga!FdaTt7VqEEXs-eUVo#e)lNj-yJF%5Ef6DypY3zu`}MpWEyOc<{@EJ z+HpFnY@|D@2BULt<;1*IO!TE9VIO_})^3u6JTx>P#kV?Ze}+9xDmT1jYpDq=Rtg1s zd_)RY{QAxV@wz5cFw56gS zODa_}K7aN;V%FylD^JtPKV93oN_`mKrMwIo(Gq;Ekq6VL*5R}HAhY+|nmbrtl+zdK zdl#YLU4%@HN`70Sdr{Kj-kd*rTwc2{B|r2wCP9}$2YU@#o@d?E?Wbt%qRYR=TOI$N ztTBG=5LSCy;(BdGYJ+7a7gyXO+2q%<9#xwuOgX@eF>i%1A1Quud~MovWUbT0geh^z zasQuCGVev=SiwQ;u~jfxJB{QgcLdV;G=_Ex#(6!grkeO@qrL>5ZtgfmgOTO|wCCTm zl5($&smILG&^5~1-M<6>?!J~Gy>a_5it8*kP<;-2a8fp6c_Q z#BuVux*#myxZ+?JET;mTo-mHrQ5#X`ef8YPl|j6o76KEd@#h#ZNt^uSSm6r1JG(+E z?Kb&R)q(Mi7?z`>wN922WV>w12H_S@g&ulX=Jfo2@?h3`}U5I=*jgU{@taVNDGz1is?oN_=zd*dyQAJ2az{>q_cm^IgfVgXFZ%q0?5 zRZ0oNY9iapSpMUkC6i>G&*}r4Mq}Qw2xB)lS%+AuA`g>ANFd1=OSy7&r9mNgOZON7 zI%H4BU2s03sB#)c)=^_N5}aaFFJnaWLFs0(n%9XxvWt)uZ8;E zI;r^~*jpm4hq7+I-Fib)q|ZOXjd-=|nh}VC#(*vSF5v(fWZy3MKR=#D%NzgAQXS+< z#47Cl{e9NcXxjmJ5A_!0VM`PU*u3AH2ZULAUT06^&pxk_=06wTB9&Th2&wS4_FYT( zN+->p(_Wyc@a4MZQI*2$}ypruvh9e2kK!Z{veGTiIu`mPZ&YoA01`w_GHu*Z3g+Vnrm-{b+1 zhVc)ZA47!>ssvwfH>hIf$!XCi_C9;d+7uWtTzM+{iU8MRAGr;AsgvG0b5OpAb^FLJ zgI|*y(bw?)L}ZJ!^J_zsU|~IGgTNyi-ee*bOBaKXrU2Qc#b4y}Pl7vKjbvppH(YsN z_$)PTCTY1^8bDU;EPea_<`<2&FTwR229Z1V7_E$>L;Yp!xsj*savo+QuVq>0dffx= zHsZd7aYua@*~%x7p{k!?-TGLoVVmh9YO_)(=K*CImj1KG+rj8nwMOJfSc6(hZs8gR_XtNe)M3?F|s&{d7(+9jwgNZ2in03lx9=*|+d1=jwSH2$MzPoEa=GJwMyhb-m|AAa5j>2+v!&OIqqi;f+F-i85|=Qo}@-aG>4 z9GGh9A!ze7%EaEWpp~mqvVVLcn9ls#WQ7}L;z(`6wA?;~U7>4>{`X(^W3gH~%(R+n zvovx)Vr8u^6d6QCjm=!o&<^B)j#<6k?553Y7+f(_24XyRVFna+7@fa^TH+{l17Snf zVPg{52I1qO?yA}l5AT+$q<}_mV~i2G6A(1E!LPCE7Ey026%O~)~&)pg2{^Kk@1qVrQy5A~uWh(7`N7gvECz z0py%B+u)cb`e(Z(!>dGWki6u?wAn>zt@wN{iA=qt{TGnHS|goPoky$3DvIvpv9Pzr z=J4Wu?QdVI7MLp2cpCl^sCqK+_}|V%LEeND=JSgc>pHF!{PWD<%kC0J3TFm6DPn^t zsV;ee{SVoU_EuHgKeJaWb>xw7wq&dN7^XPG&Cg6*pJI)zu8;V3%pob-7F=cS!dyAV>KDxZ9S@ z4`6p3I%JuoeODDm46dN#DbVCgYBh|48s6!yCEaArvzvhp`tk7HC{^Q@Im?T90k{EK z3NLI(cYYMd4J#TZZ*-1mRY4_ zyhi&(OX9?otRl;3B6YL(yD4%)oG_rn4Dkk4Z$_F5$0AEo6FZu?K&C$-y|==QUGId| z!~6Vqd;wlumhCdD=aR3b&!(b~@VMxyS-`Q!r4D3c zVvUlH>GMKYI%HS=j5rrI!skaB`)psmcea93*^2nh<>kL|GU?3wduWoo23#TdO?Q&0 z$Q(}+t*=y25aqY9vgo8a+ern~)y#mclCvZ2>(y?tX?#oGGdK_3Ojk)dZHoS8}xuSj9$L5#nx2dp#O>s+;-!U{^RD5{Z8-0L4D&vx7Qxsu}GFu3-; zt6Uq^Ufj@rXnB40#`^*Q(GhuT-B21R`m!B9-6^)bU>uM3MrmM8YGg43dGvgp@9)pT_r|Wi8KaqSbQR&>2%|9G1WWb^z;nMA7 z@5L||`19xBniA}_XKZ`>z1Txt(1ZVLEWsK-6izETLi-O3-m6d4P34)LQ_nuryy zUwL5c339&1hYKcOe2LyaU^ET=jl+u2d6&n`$54i^V$Dtu(mAKOGrk6* z(G^!>SfT#iFEoA^@H~#^;L*?kwrW4X>;0+`#|*2)aK4n+m&eb6mSsD*FG$3=B`Uv5 zS;VX|#4o%-r$Zef>CkjnqScvf-Urw_?u!@y zJtGcI()&lh{hm?)d2=>6?P zD>E}g;dC)b7!TV?_oR=0aWMz7f$=xTGLl;wvceEeeA@A8=?O0=DZTCotMPhx93&|Z zE=>e+8Kc@>kZhgVO8uyRi|$={e&Nk834}CB>;4&eLDIJJ>`~+K!(~XCUXGd#7~*sL zvhlfnvra4Ll|)45Csh^7=mW8(EG`y)vKLz?oF!i90YeqOvy;xR1y^ORH36|IpROmA zybT@piXWwT*C{5XQC$ljtJ*7iLrUefxjK9usha(@$z<>Y8JmoXdgX%^<6733pI~1h z=EaL<1F9cp$fE=H)S;|^tN=z%R;99N=AhJ@>mnzNp^|3H#fq56$hm^w)h40e`zWcI zxuLSWmis;bZK9TMjWTzYu8zM6gWP&ATo;w@zAZ{Ja}zz}zpeKCZg^QgX2(ZUEwB3< z&V^F0^E+9QxQ0famVk+Y$}C^N~NX)1}olh;yyae~0FD|3Jq5zS-E=F7J8PXMm|7X(CZs zGxEB-On=eQ4pn-X}ij^^QW(v+?A{Q zR~OnQa{3YX&Wn*Hu2(hrZ)n~CYFazX%j2wmTI!ftlz7qL!b_p4jp2S+E?1QTVbc0J+>JBx?{k39S!=REsj750~s{tAL)@ zk&`5{PQJ_$sALy?GI+gRHvX{jl2CmP{r14|kWl?e`Vdz>0>sDkB~k&iaF-AWKgm)t z3Rf4uzBs1(A%n7+y}z)xB{NY1UD?NccN7zq2d{gj(_Q0f%rrdVZPh`-Yi_TnAI^J9 z-Di)!JFZmA1OVDH$zm#x`@%bq_EH^oIOyL1(sP*M9Ulm0zp(mtO8#DHD^7RTabBo4 zDuQy$O<`Z+tJ80uE1o6KNS*qVRdL7MqKqDb`8waxsJ|r7E<4l*s7l-OZd*OjO7x=! zy^H|Ti%5ejT76#k>8pO zWc4V`^(a+Q;nO2D-j@iQ4Ev1u>ZY_N?a|1#K(K>}Rd`#S@;s%FFrR6!hqlYk&ad_# zw+&Q5?x(_Z6*>eYD6xFxL8ty%9N+VMe)cY-q6tN7D;w{Ntih+VCvC)wcVsl6o1q}) z@+0e6#64|U6xG;R{m6rMi0Y)k0{U>Vi zz#{YsI9b5g7k!&HS=sx<3sTL#(YuK6m?|W=8ar@MRcT2=GU?i#NHn)K@=xlF2-MOfKxe zNM>>RRfvdE3QzlZ(qW0W_qX#?a92#<++SfSt=;uo2_y0H(Wbuq4*W%$m75XHu}q~F z@VC{HK+eb5w;ZETlcuGab>6($y4{VS1RM-TBGC?941^S;=0_8aH2X7B#GQ+>ds zeU7}(*?C7S0v`DIkL8qjTMay6-Q%sQI~LLx65sA}6*~D+)5`GDcRdISPk939;0QXk zRom+cLs^bD%6Mo?iY9^4=7-C(osklgMJIoH(dK{sk~K#&KGSy^I7yA682t1(Y1luP z1-CTXo!8p9))@I19R7U%pC`3^%=C*;acS1+3#EvesP>DylNrNF*TR%vS$)kHZTIf( zMiPjS@4-{bX)HvCqDB!U9Dyun$7iSC$|(>pspXtihkK^Cx0NqU!gd=)4GhwD9e`Iq zcl)zzr}BRpXcFe(bBh+pFsX1+iYVm17F(9{RJ1jcdi-0;NEG8%)xwn+%ueI6w~p8` z@_hXMkCgmI*v7AP@!P5mGw95iD|Aqr7&aEJ0yJM<+hfdyo|QMHW?L+}(|39v-essW zCeAsE(d|qJOSU`jjJNb$!H~y=m&yc_BR%t|+41R^%Gg*kwGlO*l3L^TIOJw0><;#O4)*pP;Q%fc4n8q46>Ihzoc+X$$%ioe>PH@=7!+Xge$lxMl7&+VZMku?S*vdzWCxHUeJwsMr5`xKj9B+B z&OO2)^~Y3cfUR!rA^`)`s&I{$>-p){!<2?Fh221wu!h>}AaeadaZc|}7U$hrg8Og# zwTvYOIgK&5#%Tbyjj=KbpUc^GmP?BU^>zH#%3}sTy9p?h9#nQJ*JIeu!kNYI(sKRW z?wQ5gXT1#cB9tOMlZh(8F9*$Hjeee56YsjRT%$g%UKkr~Zs|X(PEplOqB?sgv)CWa z2#~hkdu^gFot9^*$4@=g^P5Xv7sF|&tbtxjZ81(|w2^gf0$20~|8^i3H0_Pq@)w2% zD-??rsapc+u2&EIsaGnq+Uyg#i?o|&<^Ng8vV<*M_E@$265GLb^$9GwJ*}=$BZ?Nj zTk|;KH&U4-3u(lQq!-P%n>|+&Gt9;%D$;nGJ!uo~6@pZun>xL{!5y41#Kw!t!d*|= z5H2#dsTeR|1Uj5f!lA`4KsbA+tcuxB|KRKhFb;Nm+%tJV!EbY*epMdTOPBENVux?1 z46WmyQnTK+;P{22ZOv%@@F*s>Kq@gyTpw3|=4#xgZ-IVnK~v|3BX^QKH;`_sVrNqS z-(-T~F1rPHZ zhMmmuUp`I!X>Y!*Pnn<|dy^{eDUekkRS14R83k9_<{OMq0^%MF`p_QK`k?e_-MxqmeR4O^pm|!`8cYP${c~pcjiZ%HT)LtJ;qa{s2>L3rx0vF0Sh%)bpBr>v zchsO*XX@YQ%o+(QmUhmL3*3>(gFZo6+S-hL1OvdFG6=lT@U|giJJmO-pO@2A|Gx`UmY9)p<@YU+_@o4HC8jmoB$g$cv;O>m)9k z1awrpJ*PT7KmM$~7$thK9v7w3K@Q%qn{_0#RY&t>Om2m0t*j~RIa~s((@R+o=@H)J z+cc@~`+6H}*!-em@;WPAj;mSKfvUE-h4C$RnnAjrA;H0?Z_Z9J$EIY_>_&Qp@6N_a z1qbI79d!7ahbrwQjdi}{wH}4xcG-R;2xSAvp3g&qwR9@ zmb~*?->zSm0mChjmYdpfIM%XGFL#yZ zS%(Cho1pjKQulT{Zw(8y79LOX^6ydj+^^q^M28p^X%&V}o?Gdx+ZiQ(+q$TBYa{V) z`SZsTl~mM?*`A$5eZ5S%u)F_du1Siw1J=`QR^(*+Y9qhP)~e$frQc*}Lur#E6j$wl z18moMGB{i5)i$Lz{6{$r9vfT6p1j&cQ70I`xiwibKT$Ji_bE9!&XUGvwbp}Xxc+zs z${&4SMM&FHxSYJLky3c@B277~V8LYE&t5Gkq1Bn_>Lzb|R6)ug62T*(Qp#={VQ=