////////////////////////////////////////////////////////////////////////////
//	Module 		: graph_engine.h
//	Created 	: 21.03.2002
//  Modified 	: 26.11.2003
//	Author		: Dmitriy Iassenev
//	Description : Graph engine
////////////////////////////////////////////////////////////////////////////

#pragma once

#include "a_star.h"
#include "edge_path.h"
#include "vertex_manager_fixed.h"
#include "vertex_manager_hash_fixed.h"
#include "vertex_allocator_fixed.h"
#include "data_storage_bucket_list.h"
#include "data_storage_binary_heap.h"
#include "path_manager.h"
#include "graph_engine_space.h"
#include "profiler.h"

#include "operator_condition.h"
#include "condition_state.h"
#include "operator_abstract.h"

using namespace GraphEngineSpace;

class CGraphEngine {
public:
	typedef CDataStorageBinaryHeap							CSolverPriorityQueue;
	typedef CDataStorageBucketList<u32,u32,8*1024,false>	CPriorityQueue;

	typedef CVertexManagerFixed<u32,u32,8>					CVertexManager;

	typedef CVertexManagerHashFixed<
				u32,
				_solver_index_type,
				256,
				8*1024
			>												CSolverVertexManager;
	typedef CVertexAllocatorFixed<64*1024>					CVertexAllocator;
	typedef CVertexAllocatorFixed<8*1024>					CSolverVertexAllocator;

	typedef CAStar<
		_dist_type,
		CPriorityQueue,
		CVertexManager,
		CVertexAllocator
	>														CAlgorithm;

	typedef CAStar<
		_solver_dist_type,
		CSolverPriorityQueue,
		CSolverVertexManager,
		CSolverVertexAllocator,
		true,
		CEdgePath<
			_solver_edge_type,
			true
		>
	>														CSolverAlgorithm;

	CAlgorithm				*m_algorithm;
	CSolverAlgorithm		*m_solver_algorithm;

public:

	IC				CGraphEngine			(u32 max_vertex_count);
	virtual			~CGraphEngine			();
	IC		const CSolverAlgorithm &solver_algorithm() const;

	template <
		typename _Graph,
		typename _Parameters
	>
	IC		bool	search					(
				const _Graph			&graph,
				const _index_type		&start_node,
				const _index_type		&dest_node,
				xr_vector<_index_type>	*node_path,
				const _Parameters		&parameters
			);

	template <
		typename _Graph,
		typename _Parameters
	>
	IC		bool	search					(
				const _Graph			&graph,
				const _index_type		&start_node,
				const _index_type		&dest_node,
				xr_vector<_index_type>	*node_path,
				_Parameters				&parameters
			);

	template <
		typename _Graph,
		typename _Parameters,
		typename _PathManager
	>
	IC		bool	search					(
				const _Graph			&graph,
				const _index_type		&start_node,
				const _index_type		&dest_node,
				xr_vector<_index_type>	*node_path,
				const _Parameters		&parameters,
				_PathManager			&path_manager
			);

	template <
		typename T1,
		typename T2,
		typename T3,
		typename T4,
		typename T5,
		bool	 T6,
		typename T7,
		typename T8,
		typename _Parameters
	>
	IC		bool	search					(
		const CProblemSolver<
			T1,
			T2,
			T3,
			T4,
			T5,
			T6,
			T7,
			T8
		>								&graph,
		const _solver_index_type		&start_node,
		const _solver_index_type		&dest_node,
		xr_vector<_solver_edge_type>	*node_path,
		const _Parameters				&parameters
	);
};

#include "graph_engine_inline.h"


/**
  ******************************************************************************
  * @file    stm32f4xx_hal_msp_template.c
  * @author  MCD Application Team
  * @brief   This file contains the HAL System and Peripheral (PPP) MSP initialization
  *          and de-initialization functions.
  *          It should be copied to the application folder and renamed into 'stm32f4xx_hal_msp.c'.
  ******************************************************************************
  * @attention
  *
  *
© COPYRIGHT(c) 2017 STMicroelectronics

  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_hal.h"

/** @addtogroup STM32F4xx_HAL_Driver
  * @{
  */

/** @defgroup HAL_MSP HAL MSP
  * @brief HAL MSP module.
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/** @defgroup HAL_MSP_Private_Functions HAL MSP Private Functions
  * @{
  */

/**
  * @brief  Initializes the Global MSP.
  * @note   This function is called from HAL_Init() function to perform system
  *         level initialization (GPIOs, clock, DMA, interrupt).
  * @retval None
  */
void HAL_MspInit(void)
{

}

/**
  * @brief  DeInitializes the Global MSP.
  * @note   This functiona is called from HAL_DeInit() function to perform system
  *         level de-initialization (GPIOs, clock, DMA, interrupt).
  * @retval None
  */
void HAL_MspDeInit(void)
{

}

/**
  * @brief  Initializes the PPP MSP.
  * @note   This functiona is called from HAL_PPP_Init() function to perform
  *         peripheral(PPP) system level initialization (GPIOs, clock, DMA, interrupt)
  * @retval None
  */
void HAL_PPP_MspInit(void)
{

}

/**
  * @brief  DeInitializes the PPP MSP.
  * @note   This functiona is called from HAL_PPP_DeInit() function to perform
  *         peripheral(PPP) system level de-initialization (GPIOs, clock, DMA, interrupt)
  * @retval None
  */
void HAL_PPP_MspDeInit(void)
{

}

