From c19fb112bb11029f4054d9d2913a75cf5dfca54a Mon Sep 17 00:00:00 2001
From: Ming Rui Zhang <mingrui.zhang@savoirfairelinux.com>
Date: Fri, 9 Apr 2021 15:00:12 -0400
Subject: [PATCH] build: use cmake entirely for windows

GitLab: #352

Change-Id: Ib373811c9d47164954a19633fd0da389eff5aac6
---
 CMakeLists.txt                  | 551 ++++++++++++++++++++------------
 cmake/time_stamp_check.cmake    |  13 +
 cmake/time_stamp_create.cmake   |   8 +
 cmake/windows_deploy.cmake      |  22 ++
 copy-runtime-files.py           | 347 --------------------
 jami-qt.pro                     | 189 -----------
 jami-qt.sln                     | 527 ++++++++++++++++++++----------
 make-client.py                  | 100 ++++--
 src/qrimageprovider.h           |   2 +-
 src/smartlistmodel.cpp          |   2 +-
 src/tintedbuttonimageprovider.h |   2 +-
 src/utils.cpp                   |  23 +-
 src/utils.h                     |   2 +-
 13 files changed, 822 insertions(+), 966 deletions(-)
 create mode 100644 cmake/time_stamp_check.cmake
 create mode 100644 cmake/time_stamp_create.cmake
 create mode 100644 cmake/windows_deploy.cmake
 delete mode 100644 copy-runtime-files.py
 delete mode 100644 jami-qt.pro

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1bb35818d..8549d9778 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.7)
+cmake_minimum_required(VERSION 3.15)
 
 project(jami-qt)
 
@@ -13,22 +13,12 @@ set(CMAKE_AUTOUIC ON)
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
 set(SRC_DIR ${PROJECT_SOURCE_DIR}/src)
-set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}
-    ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS})
+set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS})
+set(CMAKE_INSTALL_RPATH_USE_LINK_PATH true)
 
 set(QML_RESOURCES ${PROJECT_SOURCE_DIR}/resources.qrc)
 set(QML_RESOURCES_QML ${PROJECT_SOURCE_DIR}/qml.qrc)
 
-set(QML_LIBS
-    Qt5::Quick
-    Qt5::QuickWidgets
-    Qt5::Network
-    Qt5::Svg
-    Qt5::QuickControls2
-    Qt5::WebEngine
-    Qt5::DBus
-    Qt5::Core)
-
 # library compatibility (boost, libnotify, etc.)
 add_definitions(-DQT_NO_KEYWORDS)
 
@@ -69,8 +59,6 @@ set(COMMON_SOURCES
     ${SRC_DIR}/audiomanagerlistmodel.cpp
     ${SRC_DIR}/qmlregister.cpp
     ${SRC_DIR}/utilsadapter.cpp
-    ${SRC_DIR}/dbuserrorhandler.cpp
-    ${SRC_DIR}/xrectsel.c
     ${SRC_DIR}/moderatorlistmodel.cpp
     ${SRC_DIR}/screensaver.cpp
     ${SRC_DIR}/systemtray.cpp
@@ -122,29 +110,156 @@ set(COMMON_HEADERS
     ${SRC_DIR}/quickimageproviderbase.h
     ${SRC_DIR}/qtutils.h
     ${SRC_DIR}/utilsadapter.h
-    ${SRC_DIR}/dbuserrorhandler.h
-    ${SRC_DIR}/xrectsel.h
     ${SRC_DIR}/moderatorlistmodel.h
     ${SRC_DIR}/screensaver.h
     ${SRC_DIR}/systemtray.h
     ${SRC_DIR}/appsettingsmanager.h
     ${SRC_DIR}/lrcinstance.h)
 
-find_package(PkgConfig REQUIRED)
+set(QML_LIBS
+    Qt5::Quick
+    Qt5::QuickWidgets
+    Qt5::Network
+    Qt5::Svg
+    Qt5::Sql
+    Qt5::Concurrent
+    Qt5::QuickControls2
+    Qt5::WebEngine
+    Qt5::Core)
 
-pkg_check_modules(LIBNM libnm)
-if(LIBNM_FOUND)
-    add_definitions(-DUSE_LIBNM)
-endif()
+set(QML_LIBS_LIST
+    Core
+    Concurrent
+    Quick
+    QuickWidgets
+    Network
+    Svg
+    Sql
+    QuickControls2
+    WebEngine)
+
+if(MSVC)
+    # preprocessor defines
+    add_definitions(-DUNICODE -DQT_NO_DEBUG -DNDEBUG)
+
+    # dependencies
+    set(LRC ${PROJECT_SOURCE_DIR}/../lrc)
+    set(DRING ${PROJECT_SOURCE_DIR}/../daemon)
+    set(QRENCODE ${PROJECT_SOURCE_DIR}/qrencode-win32/qrencode-win32)
+
+    # compiler options
+    add_compile_options(/wd4068 /wd4099 /wd4189 /wd4267 /wd4577 /wd4467 /wd4715 /wd4828)
+    add_compile_options(/MP /GS /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /Zc:inline /fp:precise /errorReport:prompt)
+    add_compile_options(/Gd /Oi /MD /std:c++17 /FC /EHsc /nologo /sdl)
+
+    # linker options
+    add_link_options("/IGNORE:4006,4049,4078,4098" "/FORCE:MULTIPLE" "/INCREMENTAL:NO" "/DEBUG" "/LTCG" "/NODEFAULTLIB:LIBCMT")
+
+    # client deps
+    set(QRENCODE_LIB ${QRENCODE}/vc8/qrcodelib/x64/Release-Lib/qrcodelib.lib)
+
+    # lrc
+    set(LRC_SRC_PATH ${LRC}/src)
+    set(RINGCLIENT_STATIC_LIB ${LRC}/build/release/ringclient_static.lib)
+    set(QTWRAPPER_LIB ${LRC}/build/src/qtwrapper/Release/qtwrapper.lib)
+
+    # daemon
+    set(DRING_SRC_PATH ${DRING}/contrib/msvc/include)
+    set(DRING_LIB ${DRING}/build/x64/ReleaseLib_win32/bin/dring.lib)
+    set(GNUTLS_LIB ${DRING}/contrib/msvc/lib/x64/libgnutls.lib)
+
+    # ReleaseCompile config
+    if(ReleaseCompile)
+        message("ReleaseCompile config enabled")
+        add_definitions(-DCOMPILE_ONLY)
+    else()
+        # Beta config
+        if(BETA)
+            message("Beta config enabled")
+            add_definitions(-DBETA)
+            set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/x64/Beta)
+        else()
+            set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/x64/Release)
+        endif()
+    endif()
+
+    include_directories(${DRING_SRC_PATH}
+                        ${LRC_SRC_PATH}
+                        ${QRENCODE})
+else()
+    list(APPEND COMMON_SOURCES
+                ${SRC_DIR}/xrectsel.c
+                ${SRC_DIR}/dbuserrorhandler.cpp)
+    list(APPEND COMMON_HEADERS
+                ${SRC_DIR}/dbuserrorhandler.h
+                ${SRC_DIR}/xrectsel.h)
+    list(APPEND QML_LIBS Qt5::DBus)
+    list(APPEND QML_LIBS_LIST DBus)
+
+    find_package(PkgConfig REQUIRED)
+
+    pkg_check_modules(LIBNM libnm)
+    if(LIBNM_FOUND)
+        add_definitions(-DUSE_LIBNM)
+    endif()
+
+    pkg_check_modules(LIBNOTIFY libnotify>=0.7.6)
+    if(LIBNOTIFY_FOUND)
+        add_definitions(-DUSE_LIBNOTIFY)
+        add_definitions(${LIBNOTIFY_CFLAGS})
+        pkg_check_modules(LIBGDKPIXBUF gdk-pixbuf-2.0>=2.40.0)
+        add_definitions(${LIBGDKPIXBUF_CFLAGS})
+    endif()
+
+    if(NOT DEFINED LRC)
+        if(EXISTS ${PROJECT_SOURCE_DIR}/../install/lrc)
+            set(LRC ${PROJECT_SOURCE_DIR}/../install/lrc)
+        endif()
+    endif()
+
+    # If LRC is not globally installed, it's path should be specified
+    # by setting variable LRC. If library is not inside LRC + suffixes
+    # lib, build or build-local, it's path should be set with LRCLIB.
+    if(DEFINED LRC)
+        if(EXISTS ${LRC}/include/libringclient)
+            set(LRC_SRC_PATH ${LRC}/include/libringclient)
+        else()
+            set(LRC_SRC_PATH ${LRC}/src)
+        endif()
+        if(NOT DEFINED LRCLIB)
+            set(LRCLIB ${LRC})
+        endif()
+        find_library(ringclient ringclient
+            PATHS ${LRCLIB}
+            PATH_SUFFIXES lib build build-local NO_DEFAULT_PATH)
+        message("Will expect lrc library in ${LRCLIB} (including \
+    subdirs /lib, /build and /build-local)")
+        set(LRC_LIB_NAME ${ringclient})
+    else()
+        find_package(LibRingClient REQUIRED)
+        if (LibRingClient_FOUND)
+            set(LRC_SRC_PATH ${LIB_RING_CLIENT_INCLUDE_DIR})
+            set(LRC_LIB_NAME ${LIB_RING_CLIENT_LIBRARY})
+        else()
+            message("lrc not found!")
+        endif()
+    endif()
+
+    message("Will expect lrc headers in ${LRC_SRC_PATH}")
+
+    include_directories(${LRC_SRC_PATH}
+                        ${LIBNM_INCLUDE_DIRS}
+                        ${LIBNOTIFY_INCLUDE_DIRS}
+                        ${LIBGDKPIXBUF_INCLUDE_DIRS})
 
-pkg_check_modules(LIBNOTIFY libnotify>=0.7.6)
-if(LIBNOTIFY_FOUND)
-    add_definitions(-DUSE_LIBNOTIFY)
-    add_definitions(${LIBNOTIFY_CFLAGS})
-    pkg_check_modules(LIBGDKPIXBUF gdk-pixbuf-2.0>=2.40.0)
-    add_definitions(${LIBGDKPIXBUF_CFLAGS})
+    set(JAMI_DATA_PREFIX "${CMAKE_INSTALL_PREFIX}/share")
+
+    find_library(ringclient ringclient ${LRCLIBDIR} NO_DEFAULT_PATH)
+    find_library(qrencode qrencode)
+    find_library(X11 X11)
 endif()
 
+# Qt find package
 if(QT5_VER AND QT5_PATH)
     string(REPLACE "." ";" VERSION_LIST ${QT5_VER})
     list(GET VERSION_LIST 0 QT5_VER_MAJOR)
@@ -153,200 +268,214 @@ if(QT5_VER AND QT5_PATH)
 
     if((${QT5_VER_MAJOR} GREATER_EQUAL 5) AND (${QT5_VER_MINOR} GREATER_EQUAL 14))
         message(STATUS "Using custom Qt version")
-        find_package(Qt5 ${QT5_VER} REQUIRED COMPONENTS
-            Core
-            Quick
-            QuickWidgets
-            Network
-            Svg
-            QuickControls2
-            WebEngine
-            DBus
-            PATHS ${QT5_PATH} NO_DEFAULT_PATH)
-        find_package(Qt5LinguistTools ${QT5_VER}
-            PATHS ${QT5_PATH} NO_DEFAULT_PATH)
+        find_package(Qt5 ${QT5_VER} REQUIRED COMPONENTS ${QML_LIBS_LIST}
+                     PATHS ${QT5_PATH} NO_DEFAULT_PATH)
+        find_package(Qt5LinguistTools ${QT5_VER} PATHS ${QT5_PATH} NO_DEFAULT_PATH)
     endif()
 else()
-    find_package(Qt5 REQUIRED COMPONENTS
-        Core
-        Quick
-        QuickWidgets
-        Network
-        Svg
-        QuickControls2
-        WebEngine
-        DBus)
+    find_package(Qt5 REQUIRED COMPONENTS ${QML_LIBS_LIST})
     find_package(Qt5LinguistTools)
 endif()
-set(CMAKE_INSTALL_RPATH_USE_LINK_PATH true)
-
-if(NOT DEFINED LRC)
-    if(EXISTS ${PROJECT_SOURCE_DIR}/../install/lrc)
-        set(LRC ${PROJECT_SOURCE_DIR}/../install/lrc)
-    endif()
-endif()
-
-# If LRC is not globally installed, it's path should be specified
-# by setting variable LRC. If library is not inside LRC + suffixes
-# lib, build or build-local, it's path should be set with LRCLIB.
-if(DEFINED LRC)
-    if(EXISTS ${LRC}/include/libringclient)
-        set(LRC_SRC_PATH ${LRC}/include/libringclient)
-    else()
-        set(LRC_SRC_PATH ${LRC}/src)
-    endif()
-    if(NOT DEFINED LRCLIB)
-        set(LRCLIB ${LRC})
-    endif()
-    find_library(ringclient ringclient
-        PATHS ${LRCLIB}
-        PATH_SUFFIXES lib build build-local NO_DEFAULT_PATH)
-    message("Will expect lrc library in ${LRCLIB} (including \
-subdirs /lib, /build and /build-local)")
-    set(LRC_LIB_NAME ${ringclient})
-else()
-    find_package(LibRingClient REQUIRED)
-    if (LibRingClient_FOUND)
-        set(LRC_SRC_PATH ${LIB_RING_CLIENT_INCLUDE_DIR})
-        set(LRC_LIB_NAME ${LIB_RING_CLIENT_LIBRARY})
-    else()
-        message("lrc not found!")
-    endif()
-endif()
-
-message("Will expect lrc headers in ${LRC_SRC_PATH}")
 