/**
  * @}
  */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27004.2009
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BreadPlayer.Views.UWP", "BreadPlayer.Views.UWP\BreadPlayer.Views.UWP.csproj", "{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{94239CE0-2915-4C43-B4C9-0754E344ED5C}"
	ProjectSection(SolutionItems) = preProject
		appveyor.yml = appveyor.yml
		BreadPlayer.NoTests.sln = BreadPlayer.NoTests.sln
		LICENSE.txt = LICENSE.txt
	EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BreadPlayer.Core", "BreadPlayer.Core\BreadPlayer.Core.csproj", "{67F9D3A8-F71E-4428-913F-C37AE82CDB24}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BreadPlayer.Web", "BreadPlayer.Web\BreadPlayer.Web.csproj", "{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BreadPlayer.Database", "BreadPlayer.Database\BreadPlayer.Database.csproj", "{E63C3DE4-AB33-4611-B193-9739FCCB1661}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BreadPlayer.Parsers", "BreadPlayer.Parsers\BreadPlayer.Parsers.csproj", "{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BreadPlayer.Web.Tests", "BreadPlayer.Web.Tests\BreadPlayer.Web.Tests.csproj", "{23538FC1-D438-48EB-B0D7-832A401E5247}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BreadPlayer.Views.Android", "BreadPlayer.Views.Android\BreadPlayer.Views.Android.csproj", "{1241A6F7-0E20-4F20-A50F-E701C6089D6B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BreadPlayer.Extensions", "BreadPlayer.Extensions\BreadPlayer.Extensions.csproj", "{E5851A02-A8CE-4F4D-8B5F-0986013AE830}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BreadPlayer.Interfaces", "BreadPlayer.Interfaces\BreadPlayer.Interfaces.csproj", "{412718BB-903F-482F-8577-99B8EFCD96D2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BreadPlayer.Services", "BreadPlayer.Services\BreadPlayer.Services.csproj", "{94270040-8853-4616-B14B-11196BDA8CC9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BreadPlayer.Common", "BreadPlayer.Common\BreadPlayer.Common.csproj", "{47AF841A-4B78-490D-8915-7F58CDBDBEB3}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Debug|ARM = Debug|ARM
		Debug|x64 = Debug|x64
		Debug|x86 = Debug|x86
		FastBuild_Release|Any CPU = FastBuild_Release|Any CPU
		FastBuild_Release|ARM = FastBuild_Release|ARM
		FastBuild_Release|x64 = FastBuild_Release|x64
		FastBuild_Release|x86 = FastBuild_Release|x86
		Release|Any CPU = Release|Any CPU
		Release|ARM = Release|ARM
		Release|x64 = Release|x64
		Release|x86 = Release|x86
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Debug|Any CPU.ActiveCfg = Debug|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Debug|Any CPU.Build.0 = Debug|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Debug|Any CPU.Deploy.0 = Debug|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Debug|ARM.ActiveCfg = Debug|ARM
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Debug|ARM.Build.0 = Debug|ARM
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Debug|ARM.Deploy.0 = Debug|ARM
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Debug|x64.ActiveCfg = Debug|x64
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Debug|x64.Build.0 = Debug|x64
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Debug|x64.Deploy.0 = Debug|x64
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Debug|x86.ActiveCfg = Debug|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Debug|x86.Build.0 = Debug|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Debug|x86.Deploy.0 = Debug|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.FastBuild_Release|Any CPU.ActiveCfg = FastBuild_Release|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.FastBuild_Release|Any CPU.Build.0 = FastBuild_Release|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.FastBuild_Release|Any CPU.Deploy.0 = FastBuild_Release|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.FastBuild_Release|ARM.ActiveCfg = FastBuild_Release|ARM
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.FastBuild_Release|ARM.Build.0 = FastBuild_Release|ARM
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.FastBuild_Release|ARM.Deploy.0 = FastBuild_Release|ARM
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.FastBuild_Release|x64.ActiveCfg = FastBuild_Release|x64
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.FastBuild_Release|x64.Build.0 = FastBuild_Release|x64
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.FastBuild_Release|x64.Deploy.0 = FastBuild_Release|x64
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.FastBuild_Release|x86.ActiveCfg = FastBuild_Release|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.FastBuild_Release|x86.Build.0 = FastBuild_Release|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.FastBuild_Release|x86.Deploy.0 = FastBuild_Release|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Release|Any CPU.ActiveCfg = Release|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Release|Any CPU.Build.0 = Release|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Release|Any CPU.Deploy.0 = Release|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Release|ARM.ActiveCfg = Release|ARM
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Release|ARM.Build.0 = Release|ARM
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Release|ARM.Deploy.0 = Release|ARM
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Release|x64.ActiveCfg = Release|x64
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Release|x64.Build.0 = Release|x64
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Release|x64.Deploy.0 = Release|x64
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Release|x86.ActiveCfg = Release|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Release|x86.Build.0 = Release|x86
		{6528FC18-6EF0-40C8-A9FB-858AC62E5B4A}.Release|x86.Deploy.0 = Release|x86
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|ARM.ActiveCfg = Debug|ARM
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|ARM.Build.0 = Debug|ARM
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|x64.ActiveCfg = Debug|x64
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|x64.Build.0 = Debug|x64
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|x86.ActiveCfg = Debug|x86
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|x86.Build.0 = Debug|x86
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.FastBuild_Release|Any CPU.ActiveCfg = Release|Any CPU
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.FastBuild_Release|Any CPU.Build.0 = Release|Any CPU
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.FastBuild_Release|ARM.ActiveCfg = Release|ARM
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.FastBuild_Release|ARM.Build.0 = Release|ARM
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.FastBuild_Release|x64.ActiveCfg = Release|x64
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.FastBuild_Release|x64.Build.0 = Release|x64
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.FastBuild_Release|x86.ActiveCfg = Release|x86
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.FastBuild_Release|x86.Build.0 = Release|x86
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|Any CPU.Build.0 = Release|Any CPU
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|ARM.ActiveCfg = Release|ARM
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|ARM.Build.0 = Release|ARM
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|x64.ActiveCfg = Release|x64
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|x64.Build.0 = Release|x64
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|x86.ActiveCfg = Release|x86
		{67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|x86.Build.0 = Release|x86
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Debug|ARM.ActiveCfg = Debug|ARM
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Debug|ARM.Build.0 = Debug|ARM
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Debug|x64.ActiveCfg = Debug|x64
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Debug|x64.Build.0 = Debug|x64
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Debug|x86.ActiveCfg = Debug|x86
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Debug|x86.Build.0 = Debug|x86
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.FastBuild_Release|Any CPU.ActiveCfg = Release|Any CPU
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.FastBuild_Release|Any CPU.Build.0 = Release|Any CPU
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.FastBuild_Release|ARM.ActiveCfg = Release|ARM
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.FastBuild_Release|ARM.Build.0 = Release|ARM
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.FastBuild_Release|x64.ActiveCfg = Release|x64
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.FastBuild_Release|x64.Build.0 = Release|x64
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.FastBuild_Release|x86.ActiveCfg = Release|x86
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.FastBuild_Release|x86.Build.0 = Release|x86
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Release|Any CPU.Build.0 = Release|Any CPU
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Release|ARM.ActiveCfg = Release|ARM
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Release|ARM.Build.0 = Release|ARM
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Release|x64.ActiveCfg = Release|x64
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Release|x64.Build.0 = Release|x64
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Release|x86.ActiveCfg = Release|x86
		{8BAA2DC7-9675-480F-A9F5-8D8D6245689B}.Release|x86.Build.0 = Release|x86
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Debug|ARM.ActiveCfg = Debug|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Debug|ARM.Build.0 = Debug|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Debug|x64.ActiveCfg = Debug|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Debug|x64.Build.0 = Debug|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Debug|x86.ActiveCfg = Debug|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Debug|x86.Build.0 = Debug|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.FastBuild_Release|Any CPU.ActiveCfg = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.FastBuild_Release|Any CPU.Build.0 = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.FastBuild_Release|ARM.ActiveCfg = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.FastBuild_Release|ARM.Build.0 = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.FastBuild_Release|x64.ActiveCfg = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.FastBuild_Release|x64.Build.0 = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.FastBuild_Release|x86.ActiveCfg = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.FastBuild_Release|x86.Build.0 = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Release|Any CPU.Build.0 = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Release|ARM.ActiveCfg = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Release|ARM.Build.0 = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Release|x64.ActiveCfg = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Release|x64.Build.0 = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Release|x86.ActiveCfg = Release|Any CPU
		{E63C3DE4-AB33-4611-B193-9739FCCB1661}.Release|x86.Build.0 = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Debug|ARM.ActiveCfg = Debug|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Debug|ARM.Build.0 = Debug|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Debug|x64.ActiveCfg = Debug|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Debug|x64.Build.0 = Debug|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Debug|x86.ActiveCfg = Debug|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Debug|x86.Build.0 = Debug|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.FastBuild_Release|Any CPU.ActiveCfg = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.FastBuild_Release|Any CPU.Build.0 = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.FastBuild_Release|ARM.ActiveCfg = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.FastBuild_Release|ARM.Build.0 = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.FastBuild_Release|x64.ActiveCfg = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.FastBuild_Release|x64.Build.0 = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.FastBuild_Release|x86.ActiveCfg = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.FastBuild_Release|x86.Build.0 = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Release|Any CPU.Build.0 = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Release|ARM.ActiveCfg = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Release|ARM.Build.0 = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Release|x64.ActiveCfg = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Release|x64.Build.0 = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Release|x86.ActiveCfg = Release|Any CPU
		{EC3F27A8-AB79-420F-AEF2-8D3316ABAB3C}.Release|x86.Build.0 = Release|Any CPU
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Debug|Any CPU.ActiveCfg = Debug|x86
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Debug|ARM.ActiveCfg = Debug|ARM
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Debug|ARM.Build.0 = Debug|ARM
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Debug|ARM.Deploy.0 = Debug|ARM
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Debug|x64.ActiveCfg = Debug|x64
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Debug|x64.Build.0 = Debug|x64
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Debug|x64.Deploy.0 = Debug|x64
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Debug|x86.ActiveCfg = Debug|x86
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Debug|x86.Deploy.0 = Debug|x86
		{23538FC1-D438-48EB-B0D7-832A401E5247}.FastBuild_Release|Any CPU.ActiveCfg = FastBuild_Release|x86
		{23538FC1-D438-48EB-B0D7-832A401E5247}.FastBuild_Release|ARM.ActiveCfg = FastBuild_Release|ARM
		{23538FC1-D438-48EB-B0D7-832A401E5247}.FastBuild_Release|ARM.Build.0 = FastBuild_Release|ARM
		{23538FC1-D438-48EB-B0D7-832A401E5247}.FastBuild_Release|ARM.Deploy.0 = FastBuild_Release|ARM
		{23538FC1-D438-48EB-B0D7-832A401E5247}.FastBuild_Release|x64.ActiveCfg = FastBuild_Release|x64
		{23538FC1-D438-48EB-B0D7-832A401E5247}.FastBuild_Release|x64.Build.0 = FastBuild_Release|x64
		{23538FC1-D438-48EB-B0D7-832A401E5247}.FastBuild_Release|x64.Deploy.0 = FastBuild_Release|x64
		{23538FC1-D438-48EB-B0D7-832A401E5247}.FastBuild_Release|x86.ActiveCfg = FastBuild_Release|x86
		{23538FC1-D438-48EB-B0D7-832A401E5247}.FastBuild_Release|x86.Build.0 = FastBuild_Release|x86
		{23538FC1-D438-48EB-B0D7-832A401E5247}.FastBuild_Release|x86.Deploy.0 = FastBuild_Release|x86
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Release|Any CPU.ActiveCfg = Release|x86
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Release|ARM.ActiveCfg = Release|ARM
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Release|ARM.Build.0 = Release|ARM
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Release|ARM.Deploy.0 = Release|ARM
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Release|x64.ActiveCfg = Release|x64
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Release|x64.Build.0 = Release|x64
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Release|x64.Deploy.0 = Release|x64
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Release|x86.ActiveCfg = Release|x86
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Release|x86.Build.0 = Release|x86
		{23538FC1-D438-48EB-B0D7-832A401E5247}.Release|x86.Deploy.0 = Release|x86
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Debug|ARM.ActiveCfg = Debug|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Debug|ARM.Build.0 = Debug|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Debug|ARM.Deploy.0 = Debug|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Debug|x64.ActiveCfg = Debug|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Debug|x64.Build.0 = Debug|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Debug|x64.Deploy.0 = Debug|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Debug|x86.ActiveCfg = Debug|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Debug|x86.Build.0 = Debug|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Debug|x86.Deploy.0 = Debug|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.FastBuild_Release|Any CPU.ActiveCfg = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.FastBuild_Release|Any CPU.Build.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.FastBuild_Release|Any CPU.Deploy.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.FastBuild_Release|ARM.ActiveCfg = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.FastBuild_Release|ARM.Build.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.FastBuild_Release|ARM.Deploy.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.FastBuild_Release|x64.ActiveCfg = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.FastBuild_Release|x64.Build.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.FastBuild_Release|x64.Deploy.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.FastBuild_Release|x86.ActiveCfg = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.FastBuild_Release|x86.Build.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.FastBuild_Release|x86.Deploy.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Release|Any CPU.Build.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Release|Any CPU.Deploy.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Release|ARM.ActiveCfg = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Release|ARM.Build.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Release|ARM.Deploy.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Release|x64.ActiveCfg = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Release|x64.Build.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Release|x64.Deploy.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Release|x86.ActiveCfg = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Release|x86.Build.0 = Release|Any CPU
		{1241A6F7-0E20-4F20-A50F-E701C6089D6B}.Release|x86.Deploy.0 = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Debug|ARM.ActiveCfg = Debug|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Debug|ARM.Build.0 = Debug|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Debug|x64.ActiveCfg = Debug|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Debug|x64.Build.0 = Debug|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Debug|x86.ActiveCfg = Debug|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Debug|x86.Build.0 = Debug|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.FastBuild_Release|Any CPU.ActiveCfg = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.FastBuild_Release|Any CPU.Build.0 = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.FastBuild_Release|ARM.ActiveCfg = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.FastBuild_Release|ARM.Build.0 = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.FastBuild_Release|x64.ActiveCfg = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.FastBuild_Release|x64.Build.0 = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.FastBuild_Release|x86.ActiveCfg = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.FastBuild_Release|x86.Build.0 = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Release|Any CPU.Build.0 = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Release|ARM.ActiveCfg = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Release|ARM.Build.0 = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Release|x64.ActiveCfg = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Release|x64.Build.0 = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Release|x86.ActiveCfg = Release|Any CPU
		{E5851A02-A8CE-4F4D-8B5F-0986013AE830}.Release|x86.Build.0 = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Debug|ARM.ActiveCfg = Debug|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Debug|ARM.Build.0 = Debug|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Debug|x64.ActiveCfg = Debug|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Debug|x64.Build.0 = Debug|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Debug|x86.ActiveCfg = Debug|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Debug|x86.Build.0 = Debug|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.FastBuild_Release|Any CPU.ActiveCfg = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.FastBuild_Release|Any CPU.Build.0 = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.FastBuild_Release|ARM.ActiveCfg = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.FastBuild_Release|ARM.Build.0 = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.FastBuild_Release|x64.ActiveCfg = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.FastBuild_Release|x64.Build.0 = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.FastBuild_Release|x86.ActiveCfg = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.FastBuild_Release|x86.Build.0 = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Release|Any CPU.Build.0 = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Release|ARM.ActiveCfg = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Release|ARM.Build.0 = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Release|x64.ActiveCfg = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Release|x64.Build.0 = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Release|x86.ActiveCfg = Release|Any CPU
		{412718BB-903F-482F-8577-99B8EFCD96D2}.Release|x86.Build.0 = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Debug|ARM.ActiveCfg = Debug|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Debug|ARM.Build.0 = Debug|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Debug|x64.ActiveCfg = Debug|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Debug|x64.Build.0 = Debug|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Debug|x86.ActiveCfg = Debug|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Debug|x86.Build.0 = Debug|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.FastBuild_Release|Any CPU.ActiveCfg = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.FastBuild_Release|Any CPU.Build.0 = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.FastBuild_Release|ARM.ActiveCfg = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.FastBuild_Release|ARM.Build.0 = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.FastBuild_Release|x64.ActiveCfg = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.FastBuild_Release|x64.Build.0 = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.FastBuild_Release|x86.ActiveCfg = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.FastBuild_Release|x86.Build.0 = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Release|Any CPU.Build.0 = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Release|ARM.ActiveCfg = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Release|ARM.Build.0 = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Release|x64.ActiveCfg = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Release|x64.Build.0 = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Release|x86.ActiveCfg = Release|Any CPU
		{94270040-8853-4616-B14B-11196BDA8CC9}.Release|x86.Build.0 = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Debug|ARM.ActiveCfg = Debug|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Debug|ARM.Build.0 = Debug|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Debug|x64.ActiveCfg = Debug|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Debug|x64.Build.0 = Debug|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Debug|x86.ActiveCfg = Debug|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Debug|x86.Build.0 = Debug|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.FastBuild_Release|Any CPU.ActiveCfg = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.FastBuild_Release|Any CPU.Build.0 = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.FastBuild_Release|ARM.ActiveCfg = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.FastBuild_Release|ARM.Build.0 = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.FastBuild_Release|x64.ActiveCfg = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.FastBuild_Release|x64.Build.0 = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.FastBuild_Release|x86.ActiveCfg = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.FastBuild_Release|x86.Build.0 = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Release|Any CPU.Build.0 = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Release|ARM.ActiveCfg = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Release|ARM.Build.0 = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Release|x64.ActiveCfg = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Release|x64.Build.0 = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Release|x86.ActiveCfg = Release|Any CPU
		{47AF841A-4B78-490D-8915-7F58CDBDBEB3}.Release|x86.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		RESX_CodeReferences = {"Items":[{"Expression":"\\W($File.$Key)\\W","Extensions":".cs,.cshtml","IsCaseSensitive":true,"SingleLineComment":"\/\/"},{"Expression":"GetString\\(\"($Key)\"\\)","Extensions":".cs","IsCaseSensitive":true,"SingleLineComment":"\/\/"},{"Expression":"typeof\\((\\w+\\.)*($File)\\).+\"($Key)\"|\"($Key)\".+typeof\\((\\w+\\.)*($File)\\)","Extensions":".cs","IsCaseSensitive":true,"SingleLineComment":"\/\/"},{"Expression":"\\W($Key)\\W","Extensions":".vb","IsCaseSensitive":false,"SingleLineComment":"'"},{"Expression":"\\W($File::$Key)\\W","Extensions":".cpp,.c,.hxx,.h","IsCaseSensitive":true,"SingleLineComment":"\/\/"},{"Expression":"<%\\$\\s+Resources:\\s*($File)\\s*,\\s*($Key)\\s*%>","Extensions":".aspx,.ascx","IsCaseSensitive":true,"SingleLineComment":null},{"Expression":"StringResourceKey\\.($Key)","Extensions":".cs","IsCaseSensitive":true,"SingleLineComment":"\/\/"},{"Expression":"$Resource","Extensions":".xaml","IsCaseSensitive":true,"SingleLineComment":null}]}
		RESX_MoveToResources = {"Items":[{"Extensions":".cs,.vb","Patterns":"$Namespace.$File.$Key|$File.$Key|StringResourceKey.$Key|$Namespace.StringResourceKey.$Key"},{"Extensions":".cshtml,.vbhtml","Patterns":"@$Namespace.$File.$Key|@$File.$Key|@StringResourceKey.$Key|@$Namespace.StringResourceKey.$Key"},{"Extensions":".cpp,.c,.hxx,.h","Patterns":"$File::$Key"},{"Extensions":".aspx,.ascx","Patterns":"<%$ Resources:$File,$Key %>"},{"Extensions":".xaml","Patterns":"x:Uid=\"$Key\""}]}
		SolutionGuid = {C2A3DB32-E571-4937-B0D9-E74756EE207D}
	EndGlobalSection
EndGlobal


# AUTOGENERATED FILE
FROM balenalib/nitrogen8mm-dwe-debian:bullseye-build

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        ca-certificates \
        curl \
        \
# .NET Core dependencies
        libc6 \
        libgcc1 \
        libgssapi-krb5-2 \
        libicu63 \
        libssl1.1 \
        libstdc++6 \
        zlib1g \
    && rm -rf /var/lib/apt/lists/*

# Configure web servers to bind to port 80 when present
ENV ASPNETCORE_URLS=http://+:80 \
    # Enable detection of running in a container
    DOTNET_RUNNING_IN_CONTAINER=true

# Install .NET Core SDK
ENV DOTNET_SDK_VERSION 3.1.301

RUN curl -SL --output dotnet.tar.gz "https://dotnetcli.blob.core.windows.net/dotnet/Sdk/$DOTNET_SDK_VERSION/dotnet-sdk-$DOTNET_SDK_VERSION-linux-arm64.tar.gz" \
    && dotnet_sha512='834dc5829730ea7abcf5adfca5557458d5de534597933dbdcec99abbd7eff00f3e1d0084b7f3572de80b4d333dee6d32cffa2d1ead022faad3957c95e5a920a0' \
    && echo "$dotnet_sha512 dotnet.tar.gz" | sha512sum -c - \
    && mkdir -p /usr/share/dotnet \
    && tar -zxf dotnet.tar.gz -C /usr/share/dotnet \
    && rm dotnet.tar.gz \
    && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

# Configure web servers to bind to port 80 when present
# Enable correct mode for dotnet watch (only mode supported in a container)
ENV DOTNET_USE_POLLING_FILE_WATCHER=true \
    # Skip extraction of XML docs - generally not useful within an image/container - helps performance
    NUGET_XMLDOC_MODE=skip

# Trigger first run experience by running arbitrary cmd to populate local package cache
RUN dotnet help

CMD ["echo","'No CMD command was set in Dockerfile! Details about CMD command could be found in Dockerfile Guide section in our Docs. Here's the link: https://balena.io/docs"]

 RUN curl -SLO "https://raw.githubusercontent.com/balena-io-library/base-images/8accad6af708fca7271c5c65f18a86782e19f877/scripts/assets/tests/test-stack@dotnet.sh" \
  && echo "Running test-stack@dotnet" \
  && chmod +x test-stack@dotnet.sh \
  && bash test-stack@dotnet.sh \
  && rm -rf test-stack@dotnet.sh

RUN [ ! -d /.balena/messages ] && mkdir -p /.balena/messages; echo 'Here are a few details about this Docker image (For more information please visit https://www.balena.io/docs/reference/base-images/base-images/): \nArchitecture: ARM v8 \nOS: Debian Bullseye \nVariant: build variant \nDefault variable(s): UDEV=off \nThe following software stack is preinstalled: \ndotnet 3.1-sdk \nExtra features: \n- Easy way to install packages with `install_packages <package-name>` command \n- Run anywhere with cross-build feature  (for ARM only) \n- Keep the container idling with `balena-idle` command \n- Show base image details with `balena-info` command' > /.balena/messages/image-info

RUN echo '#!/bin/sh.real\nbalena-info\nrm -f /bin/sh\ncp /bin/sh.real /bin/sh\n/bin/sh "$@"' > /bin/sh-shim \
	&& chmod +x /bin/sh-shim \
	&& cp /bin/sh /bin/sh.real \
	&& mv /bin/sh-shim /bin/sh


// 7.2.1 RequireObjectCoercible(argument)
module.exports = function (it) {
  if (it == undefined) throw TypeError("Can't call method on  " + it);
  return it;
};


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<TITLE>
Uses of Class org.jasypt.encryption.pbe.StandardPBEStringEncryptor (JASYPT: Java Simplified Encryption 1.5 API)
</TITLE>

<META NAME="date" CONTENT="2008-06-10">

<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">

      Overview
      Package
      Class
    Use
      Tree
      Deprecated
      Index
      Help

 PREV
 NEXT

  FRAMES
 NO FRAMES

  All Classes

Uses of Class
org.jasypt.encryption.pbe.StandardPBEStringEncryptor

No usage of org.jasypt.encryption.pbe.StandardPBEStringEncryptor

      Overview
      Package
      Class
    Use
      Tree
      Deprecated
      Index
      Help

 PREV
 NEXT

  FRAMES
 NO FRAMES

  All Classes

Copyright © 2008 The JASYPT team. All Rights Reserved.


Osmium is a fast and flexible C++ library for working with OpenStreetMap
data.

This is the API documentation that was automatically created from the
source code. For more information about the Osmium Library see
http://osmcode.org/libosmium .

Osmium is free software and available under the Boost Software License.
The source code is available at https://github.com/osmcode/libosmium .

Osmium is a header-only library. You do not need to compile and link it,
just include the headers you need.

Everything in namespaces called "detail" is for internal Osmium use only,
do not depend on it in your code. Do not include any include files in
directories named "detail" directly. Include files in directories called
"experimental" and everything in namespaces called "experimental" is
unsupported and may change at any time regardless of the status of the rest
of the library.


## $Id: Makefile.am,v 1.26 2011/04/04 09:42:34 aleidinger Exp $

AUTOMAKE_OPTIONS = foreign $(top_srcdir)/ansi2knr

DEFS = @DEFS@ @CONFIG_DEFS@

ECHO ?= echo

nasm_sources = \
	choose_table.nas \
	cpu_feat.nas \
	fft3dn.nas \
	fftsse.nas

if HAVE_NASM
noinst_LTLIBRARIES = liblameasmroutines.la
liblameasmroutines_la_SOURCES = $(nasm_sources)
am_liblameasmroutines_la_OBJECTS = \
	choose_table$U.lo \
	cpu_feat$U.lo \
	fft3dn$U.lo \
	fftsse$U.lo
endif

noinst_HEADERS = nasm.h

INCLUDES = @INCLUDES@ -I$(top_srcdir)/libmp3lame/@CPUTYPE@

SUFFIXES = .nas .lo

EXTRA_liblameasmroutines_la_SOURCES = $(nasm_sources)

CLEANFILES = \
	choose_table.o.lst \
	choose_table.lo.lst \
	cpu_feat.o.lst \
	cpu_feat.lo.lst \
	fft3dn.o.lst \
	fft3dn.lo.lst \
	fftsse.o.lst \
	fftsse.lo.lst

EXTRA_DIST = \
	fft.nas \
	fftfpu.nas \
	ffttbl.nas \
	scalar.nas

NASM = @NASM@
NASMFLAGS=@NASM_FORMAT@ -i $(top_srcdir)/libmp3lame/@CPUTYPE@/

.nas.o: $< nasm.h
	$(NASM) $(NASMFLAGS) $< -o $@ -l $@.lst

.nas.lo: $< nasm.h
	mkdir -p .libs
	$(ECHO) '# Generated by ltmain.sh - GNU libtool 1.5.22 (1.1220.2.365 2005/12/18 22:14:06)' >$@
	$(ECHO) "pic_object='.libs/$*.o'" >>$@
	$(ECHO) "non_pic_object='.libs/$*.o'" >>$@
	$(NASM) $(NASMFLAGS) $< -o .libs/$*.o -l $@.lst

COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \
	$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
	$(AM_LDFLAGS) $(LDFLAGS) -o $@

#$(OBJECTS): libtool
#libtool: $(LIBTOOL_DEPS)
#	$(SHELL) $(top_builddir)/config.status --recheck


# Listen to all sensors, printing an info line when they change state.
#  If the sensor has a "matching" block, print some block detail and speak
#  the most useful attributes audibly.
#  This is useful for validating occupancy and block setup and wiring
#
# Author: mstevetodd, copyright 2013
# based on SensorLog.py and BlockLister.py
# Part of the JMRI distribution

import java
import java.beans
import jmri

# Define routine to map status numbers to text
def stateName(state) :
    if (state == ACTIVE) :
        return "ACTIVE"
    if (state == INACTIVE) :
        return "INACTIVE"
    if (state == INCONSISTENT) :
        return "INCONSISTENT"
    if (state == UNKNOWN) :
        return "UNKNOWN"
    return "(invalid)"

# convert block state to english
def cvtBlockStateToText(state) :
    rep = ""
    if (state == jmri.Block.OCCUPIED) :
        rep = rep + "Occupied "
    if (state == jmri.Block.UNOCCUPIED) :
        rep = rep + "Unoccupied "
    return rep

# use external "nircmd" command to "speak" some text  (I prefer this voice to eSpeak)
def speak(msg) :
    #uncomment next line for speech (Jenkins doesn't like this command)
    #java.lang.Runtime.getRuntime().exec('C:\\Progra~2\\nircmd\\nircmd speak text "' + msg +'"')
    return

# Define the sensor listener:
# Print details on all sensor changes, and speak key blocks
# items if sensor is a block occupancy sensor
class SensorListener(java.beans.PropertyChangeListener):
  def propertyChange(self, event):
    if (event.propertyName == "KnownState") :
        sensor_num = event.source.systemName[2:]
        mesg = "Sensor "+event.source.systemName
        if (event.source.userName != None) :
            mesg += " ("+event.source.userName+")"
        mesg += " from "+stateName(event.oldValue)
        mesg += " to "+stateName(event.newValue)

        #look for block based on our naming convention, and speak some info if found
        block_name = "ILB" + sensor_num
        b = blocks.getByUserName(block_name)
        if (b != None) :
            block_length = str(round(b.getLengthIn())).rstrip('0').rstrip('.') + " inches "
            mesg += " for block " + block_name + ", " + block_length
            #only speak for occupied blocks (cuts down on noise level)
            if (b.getState() == jmri.Block.OCCUPIED) :
                spoken_mesg    = b.userName + " "
                #spoken_mesg += cvtBlockStateToText(b.getState()) + ", "
                spoken_mesg += block_length
                speak(spoken_mesg)
        print mesg
    return

listener = SensorListener()

# Define a Manager listener.  When invoked, a new
# item has been added, so go through the list of items removing the
# old listener and adding a new one (works for both already registered
# and new sensors)
class ManagerListener(java.beans.PropertyChangeListener):
  def propertyChange(self, event):
    list = event.source.getNamedBeanSet()
    for sensor in list :
        sensor.removePropertyChangeListener(listener)
        sensor.addPropertyChangeListener(listener)

# Attach the sensor manager listener
sensors.addPropertyChangeListener(ManagerListener())

# For the sensors that exist, attach a sensor listener
list = sensors.getNamedBeanSet()
for i in list :
    sensor.addPropertyChangeListener(listener)

speak("block occupancy announcer started")


//------------------------------------------------------------------------------
//  assignRegistry.cc
//------------------------------------------------------------------------------
#include "Pre.h"
#include "assignRegistry.h"
#include "Core/String/StringBuilder.h"

#if ORYOL_HAS_THREADS
#include <mutex>
static std::mutex lockMutex;
#define SCOPED_LOCK std::lock_guard<std::mutex> lock(lockMutex)
#else
#define SCOPED_LOCK
#endif

namespace Oryol {
namespace _priv {

//------------------------------------------------------------------------------
void
assignRegistry::SetAssign(const String& assign, const String& path) {
    SCOPED_LOCK;
    o_assert_dbg(assign.Back() == ':'); // "assign must end with a ':'\n"
    o_assert_dbg(assign.Length() > 1);  // assigns must be at least 2 chars to not be confused with DOS drive letters
    o_assert_dbg(!path.Empty());
    o_assert_dbg((path.Back() == '/') || (path.Back() == ':')); // path must end in a '/' (dir) or ':' (other assign)
    if (this->assigns.Contains(assign)) {
        this->assigns[assign] = path;
    }
    else {
        this->assigns.Add(assign, path);
    }
}

//------------------------------------------------------------------------------
bool
assignRegistry::HasAssign(const String& assign) const {
    SCOPED_LOCK;
    o_assert_dbg(!assign.Empty());
    bool result = this->assigns.Contains(assign);
    return result;
}

//------------------------------------------------------------------------------
String
assignRegistry::LookupAssign(const String& assign) const {
    SCOPED_LOCK;
    o_assert_dbg(!assign.Empty());
    o_assert_dbg(assign.Back() == ':');
    String result;
    if (this->assigns.Contains(assign)) {
        result = this->assigns[assign];
    }
    return result;
}

//------------------------------------------------------------------------------
String
assignRegistry::ResolveAssigns(const String& str) const {
    SCOPED_LOCK;
    StringBuilder builder;
    builder.Set(str);

    // while there are assigns to replace...
    int index;
    while ((index = builder.FindFirstOf(0, EndOfString, ":")) != EndOfString) {
        // ignore DOS drive letters
        if (index > 1) {
            String assignString = builder.GetSubString(0, index + 1);

            // lookup the assign, ignore unknown assigns, may be URL schemes
            if (this->assigns.Contains(assignString)) {

                // replace assign string
                builder.SubstituteFirst(assignString, this->assigns[assignString]);
            }
            else break;
        }
        else break;
    }
    String result = builder.GetString();
    return result;
}

} // namespace _priv
} // namespace Oryol


> * 原文地址：[Design principle: Aesthetics](https://uxdesign.cc/design-principle-aesthetics-af926f8f86fe)
> * 原文作者：[Anton Nikolov](https://uxdesign.cc/@antonnikolov)
> * 译文出自：[掘金翻译计划](https://github.com/xitu/gold-miner)
> * 译者：
> * 校对者：

# Design principle: Aesthetics #

## The power of beauty in design ##

![](https://cdn-images-1.medium.com/max/1000/1*MswMrIcOLRg9mgkb9w1WOA.jpeg)

Today’s article is about understanding what is aesthetic design and its importance for the perception of usability. Humans like pretty and shiny design; they desire it much more than functional one.

We enjoy looking and using aesthetically pleasing design, because it satisfies our senses, it gives us pleasure.

Designers tend to think of aesthetics as the visuals of the design. However, aesthetic design consists of more elements than just how it looks.

### What is aesthetic design? ###

There is a whole branch of philosophy exploring aesthetics. Let’s scratch the surface of the Aesthetics field and learn how it relates to our design work.

There is a phenomenon that social psychologists call “*the halo effect*”. It means humans tend to assume that good-looking people have other positive qualities aside from their looks.

The same is valid for product design. **Good looking products and user interface are perceived as more valuable and having more qualities.**

“Beauty is in the eye of the beholder”. **Aesthetics are in all our senses, not just the sight**. Aesthetic design is a 4D experience. Product designers, who are doing actual physical products are aware of that.

With the emergence of VR and AR technologies it becomes more important for digital designers to consider the 4D experience too.

![](https://cdn-images-1.medium.com/max/800/1*-MOG4SeSZzD5YexmZlPQ2g.gif)

There are 4 important categories, which can make or break the aesthetics of our designs.

#### Vision: ####

The most dominant sense in majority of people is our sight. We can’t stop ourselves to look at what we find beautiful. It is as if the light that reflects from the beautiful design acts as a magnet for our eyes.

***Visual aesthetics have these key elements:*** *Color, Shape, Pattern, Line, Texture, Visual weight, Balance, Scale, Proximity and Movement*. Using these element well will help us achieve good visual aesthetics.

#### Hearing: ####

Our ears are capable of perceiving a whole another level of aesthetic design. The ability to hear how your car engine works, how the digital product notifies you of new messages and etc. This is the power of sound aesthetics.

***Sound aesthetics have these key elements:*** *Loudness, Pitch, Beat, Repetition, Melody, Pattern and Noise*. Using them well will create enjoyable “music” for our users.

#### Touch: ####

Skin is the largest organ in human body. It also helps us experience the aesthetics. **Material aesthetics are especially important for physical products.**

![](https://cdn-images-1.medium.com/max/800/1*Z-WitCNfF55vRKASqN0oFw.gif)

Just remember, the last time you were buying cloths and feeling their texture or when you were checking out the latest mobile phone and feeling the frame material. Sometimes people make there buying decisions only based on the material aesthetics. Powerful stuff are these material aesthetics.

***Material aesthetics key elements are:*** *Texture, Shape, Weight, Comfort, Temperature, Vibration and Sharpness*. By mastering them we can make our customers adore our products.

#### Taste and Smell: ####

Taste and Smell are sense that help us experience aesthetics even more deeply. Especially in food industry and different environment designs, these senses play an important role in experiencing aesthetics.

***Key elements are:*** *Strength, Sweetness, Sourness and Texture (for taste)*. Use these elements when possible to enhance the full picture, so our users can feel the aesthetics even deeper.

Now that we know a bit more about aesthetic design, let’s look at why it matters.

### Why aesthetic design matters? ###

Not long ago user were expecting only functional and usable products when they were buying. Today, users expectations have evolved together with the design field.

People expect usability by default and are seeking products that are more than functional and usable. We want to experience pleasure, to stimulate our senses. We want the products we use to evoke positive emotion in us. Aesthetic design is crucial to satisfy these needs.

We all judge the book by its cover. The better the book cover the more we believe the content is better. This is phenomenon called “*Aesthetic-usability*”. **Beautiful products/objects are perceived as easier to use and more valuable than ugly ones**. Even if it is not true!

![](https://cdn-images-1.medium.com/max/800/1*em7ea44XLR21VpdJ40XHIQ.gif)

This phenomenon is especially valid when the products compared are equal in functionality and ease of use. The better looking product will win over the users swiftly.

Aesthetically pleasing designs are bringing up positive attitude in the users. It makes them care more about the product. Aesthetic design makes people more loyal of the brand and tolerant toward mistakes or failures. Imagine all the apple fans.

Early impressions of a product design matter! Aesthetic design is influencing how people think and feel. It influences how much pleasure we feel from the product. Aesthetic design affects our long-term attitude about products and even people.

Aesthetic design matters not only to make the first impression, but also to keep strengthening the bond with the user. The design of our products needs to be aesthetically pleasing consistently across the whole product and user journey.

### Design for aesthetic pleasure ###

Let’s see how the words above can be useful for us to make better design. We have to design products that deliver pleasure to the user with aesthetics and usability.

But when aesthetics are in the senses of our users, how do we know what to design? The answer can be given by the people we’re designing the product/experience for. We need to understand them before deciding what is aesthetically pleasing.

When we are designing products for really wide audience it is wiser to [keep things simple](https://uxplanet.org/design-principles-kiss-the-feature-creep-7eb84b09603f) as much as possible!

There are 4 important pleasure aspect that we need to consider when we want to make our designs aesthetically pleasing.

#### Psychical pleasure ####

Pleasure derived mostly from touch, smell and taste. Think of designing hand-held product, computer devices, VR set even a normal pen.

We need to make sure the design is ergonomic, it feels comfortable and doesn’t overload the user senses. Consider how sensitive are your user’s senses, what is the average norm. Make sure the smell and taste is either neutral or brings positive associations.

#### Social pleasure ####

Pleasure derived from interacting with other people or with AI(still not that common). This context is very broad it can be from home assistant device and VR experiences to a room/building where social events will be hosted.

![](https://cdn-images-1.medium.com/max/800/1*vZ35eZZ-bVzN-wnQ1tR3zw.gif)

We need to make sure the design supports social interaction in the best way possible. It could be as simple as the sound aesthetics of the coffee machine that allows employees to communicate, while waiting for the coffee to be ready.

#### Psychological pleasure ####

Pleasure derived from completing a task or feeling in control and safe. This context is very tightly related to the usability of the product. But it can be also related to how the product design looks.

For example, a solid and stable looking car gives more psychological comfort than one that seems it might break if you open the door. Same is valid for digital products where the user feels in control and knows the task can be completed for sure.

Making things look and feel simple and stable. Guiding the user with great composition and motion. Using aesthetics plays a big role in making the users feel safe and in control.

#### Ideological pleasure ####

This context is mostly about abstract pleasure. I like to think of it as the glue that binds the other pleasure types. It is the meaning of the words in the books not the colors, font sizes and page layouts.

For example, in product design taking the sustainability angle can trigger pleasure in the user, making her feel well because she is responsible for the environment. Here are a [5 startups that are using that context](https://medium.com/age-of-awareness/my-top-five-favorite-sustainable-companies-5922246eab45).

We need to make sure that our designs communicate ideas and deeper meaning. This can frequently result in very deep aesthetically pleasure once the user realizes it.

### Balancing aesthetics and usability ###

There are cases where we need to sacrifice aesthetics, due to different limitations depending on the context. Other times aesthetics could dominate the usability aspect.

#### Aesthetics and usability in balance ####

This is what most of the cases as Designers we should strive to achieve in our designs. There are many good examples from smart phones and apps to computer chairs that look and feel good, but also have the desired usability.

#### Aesthetics over usability ####

Some times products have dominating aesthetics that are not supported by good usability and ergonomics. This is mostly visible in the fashion industry.

![](https://cdn-images-1.medium.com/max/800/1*naljt3BpP4cF1XydNAFkEw.gif)

I guess these might be nice in winter time :)

Shoes made to look nice and attractive, while at the same time destroying the feet of the user. This demonstrates clearly how humans can be seduced by aesthetic design and even at the price of their health.

#### Usability over aesthetics ####

Other times usability must be on focus no matter what. Equipment designed for emergency situations, where people cognition is compromised. In this cases aesthetics are with low priority. When designing for such cases there are a lot of constraints from different authorities and requirements. Using [Hick’s law for quick decision making](https://uxplanet.org/design-principles-hicks-law-quick-decision-making-3dcc1b1a0632) can help you make the better design decisions.

### Final thoughts ###

First impression matters. When we perceive beauty with more of our senses we feel deeper pleasure from the design. Aesthetic design gives users pleasure from the start! It makes them form a bond with the design, bond that goes beyond the initial interaction.

Aesthetic design is perceived as more friendly, usable and valuable.

#### Call to action ####

*If you found this article useful* ***tap the***💚 *so others can enjoy it, too.*

*Thanks for your time! Follow me on [*Twitter*](https://twitter.com/ainikolov)  and [*LinkedIn*](https://www.linkedin.com/in/antonnikolov/) .*

---

> [掘金翻译计划](https://github.com/xitu/gold-miner) 是一个翻译优质互联网技术文章的社区，文章来源为 [掘金](https://juejin.im) 上的英文分享文章。内容覆盖 [Android](https://github.com/xitu/gold-miner#android)、[iOS](https://github.com/xitu/gold-miner#ios)、[React](https://github.com/xitu/gold-miner#react)、[前端](https://github.com/xitu/gold-miner#前端)、[后端](https://github.com/xitu/gold-miner#后端)、[产品](https://github.com/xitu/gold-miner#产品)、[设计](https://github.com/xitu/gold-miner#设计) 等领域，想要查看更多优质译文请持续关注 [掘金翻译计划](https://github.com/xitu/gold-miner)。


/*
 * High-level sync()-related operations
 */

#include <linux/kernel.h>
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/export.h>
#include <linux/namei.h>
#include <linux/sched.h>
#include <linux/writeback.h>
#include <linux/syscalls.h>
#include <linux/linkage.h>
#include <linux/pagemap.h>
#include <linux/quotaops.h>
#include <linux/backing-dev.h>
#include "internal.h"

#define VALID_FLAGS (SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE| \
			SYNC_FILE_RANGE_WAIT_AFTER)

/*
 * Do the filesystem syncing work. For simple filesystems
 * writeback_inodes_sb(sb) just dirties buffers with inodes so we have to
 * submit IO for these buffers via __sync_blockdev(). This also speeds up the
 * wait == 1 case since in that case write_inode() functions do
 * sync_dirty_buffer() and thus effectively write one block at a time.
 */
static int __sync_filesystem(struct super_block *sb, int wait)
{
	if (wait)
		sync_inodes_sb(sb);
	else
		writeback_inodes_sb(sb, WB_REASON_SYNC);

	if (sb->s_op->sync_fs)
		sb->s_op->sync_fs(sb, wait);
	return __sync_blockdev(sb->s_bdev, wait);
}

/*
 * Write out and wait upon all dirty data associated with this
 * superblock.  Filesystem data as well as the underlying block
 * device.  Takes the superblock lock.
 */
int sync_filesystem(struct super_block *sb)
{
	int ret;

	/*
	 * We need to be protected against the filesystem going from
	 * r/o to r/w or vice versa.
	 */
	WARN_ON(!rwsem_is_locked(&sb->s_umount));

	/*
	 * No point in syncing out anything if the filesystem is read-only.
	 */
	if (sb->s_flags & MS_RDONLY)
		return 0;

	ret = __sync_filesystem(sb, 0);
	if (ret < 0)
		return ret;
	return __sync_filesystem(sb, 1);
}
EXPORT_SYMBOL(sync_filesystem);

static void sync_inodes_one_sb(struct super_block *sb, void *arg)
{
	if (!(sb->s_flags & MS_RDONLY))
		sync_inodes_sb(sb);
}

static void sync_fs_one_sb(struct super_block *sb, void *arg)
{
	if (!(sb->s_flags & MS_RDONLY) && sb->s_op->sync_fs)
		sb->s_op->sync_fs(sb, *(int *)arg);
}

static void fdatawrite_one_bdev(struct block_device *bdev, void *arg)
{
	filemap_fdatawrite(bdev->bd_inode->i_mapping);
}

static void fdatawait_one_bdev(struct block_device *bdev, void *arg)
{
	/*
	 * We keep the error status of individual mapping so that
	 * applications can catch the writeback error using fsync(2).
	 * See filemap_fdatawait_keep_errors() for details.
	 */
	filemap_fdatawait_keep_errors(bdev->bd_inode->i_mapping);
}

/*
 * Sync everything. We start by waking flusher threads so that most of
 * writeback runs on all devices in parallel. Then we sync all inodes reliably
 * which effectively also waits for all flusher threads to finish doing
 * writeback. At this point all data is on disk so metadata should be stable
 * and we tell filesystems to sync their metadata via ->sync_fs() calls.
 * Finally, we writeout all block devices because some filesystems (e.g. ext2)
 * just write metadata (such as inodes or bitmaps) to block device page cache
 * and do not sync it on their own in ->sync_fs().
 */
SYSCALL_DEFINE0(sync)
{
	int nowait = 0, wait = 1;

	wakeup_flusher_threads(0, WB_REASON_SYNC);
	iterate_supers(sync_inodes_one_sb, NULL);
	iterate_supers(sync_fs_one_sb, &nowait);
	iterate_supers(sync_fs_one_sb, &wait);
	iterate_bdevs(fdatawrite_one_bdev, NULL);
	iterate_bdevs(fdatawait_one_bdev, NULL);
	if (unlikely(laptop_mode))
		laptop_sync_completion();
	return 0;
}

static void do_sync_work(struct work_struct *work)
{
	int nowait = 0;

	/*
	 * Sync twice to reduce the possibility we skipped some inodes / pages
	 * because they were temporarily locked
	 */
	iterate_supers(sync_inodes_one_sb, &nowait);
	iterate_supers(sync_fs_one_sb, &nowait);
	iterate_bdevs(fdatawrite_one_bdev, NULL);
	iterate_supers(sync_inodes_one_sb, &nowait);
	iterate_supers(sync_fs_one_sb, &nowait);
	iterate_bdevs(fdatawrite_one_bdev, NULL);
	printk("Emergency Sync complete\n");
	kfree(work);
}

void emergency_sync(void)
{
	struct work_struct *work;

	work = kmalloc(sizeof(*work), GFP_ATOMIC);
	if (work) {
		INIT_WORK(work, do_sync_work);
		schedule_work(work);
	}
}

/*
 * sync a single super
 */
SYSCALL_DEFINE1(syncfs, int, fd)
{
	struct fd f = fdget(fd);
	struct super_block *sb;
	int ret;

	if (!f.file)
		return -EBADF;
	sb = f.file->f_path.dentry->d_sb;

	down_read(&sb->s_umount);
	ret = sync_filesystem(sb);
	up_read(&sb->s_umount);

	fdput(f);
	return ret;
}

/**
 * vfs_fsync_range - helper to sync a range of data & metadata to disk
 * @file:		file to sync
 * @start:		offset in bytes of the beginning of data range to sync
 * @end:		offset in bytes of the end of data range (inclusive)
 * @datasync:		perform only datasync
 *
 * Write back data in range @start..@end and metadata for @file to disk.  If
 * @datasync is set only metadata needed to access modified file data is
 * written.
 */
int vfs_fsync_range(struct file *file, loff_t start, loff_t end, int datasync)
{
	struct inode *inode = file->f_mapping->host;

	if (!file->f_op->fsync)
		return -EINVAL;
	if (!datasync && (inode->i_state & I_DIRTY_TIME)) {
		spin_lock(&inode->i_lock);
		inode->i_state &= ~I_DIRTY_TIME;
		spin_unlock(&inode->i_lock);
		mark_inode_dirty_sync(inode);
	}
	return file->f_op->fsync(file, start, end, datasync);
}
EXPORT_SYMBOL(vfs_fsync_range);

/**
 * vfs_fsync - perform a fsync or fdatasync on a file
 * @file:		file to sync
 * @datasync:		only perform a fdatasync operation
 *
 * Write back data and metadata for @file to disk.  If @datasync is
 * set only metadata needed to access modified file data is written.
 */
int vfs_fsync(struct file *file, int datasync)
{
	return vfs_fsync_range(file, 0, LLONG_MAX, datasync);
}
EXPORT_SYMBOL(vfs_fsync);

static int do_fsync(unsigned int fd, int datasync)
{
	struct fd f = fdget(fd);
	int ret = -EBADF;

	if (f.file) {
		ret = vfs_fsync(f.file, datasync);
		fdput(f);
	}
	return ret;
}

SYSCALL_DEFINE1(fsync, unsigned int, fd)
{
	return do_fsync(fd, 0);
}

SYSCALL_DEFINE1(fdatasync, unsigned int, fd)
{
	return do_fsync(fd, 1);
}

/*
 * sys_sync_file_range() permits finely controlled syncing over a segment of
 * a file in the range offset .. (offset+nbytes-1) inclusive.  If nbytes is
 * zero then sys_sync_file_range() will operate from offset out to EOF.
 *
 * The flag bits are:
 *
 * SYNC_FILE_RANGE_WAIT_BEFORE: wait upon writeout of all pages in the range
 * before performing the write.
 *
 * SYNC_FILE_RANGE_WRITE: initiate writeout of all those dirty pages in the
 * range which are not presently under writeback. Note that this may block for
 * significant periods due to exhaustion of disk request structures.
 *
 * SYNC_FILE_RANGE_WAIT_AFTER: wait upon writeout of all pages in the range
 * after performing the write.
 *
 * Useful combinations of the flag bits are:
 *
 * SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE: ensures that all pages
 * in the range which were dirty on entry to sys_sync_file_range() are placed
 * under writeout.  This is a start-write-for-data-integrity operation.
 *
 * SYNC_FILE_RANGE_WRITE: start writeout of all dirty pages in the range which
 * are not presently under writeout.  This is an asynchronous flush-to-disk
 * operation.  Not suitable for data integrity operations.
 *
 * SYNC_FILE_RANGE_WAIT_BEFORE (or SYNC_FILE_RANGE_WAIT_AFTER): wait for
 * completion of writeout of all pages in the range.  This will be used after an
 * earlier SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE operation to wait
 * for that operation to complete and to return the result.
 *
 * SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE|SYNC_FILE_RANGE_WAIT_AFTER:
 * a traditional sync() operation.  This is a write-for-data-integrity operation
 * which will ensure that all pages in the range which were dirty on entry to
 * sys_sync_file_range() are committed to disk.
 *
 *
 * SYNC_FILE_RANGE_WAIT_BEFORE and SYNC_FILE_RANGE_WAIT_AFTER will detect any
 * I/O errors or ENOSPC conditions and will return those to the caller, after
 * clearing the EIO and ENOSPC flags in the address_space.
 *
 * It should be noted that none of these operations write out the file's
 * metadata.  So unless the application is strictly performing overwrites of
 * already-instantiated disk blocks, there are no guarantees here that the data
 * will be available after a crash.
 */
SYSCALL_DEFINE4(sync_file_range, int, fd, loff_t, offset, loff_t, nbytes,
				unsigned int, flags)
{
	int ret;
	struct fd f;
	struct address_space *mapping;
	loff_t endbyte;			/* inclusive */
	umode_t i_mode;

	ret = -EINVAL;
	if (flags & ~VALID_FLAGS)
		goto out;

	endbyte = offset + nbytes;

	if ((s64)offset < 0)
		goto out;
	if ((s64)endbyte < 0)
		goto out;
	if (endbyte < offset)
		goto out;

	if (sizeof(pgoff_t) == 4) {
		if (offset >= (0x100000000ULL << PAGE_SHIFT)) {
			/*
			 * The range starts outside a 32 bit machine's
			 * pagecache addressing capabilities.  Let it "succeed"
			 */
			ret = 0;
			goto out;
		}
		if (endbyte >= (0x100000000ULL << PAGE_SHIFT)) {
			/*
			 * Out to EOF
			 */
			nbytes = 0;
		}
	}

	if (nbytes == 0)
		endbyte = LLONG_MAX;
	else
		endbyte--;		/* inclusive */

	ret = -EBADF;
	f = fdget(fd);
	if (!f.file)
		goto out;

	i_mode = file_inode(f.file)->i_mode;
	ret = -ESPIPE;
	if (!S_ISREG(i_mode) && !S_ISBLK(i_mode) && !S_ISDIR(i_mode) &&
			!S_ISLNK(i_mode))
		goto out_put;

	mapping = f.file->f_mapping;
	if (!mapping) {
		ret = -EINVAL;
		goto out_put;
	}

	ret = 0;
	if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) {
		ret = filemap_fdatawait_range(mapping, offset, endbyte);
		if (ret < 0)
			goto out_put;
	}

	if (flags & SYNC_FILE_RANGE_WRITE) {
		ret = __filemap_fdatawrite_range(mapping, offset, endbyte,
						 WB_SYNC_NONE);
		if (ret < 0)
			goto out_put;
	}

	if (flags & SYNC_FILE_RANGE_WAIT_AFTER)
		ret = filemap_fdatawait_range(mapping, offset, endbyte);

out_put:
	fdput(f);
out:
	return ret;
}

/* It would be nice if people remember that not all the world's an i386
   when they introduce new system calls */
SYSCALL_DEFINE4(sync_file_range2, int, fd, unsigned int, flags,
				 loff_t, offset, loff_t, nbytes)
{
	return sys_sync_file_range(fd, offset, nbytes, flags);
}


#![allow(
    dead_code,
    non_snake_case,
    non_camel_case_types,
    non_upper_case_globals
)]

#[repr(C)]
#[derive(Default)]
pub struct __IncompleteArrayField<T>(::std::marker::PhantomData<T>, [T; 0]);
impl<T> __IncompleteArrayField<T> {
    #[inline]
    pub const fn new() -> Self {
        __IncompleteArrayField(::std::marker::PhantomData, [])
    }
    #[inline]
    pub fn as_ptr(&self) -> *const T {
        self as *const _ as *const T
    }
    #[inline]
    pub fn as_mut_ptr(&mut self) -> *mut T {
        self as *mut _ as *mut T
    }
    #[inline]
    pub unsafe fn as_slice(&self, len: usize) -> &[T] {
        ::std::slice::from_raw_parts(self.as_ptr(), len)
    }
    #[inline]
    pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] {
        ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len)
    }
}
impl<T> ::std::fmt::Debug for __IncompleteArrayField<T> {
    fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        fmt.write_str("__IncompleteArrayField")
    }
}
/// Bizarrely enough, this should *not* get an `_address` field.
#[repr(C)]
#[derive(Debug, Default)]
pub struct ZeroSizedArray {
    pub arr: __IncompleteArrayField<::std::os::raw::c_char>,
}
#[test]
fn bindgen_test_layout_ZeroSizedArray() {
    assert_eq!(
        ::std::mem::size_of::<ZeroSizedArray>(),
        0usize,
        concat!("Size of: ", stringify!(ZeroSizedArray))
    );
    assert_eq!(
        ::std::mem::align_of::<ZeroSizedArray>(),
        1usize,
        concat!("Alignment of ", stringify!(ZeroSizedArray))
    );
    assert_eq!(
        unsafe {
            &(*(::std::ptr::null::<ZeroSizedArray>())).arr as *const _ as usize
        },
        0usize,
        concat!(
            "Offset of field: ",
            stringify!(ZeroSizedArray),
            "::",
            stringify!(arr)
        )
    );
}
/// And nor should this get an `_address` field.
#[repr(C)]
#[derive(Debug, Default)]
pub struct ContainsZeroSizedArray {
    pub zsa: ZeroSizedArray,
}
#[test]
fn bindgen_test_layout_ContainsZeroSizedArray() {
    assert_eq!(
        ::std::mem::size_of::<ContainsZeroSizedArray>(),
        0usize,
        concat!("Size of: ", stringify!(ContainsZeroSizedArray))
    );
    assert_eq!(
        ::std::mem::align_of::<ContainsZeroSizedArray>(),
        1usize,
        concat!("Alignment of ", stringify!(ContainsZeroSizedArray))
    );
    assert_eq!(
        unsafe {
            &(*(::std::ptr::null::<ContainsZeroSizedArray>())).zsa as *const _
                as usize
        },
        0usize,
        concat!(
            "Offset of field: ",
            stringify!(ContainsZeroSizedArray),
            "::",
            stringify!(zsa)
        )
    );
}
/// Inheriting from ZeroSizedArray shouldn't cause an `_address` to be inserted
/// either.
#[repr(C)]
#[derive(Debug, Default)]
pub struct InheritsZeroSizedArray {
    pub _base: ZeroSizedArray,
}
#[test]
fn bindgen_test_layout_InheritsZeroSizedArray() {
    assert_eq!(
        ::std::mem::size_of::<InheritsZeroSizedArray>(),
        0usize,
        concat!("Size of: ", stringify!(InheritsZeroSizedArray))
    );
    assert_eq!(
        ::std::mem::align_of::<InheritsZeroSizedArray>(),
        1usize,
        concat!("Alignment of ", stringify!(InheritsZeroSizedArray))
    );
}
/// And this should not get an `_address` field either.
#[repr(C)]
#[derive(Debug, Default)]
pub struct DynamicallySizedArray {
    pub arr: __IncompleteArrayField<::std::os::raw::c_char>,
}
#[test]
fn bindgen_test_layout_DynamicallySizedArray() {
    assert_eq!(
        ::std::mem::size_of::<DynamicallySizedArray>(),
        0usize,
        concat!("Size of: ", stringify!(DynamicallySizedArray))
    );
    assert_eq!(
        ::std::mem::align_of::<DynamicallySizedArray>(),
        1usize,
        concat!("Alignment of ", stringify!(DynamicallySizedArray))
    );
    assert_eq!(
        unsafe {
            &(*(::std::ptr::null::<DynamicallySizedArray>())).arr as *const _
                as usize
        },
        0usize,
        concat!(
            "Offset of field: ",
            stringify!(DynamicallySizedArray),
            "::",
            stringify!(arr)
        )
    );
}
/// No `_address` field here either.
#[repr(C)]
#[derive(Debug, Default)]
pub struct ContainsDynamicallySizedArray {
    pub dsa: DynamicallySizedArray,
}
#[test]
fn bindgen_test_layout_ContainsDynamicallySizedArray() {
    assert_eq!(
        ::std::mem::size_of::<ContainsDynamicallySizedArray>(),
        0usize,
        concat!("Size of: ", stringify!(ContainsDynamicallySizedArray))
    );
    assert_eq!(
        ::std::mem::align_of::<ContainsDynamicallySizedArray>(),
        1usize,
        concat!("Alignment of ", stringify!(ContainsDynamicallySizedArray))
    );
    assert_eq!(
        unsafe {
            &(*(::std::ptr::null::<ContainsDynamicallySizedArray>())).dsa
                as *const _ as usize
        },
        0usize,
        concat!(
            "Offset of field: ",
            stringify!(ContainsDynamicallySizedArray),
            "::",
            stringify!(dsa)
        )
    );
}


using System;
using System.Drawing;

namespace PKHeX.Drawing
{
    public static class QRImageUtil
    {
        public static Bitmap GetQRImage(Image qr, Image preview)
        {
            // create a small area with the pkm sprite, with a white background
            var foreground = new Bitmap(preview.Width + 4, preview.Height + 4);
            using (Graphics gfx = Graphics.FromImage(foreground))
            {
                gfx.FillRectangle(new SolidBrush(Color.White), 0, 0, foreground.Width, foreground.Height);
                int x = (foreground.Width / 2) - (preview.Width / 2);
                int y = (foreground.Height / 2) - (preview.Height / 2);
                gfx.DrawImage(preview, x, y);
            }

            // Layer on Preview Image
            {
                int x = (qr.Width / 2) - (foreground.Width / 2);
                int y = (qr.Height / 2) - (foreground.Height / 2);
                return ImageUtil.LayerImage(qr, foreground, x, y);
            }
        }

        public static Bitmap GetQRImageExtended(Font font, Image qr, Image pkm, int width, int height, string[] lines, string extraText)
        {
            var pic = GetQRImage(qr, pkm);
            return ExtendImage(font, qr, width, height, pic, lines, extraText);
        }

        private static Bitmap ExtendImage(Font font, Image qr, int width, int height, Image pic, string[] lines, string extraText)
        {
            var newpic = new Bitmap(width, height);
            using Graphics g = Graphics.FromImage(newpic);
            g.FillRectangle(new SolidBrush(Color.White), 0, 0, newpic.Width, newpic.Height);
            g.DrawImage(pic, 0, 0);

            g.DrawString(GetLine(lines, 0), font, Brushes.Black, new PointF(18, qr.Height - 5));
            g.DrawString(GetLine(lines, 1), font, Brushes.Black, new PointF(18, qr.Height + 8));
            g.DrawString(GetLine(lines, 2).Replace(Environment.NewLine, "/").Replace("//", "   ").Replace(":/", ": "), font,
                Brushes.Black, new PointF(18, qr.Height + 20));
            g.DrawString(GetLine(lines, 3) + extraText, font, Brushes.Black, new PointF(18, qr.Height + 32));
            return newpic;
        }