+# common include
 include_directories(${PROJECT_SOURCE_DIR}
-    ${SRC_DIR}
-    ${LRC_SRC_PATH}
-    ${LIBNM_INCLUDE_DIRS}
-    ${LIBNOTIFY_INCLUDE_DIRS}
-    ${LIBGDKPIXBUF_INCLUDE_DIRS})
+                    ${SRC_DIR})
 
+# common executable sources
 add_executable(${PROJECT_NAME}
-    ${SRC_DIR}/main.cpp
-    ${COMMON_HEADERS}
-    ${COMMON_SOURCES}
-    ${QML_RESOURCES}
-    ${QML_RESOURCES_QML}
-    ${LRC_SRC_PATH}/webresource.qrc)
-
-set(JAMI_DATA_PREFIX "${CMAKE_INSTALL_PREFIX}/share")
-
-find_library(ringclient ringclient ${LRCLIBDIR} NO_DEFAULT_PATH)
-find_library(qrencode qrencode)
-find_library(X11 X11)
-
-target_link_libraries(jami-qt
-    ${QML_LIBS}
-    ${LRC_LIB_NAME}
-    ${qrencode}
-    ${X11}
-    ${LIBNM_LIBRARIES}
-    ${LIBNOTIFY_LIBRARIES}
-    ${LIBGDKPIXBUF_LIBRARIES})
-
-if(ENABLE_TESTS)
-    message("Add Jami tests")
-    add_subdirectory(tests)
-endif()
+               ${SRC_DIR}/main.cpp
+               ${COMMON_HEADERS}
+               ${COMMON_SOURCES}
+               ${QML_RESOURCES}
+               ${QML_RESOURCES_QML}
+               ${LRC_SRC_PATH}/webresource.qrc)
+
+if(MSVC)
+    target_link_libraries(${PROJECT_NAME}
+                          ${QML_LIBS}
+                          ${QRENCODE_LIB}
+                          Shell32.lib
+                          Ole32.lib
+                          Advapi32.lib
+                          Shlwapi.lib
+                          User32.lib
+                          Gdi32.lib
+                          Crypt32.lib
+                          Strmiids.lib)
+
+    if(NOT DEFINED ReleaseCompile)
+        # executable icon
+        target_sources(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/ico.rc)
+
+        target_link_libraries(${PROJECT_NAME}
+                              ${RINGCLIENT_STATIC_LIB}
+                              ${QTWRAPPER_LIB}
+                              ${DRING_LIB}
+                              ${GNUTLS_LIB})
+
+        # translations
+        if(Qt5LinguistTools_FOUND)
+            message("Releasing and copying translation files")
+            file(MAKE_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE}/share/ring/translations/")
+            file(MAKE_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE}/share/libringclient/translations/")
+            file(GLOB TS_CLIENT_FILES ${PROJECT_SOURCE_DIR}/translations/*.ts)
+            file(GLOB TS_LRC_FILES ${LRC}/translations/*.ts)
+            set_source_files_properties(${TS_CLIENT_FILES} PROPERTIES OUTPUT_LOCATION
+                                        "${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE}/share/ring/translations")
+            set_source_files_properties(${TS_LRC_FILES} PROPERTIES OUTPUT_LOCATION
+                                        "${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE}/share/libringclient/translations")
+            qt5_add_translation(QM_CLIENT_FILES ${TS_CLIENT_FILES})
+            qt5_add_translation(QM_LRC_FILES ${TS_LRC_FILES})
+            target_sources(${PROJECT_NAME} PRIVATE ${QM_CLIENT_FILES})
+            target_sources(${PROJECT_NAME} PRIVATE ${QM_LRC_FILES})
+        endif()
+
+        # POST_BUILD steps
+
+        # check time stamp
+        set(TIME_STAMP_FILE ".deploy.stamp")
+        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
+                           WORKING_DIRECTORY "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
+                           COMMAND ${CMAKE_COMMAND} -DTIME_STAMP_FILE=${TIME_STAMP_FILE}
+                                   -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/time_stamp_check.cmake)
+
+        # copy runtime files and run windeployqt on target and deploy Qt libs
+        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
+                           WORKING_DIRECTORY "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
+                           COMMAND ${CMAKE_COMMAND} -DTIME_STAMP_FILE=${TIME_STAMP_FILE}
+                                   -DCOPY_TO_PATH=$<TARGET_FILE_DIR:${PROJECT_NAME}>
+                                   -DDRING_PATH=${DRING}
+                                   -DPROJECT_ROOT_DIR=${PROJECT_SOURCE_DIR}
+                                   -DWIN_DEPLOY_QT_PATH=${CMAKE_PREFIX_PATH}/bin
+                                   -DQML_SRC_DIR=${SRC_DIR}
+                                   -DEXE_NAME=$<TARGET_FILE:${PROJECT_NAME}>
+                                   -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/windows_deploy.cmake)
+
+        # create time stamp
+        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
+                           WORKING_DIRECTORY "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
+                           COMMAND ${CMAKE_COMMAND} -DTIME_STAMP_FILE=${TIME_STAMP_FILE}
+                                   -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/time_stamp_create.cmake)
+    endif()
 
-# Installation rules
-install(TARGETS jami-qt
-    RUNTIME DESTINATION bin)
-
-# install .desktop in XDG desktop dir so that it is recognized by the system
-install(FILES ${PROJECT_SOURCE_DIR}/jami-qt.desktop
-    DESTINATION ${JAMI_DATA_PREFIX}/applications)
-
-# install .desktop in the jami-qt data dir, so that it can be copied to the
-# autostart dir by the client
-install(FILES ${PROJECT_SOURCE_DIR}/jami-qt.desktop
-   DESTINATION
-      "${JAMI_DATA_PREFIX}/${PROJECT_NAME}"
-   PERMISSIONS
-      WORLD_READ
-      OWNER_WRITE
-      OWNER_READ
-      GROUP_READ
-)
-
-# adjust JAMI_DATA_PREFIX for snap package
-#   (this must come after all 'install' commands that refer to
-#    JAMI_DATA_PREFIX; the following value is not meant to be used for
-#    any install destinations)
-if(DEFINED ENV{SNAPCRAFT_PROJECT_NAME})
-    set(JAMI_DATA_PREFIX "/snap/$ENV{SNAPCRAFT_PROJECT_NAME}/current/usr/share")
-endif()
+    # executable name
+    set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "Jami")
+else()
+    target_link_libraries(${PROJECT_NAME}
+                          ${QML_LIBS}
+                          ${LRC_LIB_NAME}
+                          ${qrencode}
+                          ${X11}
+                          ${LIBNM_LIBRARIES}
+                          ${LIBNOTIFY_LIBRARIES}
+                          ${LIBGDKPIXBUF_LIBRARIES})
+
+    if(ENABLE_TESTS)
+        message("Add Jami tests")
+        add_subdirectory(tests)
+    endif()
 
-# (this must come after the above adjustment to JAMI_DATA_PREFIX)
-target_compile_definitions(jami-qt PRIVATE JAMI_INSTALL_PREFIX="${JAMI_DATA_PREFIX}")
-
-# logos
-install(FILES images/jami.svg
-    DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps)
-
-install(FILES images/jami-48px.png
-    DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps
-    RENAME jami.png)
-
-install(FILES images/jami-32px.xpm
-    DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps
-    RENAME jami.xpm)
-
-install(FILES jami-qt.appdata.xml
-    DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo)
-
-# install jami launcher that selects between clients
-install(
-    FILES
-        "${PROJECT_SOURCE_DIR}/src/jami"
-    DESTINATION
-        ${CMAKE_INSTALL_PREFIX}/bin
-    PERMISSIONS
-        WORLD_READ
-        OWNER_WRITE
-        OWNER_READ
-        GROUP_READ
-        OWNER_EXECUTE
-        GROUP_EXECUTE
-        WORLD_EXECUTE)
-
-# add a target to generate API documentation with Doxygen and graphviz-dot
-find_package(Doxygen)
-find_program(dot "dot")
-if(Doxygen_FOUND AND dot)
-    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile @ONLY)
-    add_custom_target(doc
-        COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile
-        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc
-        COMMENT "Generating API documentation with Doxygen" VERBATIM)
-
-    # create doc/README.md symlink to README since Doxygen doesn't understand file with no extension
-    add_custom_command(
-        TARGET doc
-        PRE_BUILD
-        COMMAND ln -sf ${CMAKE_CURRENT_SOURCE_DIR}/README ${CMAKE_CURRENT_SOURCE_DIR}/doc/README.md)
-endif()
+    # Installation rules
+    install(TARGETS jami-qt
+        RUNTIME DESTINATION bin)
+
+    # install .desktop in XDG desktop dir so that it is recognized by the system
+    install(FILES ${PROJECT_SOURCE_DIR}/jami-qt.desktop
+        DESTINATION ${JAMI_DATA_PREFIX}/applications)
+
+    # install .desktop in the jami-qt data dir, so that it can be copied to the
+    # autostart dir by the client
+    install(FILES ${PROJECT_SOURCE_DIR}/jami-qt.desktop
+       DESTINATION
+          "${JAMI_DATA_PREFIX}/${PROJECT_NAME}"
+       PERMISSIONS
+          WORLD_READ
+          OWNER_WRITE
+          OWNER_READ
+          GROUP_READ
+    )
+
+    # adjust JAMI_DATA_PREFIX for snap package
+    #   (this must come after all 'install' commands that refer to
+    #    JAMI_DATA_PREFIX; the following value is not meant to be used for
+    #    any install destinations)
+    if(DEFINED ENV{SNAPCRAFT_PROJECT_NAME})
+        set(JAMI_DATA_PREFIX "/snap/$ENV{SNAPCRAFT_PROJECT_NAME}/current/usr/share")
+    endif()
 
+    # (this must come after the above adjustment to JAMI_DATA_PREFIX)
+    target_compile_definitions(jami-qt PRIVATE JAMI_INSTALL_PREFIX="${JAMI_DATA_PREFIX}")
+
+    # logos
+    install(FILES images/jami.svg
+        DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps)
+
+    install(FILES images/jami-48px.png
+        DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps
+        RENAME jami.png)
+
+    install(FILES images/jami-32px.xpm
+        DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps
+        RENAME jami.xpm)
+
+    install(FILES jami-qt.appdata.xml
+        DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo)
+
+    # install jami launcher that selects between clients
+    install(
+        FILES
+            "${PROJECT_SOURCE_DIR}/src/jami"
+        DESTINATION
+            ${CMAKE_INSTALL_PREFIX}/bin
+        PERMISSIONS
+            WORLD_READ
+            OWNER_WRITE
+            OWNER_READ
+            GROUP_READ
+            OWNER_EXECUTE
+            GROUP_EXECUTE
+            WORLD_EXECUTE)
+
+    # add a target to generate API documentation with Doxygen and graphviz-dot
+    find_package(Doxygen)
+    find_program(dot "dot")
+    if(Doxygen_FOUND AND dot)
+        configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile @ONLY)
+        add_custom_target(doc
+            COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile
+            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc
+            COMMENT "Generating API documentation with Doxygen" VERBATIM)
+
+        # create doc/README.md symlink to README since Doxygen doesn't understand file with no extension
+        add_custom_command(
+            TARGET doc
+            PRE_BUILD
+            COMMAND ln -sf ${CMAKE_CURRENT_SOURCE_DIR}/README ${CMAKE_CURRENT_SOURCE_DIR}/doc/README.md)
+    endif()
 
-# translations
-if(Qt5LinguistTools_FOUND)
-    message("Releasing and copying translation files")
-    file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/share/ring/translations/")
-    file(GLOB TS_FILES ${PROJECT_SOURCE_DIR}/translations/*.ts)
-    set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "share/ring/translations")
-    qt5_add_translation(QM_FILES ${TS_FILES})
-    add_custom_target(translations ALL DEPENDS ${QM_FILES})
-    install(DIRECTORY "${CMAKE_BINARY_DIR}/share/ring/translations/"
-        DESTINATION ${CMAKE_INSTALL_PREFIX}/share/ring/translations)
-endif()
+    # translations
+    if(Qt5LinguistTools_FOUND)
+        message("Releasing and copying translation files")
+        file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/share/ring/translations/")
+        file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/share/libringclient/translations/")
+        file(GLOB TS_CLIENT_FILES ${PROJECT_SOURCE_DIR}/translations/*.ts)
+        file(GLOB QM_LRC_FILES ${LRC}/share/libringclient/translations/*.qm)
+        set_source_files_properties(${TS_CLIENT_FILES} PROPERTIES OUTPUT_LOCATION "share/ring/translations")
+        qt5_add_translation(QM_CLIENT_FILES ${TS_CLIENT_FILES})
+        add_custom_target(translations_client ALL DEPENDS ${QM_CLIENT_FILES})
+        install(DIRECTORY "${CMAKE_BINARY_DIR}/share/ring/translations/"
+                DESTINATION ${CMAKE_INSTALL_PREFIX}/share/ring/translations)
+        add_custom_target(translations_lrc ALL DEPENDS ${QM_LRC_FILES})
+        install(DIRECTORY "${LRC}/share/libringclient/translations/"
+                DESTINATION ${CMAKE_INSTALL_PREFIX}/share/libringclient/translations)
+    endif()
 
-# uninstall
-configure_file(
-    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
-    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
-    IMMEDIATE @ONLY)
+    # uninstall
+    configure_file(
+        "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
+        "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
+        IMMEDIATE @ONLY)
 
-add_custom_target(uninstall
-    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
+    add_custom_target(uninstall
+        COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
+endif()
\ No newline at end of file
diff --git a/cmake/time_stamp_check.cmake b/cmake/time_stamp_check.cmake
new file mode 100644
index 000000000..b0f44b7d9
--- /dev/null
+++ b/cmake/time_stamp_check.cmake
@@ -0,0 +1,13 @@
+execute_process(COMMAND git rev-parse HEAD
+                OUTPUT_VARIABLE VERSION_PATCH)
+
+# remove leading and trailing spaces
+string(STRIP "${VERSION_PATCH}" VERSION_PATCH)
+
+message("Checking time stamp ...")
+if(EXISTS ${TIME_STAMP_FILE})
+    file (STRINGS ${TIME_STAMP_FILE} VERSION_IN_FILE)
+    if(NOT "${VERSION_IN_FILE}" STREQUAL "${VERSION_PATCH}")
+        file (REMOVE "${TIME_STAMP_FILE}")
+    endif()
+endif()
\ No newline at end of file
diff --git a/cmake/time_stamp_create.cmake b/cmake/time_stamp_create.cmake
new file mode 100644
index 000000000..7b8aff2b1
--- /dev/null
+++ b/cmake/time_stamp_create.cmake
@@ -0,0 +1,8 @@
+execute_process(COMMAND git rev-parse HEAD
+                OUTPUT_VARIABLE VERSION_PATCH)
+if (EXISTS ${TIME_STAMP_FILE})
+    message("Keep the old time stamp")
+else()
+    message("Creating time stamp ...")
+    file(WRITE ${TIME_STAMP_FILE} "${VERSION_PATCH}")
+endif()
\ No newline at end of file
diff --git a/cmake/windows_deploy.cmake b/cmake/windows_deploy.cmake
new file mode 100644
index 000000000..f4d8c74b6
--- /dev/null
+++ b/cmake/windows_deploy.cmake
@@ -0,0 +1,22 @@
+if (EXISTS ${TIME_STAMP_FILE})
+    message("No need to deploy")
+else()
+    message("Deploying ...")
+    file(COPY "${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/avcodec-58.dll"
+              "${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/avutil-56.dll"
+              "${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/avformat-58.dll"
+              "${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/avdevice-58.dll"
+              "${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/swresample-3.dll"
+              "${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/swscale-5.dll"
+              "${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/avfilter-7.dll"
+              "${DRING_PATH}/contrib/build/openssl/libcrypto-1_1-x64.dll"
+              "${DRING_PATH}/contrib/build/openssl/libssl-1_1-x64.dll"
+              "${PROJECT_ROOT_DIR}/qt.conf"
+              "${PROJECT_ROOT_DIR}/images/jami.ico"
+              "${PROJECT_ROOT_DIR}/License.rtf"
+         DESTINATION ${COPY_TO_PATH})
+    execute_process(COMMAND "${WIN_DEPLOY_QT_PATH}/windeployqt.exe"
+                            --verbose 1
+                            --qmldir ${QML_SRC_DIR}
+                            --release ${EXE_NAME})
+endif()
\ No newline at end of file
diff --git a/copy-runtime-files.py b/copy-runtime-files.py
deleted file mode 100644
index a75dc7409..000000000
--- a/copy-runtime-files.py
+++ /dev/null
@@ -1,347 +0,0 @@
-import tempfile
-import re
-import sys
-import os
-import subprocess
-import platform
-import argparse
-import shutil
-import fileinput
-
-if platform.system() == "Windows":
-    from colorama import init
-
-    # init ANSI escape character sequences for windows
-    init()
-
-
-class bcolors:
-    HEADER = '\033[95m'
-    OKBLUE = '\033[94m'
-    OKCYAN = '\033[96m'
-    OKGREEN = '\033[92m'
-    WARNING = '\033[93m'
-    FAIL = '\033[91m'
-    ENDC = '\033[0m'
-    BOLD = '\033[1m'
-    UNDERLINE = '\033[4m'
-
-
-def execute_cmd(cmd, use_subprocess_pipe=False):
-    p = subprocess.Popen(cmd,
-                         shell=True,
-                         stdout=subprocess.PIPE if use_subprocess_pipe else sys.stdout)
-    output, _ = p.communicate()
-
-    if use_subprocess_pipe:
-        if output:
-            return output
-        return -1
-    else:
-        if p.returncode != 0:
-            sys.exit()
-
-
-class globalVar:
-    # global var
-    system_name = platform.system()
-    client_dir = os.path.dirname(os.path.realpath(__file__))
-    mode = "Release"
-    qt_version = ""
-    qt_path = ""
-    daemon_path = client_dir + os.sep + '..' + os.sep + 'daemon'
-    lrc_path = client_dir + os.sep + '..' + os.sep + 'lrc'
-    output_path = ""
-
-    stamp = execute_cmd('git rev-parse HEAD', True)[0:8]
-    if type(stamp) is bytes:
-        stamp = stamp.decode("utf-8")
-    stampFile = client_dir + os.sep + ".deploy.stamp"
-
-
-def check_stamp():
-    if os.path.exists(globalVar.stampFile):
-        with open(globalVar.stampFile) as f:
-            contents = f.read()
-            if contents.strip() == globalVar.stamp:
-                print(bcolors.OKGREEN + "Deployment stamp up-to-date" + bcolors.ENDC)
-                sys.exit()
-
-
-def write_stamp():
-    with open(".deploy.stamp", "w") as file:
-        file.write(globalVar.stamp)
-
-
-def setup_parameters(parsed_args):
-    if globalVar.system_name == "Windows":
-        if parsed_args.mode:
-            if parsed_args.mode == "Beta":
-                globalVar.mode = "Beta"
-
-        if parsed_args.qtVersion:
-            globalVar.qt_version = parsed_args.qtVersion
-            qt_minor_ver = int(globalVar.qt_version.split('.')[1])
-            if qt_minor_ver < 14:
-                print(bcolors.WARNING + "Qt version not supported" + bcolors.ENDC)
-                sys.exit()
-            globalVar.qt_path = "C:\\Qt\\" + globalVar.qt_version + \
-                ("\\msvc2017_64" if qt_minor_ver < 15 else "\\msvc2019_64")
-        else:
-            globalVar.qt_path = "C:\\Qt\\5.15.0\\msvc2019_64"
-    else:
-        if parsed_args.qtPath:
-            globalVar.qt_path = parsed_args.qtPath
-        else:
-            globalVar.qt_version = execute_cmd('qmake -v', True)
-            if globalVar.qt_version == -1:
-                print(bcolors.WARNING + "No qmake found, trying qmake-qt5..." + bcolors.ENDC)
-
-                globalVar.qt_version = execute_cmd('qmake-qt5 -v', True)
-                if globalVar.qt_version == -1:
-                    print(bcolors.FAIL + "No qmake found!" + bcolors.ENDC)
-                    sys.exit()
-
-            if type(globalVar.qt_version) is bytes:
-                globalVar.qt_version = globalVar.qt_version.decode("utf-8")
-            globalVar.qt_version = globalVar.qt_version.split(
-                'Qt version')[1].split('in')[0].strip()
-            qt_minor_ver = int(globalVar.qt_version.split('.')[1])
-            if qt_minor_ver < 14:
-                print(bcolors.WARNING + "Qt version not supported" + bcolors.ENDC)
-                sys.exit()
-
-    if parsed_args.daemonPath:
-        globalVar.daemon_path = parsed_args.daemonPath
-
-    if parsed_args.lrcPath:
-        globalVar.lrc_path = parsed_args.lrcPath
-
-    if parsed_args.outputPath:
-        if not os.path.exists(parsed_args.outputPath):
-            os.makedirs(parsed_args.outputPath)
-        globalVar.output_path = parsed_args.outputPath
-    else:
-        if globalVar.system_name != "Windows":
-            globalVar.output_path = globalVar.client_dir + os.sep + 'build-local'
-        else:
-            globalVar.output_path = globalVar.client_dir + \
-                os.sep + "x64" + os.sep + globalVar.mode
-
-
-def copy_deployment_files():
-    # dependency bin files and misc
-    files_to_copy = [
-        globalVar.daemon_path + "\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\avcodec-58.dll",
-        globalVar.daemon_path + "\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\avutil-56.dll",
-        globalVar.daemon_path +
-        "\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\avformat-58.dll",
-        globalVar.daemon_path +
-        "\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\avdevice-58.dll",
-        globalVar.daemon_path +
-        "\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\swresample-3.dll",
-        globalVar.daemon_path + "\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\swscale-5.dll",
-        globalVar.daemon_path + "\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\avfilter-7.dll",
-        globalVar.daemon_path + "\\contrib\\build\\openssl\\libcrypto-1_1-x64.dll",
-        globalVar.daemon_path + "\\contrib\\build\\openssl\\libssl-1_1-x64.dll",
-        globalVar.client_dir + "\\qt.conf",
-        globalVar.client_dir + "\\images\\jami.ico",
-        globalVar.client_dir + "\\License.rtf"
-    ]
-
-    for file in files_to_copy:
-        print(bcolors.OKBLUE + "Copying: " + file +
-              " -> " + globalVar.output_path + bcolors.ENDC)
-        if os.path.exists(file):
-            shutil.copy(file, globalVar.output_path)
-        else:
-            print(bcolors.FAIL + file + " does not exist" + bcolors.ENDC)
-            sys.exit()
-
-    # qt windeploy
-    win_deploy_qt = globalVar.qt_path + "\\bin\\windeployqt.exe --qmldir " + \
-        globalVar.client_dir + "\\src --release " + globalVar.output_path + "\\Jami.exe"
-    execute_cmd(win_deploy_qt)
-
-
-def copy_ringtones():
-    # ringtones
-    copy_to_path = globalVar.output_path + os.sep + "ringtones"
-    if not os.path.exists(copy_to_path):
-        os.makedirs(copy_to_path)
-    ringtone_path = globalVar.client_dir + "\\..\\daemon\\ringtones"
-
-    print(bcolors.OKCYAN + "Copying ringtones..." + bcolors.ENDC)
-    for _, _, files in os.walk(ringtone_path):
-        for file in files:
-            print(bcolors.OKBLUE + "Copying ringtone: " +
-                  file + " -> " + copy_to_path + bcolors.ENDC)
-            try:
-                shutil.copy(ringtone_path + os.sep + file, copy_to_path)
-            except:
-                print(bcolors.FAIL + "Unable to copy file." + bcolors.ENDC)
-
-
-def compile_and_copy_web_resources():
-    # web resources
-    rcc = 'rcc'
-
-    if globalVar.qt_path:
-        rcc = globalVar.qt_path + os.sep + 'bin' + os.sep + \
-            'rcc' + ('.exe' if globalVar.system_name == "Windows" else '')
-
-    if execute_cmd(rcc + ' -v', True) == -1:
-        print(bcolors.WARNING + "No rcc found, trying rcc-qt5..." + bcolors.ENDC)
-
-        rcc = rcc.replace('rcc', 'rcc-qt5')
-        if execute_cmd(rcc + ' -v', True) == -1:
-            print(bcolors.FAIL + "No rcc found!" + bcolors.ENDC)
-            sys.exit()
-
-    lrc_web_resources_path = globalVar.lrc_path + os.sep + "src" + os.sep + 'webresource.qrc'
-
-    execute_cmd(rcc + ' -binary ' + lrc_web_resources_path +
-                ' -o ' + globalVar.output_path + os.sep + 'webresource.rcc')
-
-
-def release_and_copy_translations():
-    # translations binary
-    lrelease = 'lrelease'
-
-    if globalVar.qt_path:
-        lrelease = globalVar.qt_path + os.sep + 'bin' + os.sep + \
-            'lrelease' + ('.exe' if globalVar.system_name == "Windows" else '')
-
-    if execute_cmd(lrelease + ' -version', True) == -1:
-        print(bcolors.WARNING + "No lrelease found, trying lrelease-qt5..." + bcolors.ENDC)
-
-        lrelease = lrelease.replace('lrelease', 'lrelease-qt5')
-        if execute_cmd(lrelease + ' -version', True) == -1:
-            print(bcolors.FAIL + "No lrelease found!" + bcolors.ENDC)
-            sys.exit()
-
-    qt_version_check = execute_cmd(lrelease + ' -version', True)
-    if type(qt_version_check) is bytes:
-        qt_version_check = qt_version_check.decode("utf-8")
-    qt_version_check = qt_version_check.split('version')[1].strip()
-    qt_minor_ver = int(qt_version_check.split('.')[1])
-    if qt_minor_ver < 14:
-        print(bcolors.WARNING + "Qt version not supported" + bcolors.ENDC)
-        sys.exit()
-
-    # lrc translations
-    lrc_ts_path = globalVar.lrc_path + os.sep + 'translations'
-    copy_to_path = globalVar.output_path + os.sep + 'share' + \
-        os.sep + 'libringclient' + os.sep + 'translations'
-    if not os.path.exists(copy_to_path):
-        os.makedirs(copy_to_path)
-
-    print(bcolors.OKCYAN + "Release lrc translations..." + bcolors.ENDC)
-    for _, _, files in os.walk(lrc_ts_path):
-        for file in files:
-            if file.endswith(".ts"):
-                execute_cmd(lrelease + " " + lrc_ts_path + os.sep + file)
-
-    for _, _, files in os.walk(lrc_ts_path):
-        for file in files:
-            if file.endswith(".qm"):
-                print(bcolors.OKBLUE + "Copying translation file: " +
-                      file + " -> " + copy_to_path + bcolors.ENDC)
-                shutil.copy(lrc_ts_path + os.sep + file, copy_to_path)
-
-    # client translations
-    client_ts_path = globalVar.client_dir + os.sep + 'translations'
-    copy_to_path = globalVar.output_path + os.sep + \
-        'share' + os.sep + 'ring' + os.sep + 'translations'
-    if not os.path.exists(copy_to_path):
-        os.makedirs(copy_to_path)
-
-    print(bcolors.OKCYAN + "Release client translations..." + bcolors.ENDC)
-    for _, _, files in os.walk(client_ts_path):
-        for file in files:
-            if file.endswith(".ts"):
-                execute_cmd(lrelease + " " +
-                            client_ts_path + os.sep + file)
-
-    for _, _, files in os.walk(client_ts_path):
-        for file in files:
-            if file.endswith(".qm"):
-                print(bcolors.OKBLUE + "Copying translation file: " +
-                      file + " -> " + copy_to_path + bcolors.ENDC)
-                shutil.copy(client_ts_path + os.sep + file, copy_to_path)
-
-
-def parse_args():
-    ap = argparse.ArgumentParser(description="Copy runtime files tool")
-    if globalVar.system_name != "Windows":
-        ap.add_argument(
-            '-q', '--qtPath', default='',
-            help='Qt path')
-    else:
-        ap.add_argument(
-            '-m', '--mode', default='',
-            help='Release or Beta mode')
-
-        ap.add_argument(
-            '-q', '--qtVersion', default='',
-            help='Qt version')
-
-    ap.add_argument(
-        '-d', '--daemonPath', default='',
-        help='Daemon path')
-    ap.add_argument(
-        '-l', '--lrcPath', default='',
-        help='Lrc path')
-    ap.add_argument(
-        '-o', '--outputPath', default='',
-        help='Output path')
-
-    parsed_args = ap.parse_args()
-
-    return parsed_args
-
-
-def main():
-    # check stamp
-    check_stamp()
-
-    # parse args
-    parsed_args = parse_args()
-
-    # set up global var
-    setup_parameters(parsed_args)
-
-    print(bcolors.OKCYAN + "****************************************" + bcolors.ENDC)
-    print(bcolors.OKBLUE + "copying deployment files..." + bcolors.ENDC)
-    print(bcolors.OKBLUE + "using daemonDir:    " +
-          globalVar.daemon_path + bcolors.ENDC)
-    print(bcolors.OKBLUE + "using lrcDir:       " +
-          globalVar.lrc_path + bcolors.ENDC)
-    if globalVar.qt_path:
-        print(bcolors.OKBLUE + "using QtDir:        " +
-              globalVar.qt_path + bcolors.ENDC)
-    else:
-        print(bcolors.OKBLUE + "using system Qt" + bcolors.ENDC)
-    if globalVar.system_name == "Windows":
-        print(bcolors.OKBLUE + globalVar.mode + " mode" + bcolors.ENDC)
-    print(bcolors.OKCYAN + "****************************************" + bcolors.ENDC)
-
-    # deployment
-    if globalVar.system_name == "Windows":
-        copy_deployment_files()
-        copy_ringtones()
-
-    # translations
-    release_and_copy_translations()
-
-    # web resources
-    compile_and_copy_web_resources()
-
-    # write stamp
-    write_stamp()
-
-    print(bcolors.OKGREEN + "Copy completed" + bcolors.ENDC)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/jami-qt.pro b/jami-qt.pro
deleted file mode 100644
index 9f0417c63..000000000
--- a/jami-qt.pro
+++ /dev/null
@@ -1,189 +0,0 @@
-win32-msvc {
-    TARGET = Jami
-    TEMPLATE = app
-
-    QT += core winextras qml quickcontrols2 quick xml multimedia network webengine svg sql
-
-    CONFIG += suppress_vcproj_warnings c++17 qtquickcompiler
-
-    # library compatibility (boost, libnotify, etc.)
-    CONFIG += no_keywords
-
-    QTQUICK_COMPILER_SKIPPED_RESOURCES += resources.qrc
-
-    # compiler options
-    QMAKE_CXXFLAGS += /wd"4068" /wd"4099" /wd"4189" /wd"4267" /wd"4577" /wd"4467" /wd"4715" /wd"4828"
-    QMAKE_CXXFLAGS += /MP /GS /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /Zc:inline /fp:precise /errorReport:prompt
-    QMAKE_CXXFLAGS += /Gd /Oi /MD /std:c++17 /FC /EHsc /nologo /sdl
-
-    # linker options
-    QMAKE_LFLAGS+= /ignore:4006,4049,4078,4098 /FORCE:MULTIPLE /INCREMENTAL:NO /Debug /LTCG /NODEFAULTLIB:LIBCMT
-
-    # preprocessor defines
-    DEFINES += UNICODE QT_NO_DEBUG NDEBUG
-
-    # dependencies
-    LRC= ../lrc
-    DRING= ../daemon
-    QRENCODE= $$PWD/qrencode-win32/qrencode-win32
-
-    # client deps
-    INCLUDEPATH += $${QRENCODE}
-    LIBS += $${QRENCODE}/vc8/qrcodelib/x64/Release-Lib/qrcodelib.lib
-
-    # lrc
-    INCLUDEPATH += $${LRC}/src/
-    LIBS += $${LRC}/build/release/ringclient_static.lib
-    LIBS += $${LRC}/build/src/qtwrapper/Release/qtwrapper.lib
-
-    # daemon
-    INCLUDEPATH += ../daemon/contrib/msvc/include/
-    LIBS += $${DRING}/build/x64/ReleaseLib_win32/bin/dring.lib
-    LIBS += $${DRING}/contrib/msvc/lib/x64/libgnutls.lib
-
-    # windows system libs
-    LIBS += Shell32.lib Ole32.lib Advapi32.lib Shlwapi.lib User32.lib Gdi32.lib Crypt32.lib Strmiids.lib
-
-    # output paths
-    OBJECTS_DIR = obj/.obj
-    MOC_DIR = obj/.moc
-    RCC_DIR = obj/.rcc
-    UI_DIR = obj/.ui
-
-    MODE = "Release"
-
-    # ReleaseCompile config
-    contains(CONFIG, ReleaseCompile) {
-        MODE = "ReleaseCompile"
-        CONFIG(ReleaseCompile) {
-            message(ReleaseCompile config enabled)
-            Release: DEFINES += COMPILE_ONLY
-        }
-    }
-
-    # beta config
-    contains(CONFIG, Beta) {
-        MODE = "Beta"
-        CONFIG(Beta) {
-            message(Beta config enabled)
-            Release: DESTDIR = x64/Beta
-            Release: DEFINES += BETA
-        }
-    } else {
-        Release: DESTDIR = x64/Release
-    }
-    Debug: DESTDIR = x64/Debug
-
-    # qt dir
-    QMAKE_INCDIR_QT=$(QTDIR)\include
-    QMAKE_LIBDIR=$(QTDIR)\lib
-    QMAKE_MOC=$(QTDIR)\bin\moc.exe
-    QMAKE_QMAKE=$(QTDIR)\bin\qmake.exe
-
-    # exe icons
-    Release: RC_FILE = ico.rc
-
-    # run the deployment script(run windeployqt)
-    !equals(MODE, "ReleaseCompile") {
-        QMAKE_POST_LINK += $$quote(python .\copy-runtime-files.py -m  $${MODE} -q $${QT_VERSION} -o $${DESTDIR})
-    }
-}
-
-# Input
-HEADERS += \
-        src/abstractitemmodelbase.h \
-        src/avatarimageprovider.h \
-        src/moderatorlistmodel.h \
-        src/networkmanager.h \
-        src/quickimageproviderbase.h \
-        src/screensaver.h \
-        src/smartlistmodel.h \
-        src/updatemanager.h \
-        src/utils.h \
-        src/bannedlistmodel.h \
-        src/version.h \
-        src/accountlistmodel.h \
-        src/runguard.h \
-        src/webchathelpers.h \
-        src/rendermanager.h \
-        src/connectivitymonitor.h \
-        src/jamiavatartheme.h \
-        src/mainapplication.h \
-        src/qrimageprovider.h \
-        src/messagesadapter.h \
-        src/accountadapter.h \
-        src/tintedbuttonimageprovider.h \
-        src/calladapter.h \
-        src/conversationsadapter.h \
-        src/distantrenderer.h \
-        src/previewrenderer.h \
-        src/qmladapterbase.h \
-        src/avadapter.h \
-        src/contactadapter.h \
-        src/pluginadapter.h \
-        src/settingsadapter.h \
-        src/deviceitemlistmodel.h \
-        src/pluginitemlistmodel.h \
-        src/pluginhandleritemlistmodel.h \
-        src/preferenceitemlistmodel.h \
-        src/mediacodeclistmodel.h \
-        src/accountstomigratelistmodel.h \
-        src/audiodevicemodel.h \
-        src/videoinputdevicemodel.h \
-        src/pluginlistpreferencemodel.h \
-        src/videoformatfpsmodel.h \
-        src/videoformatresolutionmodel.h \
-        src/audiomanagerlistmodel.h \
-        src/qmlregister.h \
-        src/qtutils.h \
-        src/utilsadapter.h \
-        src/systemtray.h \
-        src/appsettingsmanager.h \
-        src/lrcinstance.h
-
-SOURCES += \
-        src/bannedlistmodel.cpp \
-        src/accountlistmodel.cpp \
-        src/moderatorlistmodel.cpp \
-        src/networkmanager.cpp \
-        src/runguard.cpp \
-        src/screensaver.cpp \
-        src/updatemanager.cpp \
-        src/webchathelpers.cpp \
-        src/main.cpp \
-        src/smartlistmodel.cpp \
-        src/utils.cpp \
-        src/rendermanager.cpp \
-        src/connectivitymonitor.cpp \
-        src/mainapplication.cpp \
-        src/messagesadapter.cpp \
-        src/accountadapter.cpp \
-        src/calladapter.cpp \
-        src/conversationsadapter.cpp \
-        src/distantrenderer.cpp \
-        src/previewrenderer.cpp \
-        src/avadapter.cpp \
-        src/contactadapter.cpp \
-        src/pluginadapter.cpp \
-        src/settingsadapter.cpp \
-        src/deviceitemlistmodel.cpp \
-        src/pluginitemlistmodel.cpp \
-        src/pluginhandleritemlistmodel.cpp \
-        src/preferenceitemlistmodel.cpp \
-        src/mediacodeclistmodel.cpp \
-        src/accountstomigratelistmodel.cpp \
-        src/audiodevicemodel.cpp \
-        src/videoinputdevicemodel.cpp \
-        src/pluginlistpreferencemodel.cpp \
-        src/videoformatfpsmodel.cpp \
-        src/videoformatresolutionmodel.cpp \
-        src/audiomanagerlistmodel.cpp \
-        src/qmlregister.cpp \
-        src/utilsadapter.cpp \
-        src/systemtray.cpp \
-        src/appsettingsmanager.cpp \
-        src/lrcinstance.cpp
-
-RESOURCES += \
-        resources.qrc \
-        qml.qrc
diff --git a/jami-qt.sln b/jami-qt.sln
index 82e2d69de..409d0fe20 100644
--- a/jami-qt.sln
+++ b/jami-qt.sln
@@ -2,7 +2,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio Version 16
 VisualStudioVersion = 16.0.29613.14
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ring-daemon", "..\daemon\build\ring-daemon.vcxproj", "{1CA4822C-F599-3879-A78F-332D823E4871}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ring-daemon", "..\daemon\build\ring-daemon.vcxproj", "{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}"
 	ProjectSection(ProjectDependencies) = postProject
 		{2BB84911-C1B4-4747-B93D-36AA82CC5031} = {2BB84911-C1B4-4747-B93D-36AA82CC5031}
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4} = {A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}
@@ -11,17 +11,17 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ring-daemon", "..\daemon\bu
 		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65} = {7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}
 		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B} = {855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0} = {4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}
-		{711397CE-E5D5-467D-9457-8716C047E50C} = {711397CE-E5D5-467D-9457-8716C047E50C}
+		{E23F393D-035D-3A88-8335-96339271FFC2} = {E23F393D-035D-3A88-8335-96339271FFC2}
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21} = {B8719FD5-E8A6-4A36-943C-891D07F5DD21}
 		{DA0E03ED-53A7-4050-8A85-90541C5509F8} = {DA0E03ED-53A7-4050-8A85-90541C5509F8}
 		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37} = {9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}
 	EndProjectSection
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ringclient_static", "..\lrc\build\ringclient_static.vcxproj", "{774F1C61-6659-36E6-9519-17A753890576}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ringclient_static", "..\lrc\build\ringclient_static.vcxproj", "{B39971A8-F247-31DE-8029-A90CE9549533}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qtwrapper", "..\lrc\build\src\qtwrapper\qtwrapper.vcxproj", "{2CFF20AA-9341-3564-A044-C38E70D5372A}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qtwrapper", "..\lrc\build\src\qtwrapper\qtwrapper.vcxproj", "{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}"
 	ProjectSection(ProjectDependencies) = postProject
-		{1CA4822C-F599-3879-A78F-332D823E4871} = {1CA4822C-F599-3879-A78F-332D823E4871}
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE} = {8819D074-8F1F-3226-A611-F2E0BD9B6DBE}
 	EndProjectSection
 EndProject
 Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "JamiInstaller", "JamiInstaller\JamiInstaller.wixproj", "{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}"
@@ -56,12 +56,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "client", "client", "{1ECB5B
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "contrib", "contrib", "{B4FD804C-ABD9-4F54-858B-911F0119580C}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opendht", "..\daemon\contrib\build\opendht\build\opendht-static.vcxproj", "{711397CE-E5D5-467D-9457-8716C047E50C}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opendht-static", "..\daemon\contrib\build\opendht\build\opendht-static.vcxproj", "{E23F393D-035D-3A88-8335-96339271FFC2}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jami-qt", "jami-qt.vcxproj", "{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}"
-	ProjectSection(ProjectDependencies) = postProject
-		{774F1C61-6659-36E6-9519-17A753890576} = {774F1C61-6659-36E6-9519-17A753890576}
-	EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jami-qt", "build\jami-qt.vcxproj", "{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -71,6 +68,9 @@ Global
 		Debug|Any CPU = Debug|Any CPU
 		Debug|x64 = Debug|x64
 		Debug|x86 = Debug|x86
+		MinSizeRel|Any CPU = MinSizeRel|Any CPU
+		MinSizeRel|x64 = MinSizeRel|x64
+		MinSizeRel|x86 = MinSizeRel|x86
 		Release|Any CPU = Release|Any CPU
 		Release|x64 = Release|x64
 		Release|x86 = Release|x86
@@ -83,102 +83,133 @@ Global
 		ReleaseLib|Any CPU = ReleaseLib|Any CPU
 		ReleaseLib|x64 = ReleaseLib|x64
 		ReleaseLib|x86 = ReleaseLib|x86
+		RelWithDebInfo|Any CPU = RelWithDebInfo|Any CPU
+		RelWithDebInfo|x64 = RelWithDebInfo|x64
+		RelWithDebInfo|x86 = RelWithDebInfo|x86
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Beta|Any CPU.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Beta|Any CPU.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Beta|x64.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Beta|x64.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Beta|x86.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Beta|x86.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Debug|Any CPU.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Debug|Any CPU.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Debug|x64.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Debug|x64.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Debug|x86.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Debug|x86.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Release|Any CPU.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Release|Any CPU.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Release|x64.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Release|x64.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Release|x86.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.Release|x86.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseCompile|Any CPU.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseCompile|Any CPU.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseCompile|x64.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseCompile|x64.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseCompile|x86.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseCompile|x86.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseLib_win32|Any CPU.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseLib_win32|x64.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseLib_win32|x64.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseLib_win32|x86.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseLib|Any CPU.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseLib|Any CPU.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseLib|x64.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseLib|x64.Build.0 = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseLib|x86.ActiveCfg = ReleaseLib_win32|x64
-		{1CA4822C-F599-3879-A78F-332D823E4871}.ReleaseLib|x86.Build.0 = ReleaseLib_win32|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.Beta|Any CPU.ActiveCfg = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.Beta|x64.ActiveCfg = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.Beta|x64.Build.0 = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.Beta|x86.ActiveCfg = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.Debug|Any CPU.ActiveCfg = Debug|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.Debug|x64.ActiveCfg = Debug|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.Debug|x64.Build.0 = Debug|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.Debug|x86.ActiveCfg = Debug|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.Release|Any CPU.ActiveCfg = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.Release|x64.ActiveCfg = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.Release|x64.Build.0 = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.Release|x86.ActiveCfg = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseCompile|Any CPU.ActiveCfg = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseCompile|Any CPU.Build.0 = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseCompile|x64.ActiveCfg = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseCompile|x64.Build.0 = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseCompile|x86.ActiveCfg = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseCompile|x86.Build.0 = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseLib_win32|Any CPU.ActiveCfg = RelWithDebInfo|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseLib_win32|Any CPU.Build.0 = RelWithDebInfo|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseLib_win32|x64.ActiveCfg = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseLib_win32|x64.Build.0 = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseLib_win32|x86.ActiveCfg = RelWithDebInfo|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseLib_win32|x86.Build.0 = RelWithDebInfo|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseLib|Any CPU.ActiveCfg = RelWithDebInfo|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseLib|Any CPU.Build.0 = RelWithDebInfo|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseLib|x64.ActiveCfg = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseLib|x64.Build.0 = Release|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseLib|x86.ActiveCfg = MinSizeRel|x64
-		{774F1C61-6659-36E6-9519-17A753890576}.ReleaseLib|x86.Build.0 = MinSizeRel|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.Beta|Any CPU.ActiveCfg = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.Beta|x64.ActiveCfg = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.Beta|x64.Build.0 = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.Beta|x86.ActiveCfg = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.Debug|Any CPU.ActiveCfg = Debug|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.Debug|x64.ActiveCfg = Debug|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.Debug|x64.Build.0 = Debug|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.Debug|x86.ActiveCfg = Debug|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.Release|Any CPU.ActiveCfg = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.Release|x64.ActiveCfg = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.Release|x64.Build.0 = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.Release|x86.ActiveCfg = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseCompile|Any CPU.ActiveCfg = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseCompile|Any CPU.Build.0 = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseCompile|x64.ActiveCfg = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseCompile|x64.Build.0 = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseCompile|x86.ActiveCfg = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseCompile|x86.Build.0 = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseLib_win32|Any CPU.ActiveCfg = RelWithDebInfo|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseLib_win32|Any CPU.Build.0 = RelWithDebInfo|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseLib_win32|x64.ActiveCfg = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseLib_win32|x64.Build.0 = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseLib_win32|x86.ActiveCfg = RelWithDebInfo|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseLib_win32|x86.Build.0 = RelWithDebInfo|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseLib|Any CPU.ActiveCfg = RelWithDebInfo|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseLib|Any CPU.Build.0 = RelWithDebInfo|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseLib|x64.ActiveCfg = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseLib|x64.Build.0 = Release|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseLib|x86.ActiveCfg = MinSizeRel|x64
-		{2CFF20AA-9341-3564-A044-C38E70D5372A}.ReleaseLib|x86.Build.0 = MinSizeRel|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Beta|Any CPU.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Beta|Any CPU.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Beta|x64.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Beta|x64.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Beta|x86.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Beta|x86.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Debug|Any CPU.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Debug|Any CPU.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Debug|x64.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Debug|x64.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Debug|x86.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Debug|x86.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.MinSizeRel|Any CPU.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.MinSizeRel|Any CPU.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.MinSizeRel|x64.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.MinSizeRel|x64.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.MinSizeRel|x86.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.MinSizeRel|x86.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Release|Any CPU.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Release|Any CPU.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Release|x64.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Release|x64.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Release|x86.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.Release|x86.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseCompile|Any CPU.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseCompile|Any CPU.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseCompile|x64.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseCompile|x64.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseCompile|x86.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseCompile|x86.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseLib_win32|Any CPU.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseLib_win32|x64.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseLib_win32|x64.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseLib_win32|x86.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseLib|Any CPU.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseLib|Any CPU.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseLib|x64.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseLib|x64.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseLib|x86.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.ReleaseLib|x86.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.RelWithDebInfo|Any CPU.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.RelWithDebInfo|Any CPU.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.RelWithDebInfo|x64.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.RelWithDebInfo|x64.Build.0 = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.RelWithDebInfo|x86.ActiveCfg = ReleaseLib_win32|x64
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE}.RelWithDebInfo|x86.Build.0 = ReleaseLib_win32|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.Beta|Any CPU.ActiveCfg = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.Beta|x64.ActiveCfg = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.Beta|x64.Build.0 = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.Beta|x86.ActiveCfg = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.Debug|Any CPU.ActiveCfg = Debug|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.Debug|x64.ActiveCfg = Debug|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.Debug|x64.Build.0 = Debug|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.Debug|x86.ActiveCfg = Debug|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.Release|Any CPU.ActiveCfg = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.Release|x64.ActiveCfg = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.Release|x64.Build.0 = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.Release|x86.ActiveCfg = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseCompile|Any CPU.ActiveCfg = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseCompile|Any CPU.Build.0 = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseCompile|x64.ActiveCfg = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseCompile|x64.Build.0 = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseCompile|x86.ActiveCfg = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseCompile|x86.Build.0 = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseLib_win32|Any CPU.ActiveCfg = RelWithDebInfo|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseLib_win32|Any CPU.Build.0 = RelWithDebInfo|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseLib_win32|x64.ActiveCfg = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseLib_win32|x64.Build.0 = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseLib_win32|x86.ActiveCfg = RelWithDebInfo|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseLib_win32|x86.Build.0 = RelWithDebInfo|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseLib|Any CPU.ActiveCfg = RelWithDebInfo|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseLib|Any CPU.Build.0 = RelWithDebInfo|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseLib|x64.ActiveCfg = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseLib|x64.Build.0 = Release|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseLib|x86.ActiveCfg = MinSizeRel|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.ReleaseLib|x86.Build.0 = MinSizeRel|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
+		{B39971A8-F247-31DE-8029-A90CE9549533}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.Beta|Any CPU.ActiveCfg = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.Beta|x64.ActiveCfg = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.Beta|x64.Build.0 = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.Beta|x86.ActiveCfg = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.Debug|Any CPU.ActiveCfg = Debug|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.Debug|x64.ActiveCfg = Debug|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.Debug|x64.Build.0 = Debug|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.Debug|x86.ActiveCfg = Debug|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.Release|Any CPU.ActiveCfg = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.Release|x64.ActiveCfg = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.Release|x64.Build.0 = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.Release|x86.ActiveCfg = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseCompile|Any CPU.ActiveCfg = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseCompile|Any CPU.Build.0 = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseCompile|x64.ActiveCfg = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseCompile|x64.Build.0 = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseCompile|x86.ActiveCfg = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseCompile|x86.Build.0 = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseLib_win32|Any CPU.ActiveCfg = RelWithDebInfo|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseLib_win32|Any CPU.Build.0 = RelWithDebInfo|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseLib_win32|x64.ActiveCfg = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseLib_win32|x64.Build.0 = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseLib_win32|x86.ActiveCfg = RelWithDebInfo|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseLib_win32|x86.Build.0 = RelWithDebInfo|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseLib|Any CPU.ActiveCfg = RelWithDebInfo|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseLib|Any CPU.Build.0 = RelWithDebInfo|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseLib|x64.ActiveCfg = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseLib|x64.Build.0 = Release|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseLib|x86.ActiveCfg = MinSizeRel|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.ReleaseLib|x86.Build.0 = MinSizeRel|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64
 		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.Beta|Any CPU.ActiveCfg = Release|x64
 		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.Beta|x64.ActiveCfg = Beta|x64
 		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.Beta|x64.Build.0 = Beta|x64
@@ -189,6 +220,12 @@ Global
 		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.Debug|x64.Build.0 = Beta|x64
 		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.Debug|x86.ActiveCfg = Beta|x64
 		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.Debug|x86.Build.0 = Beta|x64
+		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.MinSizeRel|Any CPU.ActiveCfg = Beta|x64
+		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.MinSizeRel|Any CPU.Build.0 = Beta|x64
+		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.MinSizeRel|x64.ActiveCfg = Beta|x64
+		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.MinSizeRel|x64.Build.0 = Beta|x64
+		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.MinSizeRel|x86.ActiveCfg = Beta|x64
+		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.MinSizeRel|x86.Build.0 = Beta|x64
 		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.Release|Any CPU.ActiveCfg = Release|x64
 		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.Release|x64.ActiveCfg = Release|x64
 		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.Release|x64.Build.0 = Release|x64
@@ -211,6 +248,12 @@ Global
 		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.ReleaseLib|x64.Build.0 = Release|x64
 		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.ReleaseLib|x86.ActiveCfg = Release|x64
 		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.ReleaseLib|x86.Build.0 = Release|x64
+		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.RelWithDebInfo|Any CPU.ActiveCfg = Beta|x64
+		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.RelWithDebInfo|Any CPU.Build.0 = Beta|x64
+		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.RelWithDebInfo|x64.ActiveCfg = Release|x64
+		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.RelWithDebInfo|x64.Build.0 = Release|x64
+		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.RelWithDebInfo|x86.ActiveCfg = Beta|x64
+		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48}.RelWithDebInfo|x86.Build.0 = Beta|x64
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.Beta|Any CPU.ActiveCfg = Release|Win32
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.Beta|x64.ActiveCfg = Release|x64
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.Beta|x64.Build.0 = Release|x64
@@ -221,6 +264,12 @@ Global
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.Debug|x64.Build.0 = Debug|x64
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.Debug|x86.ActiveCfg = Debug|Win32
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.Debug|x86.Build.0 = Debug|Win32
+		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.MinSizeRel|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.MinSizeRel|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.MinSizeRel|x64.ActiveCfg = Debug-Dynamic|x64
+		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.MinSizeRel|x64.Build.0 = Debug-Dynamic|x64
+		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.MinSizeRel|x86.ActiveCfg = Debug-Dynamic|Win32
+		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.MinSizeRel|x86.Build.0 = Debug-Dynamic|Win32
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.Release|Any CPU.ActiveCfg = Release|Win32
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.Release|x64.ActiveCfg = Release|x64
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.Release|x64.Build.0 = Release|x64
@@ -244,6 +293,12 @@ Global
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.ReleaseLib|x64.Build.0 = Release|x64
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.ReleaseLib|x86.ActiveCfg = Release-Static|Win32
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.ReleaseLib|x86.Build.0 = Release-Static|Win32
+		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.RelWithDebInfo|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.RelWithDebInfo|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.RelWithDebInfo|x64.ActiveCfg = Release-Dynamic|x64
+		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.RelWithDebInfo|x64.Build.0 = Release-Dynamic|x64
+		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.RelWithDebInfo|x86.ActiveCfg = Release-Dynamic|Win32
+		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4}.RelWithDebInfo|x86.Build.0 = Release-Dynamic|Win32
 		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.Beta|Any CPU.ActiveCfg = Release|Win32
 		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.Beta|x64.ActiveCfg = Release|x64
 		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.Beta|x64.Build.0 = Release|x64
@@ -254,6 +309,12 @@ Global
 		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.Debug|x64.Build.0 = Debug|x64
 		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.Debug|x86.ActiveCfg = Debug|Win32
 		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.Debug|x86.Build.0 = Debug|Win32
+		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.MinSizeRel|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.MinSizeRel|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.MinSizeRel|x64.ActiveCfg = Debug-Dynamic|x64
+		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.MinSizeRel|x64.Build.0 = Debug-Dynamic|x64
+		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.MinSizeRel|x86.ActiveCfg = Debug-Dynamic|Win32
+		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.MinSizeRel|x86.Build.0 = Debug-Dynamic|Win32
 		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.Release|Any CPU.ActiveCfg = Release|Win32
 		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.Release|x64.ActiveCfg = Release|x64
 		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.Release|x64.Build.0 = Release|x64
@@ -277,6 +338,12 @@ Global
 		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.ReleaseLib|x64.Build.0 = Release|x64
 		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.ReleaseLib|x86.ActiveCfg = Release-Static|Win32
 		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.ReleaseLib|x86.Build.0 = Release-Static|Win32
+		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.RelWithDebInfo|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.RelWithDebInfo|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.RelWithDebInfo|x64.ActiveCfg = Release-Dynamic|x64
+		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.RelWithDebInfo|x64.Build.0 = Release-Dynamic|x64
+		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.RelWithDebInfo|x86.ActiveCfg = Release-Dynamic|Win32
+		{7FDE3880-A4AB-49E3-B439-EBEF0A0C7A65}.RelWithDebInfo|x86.Build.0 = Release-Dynamic|Win32
 		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.Beta|Any CPU.ActiveCfg = Release|Win32
 		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.Beta|x64.ActiveCfg = Release|x64
 		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.Beta|x64.Build.0 = Release|x64
@@ -287,6 +354,12 @@ Global
 		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.Debug|x64.Build.0 = Debug|x64
 		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.Debug|x86.ActiveCfg = Debug|Win32
 		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.Debug|x86.Build.0 = Debug|Win32
+		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.MinSizeRel|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.MinSizeRel|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.MinSizeRel|x64.ActiveCfg = Debug-Dynamic|x64
+		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.MinSizeRel|x64.Build.0 = Debug-Dynamic|x64
+		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.MinSizeRel|x86.ActiveCfg = Debug-Dynamic|Win32
+		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.MinSizeRel|x86.Build.0 = Debug-Dynamic|Win32
 		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.Release|Any CPU.ActiveCfg = Release|Win32
 		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.Release|x64.ActiveCfg = Release|x64
 		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.Release|x64.Build.0 = Release|x64
@@ -310,6 +383,12 @@ Global
 		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.ReleaseLib|x64.Build.0 = Release|x64
 		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.ReleaseLib|x86.ActiveCfg = Release-Static|Win32
 		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.ReleaseLib|x86.Build.0 = Release-Static|Win32
+		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.RelWithDebInfo|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.RelWithDebInfo|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.RelWithDebInfo|x64.ActiveCfg = Release-Dynamic|x64
+		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.RelWithDebInfo|x64.Build.0 = Release-Dynamic|x64
+		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.RelWithDebInfo|x86.ActiveCfg = Release-Dynamic|Win32
+		{855DC8C0-D3E9-4A2E-AE47-116605A7BC9B}.RelWithDebInfo|x86.Build.0 = Release-Dynamic|Win32
 		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.Beta|Any CPU.ActiveCfg = Release|Win32
 		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.Beta|x64.ActiveCfg = Release|x64
 		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.Beta|x64.Build.0 = Release|x64
@@ -320,6 +399,12 @@ Global
 		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.Debug|x64.Build.0 = Debug|x64
 		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.Debug|x86.ActiveCfg = Debug|Win32
 		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.Debug|x86.Build.0 = Debug|Win32
+		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.MinSizeRel|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.MinSizeRel|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.MinSizeRel|x64.ActiveCfg = Debug-Dynamic|x64
+		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.MinSizeRel|x64.Build.0 = Debug-Dynamic|x64
+		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.MinSizeRel|x86.ActiveCfg = Debug-Dynamic|Win32
+		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.MinSizeRel|x86.Build.0 = Debug-Dynamic|Win32
 		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.Release|Any CPU.ActiveCfg = Release|Win32
 		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.Release|x64.ActiveCfg = Release|x64
 		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.Release|x64.Build.0 = Release|x64
@@ -343,6 +428,12 @@ Global
 		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.ReleaseLib|x64.Build.0 = Release|x64
 		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.ReleaseLib|x86.ActiveCfg = Release-Static|Win32
 		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.ReleaseLib|x86.Build.0 = Release-Static|Win32
+		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.RelWithDebInfo|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.RelWithDebInfo|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.RelWithDebInfo|x64.ActiveCfg = Release-Dynamic|x64
+		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.RelWithDebInfo|x64.Build.0 = Release-Dynamic|x64
+		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.RelWithDebInfo|x86.ActiveCfg = Release-Dynamic|Win32
+		{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}.RelWithDebInfo|x86.Build.0 = Release-Dynamic|Win32
 		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.Beta|Any CPU.ActiveCfg = Release|Win32
 		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.Beta|x64.ActiveCfg = Release|x64
 		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.Beta|x64.Build.0 = Release|x64
@@ -353,6 +444,12 @@ Global
 		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.Debug|x64.Build.0 = Debug|x64
 		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.Debug|x86.ActiveCfg = Debug|Win32
 		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.Debug|x86.Build.0 = Debug|Win32
+		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.MinSizeRel|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.MinSizeRel|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.MinSizeRel|x64.ActiveCfg = Debug-Dynamic|x64
+		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.MinSizeRel|x64.Build.0 = Debug-Dynamic|x64
+		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.MinSizeRel|x86.ActiveCfg = Debug-Dynamic|Win32
+		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.MinSizeRel|x86.Build.0 = Debug-Dynamic|Win32
 		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.Release|Any CPU.ActiveCfg = Release|Win32
 		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.Release|x64.ActiveCfg = Release|x64
 		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.Release|x64.Build.0 = Release|x64
@@ -376,6 +473,12 @@ Global
 		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.ReleaseLib|x64.Build.0 = Release|x64
 		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.ReleaseLib|x86.ActiveCfg = Release-Static|Win32
 		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.ReleaseLib|x86.Build.0 = Release-Static|Win32
+		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.RelWithDebInfo|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.RelWithDebInfo|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.RelWithDebInfo|x64.ActiveCfg = Release-Dynamic|x64
+		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.RelWithDebInfo|x64.Build.0 = Release-Dynamic|x64
+		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.RelWithDebInfo|x86.ActiveCfg = Release-Dynamic|Win32
+		{DA0E03ED-53A7-4050-8A85-90541C5509F8}.RelWithDebInfo|x86.Build.0 = Release-Dynamic|Win32
 		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.Beta|Any CPU.ActiveCfg = Release|Win32
 		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.Beta|x64.ActiveCfg = Release|x64
 		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.Beta|x64.Build.0 = Release|x64
@@ -386,6 +489,12 @@ Global
 		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.Debug|x64.Build.0 = Debug|x64
 		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.Debug|x86.ActiveCfg = Debug|Win32
 		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.Debug|x86.Build.0 = Debug|Win32
+		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.MinSizeRel|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.MinSizeRel|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.MinSizeRel|x64.ActiveCfg = Debug-Dynamic|x64
+		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.MinSizeRel|x64.Build.0 = Debug-Dynamic|x64
+		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.MinSizeRel|x86.ActiveCfg = Debug-Dynamic|Win32
+		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.MinSizeRel|x86.Build.0 = Debug-Dynamic|Win32
 		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.Release|Any CPU.ActiveCfg = Release|Win32
 		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.Release|x64.ActiveCfg = Release|x64
 		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.Release|x64.Build.0 = Release|x64
@@ -409,6 +518,12 @@ Global
 		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.ReleaseLib|x64.Build.0 = Release|x64
 		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.ReleaseLib|x86.ActiveCfg = Release-Static|Win32
 		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.ReleaseLib|x86.Build.0 = Release-Static|Win32
+		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.RelWithDebInfo|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.RelWithDebInfo|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.RelWithDebInfo|x64.ActiveCfg = Release-Dynamic|x64
+		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.RelWithDebInfo|x64.Build.0 = Release-Dynamic|x64
+		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.RelWithDebInfo|x86.ActiveCfg = Release-Dynamic|Win32
+		{2BB84911-C1B4-4747-B93D-36AA82CC5031}.RelWithDebInfo|x86.Build.0 = Release-Dynamic|Win32
 		{B82CDD25-6903-430E-BD38-D8129A2015C1}.Beta|Any CPU.ActiveCfg = Release|Win32
 		{B82CDD25-6903-430E-BD38-D8129A2015C1}.Beta|x64.ActiveCfg = Release|x64
 		{B82CDD25-6903-430E-BD38-D8129A2015C1}.Beta|x64.Build.0 = Release|x64
@@ -419,6 +534,12 @@ Global
 		{B82CDD25-6903-430E-BD38-D8129A2015C1}.Debug|x64.Build.0 = Debug|x64
 		{B82CDD25-6903-430E-BD38-D8129A2015C1}.Debug|x86.ActiveCfg = Debug|Win32
 		{B82CDD25-6903-430E-BD38-D8129A2015C1}.Debug|x86.Build.0 = Debug|Win32
+		{B82CDD25-6903-430E-BD38-D8129A2015C1}.MinSizeRel|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{B82CDD25-6903-430E-BD38-D8129A2015C1}.MinSizeRel|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{B82CDD25-6903-430E-BD38-D8129A2015C1}.MinSizeRel|x64.ActiveCfg = Debug-Dynamic|x64
+		{B82CDD25-6903-430E-BD38-D8129A2015C1}.MinSizeRel|x64.Build.0 = Debug-Dynamic|x64
+		{B82CDD25-6903-430E-BD38-D8129A2015C1}.MinSizeRel|x86.ActiveCfg = Debug-Dynamic|Win32
+		{B82CDD25-6903-430E-BD38-D8129A2015C1}.MinSizeRel|x86.Build.0 = Debug-Dynamic|Win32
 		{B82CDD25-6903-430E-BD38-D8129A2015C1}.Release|Any CPU.ActiveCfg = Release|Win32
 		{B82CDD25-6903-430E-BD38-D8129A2015C1}.Release|x64.ActiveCfg = Release|x64
 		{B82CDD25-6903-430E-BD38-D8129A2015C1}.Release|x64.Build.0 = Release|x64
@@ -442,6 +563,12 @@ Global
 		{B82CDD25-6903-430E-BD38-D8129A2015C1}.ReleaseLib|x64.Build.0 = Release|x64
 		{B82CDD25-6903-430E-BD38-D8129A2015C1}.ReleaseLib|x86.ActiveCfg = Release-Static|Win32
 		{B82CDD25-6903-430E-BD38-D8129A2015C1}.ReleaseLib|x86.Build.0 = Release-Static|Win32
+		{B82CDD25-6903-430E-BD38-D8129A2015C1}.RelWithDebInfo|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{B82CDD25-6903-430E-BD38-D8129A2015C1}.RelWithDebInfo|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{B82CDD25-6903-430E-BD38-D8129A2015C1}.RelWithDebInfo|x64.ActiveCfg = Release-Dynamic|x64
+		{B82CDD25-6903-430E-BD38-D8129A2015C1}.RelWithDebInfo|x64.Build.0 = Release-Dynamic|x64
+		{B82CDD25-6903-430E-BD38-D8129A2015C1}.RelWithDebInfo|x86.ActiveCfg = Release-Dynamic|Win32
+		{B82CDD25-6903-430E-BD38-D8129A2015C1}.RelWithDebInfo|x86.Build.0 = Release-Dynamic|Win32
 		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.Beta|Any CPU.ActiveCfg = Release|Win32
 		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.Beta|x64.ActiveCfg = Release|x64
 		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.Beta|x64.Build.0 = Release|x64
@@ -452,6 +579,12 @@ Global
 		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.Debug|x64.Build.0 = Debug|x64
 		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.Debug|x86.ActiveCfg = Debug|Win32
 		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.Debug|x86.Build.0 = Debug|Win32
+		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.MinSizeRel|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.MinSizeRel|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.MinSizeRel|x64.ActiveCfg = Debug-Dynamic|x64
+		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.MinSizeRel|x64.Build.0 = Debug-Dynamic|x64
+		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.MinSizeRel|x86.ActiveCfg = Debug-Dynamic|Win32
+		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.MinSizeRel|x86.Build.0 = Debug-Dynamic|Win32
 		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.Release|Any CPU.ActiveCfg = Release|Win32
 		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.Release|x64.ActiveCfg = Release|x64
 		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.Release|x64.Build.0 = Release|x64
@@ -475,6 +608,12 @@ Global
 		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.ReleaseLib|x64.Build.0 = Release|x64
 		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.ReleaseLib|x86.ActiveCfg = Release-Static|Win32
 		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.ReleaseLib|x86.Build.0 = Release-Static|Win32
+		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.RelWithDebInfo|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.RelWithDebInfo|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.RelWithDebInfo|x64.ActiveCfg = Release-Dynamic|x64
+		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.RelWithDebInfo|x64.Build.0 = Release-Dynamic|x64
+		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.RelWithDebInfo|x86.ActiveCfg = Release-Dynamic|Win32
+		{9CA0FDFB-2172-41FC-B7F1-5CE915EDCB37}.RelWithDebInfo|x86.Build.0 = Release-Dynamic|Win32
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.Beta|Any CPU.ActiveCfg = Release|Win32
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.Beta|x64.ActiveCfg = Release|x64
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.Beta|x64.Build.0 = Release|x64
@@ -485,6 +624,12 @@ Global
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.Debug|x64.Build.0 = Debug|x64
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.Debug|x86.ActiveCfg = Debug|Win32
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.Debug|x86.Build.0 = Debug|Win32
+		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.MinSizeRel|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.MinSizeRel|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.MinSizeRel|x64.ActiveCfg = Debug-Dynamic|x64
+		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.MinSizeRel|x64.Build.0 = Debug-Dynamic|x64
+		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.MinSizeRel|x86.ActiveCfg = Debug-Dynamic|Win32
+		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.MinSizeRel|x86.Build.0 = Debug-Dynamic|Win32
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.Release|Any CPU.ActiveCfg = Release|Win32
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.Release|x64.ActiveCfg = Release|x64
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.Release|x64.Build.0 = Release|x64
@@ -508,6 +653,12 @@ Global
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.ReleaseLib|x64.Build.0 = Release|x64
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.ReleaseLib|x86.ActiveCfg = Release-Static|Win32
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.ReleaseLib|x86.Build.0 = Release-Static|Win32
+		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.RelWithDebInfo|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.RelWithDebInfo|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.RelWithDebInfo|x64.ActiveCfg = Release-Dynamic|x64
+		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.RelWithDebInfo|x64.Build.0 = Release-Dynamic|x64
+		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.RelWithDebInfo|x86.ActiveCfg = Release-Dynamic|Win32
+		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0}.RelWithDebInfo|x86.Build.0 = Release-Dynamic|Win32
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.Beta|Any CPU.ActiveCfg = Release|Win32
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.Beta|x64.ActiveCfg = Release|x64
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.Beta|x64.Build.0 = Release|x64
@@ -518,6 +669,12 @@ Global
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.Debug|x64.Build.0 = Debug|x64
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.Debug|x86.ActiveCfg = Debug|Win32
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.Debug|x86.Build.0 = Debug|Win32
+		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.MinSizeRel|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.MinSizeRel|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.MinSizeRel|x64.ActiveCfg = Debug-Dynamic|x64
+		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.MinSizeRel|x64.Build.0 = Debug-Dynamic|x64
+		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.MinSizeRel|x86.ActiveCfg = Debug-Dynamic|Win32
+		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.MinSizeRel|x86.Build.0 = Debug-Dynamic|Win32
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.Release|Any CPU.ActiveCfg = Release|Win32
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.Release|x64.ActiveCfg = Release|x64
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.Release|x64.Build.0 = Release|x64
@@ -541,79 +698,101 @@ Global
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.ReleaseLib|x64.Build.0 = Release|x64
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.ReleaseLib|x86.ActiveCfg = Release-Static|Win32
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.ReleaseLib|x86.Build.0 = Release-Static|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Beta|Any CPU.ActiveCfg = Release|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Beta|x64.ActiveCfg = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Beta|x64.Build.0 = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Beta|x86.ActiveCfg = Release|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Beta|x86.Build.0 = Release|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Debug|Any CPU.ActiveCfg = Debug|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Debug|x64.ActiveCfg = Debug|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Debug|x64.Build.0 = Debug|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Debug|x86.ActiveCfg = Debug|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Debug|x86.Build.0 = Debug|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Release|Any CPU.ActiveCfg = Release|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Release|x64.ActiveCfg = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Release|x64.Build.0 = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Release|x86.ActiveCfg = Release|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.Release|x86.Build.0 = Release|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseCompile|Any CPU.ActiveCfg = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseCompile|Any CPU.Build.0 = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseCompile|x64.ActiveCfg = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseCompile|x64.Build.0 = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseCompile|x86.ActiveCfg = Release|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseCompile|x86.Build.0 = Release|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseLib_win32|Any CPU.ActiveCfg = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseLib_win32|Any CPU.Build.0 = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseLib_win32|x64.ActiveCfg = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseLib_win32|x64.Build.0 = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseLib_win32|x86.ActiveCfg = Release|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseLib_win32|x86.Build.0 = Release|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseLib|Any CPU.ActiveCfg = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseLib|Any CPU.Build.0 = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseLib|x64.ActiveCfg = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseLib|x64.Build.0 = Release|x64
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseLib|x86.ActiveCfg = Release|Win32
-		{711397CE-E5D5-467D-9457-8716C047E50C}.ReleaseLib|x86.Build.0 = Release|Win32
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Beta|Any CPU.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Beta|Any CPU.Build.0 = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Beta|x64.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Beta|x64.Build.0 = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Beta|x86.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Beta|x86.Build.0 = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Debug|Any CPU.ActiveCfg = Debug|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Debug|x64.ActiveCfg = Debug|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Debug|x64.Build.0 = Debug|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Debug|x86.ActiveCfg = Debug|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Release|Any CPU.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Release|x64.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Release|x64.Build.0 = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.Release|x86.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseCompile|Any CPU.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseCompile|Any CPU.Build.0 = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseCompile|x64.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseCompile|x64.Build.0 = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseCompile|x86.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseCompile|x86.Build.0 = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseLib_win32|Any CPU.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseLib_win32|Any CPU.Build.0 = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseLib_win32|x64.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseLib_win32|x64.Build.0 = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseLib_win32|x86.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseLib_win32|x86.Build.0 = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseLib|Any CPU.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseLib|Any CPU.Build.0 = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseLib|x64.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseLib|x64.Build.0 = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseLib|x86.ActiveCfg = Release|x64
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027}.ReleaseLib|x86.Build.0 = Release|x64
+		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.RelWithDebInfo|Any CPU.ActiveCfg = Debug-Dynamic|ARM
+		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.RelWithDebInfo|Any CPU.Build.0 = Debug-Dynamic|ARM
+		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.RelWithDebInfo|x64.ActiveCfg = Release-Dynamic|x64
+		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.RelWithDebInfo|x64.Build.0 = Release-Dynamic|x64
+		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.RelWithDebInfo|x86.ActiveCfg = Release-Dynamic|Win32
+		{B8719FD5-E8A6-4A36-943C-891D07F5DD21}.RelWithDebInfo|x86.Build.0 = Release-Dynamic|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Beta|Any CPU.ActiveCfg = Release|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Beta|x64.ActiveCfg = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Beta|x64.Build.0 = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Beta|x86.ActiveCfg = Release|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Beta|x86.Build.0 = Release|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Debug|x64.ActiveCfg = Debug|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Debug|x64.Build.0 = Debug|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Debug|x86.ActiveCfg = Debug|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Debug|x86.Build.0 = Debug|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Release|Any CPU.ActiveCfg = Release|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Release|x64.ActiveCfg = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Release|x64.Build.0 = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Release|x86.ActiveCfg = Release|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.Release|x86.Build.0 = Release|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseCompile|Any CPU.ActiveCfg = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseCompile|Any CPU.Build.0 = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseCompile|x64.ActiveCfg = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseCompile|x64.Build.0 = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseCompile|x86.ActiveCfg = Release|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseCompile|x86.Build.0 = Release|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseLib_win32|Any CPU.ActiveCfg = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseLib_win32|Any CPU.Build.0 = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseLib_win32|x64.ActiveCfg = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseLib_win32|x64.Build.0 = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseLib_win32|x86.ActiveCfg = Release|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseLib_win32|x86.Build.0 = Release|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseLib|Any CPU.ActiveCfg = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseLib|Any CPU.Build.0 = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseLib|x64.ActiveCfg = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseLib|x64.Build.0 = Release|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseLib|x86.ActiveCfg = Release|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.ReleaseLib|x86.Build.0 = Release|Win32
+		{E23F393D-035D-3A88-8335-96339271FFC2}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
+		{E23F393D-035D-3A88-8335-96339271FFC2}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Beta|Any CPU.ActiveCfg = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Beta|Any CPU.Build.0 = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Beta|x64.ActiveCfg = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Beta|x64.Build.0 = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Beta|x86.ActiveCfg = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Beta|x86.Build.0 = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Debug|Any CPU.ActiveCfg = Debug|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Debug|x64.ActiveCfg = Debug|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Debug|x64.Build.0 = Debug|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Debug|x86.ActiveCfg = Debug|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.MinSizeRel|Any CPU.ActiveCfg = MinSizeRel|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Release|Any CPU.ActiveCfg = Release|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Release|x64.ActiveCfg = Release|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Release|x64.Build.0 = Release|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.Release|x86.ActiveCfg = Release|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseCompile|Any CPU.ActiveCfg = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseCompile|Any CPU.Build.0 = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseCompile|x64.ActiveCfg = Release|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseCompile|x64.Build.0 = Release|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseCompile|x86.ActiveCfg = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseCompile|x86.Build.0 = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseLib_win32|Any CPU.ActiveCfg = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseLib_win32|Any CPU.Build.0 = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseLib_win32|x64.ActiveCfg = Release|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseLib_win32|x64.Build.0 = Release|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseLib_win32|x86.ActiveCfg = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseLib_win32|x86.Build.0 = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseLib|Any CPU.ActiveCfg = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseLib|Any CPU.Build.0 = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseLib|x64.ActiveCfg = Release|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseLib|x64.Build.0 = Release|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseLib|x86.ActiveCfg = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.ReleaseLib|x86.Build.0 = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
-		{1CA4822C-F599-3879-A78F-332D823E4871} = {B6752729-7398-46FA-9CF0-DC854C6AB8CA}
-		{774F1C61-6659-36E6-9519-17A753890576} = {31F92F98-3580-445D-A3DA-D081B427A562}
-		{2CFF20AA-9341-3564-A044-C38E70D5372A} = {31F92F98-3580-445D-A3DA-D081B427A562}
+		{8819D074-8F1F-3226-A611-F2E0BD9B6DBE} = {B6752729-7398-46FA-9CF0-DC854C6AB8CA}
+		{B39971A8-F247-31DE-8029-A90CE9549533} = {31F92F98-3580-445D-A3DA-D081B427A562}
+		{4295A40A-1D7D-3A99-AB29-0C144CAB27F1} = {31F92F98-3580-445D-A3DA-D081B427A562}
 		{DBBFBC55-1C20-4D21-AE3B-6E8B14C4FE48} = {1ECB5BD6-B3A0-4135-BA3F-48FC367B61C9}
 		{A5D9AA24-08ED-48B9-BD65-F0A25E96BFC4} = {14A77BA7-0E23-4D8F-A74F-5D5D5583035D}
 		{14A77BA7-0E23-4D8F-A74F-5D5D5583035D} = {B4FD804C-ABD9-4F54-858B-911F0119580C}
@@ -627,8 +806,8 @@ Global
 		{4B5945CD-0CB3-49AA-A7FF-7612D93F82C0} = {14A77BA7-0E23-4D8F-A74F-5D5D5583035D}
 		{B8719FD5-E8A6-4A36-943C-891D07F5DD21} = {14A77BA7-0E23-4D8F-A74F-5D5D5583035D}
 		{B4FD804C-ABD9-4F54-858B-911F0119580C} = {B6752729-7398-46FA-9CF0-DC854C6AB8CA}
-		{711397CE-E5D5-467D-9457-8716C047E50C} = {B4FD804C-ABD9-4F54-858B-911F0119580C}
-		{A1BDC12C-5DF6-3E77-9793-AB9AB5C82027} = {1ECB5BD6-B3A0-4135-BA3F-48FC367B61C9}
+		{E23F393D-035D-3A88-8335-96339271FFC2} = {B4FD804C-ABD9-4F54-858B-911F0119580C}
+		{EC128C5F-DDC7-3828-98C8-B9CEAD61B131} = {1ECB5BD6-B3A0-4135-BA3F-48FC367B61C9}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {5C2901E8-26FE-444A-A80E-02AF8147CD34}
diff --git a/make-client.py b/make-client.py
index d406351d5..cebebfcc4 100644
--- a/make-client.py
+++ b/make-client.py
@@ -19,6 +19,8 @@ vs_where_path = os.path.join(
 )
 
 host_is_64bit = (False, True)[platform.machine().endswith('64')]
+this_dir = os.path.dirname(os.path.realpath(__file__))
+build_dir = this_dir + '\\build'
 
 class QtVerison(Enum):
     Major = 0
@@ -50,6 +52,11 @@ def getLatestVSVersion():
     else:
         return
 
+def getCMakeGenerator(vs_version):
+    if vs_version == '15':
+        return 'Visual Studio 15 2017 Win64'
+    else:
+        return 'Visual Studio ' + vs_version + ' 2019'
 
 def findVSLatestDir():
     args = [
@@ -66,7 +73,6 @@ def findVSLatestDir():
     else:
         return
 
-
 def getQtVersionNumber(qt_version, version_type):
     version_list = qt_version.split('.')
     return version_list[version_type.value]
@@ -77,6 +83,18 @@ def findMSBuild():
         if filename in files:
             return os.path.join(root, filename)
 
+def getMSBuildArgs(arch, config_str, configuration_type, toolset):
+    msbuild_args = [
+        '/nologo',
+        '/verbosity:minimal',
+        '/maxcpucount:' + str(multiprocessing.cpu_count()),
+        '/p:Platform=' + arch,
+        '/p:Configuration=' + config_str,
+        '/p:ConfigurationType=' + configuration_type,
+        '/p:useenv=true']
+    if (toolset != ''):
+        msbuild_args.append('/p:PlatformToolset=' + toolset)
+    return msbuild_args
 
 def getVSEnv(arch='x64', platform='', version=''):
     env_cmd = 'set path=%path:"=% && ' + \
@@ -137,8 +155,19 @@ def deps(arch, toolset, qtver):
         sys.exit(1)
 
     print('Building qrcodelib')
-    build(arch, '', '', 'Release-Lib',
-          '\\qrencode-win32\\qrencode-win32\\vc8\\qrcodelib\\qrcodelib.vcxproj', qtver, False)
+
+    vs_env_vars = {}
+    vs_env_vars.update(getVSEnv())
+
+    msbuild = findMSBuild()
+    if not os.path.isfile(msbuild):
+        raise IOError('msbuild.exe not found. path=' + msbuild)
+    msbuild_args = getMSBuildArgs(arch, 'Release-Lib', 'StaticLibrary', toolset)
+
+    this_dir = os.path.dirname(os.path.realpath(__file__))
+    proj_path = this_dir + '\\qrencode-win32\\qrencode-win32\\vc8\\qrcodelib\\qrcodelib.vcxproj'
+
+    build_project(msbuild, msbuild_args, proj_path, vs_env_vars)
 
 
 def build(arch, toolset, sdk_version, config_str, project_path_under_current_path, qtver, force_option=True):
@@ -146,30 +175,56 @@ def build(arch, toolset, sdk_version, config_str, project_path_under_current_pat
 
     configuration_type = 'StaticLibrary'
 
-    qt_minor_version = getQtVersionNumber(qtver, QtVerison.Minor)
-    qtFolderDir = 'msvc2017_64' if int(qt_minor_version) <= 14 else 'msvc2019_64'
-
     vs_env_vars = {}
     vs_env_vars.update(getVSEnv())
 
-    qmake_cmd = "C:\\Qt\\" + qtver + "\\" + qtFolderDir + "\\bin\\qmake.exe"
+    qt_dir = 'C:\\Qt\\' + qtver
+    cmake_gen = getCMakeGenerator(getLatestVSVersion())
+    qt_minor_version = getQtVersionNumber(qtver, QtVerison.Minor)
+    msvc_folder = '\\msvc2017_64' if int(qt_minor_version) <= 14 else '\\msvc2019_64'
+
+    qt_cmake_dir = qt_dir + msvc_folder + '\\lib\\cmake\\'
+    cmake_prefix_path = qt_dir + msvc_folder
+
+    cmake_options = [
+        '-DCMAKE_PREFIX_PATH=' + cmake_prefix_path,
+        '-DQt5_DIR=' + qt_cmake_dir + 'Qt5',
+        '-DQt5Core_DIR=' + qt_cmake_dir + 'Qt5Core',
+        '-DQt5Sql_DIR=' + qt_cmake_dir + 'Qt5Sql',
+        '-DQt5LinguistTools_DIR=' + qt_cmake_dir + 'Qt5LinguistTools',
+        '-DQt5Concurrent_DIR=' + qt_cmake_dir + 'Qt5Concurrent',
+        '-DQt5Gui_DIR=' + qt_cmake_dir + 'Qt5Gui',
+        '-DCMAKE_SYSTEM_VERSION=' + sdk_version
+    ]
+    if not os.path.exists(build_dir):
+        os.makedirs(build_dir)
+    os.chdir(build_dir)
+
     if (config_str == 'Release'):
-        print('Generating project using qmake ' + config_str + '|' + arch)
-        if(execute_cmd(qmake_cmd + " -tp vc jami-qt.pro -o jami-qt.vcxproj", False, vs_env_vars)):
-            print("Qmake vcxproj file generate error")
+        print('Generating project using cmake ' + config_str + '|' + arch)
+        cmd = ['cmake', '..', '-G', cmake_gen]
+        cmd.extend(cmake_options)
+        if(execute_cmd(cmd, False, vs_env_vars)):
+            print("Cmake vcxproj file generate error")
             sys.exit(1)
         configuration_type = 'Application'
     elif (config_str == 'Beta'):
-        print('Generating project using qmake ' + config_str + '|' + arch)
-        if(execute_cmd(qmake_cmd + " -tp vc jami-qt.pro -o jami-qt.vcxproj CONFIG+=Beta", False, vs_env_vars)):
-            print("Beta: Qmake vcxproj file generate error")
+        print('Generating project using cmake ' + config_str + '|' + arch)
+        cmake_options.append('-DBETA=1')
+        cmd = ['cmake', '..', '-G', cmake_gen]
+        cmd.extend(cmake_options)
+        if(execute_cmd(cmd, False, vs_env_vars)):
+            print("Beta: Cmake vcxproj file generate error")
             sys.exit(1)
         config_str = 'Release'
         configuration_type = 'Application'
     elif (config_str == 'ReleaseCompile'):
         print('Generating project using qmake ' + config_str + '|' + arch)
-        if(execute_cmd(qmake_cmd + " -tp vc jami-qt.pro -o jami-qt.vcxproj CONFIG+=ReleaseCompile", False, vs_env_vars)):
-            print("ReleaseCompile: Qmake vcxproj file generate error")
+        cmake_options.append('-DReleaseCompile=1')
+        cmd = ['cmake', '..', '-G', cmake_gen]
+        cmd.extend(cmake_options)
+        if(execute_cmd(cmd, False, vs_env_vars)):
+            print("ReleaseCompile: Cmake vcxproj file generate error")
             sys.exit(1)
         config_str = 'Release'
 
@@ -177,22 +232,13 @@ def build(arch, toolset, sdk_version, config_str, project_path_under_current_pat
     # but will be outputted into x64/Beta folder (for Beta Only)
 
     print('Building projects in ' + config_str + '|' + arch)
-    this_dir = os.path.dirname(os.path.realpath(__file__))
-    qt_client_proj_path = this_dir + project_path_under_current_path
+    qt_client_proj_path = build_dir + project_path_under_current_path
 
     msbuild = findMSBuild()
     if not os.path.isfile(msbuild):
         raise IOError('msbuild.exe not found. path=' + msbuild)
-    msbuild_args = [
-        '/nologo',
-        '/verbosity:minimal',
-        '/maxcpucount:' + str(multiprocessing.cpu_count()),
-        '/p:Platform=' + arch,
-        '/p:Configuration=' + config_str,
-        '/p:ConfigurationType=' + configuration_type,
-        '/p:useenv=true']
-    if (toolset != ''):
-        msbuild_args.append('/p:PlatformToolset=' + toolset)
+    msbuild_args = getMSBuildArgs(arch, config_str, configuration_type, toolset)
+
     if (force_option):
         # force toolset
         replace_vs_prop(qt_client_proj_path,
diff --git a/src/qrimageprovider.h b/src/qrimageprovider.h
index d148873d9..2bc39de9a 100644
--- a/src/qrimageprovider.h
+++ b/src/qrimageprovider.h
@@ -43,7 +43,7 @@ public:
      */
     QPair<QrType, QString> getIndexFromID(const QString& id)
     {
-        auto list = id.split('_', QString::SplitBehavior::SkipEmptyParts);
+        auto list = id.split('_', Qt::SkipEmptyParts);
         if (list.size() < 2)
             return {QrType::Account, ""};
         if (list.contains("account") && list.size() > 1) {
diff --git a/src/smartlistmodel.cpp b/src/smartlistmodel.cpp
index e1bc388bc..6269f43dd 100644
--- a/src/smartlistmodel.cpp
+++ b/src/smartlistmodel.cpp
@@ -298,7 +298,7 @@ SmartListModel::getConversationItemData(const conversation::Info& item,
     case Role::LastInteractionDate: {
         if (!item.interactions.empty()) {
             auto& date = item.interactions.at(item.lastMessageUid).timestamp;
-            return QVariant(QString::fromStdString(Utils::formatTimeString(date)));
+            return QVariant(Utils::formatTimeString(date));
         }
         return QVariant("");
     }
diff --git a/src/tintedbuttonimageprovider.h b/src/tintedbuttonimageprovider.h
index d708c295c..073b7b081 100644
--- a/src/tintedbuttonimageprovider.h
+++ b/src/tintedbuttonimageprovider.h
@@ -40,7 +40,7 @@ public:
 
         QColor tintedColor;
 
-        auto list = id.split('+', QString::SkipEmptyParts);
+        auto list = id.split('+', Qt::SkipEmptyParts);
 
         if (list.size() == 2) {
             QPixmap pixmapToSend(":/images/icons/" + list[0]);
diff --git a/src/utils.cpp b/src/utils.cpp
index 27d253158..7c4c7d4ec 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -36,7 +36,7 @@
 #include <QPainter>
 #include <QPropertyAnimation>
 #include <QScreen>
-#include <QStackedWidget>
+#include <QDateTime>
 #include <QSvgRenderer>
 #include <QTranslator>
 #include <QtConcurrent/QtConcurrent>
@@ -496,21 +496,16 @@ Utils::profileType(const lrc::api::conversation::Info& conv,
     }
 }
 
-// TODO: use Qt for this
-std::string
-Utils::formatTimeString(const std::time_t& timestamp)
+QString
+Utils::formatTimeString(const std::time_t& timeStamp)
 {
-    std::time_t now = std::time(nullptr);
-    char interactionDay[64];
-    char nowDay[64];
-    std::strftime(interactionDay, sizeof(interactionDay), "%D", std::localtime(&timestamp));
-    std::strftime(nowDay, sizeof(nowDay), "%D", std::localtime(&now));
-    if (std::string(interactionDay) == std::string(nowDay)) {
-        char interactionTime[64];
-        std::strftime(interactionTime, sizeof(interactionTime), "%R", std::localtime(&timestamp));
-        return interactionTime;
+    auto currentTimeStamp = QDateTime::fromSecsSinceEpoch(timeStamp);
+    auto now = QDateTime::currentDateTime();
+    auto timeStampDMY = currentTimeStamp.toString("dd/MM/yyyy");
+    if (timeStampDMY == now.toString("dd/MM/yyyy")) {
+        return currentTimeStamp.toString("hh:mm");
     } else {
-        return interactionDay;
+        return timeStampDMY;
     }
 }
 
diff --git a/src/utils.h b/src/utils.h
index d0340a4fb..99a9d54d0 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -74,7 +74,7 @@ void removeOldVersions();
 // LRC helpers
 lrc::api::profile::Type profileType(const lrc::api::conversation::Info& conv,
                                     const lrc::api::ConversationModel& model);
-std::string formatTimeString(const std::time_t& timestamp);
+QString formatTimeString(const std::time_t& timeStamp);
 bool isInteractionGenerated(const lrc::api::interaction::Type& interaction);
 bool isContactValid(const QString& contactUid, const lrc::api::ConversationModel& model);
 bool getReplyMessageBox(QWidget* widget, const QString& title, const QString& text);
-- 
GitLab