        private static string GetLine(string[] lines, int line) => lines.Length <= line ? string.Empty : lines[line];
    }
}


<?xml version="1.0" encoding="UTF-8"?>
<character>
  <utf8>o</utf8>
  <strokes>
    <stroke>
      <point x="462" y="443" timestamp="0" />
      <point x="443" y="450" timestamp="6" />
      <point x="436" y="450" timestamp="14" />
      <point x="417" y="463" timestamp="22" />
      <point x="411" y="466" timestamp="30" />
      <point x="398" y="480" timestamp="38" />
      <point x="378" y="493" timestamp="46" />
      <point x="375" y="500" timestamp="54" />
      <point x="362" y="513" timestamp="62" />
      <point x="359" y="520" timestamp="70" />
      <point x="352" y="540" timestamp="78" />
      <point x="352" y="543" timestamp="86" />
      <point x="346" y="563" timestamp="94" />
      <point x="346" y="573" timestamp="102" />
      <point x="346" y="576" timestamp="110" />
      <point x="346" y="583" timestamp="118" />
      <point x="346" y="586" timestamp="126" />
      <point x="349" y="593" timestamp="134" />
      <point x="349" y="596" timestamp="142" />
      <point x="355" y="616" timestamp="150" />
      <point x="359" y="620" timestamp="158" />
      <point x="365" y="640" timestamp="166" />
      <point x="378" y="660" timestamp="174" />
      <point x="381" y="663" timestamp="182" />
      <point x="394" y="676" timestamp="190" />
      <point x="398" y="680" timestamp="198" />
      <point x="417" y="693" timestamp="206" />
      <point x="423" y="693" timestamp="214" />
      <point x="443" y="706" timestamp="222" />
      <point x="446" y="710" timestamp="230" />
      <point x="472" y="716" timestamp="238" />
      <point x="498" y="723" timestamp="246" />
      <point x="504" y="726" timestamp="254" />
      <point x="530" y="726" timestamp="262" />
      <point x="533" y="726" timestamp="270" />
      <point x="559" y="733" timestamp="278" />
      <point x="566" y="733" timestamp="286" />
      <point x="576" y="733" timestamp="294" />
      <point x="608" y="726" timestamp="302" />
      <point x="614" y="723" timestamp="310" />
      <point x="640" y="723" timestamp="318" />
      <point x="647" y="720" timestamp="326" />
      <point x="673" y="713" timestamp="334" />
      <point x="676" y="713" timestamp="342" />
      <point x="689" y="700" timestamp="350" />
      <point x="692" y="700" timestamp="358" />
      <point x="695" y="693" timestamp="366" />
      <point x="702" y="673" timestamp="374" />
      <point x="702" y="666" timestamp="382" />
      <point x="702" y="656" timestamp="390" />
      <point x="702" y="650" timestamp="398" />
      <point x="695" y="630" timestamp="406" />
      <point x="692" y="626" timestamp="414" />
      <point x="686" y="606" timestamp="422" />
      <point x="679" y="580" timestamp="430" />
      <point x="676" y="576" timestamp="438" />
      <point x="669" y="556" timestamp="446" />
      <point x="666" y="553" timestamp="454" />
      <point x="647" y="533" timestamp="462" />
      <point x="644" y="530" timestamp="470" />
      <point x="631" y="510" timestamp="478" />
      <point x="624" y="506" timestamp="486" />
      <point x="605" y="486" timestamp="494" />
      <point x="585" y="473" timestamp="502" />
      <point x="582" y="470" timestamp="510" />
      <point x="563" y="456" timestamp="518" />
      <point x="559" y="456" timestamp="526" />
      <point x="540" y="443" timestamp="534" />
      <point x="537" y="440" timestamp="542" />
      <point x="530" y="440" timestamp="550" />
      <point x="524" y="440" timestamp="558" />
      <point x="517" y="436" timestamp="566" />
      <point x="511" y="436" timestamp="574" />
      <point x="508" y="436" timestamp="582" />
      <point x="498" y="436" timestamp="590" />
      <point x="495" y="436" timestamp="598" />
      <point x="488" y="436" timestamp="606" />
      <point x="482" y="436" timestamp="614" />
      <point x="475" y="436" timestamp="622" />
      <point x="472" y="440" timestamp="630" />
      <point x="469" y="440" timestamp="638" />
      <point x="462" y="440" timestamp="646" />
      <point x="459" y="440" timestamp="654" />
      <point x="449" y="440" timestamp="662" />
      <point x="449" y="443" timestamp="670" />
      <point x="430" y="450" timestamp="678" />
      <point x="427" y="453" timestamp="686" />
      <point x="423" y="460" timestamp="694" />
      <point x="420" y="463" timestamp="702" />
      <point x="420" y="466" timestamp="710" />
    </stroke>
  </strokes>
</character>


<?xml version="1.0" encoding="UTF-8" ?>

<CodeXL>
    <Tests>
	        <TestResultsDirectory>GoldMasters_APPSDK_2_9</TestResultsDirectory>
        <LogFilesDirectory>C:\TEMP\testResults\</LogFilesDirectory>
		<Test>
            <ExecutablePath>samples\opencl\bin\x86\MatrixMultiplicationCPPKernel.exe</ExecutablePath>
            <WorkingDirectory>samples\opencl\bin\x86</WorkingDirectory>
            <TestName>MatrixMultiplicationCPPKernel_StepIntoTest</TestName>
            <TestType>StepIntoTest</TestType>
            <Kernels>
                <Kernel>
                    <KernelName>mmmKernel_localFloat4</KernelName>
					<WorkItemId>0,0,0</WorkItemId>
					<StepIntoLine>115</StepIntoLine>
                </Kernel>
            </Kernels>
        </Test>
	</Tests>
</CodeXL>


/**
 * @file BackProject_Demo1.cpp
 * @brief Sample code for backproject function usage
 * @author OpenCV team
 */

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"

#include <iostream>

using namespace cv;
using namespace std;

/// Global Variables
Mat src; Mat hsv; Mat hue;
int bins = 25;

/// Function Headers
void Hist_and_Backproj(int, void* );

/**
 * @function main
 */
int main( int, char** argv )
{
  /// Read the image
  src = imread( argv[1], 1 );
  /// Transform it to HSV
  cvtColor( src, hsv, COLOR_BGR2HSV );

  /// Use only the Hue value
  hue.create( hsv.size(), hsv.depth() );
  int ch[] = { 0, 0 };
  mixChannels( &hsv, 1, &hue, 1, ch, 1 );

  /// Create Trackbar to enter the number of bins
  const char* window_image = "Source image";
  namedWindow( window_image, WINDOW_AUTOSIZE );
  createTrackbar("* Hue  bins: ", window_image, &bins, 180, Hist_and_Backproj );
  Hist_and_Backproj(0, 0);

  /// Show the image
  imshow( window_image, src );

  /// Wait until user exits the program
  waitKey(0);
  return 0;
}

/**
 * @function Hist_and_Backproj
 * @brief Callback to Trackbar
 */
void Hist_and_Backproj(int, void* )
{
  MatND hist;
  int histSize = MAX( bins, 2 );
  float hue_range[] = { 0, 180 };
  const float* ranges = { hue_range };

  /// Get the Histogram and normalize it
  calcHist( &hue, 1, 0, Mat(), hist, 1, &histSize, &ranges, true, false );
  normalize( hist, hist, 0, 255, NORM_MINMAX, -1, Mat() );

  /// Get Backprojection
  MatND backproj;
  calcBackProject( &hue, 1, 0, hist, backproj, &ranges, 1, true );

  /// Draw the backproj
  imshow( "BackProj", backproj );

  /// Draw the histogram
  int w = 400; int h = 400;
  int bin_w = cvRound( (double) w / histSize );
  Mat histImg = Mat::zeros( w, h, CV_8UC3 );

  for( int i = 0; i < bins; i ++ )
     { rectangle( histImg, Point( i*bin_w, h ), Point( (i+1)*bin_w, h - cvRound( hist.at<float>(i)*h/255.0 ) ), Scalar( 0, 0, 255 ), -1 ); }

  imshow( "Histogram", histImg );

}