Merge in changes

This commit is contained in:
Brian Sidebotham 2014-02-19 19:41:13 +00:00
commit 4a15b358ab
32 changed files with 3523 additions and 5312 deletions

View File

@ -190,9 +190,11 @@ if( CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
set( TO_LINKER -Wl ) set( TO_LINKER -Wl )
endif() endif()
# Thou shalt not link vaporware and tell us it's a valid DSO: # Thou shalt not link vaporware and tell us it's a valid DSO (apple ld doesn't support it)
set( CMAKE_SHARED_LINKER_FLAGS "${TO_LINKER},--no-undefined" ) if( NOT APPLE )
set( CMAKE_MODULE_LINKER_FLAGS "${TO_LINKER},--no-undefined" ) set( CMAKE_SHARED_LINKER_FLAGS "${TO_LINKER},--no-undefined" )
set( CMAKE_MODULE_LINKER_FLAGS "${TO_LINKER},--no-undefined" )
endif()
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "-s" ) set( CMAKE_EXE_LINKER_FLAGS_RELEASE "-s" )
endif() endif()
@ -345,12 +347,12 @@ check_find_package_result( OPENGL_FOUND "OpenGL" )
if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC ) if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC )
add_custom_target( lib-wxpython ) add_custom_target( lib-wxpython )
include( download_pcre ) include( download_pcre )
include( download_swig ) include( download_swig )
include( download_wxpython ) include( download_wxpython )
add_dependencies( lib-wxpython pcre ) add_dependencies( lib-wxpython pcre )
add_dependencies( lib-wxpython swig ) add_dependencies( lib-wxpython swig )
add_dependencies( lib-wxpython libwxpython ) add_dependencies( lib-wxpython libwxpython )
#set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so;.dylib;.dll") #set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so;.dylib;.dll")
@ -361,6 +363,9 @@ add_custom_target( lib-wxpython )
if( KICAD_BUILD_STATIC ) if( KICAD_BUILD_STATIC )
message(STATUS "KICAD_BUILD_STATIC set") message(STATUS "KICAD_BUILD_STATIC set")
if( KICAD_SCRIPTING OR KICAD_SCRIPTING_WXPYTHON OR KICAD_SCRIPTING_MODULES )
message(FATAL_ERROR "KICAD_SCRIPTING* is not supported with KICAD_BUILD_STATIC, please select KICAD_BUILD_DYNAMIC" )
endif()
endif() endif()
if( KICAD_BUILD_DYNAMIC ) if( KICAD_BUILD_DYNAMIC )
@ -374,6 +379,9 @@ add_custom_target( lib-wxpython )
include( download_libpng ) include( download_libpng )
if( KICAD_SCRIPTING OR KICAD_SCRIPTING_WXPYTHON OR KICAD_SCRIPTING_MODULES ) if( KICAD_SCRIPTING OR KICAD_SCRIPTING_WXPYTHON OR KICAD_SCRIPTING_MODULES )
message(STATUS "Scripting ENABLED")
set( SWIG_EXECUTABLE ${SWIG_ROOT}/bin/swig ) set( SWIG_EXECUTABLE ${SWIG_ROOT}/bin/swig )
set( SWIG_INCLUDE ${SWIG_ROOT}/include ) set( SWIG_INCLUDE ${SWIG_ROOT}/include )
set( PYTHON_DEST ${LIBWXPYTHON_ROOT}/wxPython/lib/python2.6/site-packages ) set( PYTHON_DEST ${LIBWXPYTHON_ROOT}/wxPython/lib/python2.6/site-packages )
@ -505,18 +513,24 @@ set( INC_AFTER
# Find Python and other scripting resources # Find Python and other scripting resources
if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES ) if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES )
if( NOT APPLE ) if( APPLE )
set( PythonInterp_FIND_VERSION )
else()
set( PYTHON_LIBRARY /System/Library/Frameworks/Python.framework/Versions/2.6/Python ) set( PYTHON_LIBRARY /System/Library/Frameworks/Python.framework/Versions/2.6/Python )
set( PYTHON_INCLUDE_DIR /System/Library/Frameworks/Python.framework/Versions//2.6/include/python2.6 ) set( PYTHON_INCLUDE_DIR /System/Library/Frameworks/Python.framework/Versions//2.6/include/python2.6 )
set( PythonInterp_FIND_VERSION 2.6 ) set( PythonInterp_FIND_VERSION 2.6 )
set( PythonLibs_FIND_VERSION 2.6 ) set( PythonLibs_FIND_VERSION 2.6 )
endif() endif()
# force a python version < 3.0
set( PythonInterp_FIND_VERSION 2.6)
set( PythonLibs_FIND_VERSION 2.6 )
find_package( PythonInterp ) find_package( PythonInterp )
check_find_package_result( PYTHONINTERP_FOUND "Python Interpreter" ) check_find_package_result( PYTHONINTERP_FOUND "Python Interpreter" )
if( NOT PYTHON_VERSION_MAJOR EQUAL 2 )
message( FATAL_ERROR "Python 2.x is required." )
endif()
# Get the correct Python site package install path from the Python interpreter found by # Get the correct Python site package install path from the Python interpreter found by
# FindPythonInterp unless the user specifically defined a custom path. # FindPythonInterp unless the user specifically defined a custom path.
if( NOT PYTHON_SITE_PACKAGE_PATH ) if( NOT PYTHON_SITE_PACKAGE_PATH )
@ -534,7 +548,7 @@ if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES )
mark_as_advanced( PYTHON_DEST ) mark_as_advanced( PYTHON_DEST )
message( STATUS "Python module install path: ${PYTHON_DEST}" ) message( STATUS "Python module install path: ${PYTHON_DEST}" )
find_package( PythonLibs ) find_package( PythonLibs 2.6 )
#message( STATUS "PYTHON_INCLUDE_DIRS:${PYTHON_INCLUDE_DIRS}" ) #message( STATUS "PYTHON_INCLUDE_DIRS:${PYTHON_INCLUDE_DIRS}" )

View File

@ -138,9 +138,17 @@ bzr branch lp:kicad/stable kicad_src
Components and Footprints libraries Components and Footprints libraries
all (schematic libs, 3D shapes ...) but new footprints libraries (use Download zip tool) all (schematic libs, 3D shapes ...) but new footprints libraries (use Download zip tool)
https://github.com/KiCad/kicad-library/ https://github.com/KiCad/kicad-library/
New footprints libraries (use Download zip tool for each lib you want) New footprints libraries (use Download zip tool for each lib you want)
https://github.com/KiCad/ for footprint libs (*.pretty folders) https://github.com/KiCad/ for footprint libs (*.pretty folders)
A mirror of github is available, using bzr:
(schematic libs, 3D shapes ... all but new footprints libraries)
bzr checkout lp:~kicad-product-committers/kicad/library
Old legacy libraries:
bzr checkout lp:~dickelbeck/kicad/library-read-only
Note also Kicad is able to read on github.com/KiCad/ the *.pretty folders Note also Kicad is able to read on github.com/KiCad/ the *.pretty folders
without download, using github plugin. without download, using github plugin.
(however the time to read them can be long) (however the time to read them can be long)

View File

@ -8,84 +8,96 @@
static const unsigned char png[] = { static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x04, 0xbb, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xbd, 0x96, 0x4b, 0x6c, 0x1b, 0xce, 0x00, 0x00, 0x05, 0x7d, 0x49, 0x44, 0x41, 0x54, 0x48, 0x4b, 0xbd, 0x95, 0xd9, 0x4f, 0x54,
0x55, 0x14, 0x86, 0xbf, 0x7b, 0x67, 0xfc, 0x4a, 0x1c, 0xdb, 0x72, 0xd3, 0x34, 0x4a, 0xe3, 0x28, 0x67, 0x18, 0xc6, 0x69, 0xaf, 0x9a, 0x36, 0x05, 0xda, 0x9b, 0x36, 0xbd, 0xed, 0x45, 0xfb, 0x87,
0xa5, 0xb1, 0xe2, 0x3a, 0x21, 0x88, 0x22, 0x0a, 0x34, 0x52, 0xda, 0xaa, 0xa2, 0x5d, 0x20, 0xd2, 0x34, 0xe9, 0x0d, 0x91, 0x75, 0x2c, 0xbb, 0x06, 0x4c, 0x34, 0x46, 0x22, 0x2d, 0x09, 0x04, 0x90,
0xec, 0x40, 0xa2, 0x11, 0x0b, 0x58, 0x50, 0x56, 0xac, 0x91, 0x8a, 0x58, 0x21, 0x58, 0x74, 0xd3, 0xcd, 0x85, 0x04, 0x8b, 0x28, 0x16, 0x94, 0x4d, 0x36, 0x45, 0x10, 0x18, 0x86, 0x75, 0x70, 0x1a,
0x15, 0xad, 0x94, 0x45, 0x57, 0x45, 0x42, 0x42, 0x65, 0x55, 0xb1, 0xa0, 0x40, 0xc5, 0x06, 0xa5, 0xa2, 0xec, 0xc8, 0x80, 0xc8, 0x3e, 0x08, 0x38, 0x1b, 0x30, 0x2c, 0xb3, 0x00, 0x0e, 0xe8, 0x08,
0x4f, 0x35, 0xcd, 0x4b, 0x4e, 0x1f, 0x4e, 0x5b, 0x8b, 0x46, 0x69, 0x1c, 0xb7, 0x71, 0x33, 0x9e, 0xd2, 0xa7, 0xdf, 0xfb, 0xea, 0x39, 0x72, 0xac, 0x4d, 0xd3, 0x34, 0xe9, 0x24, 0xcf, 0xcc, 0x9c,
0xc7, 0x61, 0x41, 0xc6, 0xb2, 0x63, 0x07, 0xe8, 0x86, 0x2b, 0xfd, 0x9a, 0x3b, 0x9a, 0x3b, 0xf7, 0x93, 0x73, 0xbe, 0xdf, 0xf7, 0xbc, 0xdb, 0xe7, 0x05, 0xc0, 0xeb, 0xff, 0x10, 0x7f, 0x15, 0x17,
0x3f, 0xff, 0x39, 0x67, 0xfe, 0x3b, 0x4a, 0x44, 0xf8, 0x3f, 0x86, 0x09, 0x70, 0xf6, 0xec, 0xd9, 0x17, 0xd7, 0x96, 0x94, 0x94, 0xa0, 0xbc, 0xbc, 0x1c, 0x55, 0x55, 0x55, 0xa8, 0xac, 0xac, 0x44,
0xf3, 0x4a, 0xa9, 0xf7, 0x4d, 0xd3, 0xc4, 0x30, 0x0c, 0x44, 0x04, 0xc7, 0x71, 0x70, 0x5d, 0x17, 0x59, 0x59, 0x19, 0xc4, 0x7d, 0x14, 0x16, 0x16, 0x22, 0x3f, 0x3f, 0x1f, 0x57, 0xae, 0x5c, 0xc1,
0xc7, 0x71, 0xaa, 0x78, 0xd1, 0x7b, 0xad, 0xf5, 0xb7, 0x13, 0x13, 0x13, 0x27, 0x00, 0x38, 0x7d, 0xe5, 0xcb, 0x97, 0x91, 0x9d, 0x9d, 0x8d, 0xf3, 0xe7, 0xcf, 0x23, 0x3d, 0x3d, 0x1d, 0xa9, 0xa9,
0xfa, 0x74, 0xec, 0xcc, 0x99, 0x33, 0x15, 0xdb, 0xb6, 0xc5, 0x75, 0xdd, 0xa6, 0x70, 0x1c, 0xa7, 0xa9, 0x48, 0x4a, 0x4a, 0x42, 0x42, 0x42, 0x02, 0xce, 0x9e, 0x3d, 0x8b, 0x33, 0x67, 0xce, 0xe0,
0x0a, 0xdb, 0xb6, 0xeb, 0x50, 0xa9, 0x54, 0xaa, 0xb0, 0x2c, 0xab, 0x8a, 0x52, 0xa9, 0x24, 0xe3, 0xd4, 0xa9, 0x53, 0x38, 0x71, 0xe2, 0x04, 0x8e, 0x1f, 0x3f, 0x8e, 0x98, 0x98, 0x98, 0x9b, 0x32,
0xe3, 0xe3, 0x9e, 0x88, 0x20, 0x22, 0x98, 0xae, 0xeb, 0x6a, 0xad, 0xb5, 0xa7, 0x94, 0x22, 0x9f, 0xe8, 0xfa, 0xf5, 0xeb, 0xde, 0x62, 0xc1, 0xbd, 0xfd, 0xfd, 0x7d, 0x1c, 0x1c, 0x1c, 0x7c, 0x50,
0xcf, 0xa3, 0x94, 0x02, 0x40, 0x29, 0x55, 0x37, 0x6f, 0x76, 0xdd, 0x6a, 0x68, 0xad, 0x49, 0x24, 0xaf, 0x5f, 0xbf, 0x96, 0x45, 0xcf, 0x1d, 0xd6, 0xde, 0xde, 0x9e, 0xac, 0x57, 0xaf, 0x5e, 0xc9,
0x12, 0x88, 0x88, 0xaa, 0x4b, 0x9d, 0xe7, 0x79, 0x4d, 0x37, 0x6f, 0x36, 0xff, 0x2f, 0x44, 0xcd, 0x7a, 0xfe, 0xfc, 0x39, 0xa2, 0xa2, 0xa2, 0xfe, 0x90, 0x41, 0x57, 0xaf, 0x5e, 0xf5, 0x2d, 0x2d,
0x9e, 0x9b, 0x00, 0xae, 0xeb, 0x02, 0x50, 0x2a, 0x95, 0x58, 0x59, 0x59, 0xa1, 0xa7, 0xa7, 0x07, 0x2d, 0xf5, 0xd0, 0x22, 0x26, 0x93, 0x09, 0x66, 0xb3, 0x99, 0x65, 0xb1, 0x58, 0x60, 0xb5, 0x5a,
0xad, 0x35, 0x0b, 0x0b, 0x0b, 0x6c, 0x6e, 0x96, 0x7f, 0x22, 0x11, 0x11, 0xfa, 0xfb, 0xfb, 0xab, 0x59, 0x4b, 0x4b, 0x4b, 0x18, 0x1e, 0x1e, 0x46, 0x7b, 0x7b, 0x3b, 0x6e, 0xdf, 0xbe, 0xcd, 0xce,
0x6b, 0x6a, 0xdf, 0x6d, 0x50, 0xd4, 0xd7, 0xd7, 0x47, 0x28, 0x14, 0xa2, 0x5c, 0x2e, 0x93, 0x4e, 0x6b, 0x6b, 0x6b, 0xa1, 0xd3, 0xe9, 0x30, 0x3d, 0x3d, 0x8d, 0x95, 0x95, 0x15, 0x85, 0x56, 0x57,
0xa7, 0x5f, 0x28, 0x7d, 0x22, 0x82, 0xd6, 0x1a, 0xad, 0x75, 0x23, 0xd1, 0xea, 0xea, 0x2a, 0x89, 0x57, 0xf1, 0xf2, 0xe5, 0x4b, 0x44, 0x46, 0x46, 0x42, 0x01, 0x12, 0x8e, 0x18, 0x24, 0x01, 0x24,
0x44, 0x02, 0x80, 0x44, 0x22, 0x81, 0x52, 0x0a, 0xcb, 0xb2, 0x50, 0x4a, 0x91, 0xcb, 0xe5, 0xea, 0x08, 0x01, 0xe6, 0xe7, 0xe7, 0x51, 0x53, 0x53, 0x83, 0xb1, 0xb1, 0x31, 0x38, 0x1c, 0x0e, 0x6c,
0x16, 0x6f, 0xde, 0x5c, 0x44, 0x18, 0x18, 0x18, 0xd8, 0x32, 0x75, 0x0d, 0x8a, 0x5c, 0xd7, 0x45, 0x6f, 0x6f, 0xc3, 0xe1, 0xda, 0xc4, 0xd6, 0xd6, 0x16, 0xd6, 0xd6, 0xd6, 0xa0, 0x56, 0xab, 0x79,
0x44, 0x50, 0x4a, 0x55, 0x1f, 0x2a, 0xa5, 0x48, 0xa7, 0xd3, 0xd5, 0xe8, 0x9a, 0x35, 0x87, 0xaf, 0x03, 0xf4, 0xac, 0xcd, 0x66, 0x63, 0xd1, 0xfd, 0x0f, 0x82, 0x6e, 0xdc, 0xb8, 0xc1, 0xa0, 0xc9,
0x60, 0x33, 0xb9, 0xbf, 0xb6, 0x81, 0xc8, 0x71, 0x9c, 0xa6, 0x11, 0xfd, 0x9b, 0xa2, 0x66, 0x0a, 0xc9, 0x49, 0xf4, 0xf4, 0xf4, 0xb0, 0x33, 0x82, 0x69, 0xb5, 0x5a, 0xdc, 0xbd, 0x7b, 0x17, 0x9b,
0xb3, 0xd9, 0x6c, 0xf5, 0xde, 0x2f, 0x49, 0x43, 0x33, 0xf8, 0x91, 0xf8, 0x1b, 0xf8, 0x85, 0xad, 0x9b, 0x9b, 0x68, 0xed, 0x99, 0x46, 0x58, 0x66, 0x33, 0x82, 0x52, 0x9b, 0xa0, 0x4a, 0xd7, 0x20,
0x55, 0x92, 0xcb, 0xe5, 0xb0, 0x6d, 0x9b, 0xb6, 0xb6, 0x36, 0x4c, 0xd3, 0xa4, 0x58, 0x2c, 0xb2, 0xe4, 0x5c, 0x13, 0x7e, 0xc9, 0xd7, 0xc1, 0xb6, 0xe1, 0xe2, 0xcd, 0x88, 0x35, 0xd0, 0xd5, 0xd5,
0xbe, 0xbe, 0x4e, 0x36, 0x9b, 0x25, 0x14, 0x0a, 0xd5, 0x29, 0x6c, 0x20, 0xb2, 0x6d, 0xbb, 0x4e, 0xc5, 0x8e, 0xd6, 0xd7, 0xd7, 0x19, 0x14, 0x11, 0x11, 0xa1, 0x04, 0x15, 0x14, 0x14, 0x30, 0x68,
0xb2, 0xbf, 0xf1, 0xfc, 0xfc, 0x7c, 0x55, 0x91, 0x65, 0x59, 0x88, 0x08, 0x83, 0x43, 0xaf, 0xf0, 0x6a, 0x6a, 0x8a, 0x1f, 0xa4, 0x9d, 0x93, 0x3b, 0x2a, 0x0c, 0x72, 0x10, 0x2f, 0x16, 0x8c, 0xc9,
0xd3, 0xd5, 0x87, 0x4c, 0xdd, 0x5c, 0xc2, 0x71, 0x3c, 0xd2, 0xdd, 0x09, 0xde, 0x79, 0xa3, 0x8f, 0xe9, 0x84, 0x76, 0xc4, 0x8a, 0x09, 0xa3, 0x13, 0xa6, 0x75, 0x37, 0x9e, 0x2e, 0x6f, 0xa1, 0xee,
0xc5, 0xc5, 0xfb, 0x14, 0x0a, 0x05, 0x46, 0x46, 0x46, 0x30, 0x0c, 0xa3, 0x91, 0xa8, 0x58, 0x2c, 0xe1, 0x02, 0x02, 0x52, 0xd4, 0xe8, 0x7d, 0xbc, 0x88, 0xd9, 0xd9, 0x59, 0xb4, 0xb4, 0xb4, 0x30,
0x12, 0x8b, 0xc5, 0xea, 0xd2, 0xb1, 0x59, 0x91, 0xe7, 0x79, 0xcc, 0xcc, 0xcc, 0xd0, 0xb2, 0xbd, 0xc4, 0x6e, 0xb7, 0x33, 0x28, 0x3c, 0x3c, 0xfc, 0x1d, 0x28, 0x33, 0x33, 0xd3, 0xf7, 0xda, 0xb5,
0x97, 0x93, 0xe7, 0xae, 0x71, 0x6c, 0x64, 0x0f, 0x1f, 0x0e, 0xec, 0xc2, 0xb2, 0x3d, 0xee, 0x14, 0x6b, 0x0c, 0x92, 0xec, 0x13, 0x4c, 0xa3, 0xd1, 0xc0, 0x68, 0x34, 0xa2, 0xac, 0x59, 0x8f, 0x58,
0x56, 0xf9, 0xea, 0xbb, 0x9b, 0x1c, 0x7d, 0xb5, 0x93, 0x3d, 0xe9, 0x34, 0x4b, 0x4b, 0x4b, 0x74, 0x01, 0x69, 0x1b, 0x5a, 0xc4, 0xe3, 0xf9, 0x35, 0xcc, 0x5a, 0x1c, 0x30, 0xad, 0x8a, 0xb0, 0xb9,
0x76, 0x76, 0x36, 0x57, 0xe4, 0x38, 0x4e, 0xc3, 0x47, 0x09, 0x30, 0x37, 0x37, 0x87, 0x88, 0xf0, 0x76, 0x61, 0x73, 0xb8, 0xd1, 0x33, 0xb5, 0x0a, 0xff, 0x64, 0x35, 0xec, 0xae, 0x6d, 0x34, 0x34,
0xf8, 0xf1, 0x63, 0x5e, 0x7f, 0x73, 0x98, 0x2f, 0xce, 0x5d, 0xe5, 0xb3, 0xf7, 0xf6, 0xd1, 0xb5, 0x34, 0x70, 0x54, 0x68, 0xa3, 0x04, 0x0a, 0x0b, 0x0b, 0x53, 0x82, 0x44, 0xe9, 0x7a, 0xa8, 0x82,
0x2d, 0x8a, 0xe3, 0x7a, 0x94, 0x2d, 0x9b, 0x4c, 0x77, 0x8c, 0x64, 0x6c, 0x88, 0xef, 0x7f, 0xbe, 0x96, 0x97, 0x97, 0xe5, 0x84, 0x8a, 0xfb, 0x70, 0x8a, 0x5c, 0xd0, 0x22, 0x45, 0x5a, 0x03, 0x3a,
0x4d, 0x3a, 0xd5, 0xcf, 0xfd, 0x85, 0x5b, 0x74, 0x74, 0x74, 0x6c, 0x5d, 0xa3, 0x66, 0xa9, 0xcb, 0x47, 0x97, 0xd8, 0xcd, 0x9c, 0x70, 0x62, 0x5a, 0x73, 0x63, 0xc9, 0xbe, 0xc3, 0x32, 0x0b, 0x77,
0x64, 0x32, 0x68, 0xad, 0xb1, 0x2c, 0x8b, 0x1f, 0x7e, 0xbf, 0xcb, 0xdb, 0x6f, 0xf5, 0x13, 0x8f, 0x85, 0x2d, 0x93, 0xb8, 0x54, 0xd9, 0x83, 0xb9, 0xb9, 0x39, 0xb4, 0xb6, 0xb6, 0xc2, 0xe9, 0x74,
0x46, 0x70, 0x3c, 0x01, 0xa5, 0x09, 0x06, 0x02, 0x78, 0x68, 0x44, 0x2a, 0xbc, 0x36, 0xd8, 0xc3, 0xc2, 0xe3, 0xf1, 0x20, 0x34, 0x34, 0x54, 0x09, 0xca, 0xc9, 0xc9, 0x51, 0x80, 0x9e, 0x3d, 0x7b,
0xc4, 0xc5, 0x69, 0x4e, 0x1c, 0xdd, 0xc5, 0xf2, 0xf2, 0x32, 0x91, 0x48, 0xa4, 0xb9, 0xa2, 0x66, 0xc6, 0xa0, 0xc1, 0x27, 0x0b, 0x88, 0xbe, 0xd8, 0x86, 0x5f, 0xef, 0xe9, 0x51, 0xdc, 0x36, 0x8e,
0x63, 0x7e, 0x7e, 0x1e, 0xdb, 0xb6, 0x31, 0x4d, 0x93, 0x85, 0x47, 0x25, 0x76, 0xf7, 0xec, 0xe0, 0xc1, 0x99, 0x15, 0x8c, 0x0a, 0x57, 0x93, 0x46, 0x3b, 0x66, 0xcd, 0x76, 0x18, 0x2c, 0x76, 0xcc,
0xe9, 0xb3, 0x32, 0xeb, 0xa6, 0x42, 0x21, 0xb8, 0xae, 0xc7, 0xda, 0xba, 0xcd, 0x83, 0x47, 0x4b, 0x98, 0xd6, 0xd1, 0x31, 0x60, 0x40, 0x44, 0x96, 0x86, 0x0b, 0xe8, 0xd6, 0xad, 0x5b, 0x32, 0xe8,
0xd8, 0x15, 0xe1, 0xb9, 0xe5, 0x10, 0x0e, 0x87, 0x29, 0x14, 0x0a, 0x74, 0x77, 0x77, 0xd7, 0xfb, 0xe8, 0xd1, 0xa3, 0x4a, 0x90, 0x68, 0x42, 0x06, 0x11, 0x84, 0x42, 0xd7, 0xdb, 0xdb, 0x8b, 0xdc,
0x5f, 0xb1, 0x58, 0xac, 0x76, 0xdd, 0xe6, 0x3a, 0x65, 0x32, 0x19, 0x32, 0x99, 0x0c, 0x86, 0x61, 0xdc, 0x5c, 0xdc, 0xd1, 0x8e, 0x22, 0xee, 0xb7, 0x07, 0x28, 0xee, 0x9c, 0x63, 0xb5, 0xe9, 0xad,
0x60, 0x1a, 0x0a, 0xcc, 0x20, 0xda, 0x0c, 0x12, 0x0c, 0x86, 0x88, 0x44, 0x22, 0x44, 0x5a, 0x5a, 0x18, 0x59, 0xb0, 0x63, 0x5c, 0x38, 0x9b, 0xb5, 0x8a, 0x22, 0x58, 0xd9, 0xc2, 0xa2, 0xd0, 0xe3,
0xc0, 0x0c, 0x93, 0xda, 0xd9, 0x49, 0x57, 0xe7, 0x76, 0x42, 0xc1, 0x00, 0x96, 0x65, 0xe1, 0x79, 0xf9, 0x75, 0x84, 0x65, 0x68, 0x38, 0xf4, 0xa2, 0x2f, 0xe1, 0x72, 0xb9, 0x18, 0x14, 0x12, 0x12,
0x5e, 0x43, 0x19, 0xaa, 0x8a, 0x6a, 0x53, 0xe7, 0x8f, 0xd9, 0xd9, 0x59, 0x3c, 0xcf, 0x63, 0x6d, 0xa2, 0x04, 0x65, 0x65, 0x65, 0x79, 0xa8, 0xe1, 0x08, 0x42, 0x3d, 0x40, 0x89, 0x8d, 0x8b, 0x8b,
0x6d, 0x8d, 0xc1, 0xde, 0x76, 0xae, 0xdc, 0xbe, 0xc7, 0xb3, 0xd5, 0x36, 0xa2, 0x21, 0x8d, 0x16, 0xc3, 0x83, 0x47, 0xd3, 0x88, 0xbc, 0xd0, 0x82, 0xdc, 0xfa, 0x11, 0x59, 0xd5, 0xbf, 0xcf, 0xe0,
0x07, 0x25, 0x36, 0xcf, 0x6d, 0xc5, 0xba, 0xa3, 0x58, 0x29, 0x7b, 0x84, 0x03, 0x42, 0xb9, 0x5c, 0xe1, 0x13, 0x33, 0x06, 0xa6, 0x2c, 0x18, 0x9e, 0xb6, 0x60, 0x64, 0xc6, 0x8c, 0xd6, 0xee, 0x31,
0x26, 0x99, 0x4c, 0x36, 0x3a, 0xba, 0xdf, 0xde, 0x00, 0x4f, 0x9e, 0x3c, 0x61, 0x7a, 0x7a, 0x1a, 0x44, 0xbe, 0x75, 0x54, 0x54, 0x54, 0xc4, 0xa5, 0x4f, 0xa0, 0xa0, 0xa0, 0xa0, 0x77, 0xa0, 0xf8,
0xcb, 0xb2, 0xaa, 0x35, 0x1a, 0x1c, 0x1c, 0x44, 0x6b, 0xcd, 0xb1, 0xfd, 0xbb, 0x78, 0xf8, 0xe7, 0xf8, 0x78, 0x5f, 0x31, 0x4e, 0x64, 0x10, 0xf5, 0x00, 0x55, 0x0e, 0x55, 0x8c, 0x75, 0x69, 0x19,
0x53, 0x08, 0x44, 0x69, 0x8d, 0x6f, 0x63, 0xfb, 0x8e, 0x9d, 0x74, 0xa5, 0x76, 0xd3, 0xd3, 0xd3, 0x7e, 0x49, 0x0d, 0xec, 0xa6, 0xe4, 0xfe, 0x53, 0x59, 0x77, 0x1e, 0x2c, 0xa2, 0x5d, 0x6f, 0x41,
0x4b, 0x47, 0x67, 0x17, 0x33, 0xf9, 0xa7, 0x7c, 0x3a, 0x3a, 0xc4, 0xf5, 0xeb, 0xd7, 0x49, 0xa5, 0xef, 0xe4, 0x0a, 0x1e, 0x19, 0x6c, 0xa8, 0xd2, 0x4d, 0xe1, 0x62, 0xf9, 0x43, 0xce, 0x51, 0x63,
0x52, 0xcd, 0xdd, 0xdb, 0xaf, 0x91, 0x61, 0x18, 0xa4, 0xd3, 0x69, 0x5a, 0x5b, 0x5b, 0xa9, 0x54, 0x63, 0xa3, 0x0c, 0x0a, 0x08, 0x08, 0x50, 0x82, 0x52, 0x52, 0x52, 0x38, 0x74, 0xe4, 0x46, 0x02,
0x2a, 0xcc, 0xce, 0xce, 0x22, 0x22, 0x84, 0xc3, 0x61, 0x2e, 0x5f, 0xfe, 0x8d, 0x93, 0xe3, 0x07, 0xd1, 0x2c, 0x1b, 0x1a, 0x1a, 0x42, 0x91, 0xfa, 0x91, 0xa8, 0x3a, 0xad, 0xc2, 0x55, 0xbe, 0x5a,
0xf8, 0xe6, 0xfc, 0x24, 0xd1, 0x48, 0x80, 0x9d, 0xed, 0x61, 0xa2, 0xad, 0x11, 0xd6, 0x2a, 0x26, 0x8f, 0xa2, 0xe6, 0x61, 0x54, 0xb4, 0x0d, 0xa3, 0xe6, 0xfe, 0x08, 0x54, 0x69, 0x1a, 0xac, 0x6e,
0x53, 0xb9, 0x02, 0x9f, 0xbc, 0x3b, 0x40, 0x40, 0x39, 0x58, 0x96, 0xc5, 0xe4, 0xe4, 0x24, 0xc3, 0x38, 0x51, 0x5f, 0x5f, 0x8f, 0xf1, 0xf1, 0x71, 0x6e, 0x09, 0x02, 0x1d, 0x39, 0x72, 0x44, 0x09,
0xc3, 0xc3, 0xf5, 0x44, 0xc5, 0x62, 0x91, 0x78, 0x3c, 0x8e, 0x88, 0x10, 0x8f, 0xc7, 0xd1, 0x5a, 0x12, 0x83, 0x91, 0x1d, 0x49, 0x90, 0x8d, 0x8d, 0x0d, 0x18, 0x0c, 0x06, 0x1c, 0x3b, 0x76, 0x8c,
0x57, 0x15, 0xf6, 0xf7, 0xf7, 0x63, 0x18, 0x06, 0x4a, 0x29, 0x8a, 0xc5, 0x22, 0xd7, 0xfe, 0xb8, 0x9b, 0x35, 0x2e, 0x4f, 0x8b, 0xa8, 0x4b, 0x5a, 0xdc, 0xd4, 0xce, 0xa1, 0x54, 0x37, 0x8f, 0x8a,
0xcc, 0x97, 0xe3, 0xc3, 0xdc, 0x5b, 0x5a, 0xe7, 0xd6, 0x9d, 0x65, 0xca, 0x65, 0x9b, 0x97, 0x5f, 0xae, 0x05, 0xdc, 0xeb, 0x33, 0xa2, 0x40, 0x54, 0x1b, 0x35, 0x70, 0xff, 0xb8, 0x91, 0x1b, 0x5c,
0x4a, 0xf0, 0xc1, 0x81, 0x7d, 0x5c, 0xbd, 0x32, 0x89, 0x93, 0x48, 0x10, 0x0a, 0x85, 0xc8, 0xe7, 0xb4, 0x09, 0xfa, 0xfb, 0xfb, 0x79, 0xce, 0x51, 0x79, 0xfb, 0xf9, 0xf9, 0x29, 0x41, 0x62, 0xfa,
0xf3, 0x2c, 0x2e, 0x2e, 0x36, 0xa6, 0xae, 0xb6, 0xeb, 0x6a, 0xbd, 0xad, 0xd6, 0x50, 0x93, 0xc9, 0xfe, 0x05, 0x44, 0xbf, 0x34, 0xb9, 0xd3, 0xd2, 0xd2, 0xde, 0x4c, 0x86, 0xde, 0x19, 0xa8, 0xce,
0x24, 0x87, 0x0f, 0x1f, 0x26, 0x97, 0xcb, 0xf1, 0x60, 0xee, 0x0a, 0xa9, 0xd0, 0x12, 0x43, 0x1d, 0xa9, 0x45, 0xb9, 0x37, 0x20, 0x38, 0x55, 0xcd, 0xfa, 0x39, 0xff, 0x3e, 0xd6, 0x1c, 0x5b, 0xfc,
0xcf, 0x59, 0xbe, 0x7b, 0x8d, 0x5f, 0x7f, 0xb9, 0x44, 0xa9, 0x54, 0x22, 0x9f, 0xcf, 0xfb, 0x27, 0xbc, 0x5e, 0xaf, 0xe7, 0x86, 0xad, 0xae, 0xae, 0xe6, 0x89, 0xf2, 0xe2, 0xc5, 0x0b, 0x25, 0x48,
0x2b, 0x22, 0x42, 0x7b, 0x7b, 0x3b, 0xa3, 0xa3, 0xa3, 0x2d, 0x00, 0x66, 0x20, 0x10, 0x10, 0xcb, 0x8c, 0x73, 0x5f, 0x01, 0x53, 0x80, 0xa8, 0xb3, 0xe9, 0x65, 0x6a, 0xbc, 0xe6, 0xe6, 0x66, 0x9e,
0xb2, 0xb4, 0xaf, 0xa8, 0xd6, 0xa7, 0x6a, 0x7d, 0xcb, 0x0f, 0x60, 0xef, 0xde, 0xbd, 0x78, 0x9e, 0x59, 0xb4, 0x53, 0x8a, 0xbd, 0x7b, 0x67, 0x87, 0x9b, 0x73, 0x77, 0x77, 0x97, 0x9f, 0xa3, 0xbe,
0x87, 0xeb, 0xba, 0xd8, 0xb6, 0x5d, 0xb5, 0x1b, 0xa5, 0x14, 0x97, 0x2e, 0xfd, 0x4d, 0xd8, 0xd6, 0xa1, 0xbc, 0xd0, 0xa0, 0xcd, 0xc8, 0xc8, 0xe0, 0x69, 0x42, 0x21, 0x24, 0xf9, 0xfb, 0xfb, 0x2b,
0xd6, 0x46, 0xa5, 0x52, 0xe1, 0xe0, 0xc1, 0x83, 0x4c, 0x4d, 0x4d, 0xcd, 0x1f, 0x39, 0x72, 0x64, 0x41, 0xe2, 0x1c, 0xf1, 0xd0, 0x68, 0x97, 0xdc, 0x48, 0x20, 0x5a, 0x9c, 0x4a, 0xbd, 0xb3, 0xb3,
0x9f, 0x02, 0x92, 0x63, 0x63, 0x63, 0x3f, 0x2a, 0xa5, 0xf6, 0xfb, 0x2f, 0xd5, 0xda, 0xbd, 0x3f, 0x13, 0x89, 0x89, 0x89, 0x5c, 0x20, 0xd1, 0xd1, 0xd1, 0x7c, 0xf6, 0x9c, 0x3c, 0x79, 0x12, 0xc9,
0xf7, 0x3c, 0xaf, 0xee, 0xea, 0xc3, 0x3f, 0x0e, 0x6a, 0x8f, 0x86, 0x43, 0x87, 0x0e, 0xe9, 0xde, 0xc9, 0xc9, 0xa8, 0xab, 0xab, 0x63, 0xe7, 0x4d, 0x4d, 0x4d, 0x5c, 0x71, 0x14, 0x01, 0x3a, 0xc7,
0xde, 0x5e, 0x5a, 0x5a, 0x5a, 0x48, 0xa5, 0x52, 0x9c, 0x3a, 0x75, 0xea, 0xa2, 0x09, 0x78, 0x17, 0xe8, 0x9a, 0x7a, 0x51, 0x9c, 0x61, 0xdf, 0xc8, 0x20, 0xf1, 0x12, 0x83, 0x28, 0x2f, 0xdd, 0xdd,
0x2e, 0x5c, 0xf8, 0x38, 0x16, 0x8b, 0xf5, 0x2a, 0xa5, 0xa2, 0x7e, 0x83, 0x00, 0x0a, 0x10, 0x40, 0xdd, 0xdc, 0xb8, 0x92, 0x23, 0xea, 0x09, 0x0a, 0x1d, 0xb9, 0xa1, 0x24, 0x93, 0x6b, 0x2a, 0x7f,
0x89, 0x88, 0x29, 0x22, 0x06, 0x60, 0x88, 0x88, 0x21, 0x22, 0xda, 0x9f, 0x6f, 0xa4, 0x5f, 0x01, 0xba, 0xa6, 0xf0, 0x50, 0x2e, 0xe8, 0x3f, 0x0d, 0x5f, 0x1a, 0x41, 0x15, 0x15, 0x15, 0x5c, 0x48,
0x9e, 0x52, 0xca, 0x03, 0xec, 0x1b, 0x37, 0x6e, 0xc4, 0x8e, 0x1f, 0x3f, 0xfe, 0xf9, 0xd8, 0xd8, 0xd4, 0x4f, 0x14, 0x4a, 0x31, 0x75, 0x6c, 0x02, 0xf6, 0x3d, 0x83, 0x62, 0x63, 0x63, 0x19, 0x44,
0x58, 0x3c, 0x1a, 0x8d, 0x12, 0x0c, 0x06, 0x5d, 0xb5, 0x11, 0x8d, 0x06, 0xc2, 0x1b, 0x08, 0x6e, 0x53, 0x98, 0x9a, 0x96, 0x5e, 0x94, 0x1c, 0xf5, 0xf5, 0xf5, 0xc9, 0xa2, 0xeb, 0x81, 0x81, 0x01,
0xf5, 0x73, 0xb3, 0x11, 0x84, 0xb1, 0x01, 0x5d, 0x43, 0xc2, 0x46, 0x50, 0x02, 0xb8, 0xc0, 0x7a, 0xd6, 0xe0, 0xe0, 0x20, 0x9f, 0x45, 0x54, 0x5d, 0x14, 0x76, 0x02, 0xd2, 0x71, 0x41, 0x47, 0x0a,
0x2a, 0x95, 0xf2, 0xb2, 0xd9, 0xec, 0x47, 0xf1, 0x78, 0x3c, 0xb9, 0xbc, 0xbc, 0xfc, 0xf5, 0x5f, 0x41, 0xc9, 0x0d, 0x9d, 0xd4, 0xa3, 0xa3, 0xa3, 0xe4, 0x4a, 0xe7, 0x25, 0x6a, 0xdd, 0x57, 0x54,
0x8c, 0x86, 0xc8, 0x61, 0x09, 0x89, 0x45, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0x97, 0x87, 0x5e, 0x90, 0xf2, 0x23, 0x85, 0x8e, 0x7e, 0xdf, 0x77, 0x44, 0x15, 0xb5, 0x23, 0xf2,
0xae, 0x42, 0x60, 0x82, 0x44, 0x39, 0x22, 0x47, 0xf4, 0x9e, 0x74, 0xaa, 0xd2, 0x7f, 0xda, 0x10, 0xe5, 0x8b, 0xf2, 0x46,
0x7d, 0x45, 0xbd, 0x99, 0x97, 0x97, 0xe7, 0x64, 0x90, 0x38, 0x37, 0x64, 0xd0, 0xe1, 0x1c, 0xd1,
0xcc, 0x22, 0xd0, 0x61, 0x88, 0xdb, 0xed, 0x56, 0x80, 0xc8, 0xc9, 0x61, 0xd1, 0xbd, 0x89, 0x89,
0x09, 0xce, 0x17, 0xb9, 0xee, 0xe8, 0xe8, 0x20, 0x47, 0x85, 0x5e, 0x2a, 0x95, 0xca, 0x47, 0xcc,
0xa4, 0x3d, 0x7a, 0x88, 0x60, 0x92, 0xa4, 0xdd, 0x4a, 0x7a, 0x7f, 0xc1, 0x7f, 0x12, 0x39, 0x39,
0x7d, 0xfa, 0x34, 0x41, 0x02, 0x85, 0x3e, 0xf2, 0x12, 0x9f, 0x2f, 0x85, 0xab, 0xbe, 0xc0, 0xc0,
0xc0, 0x03, 0x01, 0x94, 0x15, 0x1c, 0x1c, 0xac, 0xb8, 0xfe, 0x3b, 0x89, 0x8d, 0x2a, 0x24, 0xdd,
0x17, 0x53, 0x81, 0xd4, 0x26, 0xd6, 0xff, 0x9c, 0xab, 0x4e, 0x7c, 0x7c, 0x85, 0xbe, 0xf3, 0xf6,
0xf6, 0xfe, 0xd1, 0xc7, 0xc7, 0x27, 0x58, 0xe8, 0xa7, 0xb7, 0x0a, 0x3d, 0xf4, 0xff, 0xdf, 0x48,
0xe5, 0xf3, 0x66, 0x9d, 0x1f, 0xc4, 0xba, 0xdf, 0x0a, 0x7d, 0xc6, 0xa0, 0xb7, 0xb4, 0x8f, 0x85,
0x3e, 0x25, 0x77, 0x42, 0x5f, 0xff, 0x47, 0x7d, 0x25, 0xf4, 0x85, 0xd0, 0x27, 0x52, 0xb3, 0x92,
0xfe, 0x04, 0xe6, 0x65, 0xc3, 0xbb, 0x89, 0x46, 0xb5, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
}; };
const BITMAP_OPAQUE find_xpm[1] = {{ png, sizeof( png ), "find_xpm" }}; const BITMAP_OPAQUE find_xpm[1] = {{ png, sizeof( png ), "find_xpm" }};

View File

@ -8,85 +8,52 @@
static const unsigned char png[] = { static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x04, 0xd4, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xb5, 0x96, 0x49, 0x4f, 0x5d, 0xce, 0x00, 0x00, 0x02, 0xbc, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xb5, 0x96, 0xb1, 0x6e, 0x1b,
0x75, 0x18, 0x87, 0x31, 0x6a, 0xe2, 0xc2, 0x98, 0xe8, 0x86, 0x8d, 0x89, 0x71, 0xa3, 0x18, 0x1a, 0x47, 0x10, 0x86, 0xbf, 0x99, 0x3b, 0x16, 0x76, 0xc3, 0xe8, 0x00, 0x35, 0x24, 0x61, 0x50, 0x4f,
0x59, 0x6a, 0x5c, 0xba, 0xe0, 0xdb, 0x98, 0x7e, 0x08, 0x16, 0x5d, 0xb0, 0x64, 0x86, 0x96, 0x05, 0xe2, 0x56, 0x2f, 0xa1, 0x57, 0x48, 0xa0, 0x52, 0x11, 0x54, 0x07, 0x10, 0x90, 0x56, 0xb0, 0xe1,
0x94, 0x36, 0x1d, 0x80, 0x96, 0x99, 0x36, 0x05, 0x0a, 0x65, 0x86, 0x32, 0xcf, 0x73, 0x69, 0x65, 0xca, 0xae, 0xf8, 0x00, 0x2e, 0xd9, 0xa4, 0x15, 0x60, 0x40, 0x10, 0xd2, 0xa4, 0x10, 0xa1, 0x44,
0x86, 0x0b, 0x1c, 0xc6, 0x0b, 0xbc, 0xfe, 0x9e, 0x57, 0xcf, 0xe5, 0x5c, 0x5b, 0x63, 0x62, 0xe2, 0xe1, 0x11, 0x48, 0x63, 0x8b, 0x80, 0x62, 0x92, 0xb7, 0xb7, 0xeb, 0xc2, 0xdc, 0xe3, 0xde, 0xf2,
0x49, 0xde, 0x1c, 0xee, 0xff, 0x9c, 0xfb, 0x7b, 0xde, 0xf9, 0x92, 0x92, 0x92, 0x92, 0xf2, 0x45, 0x8e, 0xb4, 0x81, 0x64, 0x81, 0xc5, 0xce, 0x2d, 0xee, 0xf6, 0x9f, 0x6f, 0x66, 0x67, 0x70, 0x02,
0x5a, 0x5a, 0xda, 0x77, 0x19, 0x19, 0x19, 0x37, 0xfe, 0x0f, 0x4b, 0x4f, 0x4f, 0xff, 0x41, 0x8c, 0x0c, 0x81, 0x01, 0x90, 0xf2, 0xff, 0x0c, 0x03, 0xfc, 0x9d, 0x02, 0x2f, 0x3e, 0x7e, 0xfc, 0xf4,
0x2f, 0x65, 0x29, 0xe9, 0xbf, 0xaf, 0xad, 0xc5, 0x36, 0xb7, 0xb6, 0x6c, 0x6b, 0x7b, 0xdb, 0xb6, 0x9b, 0x31, 0x06, 0x51, 0x41, 0x64, 0x3d, 0x01, 0xc2, 0x55, 0x04, 0xe0, 0xeb, 0xf3, 0x7a, 0xaf,
0x77, 0x76, 0x6c, 0x71, 0x69, 0xc9, 0x76, 0xf7, 0xf6, 0x6c, 0x2f, 0x16, 0xb3, 0x2d, 0x9d, 0x2f, 0x7a, 0x16, 0x69, 0x55, 0x49, 0x92, 0x84, 0xe7, 0xcf, 0x9e, 0xbd, 0x4c, 0x01, 0x2d, 0x8a, 0x15,
0x2e, 0x2e, 0x5a, 0x6c, 0x7f, 0x3f, 0x61, 0x73, 0xf3, 0xf3, 0x76, 0x70, 0x78, 0xe8, 0xb6, 0xba, 0x77, 0x77, 0x13, 0x86, 0x47, 0x47, 0xa8, 0x2a, 0xaa, 0xeb, 0x43, 0x62, 0x51, 0xd9, 0xec, 0xe3,
0xba, 0x6a, 0x87, 0x41, 0x60, 0x83, 0xaf, 0x5f, 0x5b, 0x4d, 0x6d, 0xad, 0xad, 0xbe, 0x7d, 0xeb, 0x1c, 0x02, 0xb8, 0xc0, 0xa6, 0x41, 0xd4, 0x59, 0x0b, 0xa0, 0x29, 0x80, 0x26, 0x09, 0xfd, 0x7e,
0x9f, 0x03, 0x99, 0xdf, 0x8f, 0x8e, 0xe2, 0x62, 0xfc, 0x04, 0xe8, 0xc7, 0xb5, 0xb5, 0xb5, 0x60, 0x8f, 0x24, 0xd1, 0xcd, 0xe1, 0x91, 0xc0, 0x16, 0x61, 0xb8, 0xc6, 0x84, 0xc1, 0xf0, 0xce, 0xa9,
0x71, 0x69, 0xd9, 0xd6, 0x37, 0x36, 0xdd, 0x9e, 0x3c, 0x7d, 0x6a, 0x23, 0xa3, 0xa3, 0x0e, 0xdd, 0xdf, 0xc8, 0xf3, 0xbc, 0x4e, 0x21, 0x82, 0xa8, 0xa2, 0xb1, 0xdd, 0xb4, 0xae, 0xed, 0xf0, 0xdd,
0xd8, 0xd4, 0xe7, 0x27, 0x4f, 0x6c, 0x6a, 0x7a, 0xda, 0xc1, 0x38, 0xc0, 0xf3, 0xf5, 0xf5, 0x75, 0x6a, 0xae, 0x85, 0x52, 0x1f, 0xc7, 0xfe, 0x60, 0x40, 0x92, 0x24, 0x88, 0xf7, 0xe2, 0x7b, 0xc8,
0xdb, 0x17, 0xf4, 0xa9, 0xfe, 0xde, 0x3f, 0x38, 0xb0, 0x87, 0x0f, 0x1f, 0x5a, 0x5e, 0x5e, 0x9e, 0x62, 0x3b, 0x18, 0xaa, 0x1a, 0x10, 0x39, 0x47, 0x3e, 0x9d, 0x7e, 0x7d, 0x7f, 0xed, 0x85, 0x36,
0x03, 0x43, 0x27, 0x30, 0x81, 0x2e, 0xc5, 0xf8, 0xc5, 0x41, 0xeb, 0x1b, 0x1b, 0xc1, 0xca, 0x9b, 0x90, 0x35, 0x12, 0x89, 0x54, 0x44, 0xb2, 0x8f, 0x48, 0x54, 0xe9, 0xf7, 0xfb, 0xa8, 0x6a, 0x8d,
0x37, 0xb6, 0xb4, 0xbc, 0x6c, 0x43, 0xc3, 0xc3, 0x46, 0x74, 0x2e, 0x3e, 0x35, 0xe5, 0xc2, 0x3b, 0xc2, 0xdb, 0x44, 0x7b, 0xec, 0x58, 0xd9, 0x9b, 0xa3, 0xd9, 0xac, 0x9e, 0xa3, 0x40, 0x54, 0x23,
0xbb, 0xbb, 0x56, 0x5f, 0x5f, 0xef, 0x91, 0x22, 0xfe, 0xa2, 0xa5, 0xc5, 0xe4, 0x9c, 0x0b, 0xd5, 0x42, 0xef, 0x50, 0xe8, 0xd8, 0x56, 0x7e, 0x83, 0x59, 0x11, 0xa9, 0x2a, 0xfd, 0x5e, 0xaf, 0x4e,
0xd4, 0xd4, 0xd8, 0xa1, 0xee, 0x8f, 0x1e, 0x3d, 0xb2, 0xfc, 0xfc, 0x7c, 0x1b, 0x1a, 0x1a, 0xf2, 0x14, 0x51, 0xc5, 0x07, 0xee, 0xa2, 0x68, 0x1a, 0x7b, 0x6f, 0x5d, 0x9b, 0x97, 0xfb, 0x28, 0x9a,
0x68, 0x42, 0x3b, 0x8a, 0x82, 0x36, 0x04, 0xea, 0xed, 0xeb, 0xb3, 0xb1, 0xf1, 0x71, 0x2b, 0x2c, 0x89, 0x44, 0xb6, 0x73, 0xd4, 0x42, 0x16, 0xc7, 0xbe, 0xed, 0xb9, 0x91, 0xc8, 0x39, 0xc7, 0x74,
0x2c, 0x74, 0x20, 0x69, 0xc4, 0xf3, 0xb9, 0xb9, 0x39, 0x4f, 0x17, 0x11, 0x8e, 0xca, 0x10, 0x6f, 0x3a, 0xad, 0x2a, 0x3c, 0x14, 0xd1, 0x16, 0x82, 0x98, 0x26, 0x14, 0x6c, 0x25, 0x12, 0x55, 0x06,
0x6d, 0x6d, 0x55, 0xe4, 0x1b, 0x2e, 0x54, 0x5b, 0x57, 0x87, 0x98, 0x3d, 0x7e, 0xfc, 0xd8, 0x0a, 0x83, 0xc1, 0x86, 0x68, 0x5d, 0xe1, 0x12, 0x79, 0xdb, 0x46, 0xf4, 0x2d, 0xb9, 0xaa, 0x72, 0x34,
0x0a, 0x0a, 0x6c, 0x58, 0x8e, 0x1e, 0x1d, 0x1f, 0x27, 0xec, 0xf8, 0xe4, 0xe4, 0x1a, 0xb4, 0xb9, 0xf5, 0x75, 0xb4, 0x23, 0x17, 0x6d, 0x44, 0x6d, 0x74, 0xe1, 0x77, 0xb5, 0x1c, 0x35, 0x25, 0x7f,
0xb9, 0x19, 0x90, 0xa6, 0x49, 0x45, 0x90, 0x93, 0x93, 0x63, 0xe5, 0x77, 0xef, 0x7a, 0x54, 0x6f, 0x5f, 0xcd, 0x78, 0xdb, 0x5a, 0x8b, 0x73, 0x0e, 0xe7, 0x1c, 0x3e, 0x1d, 0x5b, 0xa1, 0x73, 0xeb,
0xdf, 0xbd, 0x73, 0xef, 0x0f, 0x94, 0x9a, 0xd1, 0xb1, 0x31, 0x1b, 0x93, 0x21, 0xde, 0xda, 0xd6, 0x5b, 0xd7, 0xed, 0x76, 0x6b, 0x5d, 0xba, 0xc9, 0xb3, 0x78, 0xb5, 0xd6, 0x6e, 0x4d, 0x2f, 0x06,
0x66, 0x72, 0xce, 0x85, 0xea, 0x04, 0x3a, 0xd6, 0xbd, 0xb2, 0xb2, 0xd2, 0x9d, 0x1c, 0x19, 0x19, 0x90, 0xa6, 0x69, 0x9d, 0xa8, 0x17, 0xdc, 0xba, 0x7d, 0xb5, 0xe2, 0xf7, 0xca, 0xb2, 0xc4, 0x5a,
0xb1, 0x93, 0x93, 0x93, 0xa8, 0x45, 0x40, 0x5b, 0x5b, 0x01, 0x29, 0xa3, 0x0e, 0x39, 0xb9, 0xb9, 0x4b, 0x59, 0x96, 0x18, 0x63, 0xb6, 0xc4, 0x54, 0x95, 0xc5, 0x62, 0x61, 0x00, 0x57, 0x11, 0xcd,
0x96, 0x2b, 0x7b, 0xf9, 0xf2, 0xa5, 0xa9, 0x49, 0xac, 0x45, 0xde, 0x53, 0x54, 0x20, 0xe3, 0x8a, 0xf2, 0x9c, 0x1f, 0xba, 0xdd, 0xc6, 0xb0, 0x34, 0x89, 0xfa, 0x03, 0x8b, 0xa2, 0xc0, 0x18, 0xc3,
0x18, 0x71, 0x9e, 0xe1, 0x08, 0x42, 0xa4, 0xf4, 0xf4, 0xf4, 0xd4, 0xaa, 0xaa, 0xaa, 0xac, 0xa8, 0x6a, 0xb5, 0x62, 0xb1, 0x58, 0xb0, 0x5c, 0x2e, 0x29, 0x8a, 0x82, 0x4e, 0xa7, 0x83, 0xb5, 0xd6,
0xa8, 0xc8, 0xa3, 0x3e, 0x3d, 0x3b, 0xb3, 0x33, 0x19, 0x77, 0x3d, 0xbb, 0x06, 0xa9, 0xb3, 0x02, 0x5e, 0x5d, 0x5d, 0xbd, 0x03, 0xe6, 0x1b, 0xa2, 0xa8, 0x33, 0xec, 0x0a, 0x9d, 0x17, 0x31, 0xc6,
0xea, 0x30, 0x2d, 0x10, 0x90, 0x5c, 0x15, 0x15, 0x31, 0x0a, 0x4e, 0x9a, 0x54, 0x50, 0x1b, 0x9f, 0x60, 0x8c, 0xe1, 0xe9, 0xe9, 0x89, 0x9b, 0x9b, 0x1b, 0x44, 0x84, 0x2c, 0xcb, 0xc8, 0xb2, 0x8c,
0x98, 0xb0, 0x09, 0x19, 0xe2, 0xed, 0xed, 0xed, 0xb6, 0xad, 0xd4, 0x02, 0x68, 0x6c, 0x6c, 0x74, 0xf9, 0x7c, 0xee, 0x2e, 0x2f, 0x2f, 0x5f, 0x8d, 0x46, 0xa3, 0xb7, 0xc0, 0x1f, 0x55, 0x1d, 0xe5,
0xd1, 0xea, 0xea, 0x6a, 0x2b, 0x2e, 0x2e, 0x76, 0x67, 0xce, 0xcf, 0xcf, 0xa3, 0x16, 0x01, 0x6d, 0x79, 0x5e, 0x8b, 0xed, 0xae, 0xab, 0xeb, 0x9c, 0xa3, 0x2c, 0xcb, 0x2a, 0x64, 0x45, 0x51, 0x20,
0x6f, 0x07, 0x0b, 0x6a, 0xe1, 0xe9, 0x99, 0x19, 0x87, 0xe4, 0xa9, 0xa8, 0x80, 0x48, 0x4f, 0x9b, 0x22, 0x1c, 0x1f, 0x1f, 0x33, 0x1c, 0x0e, 0x79, 0x7c, 0x7c, 0x74, 0x17, 0x17, 0x17, 0xbf, 0x8e,
0xd2, 0x44, 0x6a, 0x26, 0x27, 0x27, 0xdd, 0x10, 0xef, 0xe8, 0xe8, 0xb0, 0x1d, 0xa5, 0x1a, 0x21, 0x46, 0xa3, 0xd7, 0xc0, 0x2d, 0xf0, 0x39, 0xf5, 0x87, 0xf5, 0x7a, 0xbd, 0xbd, 0xf5, 0x20, 0x22,
0x40, 0xdc, 0x01, 0x95, 0x94, 0x94, 0xb8, 0x33, 0xf1, 0x78, 0x3c, 0x61, 0x49, 0x20, 0xd5, 0x27, 0xd5, 0xcd, 0xf2, 0xb9, 0x29, 0xcb, 0x92, 0xe5, 0x6a, 0xc5, 0xc1, 0xc1, 0x01, 0xb3, 0xd9, 0x8c,
0x98, 0x90, 0x08, 0x20, 0x20, 0x74, 0x4f, 0xc7, 0xab, 0x57, 0x0e, 0x02, 0x48, 0x14, 0x74, 0x20, 0x87, 0x87, 0x07, 0x7b, 0x7e, 0x7e, 0xfe, 0xcb, 0x78, 0x3c, 0x7e, 0x07, 0xfc, 0xe9, 0x9c, 0x5b,
0x11, 0xe3, 0xfd, 0x2b, 0x3d, 0xdb, 0x55, 0x06, 0x10, 0x6a, 0x6a, 0x6a, 0xf2, 0x7b, 0x43, 0x43, 0xd6, 0x3a, 0x43, 0x4c, 0xb4, 0x4b, 0xd4, 0x8b, 0x79, 0xb2, 0xe5, 0x62, 0xc1, 0xe1, 0xe1, 0x21,
0x43, 0x12, 0xe8, 0xe2, 0xe2, 0xe2, 0x7d, 0x90, 0xbc, 0x0b, 0x68, 0xe3, 0x59, 0x75, 0x18, 0x90, 0x93, 0xc9, 0xc4, 0x9c, 0x9e, 0x9e, 0xfe, 0x3c, 0x1e, 0x8f, 0xdf, 0x00, 0x13, 0x2f, 0xb2, 0xe9,
0x7c, 0x75, 0x4f, 0x67, 0x57, 0x97, 0xd7, 0x81, 0x88, 0x88, 0x82, 0x68, 0x00, 0xe1, 0x3d, 0x11, 0x0c, 0xdf, 0x48, 0xe4, 0x45, 0x42, 0xb1, 0xb2, 0x2c, 0x49, 0x92, 0x84, 0xfb, 0xfb, 0xfb, 0xf9,
0xed, 0xe9, 0x7d, 0x84, 0x88, 0x08, 0x51, 0x3a, 0x2f, 0x04, 0xf1, 0x39, 0x34, 0xbd, 0x93, 0x0c, 0xd9, 0xd9, 0xd9, 0x8f, 0xd7, 0xd7, 0xd7, 0xef, 0x81, 0x4f, 0xce, 0xb9, 0x32, 0xfc, 0x2e, 0x05,
0x1a, 0x18, 0x18, 0xf0, 0x89, 0x07, 0x42, 0x9b, 0x76, 0x75, 0x77, 0x5b, 0xbf, 0xce, 0x00, 0x13, 0xac, 0x26, 0x09, 0x59, 0x96, 0xed, 0xec, 0x02, 0x71, 0x2f, 0x4b, 0xd3, 0x14, 0xe7, 0x1c, 0x69,
0x05, 0x83, 0x49, 0xe1, 0x11, 0xe7, 0x79, 0xd8, 0x81, 0xb7, 0x6e, 0xdd, 0xf2, 0xe8, 0x2e, 0x2f, 0xa7, 0x63, 0x6e, 0x6f, 0x6f, 0x3f, 0x9c, 0x9c, 0x9c, 0xfc, 0x54, 0x14, 0xc5, 0xef, 0xc0, 0xbf,
0x2f, 0xed, 0xf6, 0xed, 0xdb, 0xee, 0x10, 0x7f, 0x87, 0x26, 0xd8, 0x35, 0x48, 0x2f, 0x06, 0x0c, 0xae, 0x21, 0xd9, 0xf2, 0x1f, 0xfc, 0x40, 0x16, 0xc0, 0x5f, 0xc0, 0x3f, 0x61, 0xa8, 0xe2, 0xf1,
0xdd, 0xbc, 0x40, 0x88, 0x14, 0xa8, 0x4d, 0x7b, 0x7a, 0x7a, 0x6c, 0x60, 0x70, 0xd0, 0xca, 0xcb, 0x05, 0x95, 0x9b, 0x4e, 0x78, 0x5f, 0x66, 0xb8, 0x85, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
0xcb, 0x3d, 0x8a, 0xe6, 0xe6, 0x66, 0x7b, 0xfe, 0xfc, 0xb9, 0x83, 0x2a, 0x2a, 0x2a, 0xbc, 0xbb, 0x44, 0xae, 0x42, 0x60, 0x82,
0x18, 0x5e, 0xc4, 0x19, 0xde, 0x10, 0x44, 0x8a, 0xaf, 0xae, 0xae, 0x12, 0xf6, 0x1e, 0x68, 0x76,
0x76, 0xd6, 0x16, 0x16, 0x16, 0x1c, 0xc4, 0x3c, 0xf4, 0xf6, 0xf6, 0xba, 0xa7, 0x9c, 0x21, 0x8e,
0x18, 0x5d, 0x48, 0x3a, 0x38, 0x63, 0xb6, 0x10, 0x47, 0x98, 0xe7, 0x88, 0xfe, 0x3b, 0x68, 0x6f,
0x2f, 0x60, 0x66, 0x58, 0x9e, 0x40, 0x98, 0x87, 0x3e, 0x6d, 0x0a, 0x22, 0x09, 0xbb, 0x27, 0xcc,
0x79, 0x34, 0x2d, 0x51, 0x41, 0xae, 0x3b, 0x77, 0xee, 0x78, 0x1d, 0xa3, 0xe7, 0x7a, 0xef, 0x1a,
0xa4, 0xc2, 0x06, 0x74, 0x18, 0xbb, 0x0c, 0x08, 0x46, 0xcd, 0xfe, 0x09, 0xf2, 0x77, 0x00, 0x17,
0xe7, 0xd1, 0xae, 0x0b, 0x9d, 0x4c, 0xea, 0x3a, 0x40, 0xaf, 0xb5, 0x75, 0x89, 0x08, 0x08, 0x83,
0x37, 0xa8, 0xfa, 0xd0, 0x04, 0xd4, 0x01, 0x08, 0xb3, 0x44, 0x9b, 0x23, 0x4e, 0x13, 0x20, 0xcc,
0x15, 0xd3, 0x46, 0x47, 0x90, 0x77, 0xc9, 0x06, 0xbb, 0x2e, 0xba, 0x54, 0xf5, 0xbd, 0x64, 0x90,
0x96, 0x9f, 0x2d, 0x6b, 0x99, 0x86, 0x20, 0xc0, 0xec, 0xad, 0x07, 0x0f, 0x1e, 0x38, 0xa8, 0x45,
0x3b, 0x8f, 0x99, 0x02, 0xc4, 0xd9, 0x8c, 0x66, 0x8e, 0x06, 0xe2, 0x5d, 0xea, 0xc7, 0xdf, 0x6c,
0x15, 0x52, 0xce, 0x30, 0x87, 0x26, 0x47, 0x2f, 0xc4, 0xf8, 0xf9, 0x4f, 0x50, 0x2c, 0x16, 0xd0,
0x96, 0x51, 0x10, 0xeb, 0x1e, 0x18, 0xe9, 0xc0, 0x7b, 0x06, 0x92, 0x99, 0x01, 0x54, 0x5a, 0x5a,
0xea, 0x9e, 0x13, 0x4d, 0x76, 0x76, 0xb6, 0xd7, 0x05, 0xd1, 0xce, 0xce, 0x4e, 0xdf, 0xf6, 0x2b,
0x2b, 0x2b, 0x6e, 0x4b, 0x2a, 0x85, 0x96, 0xed, 0x0b, 0x31, 0xbe, 0x71, 0x90, 0xbe, 0xe0, 0xed,
0xbd, 0xac, 0x87, 0x40, 0xe8, 0x1e, 0xa2, 0xa1, 0x6e, 0x00, 0x00, 0xf1, 0x19, 0xe3, 0xe2, 0x8c,
0x67, 0xa4, 0xb3, 0x5b, 0xf3, 0x46, 0x84, 0x6c, 0x88, 0x67, 0xcf, 0x9e, 0xf9, 0x1c, 0x01, 0x60,
0xe7, 0x49, 0xab, 0x49, 0xfa, 0xdf, 0xca, 0x3e, 0x4d, 0x80, 0xf8, 0x49, 0x7e, 0xa3, 0x1f, 0xbf,
0xb2, 0xb2, 0x32, 0x5f, 0x9a, 0xe4, 0x1c, 0x8f, 0xbb, 0xb4, 0x21, 0x00, 0x31, 0x63, 0x18, 0x17,
0x67, 0x2c, 0x55, 0x9c, 0x23, 0x12, 0xc4, 0xef, 0xdd, 0xbf, 0xef, 0xcf, 0x38, 0xc7, 0xa1, 0xac,
0xac, 0xac, 0x7b, 0x7f, 0x45, 0xf2, 0x89, 0x8e, 0x53, 0x12, 0x20, 0xc2, 0xa7, 0xd8, 0x14, 0x3f,
0xec, 0x36, 0xd2, 0xc3, 0x5c, 0x84, 0x20, 0xe6, 0x87, 0xd4, 0x21, 0xdc, 0xdf, 0xdf, 0xef, 0x8e,
0xe8, 0xb7, 0xcc, 0xcf, 0x59, 0x4b, 0x44, 0xa9, 0x26, 0xba, 0xba, 0x79, 0xf3, 0x66, 0xbe, 0x74,
0xbf, 0x0e, 0x21, 0x49, 0x20, 0x3a, 0x84, 0x28, 0x80, 0x91, 0x12, 0x06, 0x16, 0x50, 0xd8, 0xd2,
0x51, 0x10, 0xad, 0x4b, 0xd1, 0xf9, 0x09, 0x21, 0x0b, 0x44, 0x40, 0x5b, 0x2b, 0x8d, 0xf1, 0xcc,
0xcc, 0xcc, 0xdf, 0xa4, 0x99, 0x2a, 0xfb, 0x38, 0x84, 0x24, 0x81, 0x78, 0x19, 0x10, 0xf3, 0x43,
0x87, 0x11, 0x61, 0x74, 0x76, 0x58, 0x9a, 0x38, 0x10, 0x82, 0xf8, 0xcc, 0x08, 0xf0, 0xf3, 0xc0,
0xff, 0x0d, 0x5a, 0x51, 0xfb, 0xa9, 0xa9, 0xa9, 0xbf, 0x4a, 0xef, 0x73, 0xd9, 0x47, 0x51, 0x48,
0x08, 0xba, 0xa1, 0xf6, 0x5c, 0x93, 0x48, 0x5c, 0xd1, 0xc4, 0xb5, 0xa9, 0x13, 0x26, 0x70, 0x5c,
0xa2, 0x09, 0xe3, 0xe2, 0xce, 0x33, 0x65, 0x20, 0xae, 0x34, 0xc7, 0x55, 0x93, 0xb8, 0x20, 0xbd,
0xd2, 0xf9, 0x5e, 0xf6, 0xd9, 0x87, 0x20, 0x21, 0x88, 0x7f, 0xee, 0xd2, 0x65, 0x19, 0xff, 0xd1,
0xf8, 0xee, 0x57, 0xd1, 0x7a, 0x7c, 0xc8, 0xfe, 0x00, 0x0a, 0x0d, 0x10, 0x76, 0xc6, 0x00, 0x96,
0x87, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
}; };
const BITMAP_OPAQUE new_pcb_xpm[1] = {{ png, sizeof( png ), "new_pcb_xpm" }}; const BITMAP_OPAQUE new_pcb_xpm[1] = {{ png, sizeof( png ), "new_pcb_xpm" }};

View File

@ -8,214 +8,88 @@
static const unsigned char png[] = { static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9,
0x87, 0x00, 0x00, 0x0c, 0xdb, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xd5, 0x99, 0x7b, 0x6c, 0x54, 0x87, 0x00, 0x00, 0x05, 0x02, 0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xdd, 0x59, 0x5b, 0x6c, 0x14,
0xd7, 0x9d, 0x80, 0xbf, 0xfb, 0xf0, 0xcc, 0xd8, 0x1e, 0x3f, 0xc6, 0x9e, 0xf1, 0x1b, 0x1b, 0x1c, 0x55, 0x18, 0x5e, 0xdd, 0x52, 0x15, 0xcb, 0x92, 0x72, 0x79, 0xe0, 0x09, 0xd2, 0x68, 0x2f, 0x5a,
0x8c, 0xbd, 0xa6, 0x36, 0x09, 0x09, 0x10, 0x36, 0xae, 0x4b, 0x29, 0xc1, 0x09, 0x50, 0x85, 0x87, 0x7b, 0xd1, 0x07, 0x22, 0x18, 0x25, 0xb1, 0x69, 0x79, 0x81, 0x07, 0x4a, 0x94, 0x9a, 0x6a, 0xe8,
0x01, 0xb5, 0x8e, 0x20, 0x51, 0xac, 0x88, 0x26, 0x80, 0xaa, 0xb6, 0xa4, 0x34, 0x8d, 0xd2, 0xa8, 0x83, 0x49, 0x81, 0xc4, 0xc4, 0x07, 0x78, 0xb2, 0x17, 0x62, 0x4d, 0x78, 0xe0, 0x85, 0x47, 0x08,
0x5d, 0x56, 0x95, 0x1a, 0xd4, 0x55, 0x68, 0x57, 0x9b, 0x84, 0x50, 0x20, 0x9b, 0x22, 0x2d, 0x54, 0xf0, 0x80, 0xbd, 0x28, 0xb1, 0xb6, 0x15, 0xbc, 0xd4, 0x00, 0x2b, 0x6d, 0x43, 0xbb, 0x97, 0xd9,
0x21, 0x29, 0x24, 0x4d, 0xe4, 0x50, 0x20, 0x6e, 0x03, 0xd4, 0xa1, 0x6e, 0x30, 0x25, 0x25, 0x7e, 0xad, 0xc4, 0xc6, 0xb4, 0x6b, 0x43, 0x8a, 0x10, 0xaa, 0xc1, 0x42, 0xd5, 0xa5, 0xed, 0x76, 0xb6,
0xe1, 0x07, 0x7e, 0x8e, 0x3d, 0xf6, 0xd8, 0x33, 0x9e, 0xc7, 0xbd, 0x67, 0xff, 0xb0, 0xe7, 0xe2, 0xbf, 0xff, 0x7f, 0x3a, 0x67, 0x33, 0x3b, 0x3d, 0xbb, 0x7b, 0x66, 0x76, 0x26, 0x05, 0x37, 0xf9,
0xf1, 0x8c, 0x89, 0xcd, 0x2e, 0x2b, 0xed, 0x91, 0xae, 0xce, 0xb9, 0xe7, 0xde, 0x73, 0xce, 0xef, 0x32, 0xf3, 0xcd, 0xce, 0x9c, 0x39, 0xdf, 0x9c, 0xef, 0x3f, 0xff, 0x3f, 0x67, 0x5c, 0x00, 0xe0,
0xfd, 0x3a, 0x92, 0x10, 0x82, 0xff, 0xcf, 0x4d, 0x0d, 0x0d, 0xb6, 0x6d, 0xdb, 0xf6, 0xb4, 0xd9, 0x4a, 0x05, 0xfc, 0x3d, 0x8f, 0x28, 0x4b, 0x77, 0x8e, 0x15, 0xe0, 0xef, 0x29, 0xc4, 0x6b, 0xd4,
0x6c, 0xce, 0x51, 0x55, 0x15, 0x59, 0x96, 0x51, 0x55, 0x95, 0xc9, 0xe3, 0xc9, 0xbd, 0xa2, 0x28, 0x7e, 0xd6, 0x6d, 0x09, 0x1a, 0xcf, 0x41, 0x94, 0x22, 0xde, 0x47, 0x7c, 0x8a, 0x78, 0xcb, 0x6e,
0xa8, 0xea, 0xf8, 0xd2, 0xe9, 0xfe, 0x99, 0xfc, 0x08, 0x21, 0x3a, 0x9e, 0x7c, 0xf2, 0xc9, 0xd7, 0x01, 0xda, 0x7d, 0xde, 0xd6, 0xda, 0xa7, 0xfb, 0xbc, 0x8c, 0x70, 0x67, 0x25, 0x40, 0x6b, 0xe4,
0xee, 0x1a, 0x02, 0x4f, 0x3c, 0xf1, 0xc4, 0xee, 0x17, 0x5e, 0x78, 0xe1, 0xe5, 0xa4, 0xa4, 0xa4, 0x00, 0xa2, 0x19, 0xf1, 0x99, 0x0e, 0x2f, 0x21, 0x36, 0x3b, 0x80, 0x57, 0x0c, 0xf7, 0x69, 0x42,
0x18, 0x00, 0x49, 0x92, 0x98, 0xda, 0x0b, 0x21, 0x90, 0x24, 0x29, 0x6c, 0x3c, 0xb5, 0x45, 0x9b, 0xbc, 0x8b, 0x28, 0x36, 0xf9, 0x20, 0x5c, 0x79, 0x88, 0x06, 0x43, 0x63, 0xab, 0x8d, 0x7a, 0xc4,
0x13, 0x42, 0xa0, 0x69, 0x5a, 0xf0, 0xe8, 0xd1, 0xa3, 0xea, 0xb6, 0x6d, 0xdb, 0xfe, 0xfd, 0xae, 0x73, 0xd2, 0x23, 0xa0, 0x79, 0x92, 0x6c, 0xf3, 0x1e, 0xa2, 0x65, 0x95, 0x46, 0xe0, 0x13, 0xc4,
0x20, 0x60, 0x32, 0x99, 0x8a, 0x6d, 0x36, 0x5b, 0x8c, 0xae, 0xeb, 0xc6, 0xa1, 0x00, 0xa3, 0x17, 0x3b, 0x88, 0xa2, 0x6c, 0x63, 0x60, 0x0d, 0x05, 0x2e, 0xe2, 0xa0, 0xe6, 0xd1, 0x37, 0x1d, 0x8a,
0x2f, 0x62, 0xca, 0xcd, 0x45, 0xcd, 0xc8, 0x08, 0x9b, 0x8f, 0xd6, 0x87, 0x9e, 0xa9, 0xef, 0x42, 0x81, 0x2a, 0xc4, 0x71, 0xed, 0xa1, 0x95, 0x64, 0x1d, 0x03, 0x29, 0x6e, 0xe2, 0x41, 0xbc, 0xea,
0x08, 0x6c, 0x36, 0x9b, 0x6a, 0x32, 0x99, 0x0a, 0xef, 0x06, 0x07, 0xe4, 0xa9, 0x14, 0x94, 0x24, 0xd0, 0x2c, 0x54, 0x2e, 0x6b, 0x13, 0xcb, 0x02, 0x9e, 0x04, 0xfc, 0x2f, 0x04, 0xe4, 0x20, 0x0e,
0x09, 0x59, 0x96, 0xc1, 0xe3, 0xa1, 0xe3, 0xe9, 0xa7, 0x69, 0xdd, 0xb8, 0x11, 0xd7, 0xb1, 0x63, 0x20, 0xbc, 0x88, 0x87, 0xab, 0x8c, 0x07, 0x88, 0x1f, 0x11, 0xfb, 0x11, 0x6e, 0x81, 0xf5, 0x9e,
0x48, 0x93, 0x38, 0x30, 0xdb, 0x27, 0x24, 0x6a, 0x77, 0x15, 0x81, 0xc9, 0xc0, 0x4f, 0x16, 0x85, 0x15, 0x09, 0x68, 0x08, 0x06, 0x83, 0xf0, 0xb8, 0x21, 0x16, 0x8b, 0x7d, 0x20, 0x10, 0x50, 0x27,
0xcc, 0xea, 0x6a, 0x06, 0x5e, 0x7d, 0x95, 0xb6, 0xed, 0xdb, 0x09, 0x34, 0x35, 0x85, 0xfd, 0x33, 0x12, 0x10, 0xa6, 0x0b, 0xf4, 0x3f, 0x11, 0x1f, 0x9f, 0x1d, 0x87, 0xae, 0x5b, 0x5d, 0x70, 0x54,
0x1d, 0xb0, 0x93, 0xf7, 0x9b, 0x2a, 0x8e, 0x77, 0x95, 0x03, 0x53, 0x01, 0x03, 0xb0, 0x6f, 0xd8, 0x39, 0xca, 0xf8, 0x86, 0x2f, 0x37, 0x80, 0xeb, 0x73, 0x17, 0x03, 0x71, 0xbe, 0x2f, 0xc3, 0x47,
0xc0, 0xa2, 0x3f, 0xfe, 0x91, 0xb8, 0x79, 0xf3, 0x68, 0xdd, 0xba, 0x95, 0xfe, 0x5f, 0xfd, 0x0a, 0x02, 0x23, 0x70, 0x7a, 0xe2, 0x34, 0x3c, 0x52, 0x1f, 0xb1, 0xf6, 0x15, 0x45, 0x81, 0x78, 0x3c,
0x02, 0x81, 0x19, 0x51, 0x7d, 0x72, 0xd3, 0x34, 0xed, 0xff, 0x86, 0x03, 0xd1, 0x80, 0x88, 0x49, 0x9e, 0xb8, 0x1f, 0x71, 0x55, 0x55, 0x07, 0x0d, 0x9d, 0x7f, 0x41, 0x9b, 0x6e, 0x0b, 0x8d, 0x02,
0x4d, 0xa5, 0xe0, 0xc0, 0x01, 0x0a, 0x0f, 0x1d, 0x62, 0xe4, 0xfd, 0xf7, 0x69, 0xad, 0xac, 0xc4, 0x20, 0x9d, 0x80, 0xa9, 0x7f, 0xa7, 0x4c, 0x77, 0x30, 0x13, 0xbf, 0x11, 0xb8, 0xc1, 0xb6, 0x9b,
0x7b, 0xf9, 0x72, 0x18, 0x75, 0xbf, 0x0c, 0x99, 0x60, 0x30, 0x78, 0xf7, 0xcc, 0x68, 0x34, 0x36, 0x2e, 0x6e, 0x82, 0xa6, 0xd1, 0x26, 0xa1, 0x80, 0xa5, 0xa5, 0xa5, 0x87, 0x06, 0x01, 0xb5, 0x9a,
0x47, 0xa3, 0x62, 0xf2, 0x8a, 0x15, 0x2c, 0xaa, 0xa9, 0xa1, 0x7d, 0xff, 0x7e, 0xda, 0xab, 0xab, 0x80, 0xfd, 0xa6, 0x04, 0xf4, 0xdc, 0xee, 0x71, 0x4c, 0x00, 0xc7, 0x70, 0x60, 0x18, 0xae, 0xdd,
0x49, 0xda, 0xb0, 0x01, 0xc7, 0x77, 0xbf, 0x8b, 0x64, 0xb5, 0x46, 0xfd, 0xbf, 0xab, 0xab, 0x8b, 0xbb, 0x96, 0x52, 0x00, 0xe5, 0x08, 0x2d, 0xd1, 0xf1, 0x84, 0xe7, 0x5e, 0x21, 0xe0, 0x71, 0x03,
0x9a, 0x9a, 0x1a, 0x54, 0x55, 0xa5, 0xb7, 0xb7, 0x77, 0xe3, 0xc5, 0x8b, 0x17, 0x4b, 0x14, 0x45, 0x8e, 0x88, 0x5e, 0x40, 0xb1, 0x21, 0x6b, 0x17, 0xaf, 0x10, 0x40, 0x43, 0xc8, 0xa1, 0xe7, 0xb5,
0x31, 0xcc, 0xad, 0xa2, 0x28, 0x86, 0x49, 0x9e, 0x3c, 0x3f, 0xd5, 0x64, 0x87, 0xbe, 0x4d, 0x7e, 0x3f, 0xd5, 0x32, 0x9e, 0xdb, 0x9e, 0x9b, 0x40, 0xb6, 0x9c, 0x9e, 0xb8, 0x91, 0xe7, 0x75, 0xe4,
0x00, 0xdd, 0xef, 0xf7, 0xbf, 0xa8, 0x4e, 0x06, 0x38, 0xd0, 0xd1, 0x41, 0xf7, 0xcb, 0x2f, 0x23, 0x41, 0xc5, 0xe5, 0x0a, 0x88, 0xa9, 0x31, 0xd1, 0x08, 0xd4, 0x19, 0x04, 0xd4, 0x49, 0x5b, 0x68,
0x34, 0x0d, 0x31, 0x41, 0x31, 0x11, 0x0c, 0xd2, 0x7d, 0xf8, 0x30, 0x3d, 0x47, 0x8e, 0x18, 0x80, 0xeb, 0xd7, 0x5b, 0x1d, 0xb7, 0x10, 0x71, 0x12, 0x42, 0xfb, 0xe7, 0x7f, 0x3b, 0x9f, 0x24, 0x80,
0x2d, 0x38, 0x78, 0x10, 0xfb, 0xfa, 0xf5, 0x34, 0xed, 0xd9, 0x43, 0xcb, 0x86, 0x0d, 0xa4, 0xed, 0xb2, 0xb5, 0x56, 0x72, 0xe8, 0x05, 0x1c, 0xe7, 0x59, 0x3c, 0xad, 0x80, 0x99, 0x85, 0x19, 0xe9,
0xdd, 0x8b, 0xf5, 0x1b, 0xdf, 0x88, 0x40, 0xa0, 0xa6, 0xa6, 0x86, 0x67, 0x9e, 0x79, 0x26, 0xf4, 0x0e, 0x6e, 0xf9, 0x6a, 0x0b, 0x54, 0x7e, 0x5b, 0x09, 0x05, 0x3d, 0x05, 0x59, 0x09, 0xa8, 0xb9,
0x9a, 0x23, 0x49, 0x52, 0xce, 0x4c, 0xa8, 0x1a, 0x32, 0xd5, 0xd3, 0x35, 0x21, 0x04, 0xb2, 0x2c, 0x5a, 0x63, 0x14, 0x40, 0x25, 0x47, 0x8d, 0xae, 0xf8, 0xab, 0x40, 0x54, 0xd3, 0xf1, 0x27, 0x22,
0x53, 0x5b, 0x5b, 0x3b, 0x5f, 0x9d, 0x3c, 0xa9, 0x58, 0xad, 0xc4, 0x16, 0x15, 0x81, 0x10, 0xe8, 0x06, 0xa8, 0x6e, 0xd2, 0xb6, 0xf9, 0x9a, 0x80, 0xcd, 0x49, 0xc7, 0xd3, 0xc5, 0xc0, 0xa9, 0x5f,
0x3e, 0x1f, 0xee, 0x73, 0xe7, 0x40, 0x96, 0xb1, 0x6f, 0xdc, 0x88, 0x6d, 0xd5, 0x2a, 0x63, 0x03, 0x4f, 0x25, 0x3c, 0xdc, 0x3a, 0xda, 0x0a, 0x91, 0xd9, 0xc8, 0x8a, 0x18, 0x91, 0xe5, 0x9e, 0x2e,
0x53, 0x7a, 0x3a, 0x52, 0x4c, 0x0c, 0x25, 0xa7, 0x4e, 0xd1, 0xf5, 0xfa, 0xeb, 0x74, 0xfc, 0xf8, 0x4f, 0xc6, 0x18, 0x48, 0xc4, 0x8c, 0x12, 0x14, 0x4d, 0xa3, 0x49, 0x02, 0xa4, 0x62, 0xa0, 0xf7,
0xc7, 0xc4, 0x9f, 0x3e, 0x8d, 0x63, 0xef, 0x5e, 0x14, 0x87, 0xc3, 0xf8, 0x2f, 0x21, 0x21, 0x01, 0x76, 0x2f, 0x0c, 0xfd, 0x39, 0x04, 0x32, 0x89, 0x2e, 0x13, 0x6f, 0xf9, 0xb9, 0x45, 0xca, 0x42,
0x80, 0xb1, 0xb1, 0xb1, 0xdb, 0x02, 0x33, 0x75, 0x7c, 0x3b, 0x93, 0x1c, 0x9a, 0x8b, 0x8b, 0x8b, 0xcc, 0x72, 0x76, 0x09, 0xb0, 0x93, 0x0f, 0xfc, 0x31, 0xe0, 0xac, 0x00, 0x0a, 0x1c, 0x0e, 0x27,
0x23, 0x29, 0x29, 0x49, 0x09, 0xe3, 0x40, 0x8c, 0xdd, 0x4e, 0xc6, 0xce, 0x9d, 0xe3, 0x4a, 0x37, 0x38, 0x75, 0x8a, 0x3a, 0x4a, 0x20, 0xce, 0xf7, 0x53, 0x71, 0x7d, 0x1e, 0x90, 0x12, 0x60, 0xd6,
0x3c, 0x4c, 0xef, 0x6b, 0xaf, 0x21, 0xc9, 0x32, 0x6a, 0x62, 0x22, 0x6a, 0x62, 0x62, 0x24, 0xa5, 0xd3, 0x46, 0x1e, 0x8d, 0x45, 0x61, 0x62, 0x76, 0x02, 0x06, 0xa6, 0x07, 0x18, 0xf7, 0xde, 0xf3,
0x54, 0x95, 0xac, 0xef, 0x7c, 0x87, 0xd4, 0xb5, 0x6b, 0x69, 0xda, 0xbb, 0x97, 0xd6, 0x8d, 0x1b, 0x26, 0x40, 0xbc, 0xed, 0x66, 0x9b, 0x74, 0x0c, 0xa4, 0x28, 0x25, 0xb2, 0xb7, 0xd0, 0xfd, 0xf9,
0xb1, 0xef, 0xde, 0x4d, 0xe2, 0xa6, 0x4d, 0x11, 0xd6, 0x28, 0x5a, 0xab, 0xaf, 0xaf, 0xe7, 0xcc, 0xfb, 0xd0, 0x79, 0xab, 0x93, 0xf1, 0xc3, 0xbe, 0xc3, 0xb0, 0xc7, 0xbb, 0x87, 0x25, 0x1f, 0x3b,
0x99, 0x33, 0x51, 0xa9, 0x3d, 0xe1, 0x3f, 0xa8, 0xaa, 0xaa, 0x0a, 0x89, 0x4c, 0x04, 0xc2, 0x92, 0xf3, 0x40, 0x6e, 0x87, 0xcd, 0x02, 0xe6, 0xd4, 0x39, 0xc6, 0xab, 0xaf, 0x54, 0x43, 0x4e, 0x7b,
0x24, 0xa1, 0x4e, 0xe7, 0x49, 0x67, 0x63, 0xf6, 0xcc, 0xb9, 0xb9, 0x14, 0xff, 0xf6, 0xb7, 0x74, 0x8e, 0xe3, 0x89, 0xac, 0xa8, 0xaf, 0xc8, 0x9a, 0x00, 0x91, 0x87, 0x03, 0x4a, 0x80, 0x0d, 0xaf,
0xbd, 0xfe, 0x3a, 0x37, 0x7e, 0xf6, 0x33, 0xfa, 0x5f, 0x79, 0x05, 0xc9, 0x6c, 0x26, 0xb0, 0x6e, 0x8c, 0x67, 0xed, 0xe2, 0xbe, 0xa0, 0xcf, 0x9e, 0x18, 0xd8, 0x7d, 0x75, 0xb7, 0x6d, 0xb5, 0x8f,
0x9d, 0xb1, 0x57, 0xc7, 0x48, 0x07, 0xdb, 0xdf, 0xdf, 0x8e, 0x2e, 0x74, 0x1e, 0xce, 0x7b, 0x98, 0x6c, 0x2d, 0x44, 0xfb, 0x94, 0x6f, 0xb2, 0xb2, 0xd0, 0xf4, 0xdc, 0xb4, 0xed, 0xb5, 0x8f, 0x19,
0xe7, 0x97, 0x3d, 0xcf, 0xd1, 0xa3, 0x47, 0x71, 0x3a, 0x9d, 0xe4, 0xe6, 0xe6, 0xe2, 0x74, 0x3a, 0x0b, 0x75, 0x4f, 0x75, 0x5b, 0x17, 0x40, 0x7e, 0x2f, 0xf9, 0xa6, 0x64, 0x55, 0x05, 0x4c, 0xfe,
0x51, 0x55, 0x95, 0x60, 0x30, 0x88, 0xa2, 0x28, 0xc4, 0xc6, 0xc6, 0x72, 0xe6, 0xcc, 0x19, 0x96, 0x33, 0x69, 0x3d, 0x06, 0xfc, 0x41, 0xbf, 0x69, 0xcf, 0xf2, 0x18, 0x21, 0xef, 0xd2, 0xf5, 0x81,
0x2f, 0x5f, 0x0e, 0x0e, 0xd8, 0xf6, 0xc1, 0x36, 0x74, 0xa1, 0x53, 0x91, 0x5b, 0xc1, 0x8b, 0x4b, 0x60, 0x80, 0x71, 0xda, 0x72, 0xc8, 0xb6, 0x47, 0x6d, 0xf1, 0x18, 0x34, 0x1d, 0x03, 0x63, 0x0f,
0x5f, 0xbc, 0xe5, 0x5f, 0xa2, 0x21, 0x20, 0x49, 0x12, 0x42, 0x0e, 0xb3, 0xb0, 0x8c, 0xd4, 0xd7, 0xc6, 0x60, 0x6d, 0xc7, 0x5a, 0x69, 0x4f, 0xef, 0xf3, 0xee, 0x63, 0x6f, 0x51, 0x6a, 0x5c, 0x95,
0xd3, 0xfe, 0x8b, 0x5f, 0xf0, 0x4f, 0x6f, 0xbd, 0x15, 0x15, 0x89, 0xfe, 0xb7, 0xdf, 0xa6, 0xf3, 0xca, 0x13, 0x32, 0x31, 0xb0, 0xab, 0x7f, 0x17, 0x3b, 0xdf, 0xd2, 0x08, 0x1c, 0x0b, 0x1d, 0x33,
0xd7, 0xbf, 0x26, 0xb6, 0xa4, 0x84, 0xc4, 0x4d, 0x9b, 0x50, 0xec, 0x76, 0xd4, 0x96, 0x16, 0x83, 0x65, 0x09, 0xd9, 0x52, 0x22, 0xf2, 0x77, 0x44, 0xda, 0x42, 0x47, 0xfc, 0x47, 0xd2, 0xbd, 0x13,
0x03, 0xbd, 0x9e, 0x5e, 0xae, 0xf4, 0x5d, 0x01, 0x20, 0x3d, 0x2e, 0xdd, 0x38, 0x6b, 0xc9, 0x92, 0xa7, 0x17, 0x40, 0x75, 0xbc, 0x8c, 0x80, 0xd2, 0x4b, 0xa5, 0xa6, 0x04, 0x9c, 0xf8, 0xe5, 0x84,
0x25, 0xec, 0xda, 0xb5, 0x8b, 0x43, 0x87, 0x0e, 0xe1, 0xf3, 0xf9, 0x70, 0xb9, 0x5c, 0x94, 0x94, 0xb4, 0x80, 0x33, 0x91, 0x33, 0xd6, 0x05, 0x98, 0x9d, 0xa7, 0x65, 0x6b, 0x21, 0x5a, 0x42, 0x91,
0x94, 0xb0, 0x78, 0xf1, 0x62, 0x9e, 0x7a, 0xea, 0x29, 0x84, 0x10, 0x38, 0xbd, 0x4e, 0xda, 0xdd, 0x6d, 0x9f, 0xea, 0x25, 0xcb, 0x31, 0x20, 0x3b, 0x8f, 0x9f, 0x8b, 0x9c, 0x93, 0xae, 0x95, 0xfa,
0xed, 0x00, 0x34, 0x0d, 0x35, 0x19, 0x6b, 0x85, 0x10, 0x84, 0x89, 0x90, 0xf0, 0x7a, 0x71, 0x7d, 0xa6, 0xfa, 0xa4, 0xf3, 0xc0, 0xfa, 0xce, 0xf5, 0xac, 0x9e, 0xb2, 0x1c, 0x03, 0xb2, 0xd3, 0x60,
0xf8, 0xe1, 0xb8, 0x12, 0x87, 0xe4, 0x56, 0x08, 0x9c, 0xef, 0xbe, 0x4b, 0xf7, 0x9b, 0x6f, 0xe2, 0xf3, 0x68, 0xb3, 0x94, 0x85, 0xee, 0x44, 0xef, 0xc0, 0xc6, 0x8b, 0x1b, 0xa5, 0xa7, 0xd1, 0xb2,
0xbd, 0x7e, 0x9d, 0x7f, 0x54, 0x57, 0x33, 0xf7, 0x27, 0x3f, 0xc1, 0x3c, 0x67, 0x0e, 0x00, 0xbe, 0x4b, 0x65, 0x99, 0xd6, 0x85, 0xec, 0x11, 0x50, 0x7e, 0xb9, 0x5c, 0x4a, 0xc0, 0xce, 0x1f, 0x76,
0x8e, 0x0e, 0x9a, 0x7f, 0xf4, 0x23, 0xdc, 0x75, 0x75, 0x38, 0x76, 0xef, 0x26, 0x79, 0xcb, 0x16, 0x9a, 0xca, 0x03, 0xf5, 0x83, 0xf5, 0xd9, 0x09, 0x30, 0x5b, 0xbb, 0xa4, 0xf2, 0xbc, 0x99, 0x79,
0x84, 0x24, 0xa1, 0xeb, 0x3a, 0x72, 0x77, 0xb7, 0xe1, 0x5f, 0x2c, 0xaa, 0xe5, 0x16, 0xc7, 0x54, 0x5f, 0xcf, 0x29, 0x87, 0xe8, 0xdb, 0x73, 0x2c, 0x06, 0x38, 0xdf, 0xd6, 0xbd, 0x0d, 0x1a, 0x87,
0xb3, 0x21, 0x16, 0x21, 0x04, 0xcb, 0xca, 0xca, 0xf8, 0xe0, 0x83, 0x0f, 0xb0, 0x5a, 0xad, 0x2c, 0x1b, 0xe1, 0xe4, 0xd8, 0x49, 0xc6, 0x69, 0xfd, 0xa8, 0xb0, 0xb7, 0xd0, 0x72, 0x2d, 0xd4, 0xff,
0x5e, 0xbc, 0x38, 0x8c, 0x98, 0xf1, 0x31, 0xf1, 0xc6, 0xda, 0xc9, 0x63, 0x5d, 0xd7, 0xc3, 0x39, 0x7b, 0x7f, 0x22, 0x86, 0x0c, 0xab, 0x12, 0xf4, 0xf1, 0xf1, 0x0d, 0x44, 0x01, 0x5f, 0x1b, 0x45,
0xe0, 0xbf, 0x79, 0x93, 0x9e, 0x43, 0x87, 0x40, 0x08, 0xc4, 0x84, 0xe3, 0xd1, 0xfd, 0x7e, 0xe2, 0xbc, 0x8e, 0xa8, 0x4c, 0x12, 0xe0, 0xf9, 0xc2, 0xe3, 0x58, 0xe9, 0x20, 0x63, 0xa1, 0xbb, 0xd1,
0x4b, 0x4b, 0x49, 0xa9, 0xa8, 0xa0, 0x6f, 0x68, 0x88, 0xf4, 0xc7, 0x1f, 0x47, 0xb5, 0xd9, 0x10, 0xbb, 0x42, 0x0b, 0xd1, 0x92, 0xba, 0x60, 0x5d, 0xa8, 0x8d, 0xbe, 0x1e, 0x25, 0x09, 0xd8, 0xeb,
0x9a, 0x46, 0xf7, 0x1b, 0x6f, 0xd0, 0xbe, 0x7f, 0x3f, 0xf1, 0x4b, 0x97, 0x92, 0x7f, 0xf2, 0x24, 0xdd, 0x6b, 0x6b, 0x87, 0x29, 0x56, 0xaa, 0xae, 0x54, 0x49, 0xaf, 0x8d, 0xa6, 0x5b, 0xdc, 0x15,
0x6a, 0x7a, 0xfa, 0xb8, 0x8c, 0x4e, 0x0a, 0xf6, 0x42, 0x00, 0x96, 0xa6, 0x95, 0x72, 0xe5, 0xc9, 0xac, 0xcc, 0x35, 0x08, 0x6b, 0x21, 0x6a, 0xc8, 0xae, 0xfa, 0x9e, 0xe7, 0x00, 0xab, 0x31, 0x95,
0x2b, 0x68, 0x42, 0x23, 0xc5, 0x92, 0x12, 0x21, 0xae, 0x45, 0x45, 0x45, 0x14, 0x16, 0x16, 0x1a, 0x61, 0x6d, 0xb4, 0x62, 0x85, 0x00, 0x55, 0x55, 0xe1, 0xec, 0xf8, 0x59, 0x58, 0xd7, 0xb9, 0x8e,
0xca, 0xda, 0xd3, 0xd3, 0x63, 0x7c, 0xbf, 0x37, 0xed, 0x5e, 0x3e, 0xdf, 0xfe, 0x39, 0xba, 0xd0, 0x71, 0xda, 0x72, 0x98, 0xe1, 0x3b, 0xbe, 0xdb, 0xb1, 0xfc, 0x8e, 0xbc, 0x10, 0x85, 0xfc, 0xae,
0xb1, 0x28, 0x16, 0x63, 0xcf, 0x08, 0x04, 0x62, 0x0b, 0x0a, 0x58, 0x78, 0xea, 0x14, 0x92, 0x24, 0x7c, 0xe1, 0xf9, 0xf4, 0xa0, 0xf4, 0x9c, 0x02, 0x38, 0x16, 0x8b, 0xb1, 0x3e, 0x10, 0x04, 0x23,
0xa1, 0x0d, 0x0f, 0xf3, 0x69, 0x69, 0x29, 0xb2, 0xd9, 0x8c, 0x65, 0xee, 0x5c, 0x52, 0x1e, 0x7d, 0xf0, 0xb4, 0x6e, 0x75, 0xba, 0x15, 0x91, 0x9b, 0xf2, 0x7d, 0xe0, 0x90, 0xef, 0x90, 0x25, 0xcb,
0x14, 0x49, 0x55, 0x49, 0x5e, 0xb1, 0x82, 0xd1, 0xab, 0x57, 0x69, 0xde, 0xb3, 0x07, 0x5f, 0x77, 0xd0, 0xeb, 0x26, 0xad, 0xf5, 0x2f, 0xc4, 0x17, 0x18, 0x0f, 0xcf, 0x84, 0xa5, 0x63, 0x80, 0x66,
0x37, 0xd9, 0xfb, 0xf6, 0x91, 0x58, 0x51, 0x81, 0xae, 0xeb, 0xd3, 0x9a, 0x3e, 0x49, 0x92, 0xd0, 0x2e, 0x13, 0xdf, 0x07, 0xea, 0x8d, 0xb3, 0xd0, 0x98, 0x68, 0x1e, 0xdf, 0xfe, 0xfd, 0x76, 0x29,
0x84, 0xc6, 0x75, 0xd7, 0x75, 0x84, 0x10, 0xe4, 0x27, 0xe7, 0x93, 0x60, 0x4e, 0xf8, 0x52, 0x25, 0x01, 0xee, 0x76, 0xf7, 0xb2, 0x05, 0xfe, 0x52, 0x92, 0xae, 0xbf, 0x30, 0x79, 0x41, 0x5a, 0x00,
0x0f, 0xb5, 0xb1, 0xe0, 0x18, 0x67, 0x3b, 0xce, 0xa2, 0xe9, 0x1a, 0x85, 0xb6, 0x42, 0x16, 0x24, 0x95, 0x10, 0x82, 0x2f, 0x34, 0x3e, 0x83, 0x80, 0x17, 0x35, 0x01, 0xe5, 0x46, 0x01, 0x8d, 0xec,
0x2f, 0x88, 0x2e, 0x42, 0xb7, 0x0b, 0x07, 0xcc, 0xd9, 0xd9, 0xa4, 0x6d, 0xdd, 0xca, 0x8d, 0x7d, 0x89, 0x85, 0xc3, 0x09, 0x70, 0xee, 0x57, 0xfc, 0x30, 0x1c, 0x5c, 0xae, 0xf7, 0x07, 0x03, 0x83,
0xfb, 0xe8, 0x3e, 0x78, 0x10, 0xdb, 0xfa, 0xf5, 0xe4, 0xbd, 0xf1, 0x06, 0x72, 0x42, 0x82, 0x11, 0x70, 0xdd, 0x7f, 0x9d, 0x81, 0x9e, 0xd8, 0x50, 0x60, 0x08, 0x46, 0x94, 0x11, 0x08, 0x85, 0x42,
0x5e, 0x47, 0x43, 0x20, 0xb4, 0xd7, 0xc5, 0xce, 0x8b, 0x6c, 0x7a, 0x7b, 0xdc, 0x3a, 0xad, 0x9a, 0x20, 0xba, 0x3e, 0x14, 0x0e, 0xb1, 0xff, 0xf8, 0xff, 0x7c, 0x3f, 0x15, 0x37, 0x5e, 0x8f, 0x96,
0xbb, 0x8a, 0x13, 0xeb, 0x4f, 0x44, 0x0d, 0xd7, 0xa3, 0xe9, 0xe3, 0x85, 0xee, 0x0b, 0xec, 0xf8, 0xfa, 0x50, 0xf0, 0x8d, 0xec, 0x20, 0x5f, 0x13, 0xd5, 0x0b, 0x78, 0x66, 0x7e, 0x7e, 0xfe, 0xe3,
0x68, 0x07, 0x00, 0x15, 0x79, 0x15, 0x1c, 0x5c, 0x75, 0xd0, 0x08, 0x4f, 0x66, 0x1c, 0x22, 0x0e, 0xc5, 0xc5, 0xc5, 0x9b, 0xdc, 0x83, 0xab, 0x09, 0xec, 0x87, 0x82, 0xfd, 0xf9, 0x08, 0xfb, 0xb5,
0x7d, 0xfc, 0x31, 0xcd, 0x7b, 0xf7, 0x82, 0x2c, 0x93, 0xff, 0x9b, 0xdf, 0x10, 0xbf, 0x74, 0x69, 0x46, 0x20, 0x20, 0xcf, 0x78, 0xec, 0x3f, 0x1b, 0x75, 0xce, 0x5d, 0xf3, 0xcf, 0xc0, 0x5f, 0x00,
0x98, 0x6d, 0xbe, 0x9d, 0x53, 0x92, 0x24, 0x09, 0xa4, 0x70, 0x13, 0x19, 0x0d, 0x58, 0x31, 0x45, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
0xf4, 0x8c, 0x5e, 0x9a, 0xde, 0x87, 0x84, 0x39, 0xb2, 0x68, 0x4e, 0x25, 0x38, 0x30, 0x40, 0xe3,
0x81, 0x03, 0x38, 0xdf, 0x79, 0x87, 0xb4, 0xea, 0x6a, 0xd2, 0x77, 0xee, 0x44, 0x32, 0x99, 0x22,
0x00, 0x9f, 0x8e, 0xfa, 0xa1, 0x7e, 0xbe, 0x6d, 0x3e, 0x95, 0x45, 0x95, 0x08, 0x21, 0x28, 0x9f,
0x53, 0x1e, 0xa1, 0x23, 0xb7, 0xdb, 0x67, 0x61, 0xea, 0x42, 0xb6, 0x17, 0x8f, 0x9b, 0xe0, 0x87,
0xb2, 0x1e, 0x32, 0xd6, 0x44, 0x70, 0x20, 0x1a, 0x02, 0xd7, 0xaa, 0xaa, 0x88, 0x2d, 0x28, 0xa0,
0xe8, 0xe4, 0x49, 0x2c, 0x45, 0x45, 0x51, 0x11, 0x9d, 0x09, 0x17, 0xb2, 0x12, 0xb2, 0x38, 0xbc,
0xee, 0x70, 0x54, 0x20, 0x6f, 0x97, 0xdd, 0x49, 0x92, 0x44, 0x46, 0x7c, 0x06, 0x3f, 0xff, 0xea,
0xcf, 0xa3, 0x7a, 0x64, 0x35, 0x1a, 0x5b, 0x84, 0x10, 0x48, 0xb1, 0xb1, 0x78, 0x1e, 0xab, 0xa2,
0xd7, 0x96, 0xcd, 0x40, 0xc6, 0x5c, 0x4c, 0x7f, 0xe9, 0x22, 0xa7, 0xcb, 0xc7, 0xc2, 0x85, 0xb9,
0xa4, 0xa6, 0x26, 0x7e, 0x29, 0xe0, 0x53, 0x3d, 0x66, 0xbb, 0xbb, 0x9d, 0x6f, 0x9d, 0xfc, 0x16,
0x9a, 0xd0, 0x58, 0x99, 0xb7, 0x92, 0x7d, 0x5f, 0xdb, 0x17, 0x15, 0x81, 0x68, 0x7b, 0xb6, 0x0e,
0xb7, 0xb2, 0xf9, 0xdd, 0xcd, 0xe8, 0xe8, 0x3c, 0x92, 0xf7, 0x08, 0x2f, 0x3d, 0xf8, 0x52, 0xb8,
0x19, 0x0d, 0x04, 0x02, 0x3d, 0x2d, 0x2d, 0x1d, 0x5a, 0x47, 0xc7, 0x90, 0xa2, 0x69, 0x3a, 0x20,
0xd1, 0xd8, 0xd8, 0x45, 0xdd, 0xa0, 0x8c, 0x32, 0xdc, 0x86, 0xdc, 0x7e, 0x63, 0x22, 0x24, 0x96,
0xf0, 0x7a, 0x55, 0xb6, 0x6c, 0x59, 0x8d, 0xd5, 0x1a, 0xcb, 0xb8, 0x70, 0x4e, 0x3e, 0x30, 0xfc,
0xbd, 0xbd, 0xdd, 0xc3, 0x99, 0x33, 0x9f, 0x01, 0x82, 0x96, 0xa1, 0x16, 0xfa, 0x1a, 0xc6, 0xf7,
0xfe, 0xac, 0xab, 0x93, 0xb3, 0xe2, 0x0a, 0x7e, 0x7f, 0x02, 0x4e, 0x27, 0x9c, 0x3b, 0xd7, 0x60,
0xac, 0x99, 0x3b, 0x37, 0x8d, 0xec, 0xec, 0x70, 0x33, 0xeb, 0xf4, 0x3a, 0x69, 0x73, 0xb7, 0x01,
0xd0, 0xe8, 0x6a, 0x8c, 0x74, 0x64, 0x57, 0xaf, 0x9a, 0x3f, 0x3f, 0x7f, 0xfe, 0xaa, 0xbc, 0x74,
0x69, 0x31, 0x8a, 0xa2, 0x20, 0x49, 0x32, 0x0e, 0x47, 0x12, 0x8b, 0x17, 0xcf, 0x27, 0x18, 0xd4,
0xd0, 0x75, 0x1d, 0x49, 0x92, 0x19, 0x5f, 0x17, 0xca, 0xd8, 0x24, 0x64, 0x39, 0x9a, 0xe5, 0xba,
0x35, 0x5e, 0xb3, 0x66, 0x9d, 0x31, 0x77, 0x7f, 0x8a, 0x9d, 0xe3, 0xf9, 0xbf, 0x0b, 0xfb, 0xfe,
0xfd, 0xef, 0x3f, 0x37, 0x21, 0xcb, 0x3a, 0x7e, 0xbf, 0x46, 0x20, 0x10, 0xa4, 0xb6, 0xb6, 0x15,
0x4d, 0xbb, 0xca, 0xca, 0x95, 0x05, 0x06, 0x77, 0xe2, 0xd4, 0x38, 0x03, 0x19, 0xab, 0xc9, 0x6a,
0x8c, 0x83, 0xc1, 0xe0, 0x38, 0x02, 0x79, 0x79, 0xe9, 0x7b, 0x2a, 0x2b, 0xbf, 0x2a, 0x99, 0xcd,
0x26, 0x23, 0x06, 0x1f, 0x1a, 0xf2, 0x30, 0x34, 0xe4, 0xc5, 0xe3, 0x19, 0xc3, 0xe7, 0x0b, 0x22,
0xcb, 0xca, 0x04, 0xc0, 0xe1, 0xbd, 0x2c, 0x2b, 0xf4, 0xf5, 0x75, 0x73, 0xfc, 0xf8, 0x9b, 0x98,
0x4c, 0x16, 0xb6, 0x6c, 0x79, 0x1c, 0xbf, 0xdf, 0x4f, 0x4f, 0x4f, 0x3b, 0x9a, 0xe6, 0x43, 0xd7,
0x75, 0x12, 0x13, 0xed, 0x64, 0x65, 0xcd, 0x23, 0x3d, 0x3d, 0x87, 0x9b, 0x3d, 0x9d, 0x38, 0x07,
0x9d, 0x48, 0x12, 0x84, 0x88, 0xac, 0xeb, 0xe0, 0xf5, 0xfa, 0xc8, 0x76, 0x14, 0x50, 0x5a, 0x5a,
0xc4, 0x47, 0x1f, 0x7d, 0xc2, 0xd8, 0x58, 0xc0, 0x00, 0xb4, 0xd8, 0x5e, 0x4c, 0xe3, 0x53, 0x8d,
0x68, 0xba, 0x86, 0x45, 0xb1, 0x44, 0x5a, 0xa1, 0x8c, 0x8c, 0xe4, 0x7c, 0xb7, 0x7b, 0x18, 0x49,
0x4a, 0x44, 0x51, 0x14, 0x84, 0x10, 0xf8, 0x7c, 0x7e, 0x46, 0x47, 0xbd, 0xb8, 0xdd, 0x1e, 0xc6,
0xc6, 0x42, 0x08, 0xc8, 0x11, 0xbd, 0xa2, 0x28, 0xbc, 0xf4, 0xaf, 0xff, 0x42, 0xfe, 0xe3, 0x47,
0xe9, 0x73, 0x7b, 0xd8, 0xff, 0xcb, 0x9d, 0xbc, 0xf2, 0x6f, 0xbf, 0x44, 0x92, 0x86, 0x39, 0x72,
0xe4, 0x08, 0x6b, 0xd6, 0xac, 0xe1, 0xeb, 0x5f, 0x7f, 0x90, 0x9e, 0x9e, 0x6e, 0xbe, 0xf8, 0xe2,
0x02, 0x0d, 0xed, 0x43, 0x54, 0x6d, 0xac, 0x20, 0xa0, 0x43, 0xe7, 0xa8, 0x42, 0x9f, 0x47, 0xc6,
0x35, 0x26, 0xe3, 0x72, 0xfb, 0xf0, 0x35, 0x5f, 0xc6, 0x6c, 0x76, 0x30, 0x32, 0x12, 0xc4, 0xed,
0xbe, 0x15, 0x82, 0x7b, 0x02, 0x1e, 0x8e, 0xfe, 0xfd, 0x28, 0x41, 0x3d, 0xc8, 0x22, 0xfb, 0x22,
0xca, 0xb2, 0xca, 0xc2, 0x75, 0xc0, 0xe7, 0x0b, 0xdc, 0x71, 0x79, 0x4e, 0x08, 0x9d, 0x2f, 0xba,
0xdc, 0x34, 0x34, 0xa6, 0xa0, 0x6b, 0xc9, 0x14, 0x0e, 0x04, 0xc8, 0xcd, 0xcd, 0xe5, 0x87, 0x3f,
0x7c, 0x8e, 0x13, 0x27, 0x4e, 0x50, 0x5f, 0x5f, 0xcf, 0xe6, 0xcd, 0x5b, 0x89, 0x8d, 0x8d, 0x23,
0x23, 0x23, 0x9b, 0x76, 0x57, 0x2d, 0xb5, 0x6d, 0xe0, 0x09, 0x2a, 0x13, 0xda, 0xa2, 0x03, 0x3a,
0x09, 0x8a, 0x17, 0x49, 0x92, 0x27, 0xf2, 0x07, 0x7f, 0xd8, 0x19, 0xd7, 0x06, 0xae, 0xf1, 0xd3,
0x4f, 0x7e, 0x0a, 0xc0, 0x8a, 0x9c, 0x15, 0x06, 0x02, 0x06, 0x07, 0xee, 0xb4, 0x62, 0xe0, 0xf1,
0xb8, 0xb9, 0x79, 0xb3, 0x81, 0x5d, 0x55, 0x0f, 0xf3, 0x1f, 0xa7, 0xab, 0x20, 0x38, 0xc6, 0x0f,
0x7e, 0x50, 0x05, 0xc0, 0xb3, 0xcf, 0x3e, 0x4b, 0x77, 0x77, 0x37, 0x3b, 0x76, 0xec, 0x30, 0x2c,
0x8b, 0xaa, 0xaa, 0x3c, 0xb8, 0x70, 0x2e, 0xcd, 0x2d, 0xe7, 0x19, 0x1b, 0x76, 0xd3, 0xd6, 0xd6,
0x41, 0x71, 0xf1, 0x72, 0x02, 0x01, 0x1d, 0x9f, 0x4f, 0xc3, 0x9e, 0x36, 0x0f, 0x97, 0x6b, 0x74,
0xc6, 0xe7, 0x47, 0xc4, 0x42, 0xb3, 0xa3, 0xbc, 0xa0, 0xa3, 0xa3, 0x81, 0xd5, 0xab, 0xd7, 0x60,
0xb1, 0x98, 0xf9, 0xf6, 0xb7, 0xdd, 0xc4, 0xc5, 0x99, 0xb1, 0xdb, 0x53, 0x01, 0x28, 0x2f, 0x2f,
0xe7, 0xfc, 0xf9, 0x8f, 0x11, 0x42, 0x27, 0x18, 0xd4, 0x8d, 0x75, 0x59, 0x59, 0x73, 0x70, 0x38,
0x32, 0x09, 0x04, 0x34, 0x3c, 0x9e, 0x11, 0x2e, 0x5c, 0xb8, 0xcc, 0x92, 0x25, 0x6b, 0x70, 0xb9,
0x46, 0x19, 0x1a, 0x1a, 0x35, 0x14, 0xb7, 0xbe, 0xbe, 0xde, 0x58, 0x53, 0x98, 0x52, 0xc8, 0x73,
0x4b, 0x9e, 0x43, 0xd3, 0x35, 0xee, 0x75, 0xdc, 0x1b, 0x89, 0xc0, 0x9d, 0x30, 0xa0, 0xa9, 0xe9,
0x33, 0x96, 0x2d, 0xfb, 0x67, 0x83, 0xed, 0xa9, 0xa9, 0xa9, 0x98, 0x4c, 0xca, 0xac, 0xf6, 0x88,
0x89, 0xb1, 0x90, 0x97, 0x97, 0x41, 0x6f, 0x6f, 0x3b, 0x26, 0x53, 0x4a, 0xd8, 0xb7, 0x63, 0xc7,
0x8e, 0x61, 0xb3, 0xd9, 0x70, 0x38, 0x1c, 0xc4, 0xab, 0xf1, 0x7c, 0xef, 0xfe, 0xef, 0x45, 0x38,
0xb2, 0x59, 0xc5, 0x42, 0x53, 0x45, 0x27, 0x3b, 0xdb, 0x81, 0xc5, 0x62, 0x8d, 0xfa, 0x3d, 0x10,
0xf0, 0xd3, 0xd6, 0xd6, 0xc6, 0xe0, 0xe0, 0x20, 0x00, 0x69, 0x69, 0xe9, 0x64, 0x66, 0x66, 0x45,
0xfd, 0x37, 0x3b, 0x3b, 0x97, 0xda, 0xda, 0xb3, 0x14, 0x14, 0xac, 0x0e, 0x9b, 0x3f, 0x7c, 0xf8,
0x30, 0xe9, 0xe9, 0x49, 0xd3, 0xe6, 0xca, 0xaa, 0xaa, 0x22, 0x84, 0x10, 0x77, 0x84, 0x40, 0x57,
0xd7, 0x75, 0x96, 0x2d, 0xfb, 0x5a, 0xd4, 0x6f, 0x9d, 0x9d, 0xed, 0xb4, 0xb5, 0xb5, 0xa1, 0xaa,
0x26, 0x86, 0x86, 0x46, 0x90, 0x24, 0x09, 0x9f, 0xcf, 0xcf, 0xa7, 0x9f, 0xd6, 0x51, 0x56, 0x56,
0x8e, 0xd9, 0x1c, 0x37, 0x45, 0x8e, 0xe1, 0xbe, 0xfb, 0x96, 0x50, 0x57, 0xf7, 0x09, 0xd9, 0xd9,
0xf7, 0x19, 0x22, 0xd4, 0xd3, 0xd3, 0x43, 0x30, 0x38, 0x12, 0x35, 0x4a, 0x08, 0x51, 0xbf, 0xa1,
0xa1, 0xa1, 0xff, 0x8e, 0x94, 0xd8, 0xe1, 0x70, 0xa0, 0xeb, 0x91, 0x86, 0xab, 0xb7, 0xb7, 0x9b,
0xc1, 0xc1, 0x41, 0x46, 0x47, 0x35, 0xac, 0x56, 0xab, 0x51, 0x95, 0xd0, 0xb4, 0x20, 0x16, 0x8b,
0x87, 0x0b, 0x17, 0xfe, 0x4c, 0x59, 0x59, 0xf9, 0xd4, 0x82, 0x20, 0xb1, 0xb1, 0x56, 0x02, 0x81,
0x81, 0x30, 0x8f, 0x7e, 0xe0, 0xc0, 0xab, 0xaf, 0xc8, 0xf2, 0x48, 0xff, 0xd4, 0xca, 0x21, 0x20,
0x64, 0x59, 0xd6, 0x15, 0x45, 0xf1, 0x0d, 0x0e, 0x0e, 0xbe, 0x35, 0x6b, 0x04, 0x7c, 0xbe, 0x31,
0x12, 0x13, 0x93, 0x22, 0xe6, 0x15, 0x45, 0xa2, 0xa3, 0xa3, 0x1d, 0xbf, 0x5f, 0x22, 0x3b, 0x7b,
0x1e, 0x03, 0x03, 0x7d, 0xfc, 0xfe, 0xf7, 0x27, 0x70, 0x38, 0x1c, 0xac, 0x5c, 0xb9, 0x0e, 0x9b,
0xad, 0x80, 0xae, 0xae, 0x26, 0xde, 0x7b, 0xef, 0x14, 0x6b, 0xd7, 0xae, 0x27, 0x10, 0xd0, 0xc2,
0x3c, 0xaa, 0xdd, 0x6e, 0x0b, 0xdb, 0xef, 0xf2, 0xe5, 0xab, 0x57, 0x9a, 0x9b, 0x2f, 0xb6, 0x47,
0x93, 0x50, 0xc0, 0x07, 0x0c, 0x44, 0x24, 0xf5, 0x33, 0x69, 0x2e, 0x57, 0x1f, 0x76, 0x7b, 0x5e,
0x64, 0x52, 0xdf, 0xdf, 0x4b, 0x7c, 0x7c, 0x3c, 0x99, 0x59, 0x59, 0x0c, 0x38, 0xfb, 0x78, 0xf4,
0xd1, 0x72, 0x02, 0x81, 0x71, 0x6f, 0xba, 0x60, 0xc1, 0x21, 0x4e, 0xbf, 0x77, 0x0e, 0xc1, 0x1c,
0x5c, 0xae, 0x7e, 0x14, 0x45, 0x9a, 0x22, 0x1a, 0x90, 0x94, 0x64, 0xc3, 0xe7, 0xf3, 0x13, 0x32,
0x2a, 0x56, 0x6b, 0x4a, 0x17, 0x10, 0x0d, 0x01, 0x6d, 0xe2, 0xf1, 0x00, 0x6e, 0xf9, 0x56, 0x10,
0x36, 0x53, 0x04, 0x7a, 0xb1, 0x58, 0x62, 0xa3, 0xcc, 0x0f, 0x10, 0x08, 0x6a, 0xd8, 0x52, 0x12,
0x79, 0xe7, 0xdd, 0xff, 0x32, 0x80, 0x07, 0xb8, 0x7e, 0xfd, 0x3a, 0x7f, 0xfb, 0xdb, 0x25, 0xb2,
0x73, 0xb2, 0x48, 0x48, 0x48, 0xa0, 0xb9, 0xb9, 0x29, 0x62, 0x7d, 0x52, 0x92, 0x0d, 0x97, 0xab,
0xc7, 0xd0, 0x81, 0xc2, 0xc2, 0xf2, 0x66, 0xe0, 0x5a, 0x94, 0xe7, 0xba, 0x10, 0xa2, 0x51, 0x08,
0x71, 0x53, 0x08, 0x31, 0x3a, 0x6b, 0x11, 0x92, 0x24, 0x99, 0x68, 0x51, 0x74, 0x28, 0x2d, 0xd4,
0x75, 0x1d, 0x6b, 0x7c, 0xa4, 0x75, 0x8a, 0xb7, 0x5a, 0x8d, 0xc0, 0x30, 0x74, 0x91, 0x32, 0xd5,
0xa3, 0x2b, 0x8a, 0x32, 0x49, 0x24, 0x55, 0x21, 0x66, 0x70, 0x81, 0x27, 0xcf, 0x56, 0x84, 0x92,
0x93, 0xd3, 0x18, 0x1b, 0x8b, 0xf4, 0x96, 0xa9, 0xa9, 0x76, 0x4c, 0x31, 0x31, 0x8c, 0x8c, 0xb8,
0xf9, 0xe6, 0x63, 0x9b, 0x48, 0x49, 0xb9, 0x65, 0xd7, 0x1f, 0x7a, 0xa8, 0x8c, 0xe2, 0xe2, 0x12,
0x7a, 0x7b, 0xbb, 0x71, 0xbb, 0xdd, 0xe4, 0xe7, 0xcf, 0x8f, 0x4c, 0x59, 0x87, 0x06, 0x49, 0x4a,
0x4a, 0x9f, 0x75, 0x61, 0x6d, 0xd6, 0x8e, 0xcc, 0x66, 0x73, 0xe0, 0x76, 0x0f, 0x61, 0xb1, 0x24,
0x4c, 0x41, 0xcc, 0x4e, 0x43, 0xc3, 0x15, 0xdc, 0x23, 0xa3, 0xe4, 0xcc, 0xc9, 0xe7, 0xec, 0xf9,
0x8b, 0xd4, 0x7c, 0xf8, 0x1e, 0x76, 0xbb, 0x83, 0x65, 0xcb, 0xcb, 0xf0, 0x7a, 0xbd, 0xf4, 0x76,
0x77, 0xe0, 0x74, 0x3a, 0xd1, 0xb4, 0xc8, 0x8c, 0x6c, 0x70, 0x70, 0x90, 0xa4, 0xa4, 0x7b, 0x66,
0x5c, 0xa9, 0x08, 0xe3, 0xc0, 0x6c, 0x44, 0x28, 0x26, 0xc6, 0xc4, 0xe8, 0xe8, 0x50, 0x94, 0x0b,
0x0c, 0x9d, 0xd2, 0xd2, 0x45, 0x20, 0x34, 0x6e, 0xb4, 0x7e, 0x81, 0xa6, 0x05, 0x58, 0xfd, 0xc8,
0x5a, 0x16, 0x3f, 0xb0, 0x14, 0x97, 0x6b, 0x80, 0x96, 0xa6, 0x6b, 0xb4, 0xb6, 0xb6, 0x50, 0x59,
0xb9, 0x35, 0x22, 0xeb, 0x8a, 0x89, 0x51, 0xe8, 0xef, 0x1f, 0xfe, 0x9f, 0x5d, 0xb3, 0xce, 0xa6,
0xf5, 0xf4, 0xf4, 0x93, 0x9f, 0x1f, 0x29, 0x9e, 0x29, 0x29, 0xe3, 0x71, 0xd0, 0x9f, 0xfe, 0x54,
0x8b, 0x84, 0x3e, 0xa1, 0x2f, 0x3a, 0x63, 0x63, 0x63, 0x34, 0x37, 0x37, 0xf3, 0xd8, 0x63, 0x1b,
0x89, 0x8d, 0x8d, 0x27, 0x10, 0x08, 0xbf, 0xec, 0x70, 0xbb, 0x5d, 0x58, 0xad, 0x19, 0x5f, 0x9a,
0x27, 0xff, 0xaf, 0xe8, 0xc0, 0x78, 0x02, 0xf4, 0x15, 0x9a, 0x9a, 0xfe, 0x1e, 0x71, 0x88, 0x10,
0xe3, 0x61, 0x43, 0x65, 0xe5, 0x66, 0x0a, 0x0b, 0x0b, 0xf1, 0x7a, 0x3d, 0xf8, 0x7c, 0x3e, 0x4a,
0x4b, 0x17, 0x51, 0x5d, 0xfd, 0x34, 0xc9, 0xc9, 0xb6, 0x48, 0x00, 0x64, 0xa8, 0xab, 0xfb, 0x0b,
0x05, 0x05, 0x0f, 0xcc, 0xa8, 0xa2, 0x7d, 0xdb, 0x1b, 0x9a, 0x99, 0x36, 0x93, 0xc9, 0x42, 0x5f,
0x9f, 0xce, 0xf0, 0xb0, 0x13, 0x87, 0x23, 0x23, 0x7a, 0x15, 0x22, 0x2b, 0x8b, 0xec, 0xec, 0x1c,
0x23, 0x1a, 0x0d, 0x06, 0xb5, 0x69, 0x82, 0xc2, 0x7f, 0x50, 0x52, 0xb2, 0x6a, 0x8a, 0x29, 0x9f,
0x39, 0x3c, 0x77, 0xc4, 0x01, 0x80, 0x39, 0x73, 0x0a, 0xb8, 0x74, 0xe9, 0x12, 0xc1, 0x60, 0xe0,
0x8e, 0xef, 0xb7, 0x3c, 0x1e, 0x37, 0xc3, 0xc3, 0x1a, 0xc9, 0xc9, 0xf6, 0x19, 0x5d, 0x9a, 0xdf,
0x06, 0x81, 0x3b, 0x4b, 0x68, 0xee, 0xb9, 0xe7, 0x7e, 0xfe, 0xf0, 0x87, 0xd3, 0xf4, 0xf5, 0xf5,
0xcc, 0x7a, 0xed, 0x8d, 0x1b, 0x8d, 0xd4, 0xd5, 0x7d, 0xc6, 0x92, 0x25, 0xab, 0xa2, 0x00, 0x3f,
0x7b, 0x1d, 0xb8, 0xa3, 0x94, 0xd2, 0x6c, 0xb6, 0x50, 0x5a, 0xba, 0x82, 0xbf, 0xfe, 0xf5, 0x73,
0x2e, 0x5d, 0xfa, 0xf3, 0x8c, 0xae, 0x52, 0xbd, 0x5e, 0x2f, 0x35, 0x35, 0x1f, 0xa2, 0xeb, 0xc9,
0x94, 0x97, 0xaf, 0x9f, 0xa6, 0xa8, 0x35, 0x73, 0x98, 0x54, 0x80, 0x96, 0x96, 0xde, 0xda, 0x91,
0x11, 0xcf, 0x37, 0x13, 0xa3, 0x5c, 0x23, 0xcd, 0x8c, 0x13, 0x5f, 0xc1, 0xeb, 0x1d, 0xe5, 0xf8,
0xf1, 0xdf, 0x91, 0x9e, 0x6e, 0x27, 0x27, 0x27, 0x8b, 0xcc, 0xcc, 0x4c, 0x1c, 0x8e, 0x34, 0x02,
0x01, 0x3f, 0x3d, 0x3d, 0xbd, 0x74, 0x76, 0x76, 0xd2, 0xd5, 0xd5, 0x8d, 0xdb, 0xed, 0x63, 0xd9,
0xb2, 0xb5, 0x98, 0xcd, 0x96, 0x69, 0x32, 0x3d, 0x70, 0xbb, 0x47, 0x9c, 0x92, 0x24, 0x35, 0xcf,
0x28, 0x32, 0x10, 0x42, 0x50, 0x51, 0xf1, 0xfc, 0x03, 0x99, 0x99, 0xc9, 0xff, 0xb9, 0x60, 0x41,
0x56, 0xa1, 0x10, 0xe3, 0xf5, 0x1e, 0xbf, 0x5f, 0xc3, 0xe7, 0x0b, 0x10, 0x0c, 0xea, 0x84, 0x8a,
0x5d, 0xe3, 0xd5, 0x88, 0x90, 0x85, 0x90, 0x8d, 0x8b, 0xf1, 0xd0, 0x9c, 0x2c, 0x2b, 0x13, 0x3e,
0xc1, 0x47, 0x30, 0x38, 0x8c, 0xaa, 0x8e, 0xa1, 0x69, 0x12, 0x8a, 0x92, 0x88, 0xc5, 0x62, 0x43,
0x55, 0xcd, 0x46, 0x5d, 0xe8, 0xd6, 0x75, 0xe9, 0x78, 0x8d, 0x33, 0x10, 0x18, 0xaf, 0x0b, 0xf5,
0xf5, 0x0d, 0xf4, 0x8d, 0x8c, 0x8c, 0xee, 0x39, 0x7c, 0x78, 0xd7, 0x91, 0x99, 0x20, 0xf0, 0xdf,
0xd1, 0x1d, 0xfc, 0xa3, 0x61, 0x31, 0x70, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
0xae, 0x42, 0x60, 0x82,
}; };
const BITMAP_OPAQUE icon_bitmap2component_xpm[1] = {{ png, sizeof( png ), "icon_bitmap2component_xpm" }}; const BITMAP_OPAQUE icon_bitmap2component_xpm[1] = {{ png, sizeof( png ), "icon_bitmap2component_xpm" }};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -13,8 +13,8 @@
inkscape:export-ydpi="90.000000" inkscape:export-ydpi="90.000000"
inkscape:export-xdpi="90.000000" inkscape:export-xdpi="90.000000"
inkscape:export-filename="/home/steven/edit-find-48.png" inkscape:export-filename="/home/steven/edit-find-48.png"
sodipodi:docname="find.svg.BASE" sodipodi:docname="find.svg"
inkscape:version="0.48.2 r9819" inkscape:version="0.48.3.1 r9886"
sodipodi:version="0.32" sodipodi:version="0.32"
id="svg249" id="svg249"
height="26" height="26"
@ -59,18 +59,6 @@
offset="1.0000000" offset="1.0000000"
style="stop-color:#ffffff;stop-opacity:0.24761905;" /> style="stop-color:#ffffff;stop-opacity:0.24761905;" />
</linearGradient> </linearGradient>
<linearGradient
id="linearGradient4477"
inkscape:collect="always">
<stop
id="stop4479"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop4481"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient <linearGradient
id="linearGradient2366"> id="linearGradient2366">
<stop <stop
@ -97,66 +85,6 @@
offset="1.0000000" offset="1.0000000"
id="stop2850" /> id="stop2850" />
</linearGradient> </linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4477"
id="radialGradient1527"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.237968,0,28.93278)"
cx="24.130018"
cy="37.967922"
fx="24.130018"
fy="37.967922"
r="16.528622" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2846"
id="linearGradient1529"
gradientUnits="userSpaceOnUse"
x1="27.366341"
y1="26.580296"
x2="31.335964"
y2="30.557772" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4440"
id="linearGradient1531"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.334593,0,0,1.291292,-6.973842,-7.460658)"
x1="30.65625"
y1="34"
x2="33.21875"
y2="31.0625" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2366"
id="linearGradient1533"
gradientUnits="userSpaceOnUse"
x1="18.292673"
y1="13.602121"
x2="17.500893"
y2="25.743469" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4454"
id="radialGradient1537"
gradientUnits="userSpaceOnUse"
cx="18.240929"
cy="21.817987"
fx="18.240929"
fy="21.817987"
r="8.3085051" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4467"
id="radialGradient1539"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.592963,0,0,2.252104,-25.05975,-18.941)"
cx="15.414371"
cy="13.078408"
fx="15.414371"
fy="13.078408"
r="6.65625" />
<radialGradient <radialGradient
id="aigrd2-8" id="aigrd2-8"
cx="20.892099" cx="20.892099"
@ -338,18 +266,279 @@
fx="8.824419" fx="8.824419"
fy="3.7561285" fy="3.7561285"
r="37.751713" /> r="37.751713" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2846-1-5"
id="linearGradient2730-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1,0,0,1,48.18409,0)"
x1="27.366341"
y1="26.580296"
x2="31.335964"
y2="30.557772" />
<linearGradient
id="linearGradient2846-1-5">
<stop
style="stop-color:#8a8a8a;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop2848-0-9" />
<stop
style="stop-color:#484848;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop2850-4-6" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4440-1-1"
id="linearGradient2732-2"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.334593,0,0,1.291292,55.15793,-7.460658)"
x1="30.65625"
y1="34"
x2="33.21875"
y2="31.0625" />
<linearGradient
id="linearGradient4440-1-1">
<stop
id="stop4442-1-7"
offset="0"
style="stop-color:#7d7d7d;stop-opacity:1;" />
<stop
style="stop-color:#b1b1b1;stop-opacity:1.0000000;"
offset="0.50000000"
id="stop4448-8-8" />
<stop
id="stop4444-6-5"
offset="1.0000000"
style="stop-color:#686868;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2366-4-4"
id="linearGradient2734-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1,0,0,1,44.17827,0)"
x1="18.292673"
y1="13.602121"
x2="17.500893"
y2="25.743469" />
<linearGradient
id="linearGradient2366-4-4">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2368-3-1" />
<stop
id="stop2374-4-8"
offset="0.50000000"
style="stop-color:#ffffff;stop-opacity:0.21904762;" />
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop2370-7-5" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4454-7-7"
id="radialGradient2736-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1,0,0,1,43.352,0)"
cx="18.240929"
cy="21.817987"
fx="18.240929"
fy="21.817987"
r="8.3085051" />
<linearGradient
id="linearGradient4454-7-7">
<stop
id="stop4456-0-5"
offset="0.0000000"
style="stop-color:#729fcf;stop-opacity:0.20784314;" />
<stop
id="stop4458-7-3"
offset="1.0000000"
style="stop-color:#729fcf;stop-opacity:0.67619050;" />
</linearGradient>
<radialGradient
r="6.65625"
fy="13.078408"
fx="15.414371"
cy="13.078408"
cx="15.414371"
gradientTransform="matrix(2.592963,0,0,2.252104,-25.05976,-18.941)"
gradientUnits="userSpaceOnUse"
id="radialGradient3411"
xlink:href="#linearGradient4467-4-8"
inkscape:collect="always" />
<linearGradient
id="linearGradient4467-4-8">
<stop
id="stop4469-5-3"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop4471-3-1"
offset="1.0000000"
style="stop-color:#ffffff;stop-opacity:0.24761905;" />
</linearGradient>
<radialGradient
r="6.65625"
fy="13.078408"
fx="15.414371"
cy="13.078408"
cx="15.414371"
gradientTransform="matrix(2.592963,0,0,2.252104,-25.05976,-18.941)"
gradientUnits="userSpaceOnUse"
id="radialGradient3143"
xlink:href="#linearGradient4467-4-8"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2846-1-5"
id="linearGradient3953"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1,0,0,1,48.18409,0)"
x1="27.366341"
y1="26.580296"
x2="31.335964"
y2="30.557772" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4440-1-1"
id="linearGradient3955"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.334593,0,0,1.291292,55.15793,-7.460658)"
x1="30.65625"
y1="34"
x2="33.21875"
y2="31.0625" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2366-4-4"
id="linearGradient3957"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1,0,0,1,44.17827,0)"
x1="18.292673"
y1="13.602121"
x2="17.500893"
y2="25.743469" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4454-7-7"
id="radialGradient3959"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1,0,0,1,43.352,0)"
cx="18.240929"
cy="21.817987"
fx="18.240929"
fy="21.817987"
r="8.3085051" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4467-4-8"
id="radialGradient3961"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.592963,0,0,2.252104,-25.05976,-18.941)"
cx="15.414371"
cy="13.078408"
fx="15.414371"
fy="13.078408"
r="6.65625" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4467-4-8"
id="radialGradient3964"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.1830991,0,0,1.0154904,7.797398,16.499809)"
cx="15.414371"
cy="13.078408"
fx="15.414371"
fy="13.078408"
r="6.65625" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4440-1-1"
id="linearGradient3970"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.60893882,0,0,0.58225314,4.761172,21.67638)"
x1="30.65625"
y1="34"
x2="33.21875"
y2="31.0625" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2846-1-5"
id="linearGradient3974"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.45627305,0,0,0.45090742,1.5791967,25.040446)"
x1="27.366341"
y1="26.580296"
x2="31.335964"
y2="30.557772" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2846-1-5"
id="linearGradient3985"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.45627305,0,0,0.45090742,1.5791967,25.040446)"
x1="27.366341"
y1="26.580296"
x2="31.335964"
y2="30.557772" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4440-1-1"
id="linearGradient3987"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.60893882,0,0,0.58225314,4.761172,21.67638)"
x1="30.65625"
y1="34"
x2="33.21875"
y2="31.0625" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2366-4-4"
id="linearGradient3989"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1,0,0,1,44.17827,0)"
x1="18.292673"
y1="13.602121"
x2="17.500893"
y2="25.743469" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4454-7-7"
id="radialGradient3991"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1,0,0,1,43.352,0)"
cx="18.240929"
cy="21.817987"
fx="18.240929"
fy="21.817987"
r="8.3085051" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4467-4-8"
id="radialGradient3993"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.1830991,0,0,1.0154904,7.797398,16.499809)"
cx="15.414371"
cy="13.078408"
fx="15.414371"
fy="13.078408"
r="6.65625" />
</defs> </defs>
<sodipodi:namedview <sodipodi:namedview
inkscape:window-y="26" inkscape:window-y="29"
inkscape:window-x="0" inkscape:window-x="0"
inkscape:window-height="969" inkscape:window-height="849"
inkscape:window-width="1280" inkscape:window-width="1600"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:grid-bbox="true" inkscape:grid-bbox="true"
showgrid="true" showgrid="true"
inkscape:current-layer="layer5" inkscape:current-layer="layer5"
inkscape:cy="13.694933" inkscape:cy="12.288442"
inkscape:cx="19.492108" inkscape:cx="8.4435897"
inkscape:zoom="22.627416" inkscape:zoom="22.627416"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
@ -364,7 +553,7 @@
<inkscape:grid <inkscape:grid
type="xygrid" type="xygrid"
id="grid2919" id="grid2919"
empspacing="5" empspacing="1"
visible="true" visible="true"
enabled="true" enabled="true"
snapvisiblegridlinesonly="true" /> snapvisiblegridlinesonly="true" />
@ -611,66 +800,74 @@
id="rect15686-03" id="rect15686-03"
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" /> style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970757;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" />
<g <g
id="g1772" id="g3976"
transform="matrix(0.39105747,0,0,0.37162201,7.9100602,31.393184)"> transform="translate(25.279068,-0.44194166)">
<path
sodipodi:type="arc"
style="opacity:0.17112301;color:#000000;fill:url(#radialGradient1527);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
id="path4475"
sodipodi:cx="24.130018"
sodipodi:cy="37.967922"
sodipodi:rx="16.528622"
sodipodi:ry="3.9332814"
d="m 40.65864,37.967922 c 0,2.172292 -7.400116,3.933282 -16.528622,3.933282 -9.128505,0 -16.5286214,-1.76099 -16.5286214,-3.933282 0,-2.172291 7.4001164,-3.933281 16.5286214,-3.933281 9.128506,0 16.528622,1.76099 16.528622,3.933281 z"
transform="matrix(1.446431,0,0,1.51999,-10.97453,-17.75168)" />
<path <path
inkscape:connector-curvature="0"
sodipodi:nodetypes="csscccscccscczzzz" sodipodi:nodetypes="csscccscccscczzzz"
id="path2844" id="path2844-9-9"
d="m 18.627569,3.1435548 c -8.13913,0 -14.7448008,6.6056711 -14.7448008,14.7448012 0,8.13913 6.6056708,14.744802 14.7448008,14.744802 3.479555,0 6.551001,-1.384393 9.073723,-3.402647 -0.205377,1.006881 -0.07803,2.035368 0.756144,2.759925 l 10.964084,9.52741 c 1.233416,1.071329 3.087462,0.93096 4.15879,-0.302457 1.071328,-1.233418 0.930959,-3.087462 -0.302457,-4.15879 L 32.313769,27.529188 c -0.671527,-0.583279 -1.492878,-0.755969 -2.306238,-0.642722 1.9867,-2.512422 3.364839,-5.548803 3.364839,-8.99811 0,-8.1391301 -6.605671,-14.7448012 -14.744801,-14.7448012 z m -0.07562,1.2261833 c 7.639459,0 13.291775,4.7889505 13.291775,13.2917749 0,8.675113 -5.81669,13.291775 -13.291775,13.291775 -7.302949,0 -13.2917734,-5.478092 -13.2917734,-13.291775 0,-7.9841069 5.8246384,-13.291775 13.2917734,-13.2917749 z" d="m -11.906647,26.457898 c -3.713666,0 -6.727656,2.978546 -6.727656,6.64854 0,3.669995 3.01399,6.648541 6.727656,6.648541 1.587627,0 2.9890449,-0.624233 4.140095,-1.534279 -0.093708,0.45401 -0.035603,0.917763 0.3450081,1.244471 l 5.0026161,4.29598 c 0.5627744,0.48307 1.4087257,0.419777 1.89754376,-0.13638 0.4888181,-0.556158 0.42477151,-1.39216 -0.13800297,-1.87523 l -5.00261609,-4.29598 c -0.3063996,-0.263005 -0.68116,-0.340872 -1.0522742,-0.289808 0.9064777,-1.13287 1.5352853,-2.501996 1.5352853,-4.057315 0,-3.669994 -3.0139896,-6.64854 -6.727655,-6.64854 z m -0.0345,0.552895 c 3.4856796,0 6.0646791,2.159374 6.0646791,5.99336 0,3.911673 -2.6539989,5.99336 -6.0646791,5.99336 -3.332138,0 -6.064678,-2.470112 -6.064678,-5.99336 0,-3.600093 2.657626,-5.99336 6.064678,-5.99336 z"
style="color:#000000;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1529);stroke-width:3.00581574;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" /> style="color:#000000;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3985);stroke-width:1.80999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path <path
inkscape:connector-curvature="0"
style="color:#000000;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000036;marker:none;visibility:visible;display:inline;overflow:visible" style="color:#000000;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000036;marker:none;visibility:visible;display:inline;overflow:visible"
d="m 18.602905,3.0803551 c -8.16544,0 -14.7924642,6.627024 -14.7924642,14.7924639 0,8.16544 6.6270242,14.792464 14.7924642,14.792464 3.490803,0 6.572177,-1.388867 9.103055,-3.413645 -0.206041,1.010136 -0.07829,2.041947 0.758587,2.768846 l 10.999526,9.558207 c 1.237403,1.074792 3.097442,0.93397 4.172233,-0.303435 1.074791,-1.237404 0.933968,-3.097442 -0.303435,-4.172233 L 32.333346,27.544815 c -0.673698,-0.585164 -1.497704,-0.758413 -2.313693,-0.644799 1.993122,-2.520544 3.375716,-5.56674 3.375716,-9.027197 0,-8.1654399 -6.627024,-14.7924639 -14.792464,-14.7924639 z m -0.07586,3.1860692 c 6.281108,2e-7 11.378818,5.0977107 11.378818,11.3788187 0,6.281108 -5.09771,11.378818 -11.378818,11.378818 -6.281108,0 -11.3788184,-5.09771 -11.3788184,-11.378818 2e-7,-6.281108 5.0977104,-11.3788187 11.3788184,-11.3788187 z" d="m -11.917901,26.429401 c -3.72567,0 -6.749403,2.988174 -6.749403,6.670032 0,3.681857 3.023733,6.670031 6.749403,6.670031 1.59276,0 2.9987074,-0.62625 4.1534789,-1.539237 -0.094011,0.455477 -0.035722,0.920729 0.3461228,1.248493 l 5.0187873,4.309866 c 0.5645936,0.484632 1.41327926,0.421134 1.90367743,-0.136821 0.49039817,-0.557954 0.42614443,-1.396659 -0.13844921,-1.881291 L -5.6530706,37.460607 c -0.3073902,-0.263854 -0.683362,-0.341974 -1.0556758,-0.290744 0.9094079,-1.136532 1.5402483,-2.510085 1.5402483,-4.07043 0,-3.681858 -3.0237325,-6.670032 -6.7494029,-6.670032 z m -0.03461,1.436622 c 2.8659006,0 5.1918483,2.298596 5.1918483,5.130794 0,2.832198 -2.3259477,5.130793 -5.1918483,5.130793 -2.8659,0 -5.191848,-2.298595 -5.191848,-5.130793 0,-2.832198 2.325948,-5.130794 5.191848,-5.130794 z"
id="path4430" /> id="path4430-3-6"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path <path
style="color:#000000;fill:url(#linearGradient1531);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" inkscape:connector-curvature="0"
d="m 39.507004,41.57769 c -0.478672,-2.273187 1.39733,-4.811422 3.584053,-4.788375 0,0 -10.760367,-9.258111 -10.760367,-9.258111 -2.944791,-0.05671 -4.269502,2.272616 -3.776814,4.599922 l 10.953128,9.446564 z" style="color:#000000;fill:url(#linearGradient3987);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
id="path4438" d="m -2.3799238,43.788135 c -0.2184051,-1.024997 0.637564,-2.169506 1.63530681,-2.159114 0,0 -4.90966551,-4.174551 -4.90966551,-4.174551 -1.3436287,-0.02557 -1.9480587,1.02474 -1.7232584,2.074139 l 4.9976171,4.259526 z"
sodipodi:nodetypes="ccccc" /> id="path4438-0-4"
sodipodi:nodetypes="ccccc"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path <path
sodipodi:type="arc" sodipodi:type="arc"
style="color:#000000;fill:none;stroke:url(#linearGradient1533);stroke-width:1.20643401;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" style="color:#000000;fill:none;stroke:url(#linearGradient3989);stroke-width:1.24788225;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
id="path4450" id="path4450-2-3"
sodipodi:cx="17.500893" sodipodi:cx="17.500893"
sodipodi:cy="18.920233" sodipodi:cy="18.920233"
sodipodi:rx="11.048544" sodipodi:rx="11.048544"
sodipodi:ry="11.048544" sodipodi:ry="11.048544"
d="m 28.549437,18.920233 c 0,6.101942 -4.946602,11.048544 -11.048544,11.048544 -6.101943,0 -11.0485443,-4.946602 -11.0485443,-11.048544 0,-6.101943 4.9466013,-11.0485442 11.0485443,-11.0485442 6.101942,0 11.048544,4.9466012 11.048544,11.0485442 z" d="m 28.549437,18.920233 c 0,6.101942 -4.946602,11.048544 -11.048544,11.048544 -6.101943,0 -11.0485443,-4.946602 -11.0485443,-11.048544 0,-6.101943 4.9466013,-11.0485442 11.0485443,-11.0485442 6.101942,0 11.048544,4.9466012 11.048544,11.0485442 z"
transform="matrix(1.245743,0,0,1.245743,-3.425346,-6.177033)" /> transform="matrix(0.56839909,0,0,0.56171489,-21.968801,22.255175)"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<rect <rect
style="opacity:0.43315507;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.50295389;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" style="opacity:0.43315507;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.70510882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
id="rect4495" id="rect4495-7-3"
width="19.048439" width="8.6471872"
height="4.4404783" height="2.0123112"
x="40.373337" x="19.239033"
y="0.14086054" y="32.352734"
rx="3.2112026" rx="1.5078329"
ry="2.837393" ry="1.3300102"
transform="matrix(0.752986,0.658037,-0.648902,0.760872,0,0)" /> transform="matrix(0.75682702,0.65361522,-0.65333777,0.75706655,0,0)"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path <path
sodipodi:type="arc" sodipodi:type="arc"
style="color:#000000;fill:url(#radialGradient1537);fill-opacity:1;fill-rule:evenodd;stroke:#3063a3;stroke-width:1.07456946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible" style="color:#000000;fill:url(#radialGradient3991);fill-opacity:1;fill-rule:evenodd;stroke:#3063a3;stroke-width:1.11148739;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible"
id="path4452" id="path4452-9-3"
sodipodi:cx="17.589281" sodipodi:cx="17.589281"
sodipodi:cy="18.478292" sodipodi:cy="18.478292"
sodipodi:rx="8.3085051" sodipodi:rx="8.3085051"
sodipodi:ry="8.3085051" sodipodi:ry="8.3085051"
d="m 25.897786,18.478292 c 0,4.588661 -3.719844,8.308506 -8.308505,8.308506 -4.588661,0 -8.308505,-3.719845 -8.308505,-8.308506 0,-4.58866 3.719844,-8.308505 8.308505,-8.308505 4.588661,0 8.308505,3.719845 8.308505,8.308505 z" d="m 25.897786,18.478292 c 0,4.588661 -3.719844,8.308506 -8.308505,8.308506 -4.588661,0 -8.308505,-3.719845 -8.308505,-8.308506 0,-4.58866 3.719844,-8.308505 8.308505,-8.308505 4.588661,0 8.308505,3.719845 8.308505,8.308505 z"
transform="matrix(1.398614,0,0,1.398614,-6.224338,-8.298958)" /> transform="matrix(0.63815043,0,0,0.63064598,-23.245907,21.298384)"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path <path
style="opacity:0.83422457;color:#000000;fill:url(#radialGradient1539);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" inkscape:connector-curvature="0"
d="m 18.156915,7.3966938 c -5.20759,0 -9.4245469,4.2169572 -9.4245469,9.4245472 0,1.503975 0.4203072,2.887773 1.0471719,4.149903 1.25238,0.461613 2.582757,0.775683 3.994767,0.775683 6.170955,0 11.099282,-4.861637 11.480106,-10.937129 C 23.523449,8.7641668 21.044374,7.3966938 18.156915,7.3966938 z" style="opacity:0.83422457;color:#000000;fill:url(#radialGradient3993);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
id="path4462" /> d="m -11.921206,28.37567 c 2.3760829,0 4.3001667,1.901457 4.3001667,4.249598 0,0.678154 -0.1917749,1.302119 -0.4777963,1.871222 -0.5714273,0.208145 -1.1784425,0.349762 -1.8227046,0.349762 -2.8156408,0 -5.0643028,-2.192149 -5.2380628,-4.931633 0.789792,-0.922345 1.920927,-1.538949 3.238397,-1.538949 z"
id="path4462-9-8"
inkscape:r_cx="true"
inkscape:r_cy="true" />
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 32 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -623,18 +623,10 @@ void GRLineArray( EDA_RECT* aClipBox, wxDC* aDC, std::vector<wxPoint>& aLines,
aClipBox->Inflate(-aWidth/2); aClipBox->Inflate(-aWidth/2);
} }
// Draw the outline of a thick segment wih rounded ends
void GRCSegm( EDA_RECT* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, void GRCSegm( EDA_RECT* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2,
int width, int aPenSize, EDA_COLOR_T Color ) int width, int aPenSize, EDA_COLOR_T Color )
{ {
long radius;
int dwx, dwy;
long dx, dy, dwx2, dwy2;
long sx1, sy1, ex1, ey1;
long sx2, sy2, ex2, ey2;
bool swap_ends = false;
GRLastMoveToX = x2; GRLastMoveToX = x2;
GRLastMoveToY = y2; GRLastMoveToY = y2;
@ -658,114 +650,63 @@ void GRCSegm( EDA_RECT* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2,
GRSetColorPen( DC, Color, aPenSize ); GRSetColorPen( DC, Color, aPenSize );
GRSetBrush( DC, Color, false ); GRSetBrush( DC, Color, false );
radius = (width + 1) >> 1; int radius = (width + 1) >> 1;
int dx = x2 - x1;
int dy = y2 - y1;
double angle = -ArcTangente( dy, dx );
wxPoint start;
wxPoint end;
wxPoint org( x1, y1);
int len = (int) hypot( dx, dy );
dx = x2 - x1; // We know if the DC is mirrored, to draw arcs
dy = y2 - y1; int slx = DC->DeviceToLogicalX( 1 ) - DC->DeviceToLogicalX( 0 );
int sly = DC->DeviceToLogicalY( 1 ) - DC->DeviceToLogicalY( 0 );
bool mirrored = (slx > 0 && sly < 0) || (slx < 0 && sly > 0);
if( dx == 0 ) /* segment vertical */ // first edge
{ start.x = 0;
dwx = radius; start.y = radius;
if( dy >= 0 ) end.x = len;
dwx = -dwx; end.y = radius;
RotatePoint( &start, angle);
RotatePoint( &end, angle);
sx1 = x1 - dwx; start += org;
sy1 = y1; end += org;
ex1 = x2 - dwx; DC->DrawLine( start, end );
ey1 = y2;
DC->DrawLine( sx1, sy1, ex1, ey1 ); // first rounded end
end.x = 0;
end.y = -radius;
RotatePoint( &end, angle);
end += org;
sx2 = x1 + dwx; if( !mirrored )
sy2 = y1; DC->DrawArc( end, start, org );
ex2 = x2 + dwx;
ey2 = y2;
DC->DrawLine( sx2, sy2, ex2, ey2 );
}
else if( dy == 0 ) /* segment horizontal */
{
dwy = radius;
if( dx < 0 )
dwy = -dwy;
sx1 = x1;
sy1 = y1 - dwy;
ex1 = x2;
ey1 = y2 - dwy;
DC->DrawLine( sx1, sy1, ex1, ey1 );
sx2 = x1;
sy2 = y1 + dwy;
ex2 = x2;
ey2 = y2 + dwy;
DC->DrawLine( sx2, sy2, ex2, ey2 );
}
else else
{ DC->DrawArc( start, end, org );
if( std::abs( dx ) == std::abs( dy ) ) // segment 45 degrees
{
dwx = dwy = ( (width * 5) + 4 ) / 7; // = width / 2 * 0.707
if( dy < 0 )
{
if( dx <= 0 )
{
dwx = -dwx; swap_ends = true;
}
}
else // dy >= 0
{
if( dx > 0 )
{
dwy = -dwy; swap_ends = true;
}
else
swap_ends = true;
}
}
else
{
double delta_angle = ArcTangente( dy, dx );
dwx = 0;
dwy = width;
RotatePoint( &dwx, &dwy, -delta_angle );
}
dwx2 = dwx >> 1;
dwy2 = dwy >> 1;
sx1 = x1 - dwx2;
sy1 = y1 - dwy2;
ex1 = x2 - dwx2; // second edge
ey1 = y2 - dwy2; start.x = len;
start.y = -radius;
RotatePoint( &start, angle);
start += org;
DC->DrawLine( sx1, sy1, ex1, ey1 ); DC->DrawLine( start, end );
sx2 = x1 + dwx2; // second rounded end
sy2 = y1 + dwy2; end.x = len;
end.y = radius;
RotatePoint( &end, angle);
end += org;
ex2 = x2 + dwx2; if( !mirrored )
ey2 = y2 + dwy2; DC->DrawArc( end.x, end.y, start.x, start.y, x2, y2 );
DC->DrawLine( sx2, sy2, ex2, ey2 );
}
if( swap_ends )
{
DC->DrawArc( sx2, sy2, sx1, sy1, x1, y1 );
DC->DrawArc( ex1, ey1, ex2, ey2, x2, y2 );
}
else else
{ DC->DrawArc( start.x, start.y, end.x, end.y, x2, y2 );
DC->DrawArc( sx1, sy1, sx2, sy2, x1, y1 );
DC->DrawArc( ex2, ey2, ex1, ey1, x2, y2 );
}
} }

View File

@ -19,6 +19,8 @@ set( EESCHEMA_DLGS
dialogs/dialog_bom.cpp dialogs/dialog_bom.cpp
dialogs/dialog_bom_base.cpp dialogs/dialog_bom_base.cpp
dialogs/dialog_bom_cfg_keywords.cpp dialogs/dialog_bom_cfg_keywords.cpp
dialogs/dialog_choose_component.cpp
dialogs/dialog_choose_component_base.cpp
dialogs/dialog_lib_edit_text.cpp dialogs/dialog_lib_edit_text.cpp
dialogs/dialog_lib_edit_text_base.cpp dialogs/dialog_lib_edit_text_base.cpp
dialogs/dialog_edit_component_in_lib.cpp dialogs/dialog_edit_component_in_lib.cpp
@ -88,6 +90,7 @@ set( EESCHEMA_SRCS
files-io.cpp files-io.cpp
find.cpp find.cpp
getpart.cpp getpart.cpp
component_tree_search_container.cpp
hierarch.cpp hierarch.cpp
hotkeys.cpp hotkeys.cpp
libarch.cpp libarch.cpp

View File

@ -0,0 +1,357 @@
/* -*- c++ -*-
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
* Copyright (C) 2014 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <component_tree_search_container.h>
#include <algorithm>
#include <boost/foreach.hpp>
#include <set>
#include <wx/string.h>
#include <wx/tokenzr.h>
#include <wx/treectrl.h>
#include <wx/arrstr.h>
#include <class_library.h>
#include <macros.h>
// Each node gets this lowest score initially, without any matches applied. Matches
// will then increase this score depending on match quality.
// This way, an empty search string will result in all components being displayed as they
// have the minimum score. However, in that case, we avoid expanding all the nodes asd the
// result is very unspecific.
static const unsigned kLowestDefaultScore = 1;
struct COMPONENT_TREE_SEARCH_CONTAINER::TREE_NODE
{
TREE_NODE(TREE_NODE* aParent, CMP_LIBRARY* aOwningLib,
const wxString& aName, const wxString& aDisplayInfo,
const wxString& aSearchText,
bool aNormallyExpanded = false)
: Parent( aParent ),
Lib( aOwningLib ),
NormallyExpanded( aNormallyExpanded ),
Name( aName ),
DisplayInfo( aDisplayInfo ),
MatchName( aName.Lower() ),
SearchText( aSearchText.Lower() ),
MatchScore( 0 ), PreviousScore( 0 )
{
}
TREE_NODE* const Parent; ///< NULL if library, pointer to lib-node when component.
CMP_LIBRARY* const Lib; ///< Owning library of this component.
const bool NormallyExpanded; ///< If this is a parent node, should it be unfolded ?
const wxString Name; ///< Exact name as displayed to the user.
const wxString DisplayInfo; ///< Additional info displayed in the tree (description..)
const wxString MatchName; ///< Preprocessed: lowercased display name.
const wxString SearchText; ///< Other text (keywords, description..) to search in.
unsigned MatchScore; ///< Result-Score after UpdateSearchTerm()
unsigned PreviousScore; ///< Optimization: used to see if we need any tree update.
wxTreeItemId TreeId; ///< Tree-ID if stored in the tree (if MatchScore > 0).
};
// Sort tree nodes by reverse match-score (bigger is first), then alphabetically.
// Library nodes (i.e. the ones that don't have a parent) are always sorted before any
// leaf nodes.
bool COMPONENT_TREE_SEARCH_CONTAINER::scoreComparator( const TREE_NODE* a1, const TREE_NODE* a2 )
{
if ( a1->Parent == NULL && a2->Parent != NULL )
return true;
if ( a1->Parent != NULL && a2->Parent == NULL )
return false;
if ( a1->MatchScore != a2->MatchScore )
return a1->MatchScore > a2->MatchScore; // biggest first.
if (a1->Parent != a2->Parent)
return a1->Parent->MatchName.Cmp(a2->Parent->MatchName) < 0;
return a1->MatchName.Cmp( a2->MatchName ) < 0;
}
COMPONENT_TREE_SEARCH_CONTAINER::COMPONENT_TREE_SEARCH_CONTAINER()
: tree( NULL )
{
}
COMPONENT_TREE_SEARCH_CONTAINER::~COMPONENT_TREE_SEARCH_CONTAINER()
{
BOOST_FOREACH( TREE_NODE* node, nodes )
delete node;
nodes.clear();
}
void COMPONENT_TREE_SEARCH_CONTAINER::SetPreselectNode( const wxString& aComponentName )
{
preselect_node_name = aComponentName.Lower();
}
void COMPONENT_TREE_SEARCH_CONTAINER::SetTree( wxTreeCtrl* aTree )
{
tree = aTree;
UpdateSearchTerm( wxEmptyString );
}
void COMPONENT_TREE_SEARCH_CONTAINER::AddLibrary( CMP_LIBRARY& aLib )
{
wxArrayString all_comp;
aLib.GetEntryNames( all_comp );
AddComponentList( aLib.GetName(), all_comp, &aLib, false );
}
void COMPONENT_TREE_SEARCH_CONTAINER::AddComponentList( const wxString& aNodeName,
const wxArrayString& aComponentNameList,
CMP_LIBRARY* aOptionalLib,
bool aNormallyExpanded )
{
TREE_NODE* parent_node = new TREE_NODE( NULL, NULL, aNodeName, wxEmptyString, wxEmptyString,
aNormallyExpanded );
nodes.push_back( parent_node );
BOOST_FOREACH( const wxString& cName, aComponentNameList )
{
LIB_COMPONENT *c;
if (aOptionalLib)
c = aOptionalLib->FindComponent( cName );
else
c = CMP_LIBRARY::FindLibraryComponent( cName, wxEmptyString );
if (c == NULL)
continue;
wxString keywords, descriptions;
wxString display_info;
for ( size_t i = 0; i < c->GetAliasCount(); ++i )
{
LIB_ALIAS *a = c->GetAlias( i );
keywords += a->GetKeyWords();
descriptions += a->GetDescription();
if ( display_info.empty() && !a->GetDescription().empty() )
{
// Preformatting. Unfortunately, the tree widget doesn't have columns
display_info.Printf( wxT(" %s[ %s ]"),
( cName.length() <= 8 ) ? wxT("\t\t") : wxT("\t"),
GetChars( a->GetDescription() ) );
}
}
// If there are no keywords, we give a couple of characters whitespace penalty. We want
// a component with a search-term found in the keywords score slightly higher than another
// component without keywords, but that term in the descriptions.
wxString search_text = ( !keywords.empty() ) ? keywords : wxT(" ");
search_text += descriptions;
nodes.push_back( new TREE_NODE( parent_node, c->GetLibrary(),
cName, display_info, search_text ) );
}
}
LIB_COMPONENT* COMPONENT_TREE_SEARCH_CONTAINER::GetSelectedComponent()
{
const wxTreeItemId& select_id = tree->GetSelection();
BOOST_FOREACH( TREE_NODE* node, nodes )
{
if ( node->MatchScore > 0 && node->TreeId == select_id && node->Lib )
return node->Lib->FindComponent( node->Name );
}
return NULL;
}
// Creates a score depending on the position of a string match. If the position
// is 0 (= prefix match), this returns the maximum score. This degrades until
// pos == max, which returns a score of 0;
// Evertyhing else beyond that is just 0. Only values >= 0 allowed for position and max.
//
// @param aPosition is the position a string has been found in a substring.
// @param aMaximum is the maximum score this function returns.
// @return position dependent score.
static int matchPosScore(int aPosition, int aMaximum)
{
return ( aPosition < aMaximum ) ? aMaximum - aPosition : 0;
}
void COMPONENT_TREE_SEARCH_CONTAINER::UpdateSearchTerm( const wxString& aSearch )
{
if ( tree == NULL )
return;
// We score the list by going through it several time, essentially with a complexity
// of O(n). For the default library of 2000+ items, this typically takes less than 5ms
// on an i5. Good enough, no index needed.
// Initial AND condition: Leaf nodes are considered to match initially.
BOOST_FOREACH( TREE_NODE* node, nodes )
{
node->PreviousScore = node->MatchScore;
node->MatchScore = node->Parent ? kLowestDefaultScore : 0; // start-match for leafs.
}
// Create match scores for each node for all the terms, that come space-separated.
// Scoring adds up values for each term according to importance of the match. If a term does
// not match at all, the result is thrown out of the results (AND semantics).
// From high to low
// - Exact match for a ccmponent name gives the highest score, trumping all.
// - A positional score depending of where a term is found as substring; prefix-match: high.
// - substring-match in library name.
// - substring match in keywords and descriptions with positional score. Keywords come
// first so contribute more to the score.
//
// This is of course subject to tweaking.
wxStringTokenizer tokenizer( aSearch );
while ( tokenizer.HasMoreTokens() )
{
const wxString term = tokenizer.GetNextToken().Lower();
BOOST_FOREACH( TREE_NODE* node, nodes )
{
if ( node->Parent == NULL)
continue; // Library nodes are not scored here.
if ( node->MatchScore == 0)
continue; // Leaf node without score are out of the game.
// Keywords and description we only count if the match string is at
// least two characters long. That avoids spurious, low quality
// matches. Most abbreviations are at three characters long.
int found_pos;
if ( term == node->MatchName )
node->MatchScore += 1000; // exact match. High score :)
else if ( (found_pos = node->MatchName.Find( term ) ) != wxNOT_FOUND )
{
// Substring match. The earlier in the string the better. score += 20..40
node->MatchScore += matchPosScore( found_pos, 20 ) + 20;
}
else if ( node->Parent->MatchName.Find( term ) != wxNOT_FOUND )
node->MatchScore += 19; // parent name matches. score += 19
else if ( ( found_pos = node->SearchText.Find( term ) ) != wxNOT_FOUND )
{
// If we have a very short search term (like one or two letters), we don't want
// to accumulate scores if they just happen to be in keywords or description as
// almost any one or two-letter combination shows up in there.
// For longer terms, we add scores 1..18 for positional match (higher in the
// front, where the keywords are). score += 0..18
node->MatchScore += ( ( term.length() >= 2 )
? matchPosScore( found_pos, 17 ) + 1
: 0 );
}
else
node->MatchScore = 0; // No match. That's it for this item.
}
}
// Parent nodes have the maximum score seen in any of their children.
unsigned highest_score_seen = 0;
bool any_change = false;
BOOST_FOREACH( TREE_NODE* node, nodes )
{
if ( node->Parent == NULL )
continue;
any_change |= (node->PreviousScore != node->MatchScore);
node->Parent->MatchScore = std::max( node->Parent->MatchScore, node->MatchScore );
highest_score_seen = std::max( highest_score_seen, node->MatchScore );
}
// The tree update might be slow, so we want to bail out if there is no change.
if ( !any_change )
return;
// Now: sort all items according to match score, libraries first.
std::sort( nodes.begin(), nodes.end(), scoreComparator );
// Fill the tree with all items that have a match. Re-arranging, adding and removing changed
// items is pretty complex, so we just re-build the whole tree.
tree->Freeze();
tree->DeleteAllItems();
const wxTreeItemId root_id = tree->AddRoot( wxEmptyString );
const TREE_NODE* first_match = NULL;
const TREE_NODE* preselected_node = NULL;
BOOST_FOREACH( TREE_NODE* node, nodes )
{
if ( node->MatchScore == 0 )
continue;
// If we have nodes that go beyond the default score, suppress nodes that
// have the default score. That can happen if they have an honary += 0 score due to
// some one-letter match in the keyword or description. In this case, we prefer matches
// that just have higher scores. Improves relevancy and performance as the tree has to
// display less items.
if ( highest_score_seen > kLowestDefaultScore && node->MatchScore == kLowestDefaultScore )
continue;
const bool isLeaf = ( node->Parent != NULL );
wxString node_text;
#if 0
// Node text with scoring information for debugging
node_text.Printf( wxT("%s (s=%u)%s"), GetChars(node->Name),
node->MatchScore, GetChars(node->DisplayInfo));
#else
node_text = node->Name + node->DisplayInfo;
#endif
node->TreeId = tree->AppendItem( !isLeaf ? root_id : node->Parent->TreeId, node_text );
// If we are a leaf node, we might need to expand.
if ( isLeaf )
{
if ( node->MatchScore > kLowestDefaultScore )
{
tree->EnsureVisible( node->TreeId );
if ( first_match == NULL )
first_match = node; // The "I am feeling lucky" element.
}
if ( preselected_node == NULL && node->MatchName == preselect_node_name )
preselected_node = node;
}
if ( !isLeaf && node->NormallyExpanded )
tree->Expand( node->TreeId );
}
if ( first_match ) // Highest score search match pre-selected.
tree->SelectItem( first_match->TreeId );
else if ( preselected_node ) // No search, so history item preselected.
tree->SelectItem( preselected_node->TreeId );
tree->Thaw();
}

View File

@ -0,0 +1,108 @@
/* -*- c++ -*-
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
* Copyright (C) 2014 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http: *www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http: *www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <vector>
#include <wx/string.h>
class LIB_COMPONENT;
class CMP_LIBRARY;
class wxTreeCtrl;
class wxArrayString;
// class COMPONENT_TREE_SEARCH_CONTAINER
// A container for components that allows to search them matching their name, keywords
// and descripotions, updating a wxTreeCtrl with the results (toplevel nodes:
// libraries, leafs: components), scored by relevance.
//
// The scored result list is adpated on each update on the search-term: this allows
// to have a search-as-you-type experience.
class COMPONENT_TREE_SEARCH_CONTAINER
{
public:
COMPONENT_TREE_SEARCH_CONTAINER();
~COMPONENT_TREE_SEARCH_CONTAINER();
/** Function AddLibrary
* Add the components of this library to be searched.
* To be called in the setup phase to fill this container.
*
* @param aLib containting all the components to be added.
*/
void AddLibrary( CMP_LIBRARY& aLib );
/** Function AddComponentList
* Add the given list of components, given by name, to be searched.
* To be called in the setup phase to fill this container.
*
* @param aNodeName The parent node name the components will show up as leaf.
* @param aComponentNameList List of component names.
* @param aOptionalLib Library to look up the component names (if NULL: global lookup)
* @param aNormallyExpanded Should the node in the tree be expanded by default.
*/
void AddComponentList( const wxString& aNodeName, const wxArrayString& aComponentNameList,
CMP_LIBRARY* aOptionalLib, bool aNormallyExpanded );
/** Function SetPreselectNode
* Set the component name to be selected in absence of any search-result.
*
* @param aComponentName the component name to be selected.
*/
void SetPreselectNode( const wxString& aComponentName );
/** Function SetTree
* Set the tree to be manipulated.
* Each update of the search term will update the tree, with the most
* scoring component at the top and selected. If a preselect node is set, this
* is displayed. Does not take ownership of the tree.
*
* @param aTree that is to be modified on search updates.
*/
void SetTree( wxTreeCtrl* aTree );
/** Function UpdateSearchTerm
* Update the search string provided by the user and narrow down the result list.
*
* This string is a space-separated list of terms, each of which
* is applied to the components list to narrow it down. Results are scored by
* relevancy (e.g. exact match scores higher than prefix-match which in turn scores
* higher than substring match). This updates the search and tree on each call.
*
* @param aSearch is the user-provided search string.
*/
void UpdateSearchTerm( const wxString& aSearch );
/** Function GetSelectedComponent
*
* @return the selected component or NULL if there is none.
*/
LIB_COMPONENT* GetSelectedComponent();
private:
struct TREE_NODE;
static bool scoreComparator( const TREE_NODE* a1, const TREE_NODE* a2 );
std::vector<TREE_NODE*> nodes;
wxString preselect_node_name;
wxTreeCtrl* tree;
};

View File

@ -0,0 +1,259 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
* Copyright (C) 2014 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <dialog_choose_component.h>
#include <set>
#include <boost/foreach.hpp>
#include <wx/tokenzr.h>
#include <class_library.h>
#include <component_tree_search_container.h>
#include <sch_base_frame.h>
// Tree navigation helpers.
static wxTreeItemId GetPrevItem( const wxTreeCtrl& tree, const wxTreeItemId& item );
static wxTreeItemId GetNextItem( const wxTreeCtrl& tree, const wxTreeItemId& item );
// Combine descriptions of all aliases from given component.
static wxString combineDescriptions( LIB_COMPONENT* aComponent )
{
std::set<wxString> descriptions;
for( size_t i = 0; i < aComponent->GetAliasCount(); ++i )
{
LIB_ALIAS* a = aComponent->GetAlias( i );
if ( !a->GetDescription().empty() )
descriptions.insert( a->GetDescription() );
}
wxString result;
BOOST_FOREACH( const wxString& s, descriptions )
result += s + wxT("\n");
return result;
}
// Combine keywords. Keywords come as a string, but are considered space-separated
// individual words. Return a string with a unique set of these.
static wxString combineKeywords( LIB_COMPONENT* aComponent )
{
std::set<wxString> keywords;
for( size_t i = 0; i < aComponent->GetAliasCount(); ++i )
{
LIB_ALIAS* a = aComponent->GetAlias( i );
wxStringTokenizer tokenizer( a->GetKeyWords() );
while ( tokenizer.HasMoreTokens() )
keywords.insert( tokenizer.GetNextToken() );
}
wxString result;
BOOST_FOREACH( const wxString& s, keywords )
result += s + wxT(" ");
return result;
}
DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxString& aTitle,
COMPONENT_TREE_SEARCH_CONTAINER* aContainer )
: DIALOG_CHOOSE_COMPONENT_BASE( aParent, wxID_ANY, aTitle ),
m_search_container( aContainer ),
m_selected_component( NULL ),
m_external_browser_requested( false ),
m_received_doubleclick_in_tree( false )
{
// TODO: restore last size user was choosing.
m_search_container->SetTree( m_libraryComponentTree );
m_searchBox->SetFocus();
m_componentDetails->SetEditable( false );
}
// After this dialog is done: return the component that has been selected, or an
// empty string if there is none.
wxString DIALOG_CHOOSE_COMPONENT::GetSelectedComponentName() const
{
if ( m_selected_component == NULL )
return wxEmptyString;
return m_selected_component->GetName();
}
void DIALOG_CHOOSE_COMPONENT::OnSearchBoxChange( wxCommandEvent& aEvent )
{
m_selected_component = NULL;
m_search_container->UpdateSearchTerm( m_searchBox->GetLineText(0) );
updateSelection();
}
void DIALOG_CHOOSE_COMPONENT::OnSearchBoxEnter( wxCommandEvent& aEvent )
{
EndModal( wxID_OK ); // We are done.
}
void DIALOG_CHOOSE_COMPONENT::SelectIfValid( const wxTreeItemId& aTreeId )
{
if ( aTreeId.IsOk() && aTreeId != m_libraryComponentTree->GetRootItem() )
m_libraryComponentTree->SelectItem( aTreeId );
}
void DIALOG_CHOOSE_COMPONENT::OnInterceptSearchBoxKey( wxKeyEvent& aKeyStroke )
{
// Cursor up/down are forwarded to the tree. This is done by intercepting some navigational
// keystrokes that normally would go to the text search box (which has the focus by default).
const wxTreeItemId sel = m_libraryComponentTree->GetSelection();
switch ( aKeyStroke.GetKeyCode() )
{
case WXK_UP:
SelectIfValid( GetPrevItem( *m_libraryComponentTree, sel ) );
break;
case WXK_DOWN:
SelectIfValid( GetNextItem( *m_libraryComponentTree, sel ) );
break;
default:
aKeyStroke.Skip(); // Pass on to search box.
break;
}
}
void DIALOG_CHOOSE_COMPONENT::OnTreeSelect( wxTreeEvent& aEvent )
{
updateSelection();
}
void DIALOG_CHOOSE_COMPONENT::OnDoubleClickTreeSelect( wxTreeEvent& aEvent )
{
updateSelection();
if ( m_selected_component == NULL )
return;
// Ok, got selection. We don't just end the modal dialog here, but
// wait for the MouseUp event to occur. Otherwise something (broken?)
// happens: the dialog will close and will deliver the 'MouseUp' event
// to the eeschema canvas, that will immediately place the component.
m_received_doubleclick_in_tree = true;
}
void DIALOG_CHOOSE_COMPONENT::OnTreeMouseUp( wxMouseEvent& aMouseEvent )
{
if ( m_received_doubleclick_in_tree )
EndModal( wxID_OK ); // We are done (see OnDoubleClickTreeSelect)
else
aMouseEvent.Skip(); // Let upstream handle it.
}
void DIALOG_CHOOSE_COMPONENT::OnStartComponentBrowser( wxMouseEvent& aEvent )
{
m_external_browser_requested = true;
EndModal( wxID_OK ); // We are done.
}
void DIALOG_CHOOSE_COMPONENT::updateSelection()
{
LIB_COMPONENT* selection = m_search_container->GetSelectedComponent();
if ( selection == m_selected_component )
return; // no change.
m_selected_component = selection;
m_componentDetails->Clear();
if ( m_selected_component == NULL )
return;
wxFont font_normal = m_componentDetails->GetFont();
wxFont font_bold = m_componentDetails->GetFont();
font_bold.SetWeight( wxFONTWEIGHT_BOLD );
wxTextAttr headline_attribute;
headline_attribute.SetFont(font_bold);
wxTextAttr text_attribute;
text_attribute.SetFont(font_normal);
const wxString description = combineDescriptions( selection );
if ( !description.empty() )
{
m_componentDetails->SetDefaultStyle( headline_attribute );
m_componentDetails->AppendText( _("Description\n") );
m_componentDetails->SetDefaultStyle( text_attribute );
m_componentDetails->AppendText( description );
m_componentDetails->AppendText( wxT("\n") );
}
const wxString keywords = combineKeywords( selection );
if ( !keywords.empty() )
{
m_componentDetails->SetDefaultStyle( headline_attribute );
m_componentDetails->AppendText( _("Keywords\n") );
m_componentDetails->SetDefaultStyle( text_attribute );
m_componentDetails->AppendText( keywords );
}
m_componentDetails->SetInsertionPoint( 0 ); // scroll up.
}
static wxTreeItemId GetPrevItem( const wxTreeCtrl& tree, const wxTreeItemId& item )
{
wxTreeItemId prevItem = tree.GetPrevSibling( item );
if ( !prevItem.IsOk() )
{
const wxTreeItemId parent = tree.GetItemParent( item );
prevItem = tree.GetLastChild( tree.GetPrevSibling( parent ) );
}
return prevItem;
}
static wxTreeItemId GetNextItem( const wxTreeCtrl& tree, const wxTreeItemId& item )
{
wxTreeItemId nextItem = tree.GetNextSibling( item );
if ( !nextItem.IsOk() )
{
const wxTreeItemId parent = tree.GetItemParent( item );
wxTreeItemIdValue dummy;
nextItem = tree.GetFirstChild( tree.GetNextSibling( parent ), dummy );
}
return nextItem;
}

View File

@ -0,0 +1,69 @@
/* -*- c++ -*-
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
* Copyright (C) 2014 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <dialog_choose_component_base.h>
class COMPONENT_TREE_SEARCH_CONTAINER;
class LIB_COMPONENT;
class wxTreeItemId;
class DIALOG_CHOOSE_COMPONENT : public DIALOG_CHOOSE_COMPONENT_BASE
{
public:
DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxString& aTitle,
COMPONENT_TREE_SEARCH_CONTAINER* aSearch_container );
/** Function GetSelectedComponentName
* To be called after this dialog returns from ShowModal().
*
* @return the component that has been selected, or an empty string if there is none.
*/
wxString GetSelectedComponentName() const;
/** Function IsExternalBrowserSelected
*
* @return true, iff the browser pressed the browsing button.
*/
bool IsExternalBrowserSelected() const { return m_external_browser_requested; }
protected:
virtual void OnSearchBoxChange( wxCommandEvent& aEvent );
virtual void OnSearchBoxEnter( wxCommandEvent& aEvent );
virtual void OnInterceptSearchBoxKey( wxKeyEvent& aEvent );
virtual void OnTreeSelect( wxTreeEvent& aEvent );
virtual void OnDoubleClickTreeSelect( wxTreeEvent& aEvent );
virtual void OnTreeMouseUp( wxMouseEvent& aMouseEvent );
virtual void OnStartComponentBrowser( wxMouseEvent& aEvent );
private:
void updateSelection();
void SelectIfValid( const wxTreeItemId& aTreeId );
COMPONENT_TREE_SEARCH_CONTAINER* const m_search_container;
LIB_COMPONENT* m_selected_component;
bool m_external_browser_requested;
bool m_received_doubleclick_in_tree;
};

View File

@ -0,0 +1,109 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Nov 6 2013)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "dialog_choose_component_base.h"
///////////////////////////////////////////////////////////////////////////
DIALOG_CHOOSE_COMPONENT_BASE::DIALOG_CHOOSE_COMPONENT_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxSize( 450,-1 ), wxDefaultSize );
wxBoxSizer* bSizer1;
bSizer1 = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bSearchSizer;
bSearchSizer = new wxBoxSizer( wxHORIZONTAL );
m_searchLabel = new wxStaticText( this, wxID_ANY, wxT("Search"), wxDefaultPosition, wxDefaultSize, 0 );
m_searchLabel->Wrap( -1 );
bSearchSizer->Add( m_searchLabel, 0, wxALL, 5 );
m_searchBox = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
bSearchSizer->Add( m_searchBox, 1, wxALL, 5 );
bSizer1->Add( bSearchSizer, 0, wxEXPAND, 5 );
m_libraryComponentTree = new wxTreeCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE|wxTR_HIDE_ROOT );
m_libraryComponentTree->SetMinSize( wxSize( -1,50 ) );
bSizer1->Add( m_libraryComponentTree, 2, wxALL|wxEXPAND, 5 );
wxBoxSizer* bSizer3;
bSizer3 = new wxBoxSizer( wxHORIZONTAL );
m_componentView = new wxStaticText( this, wxID_ANY, wxT("TODO\n(mini. comp image)"), wxDefaultPosition, wxSize( 100,100 ), 0 );
m_componentView->Wrap( -1 );
m_componentView->SetMinSize( wxSize( 100,100 ) );
bSizer3->Add( m_componentView, 0, wxALL, 5 );
wxBoxSizer* bSizer6;
bSizer6 = new wxBoxSizer( wxVERTICAL );
m_componentDetails = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,100 ), wxTE_MULTILINE );
bSizer6->Add( m_componentDetails, 1, wxALL|wxEXPAND, 5 );
m_unitChoice = new wxComboBox( this, wxID_ANY, wxT("Unit A"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
m_unitChoice->Enable( false );
m_unitChoice->Hide();
bSizer6->Add( m_unitChoice, 0, wxALL, 5 );
bSizer3->Add( bSizer6, 2, wxEXPAND, 5 );
bSizer1->Add( bSizer3, 1, wxEXPAND, 5 );
wxBoxSizer* bSizer5;
bSizer5 = new wxBoxSizer( wxHORIZONTAL );
bSizer5->Add( 0, 0, 1, wxEXPAND, 5 );
m_button = new wxStdDialogButtonSizer();
m_buttonOK = new wxButton( this, wxID_OK );
m_button->AddButton( m_buttonOK );
m_buttonCancel = new wxButton( this, wxID_CANCEL );
m_button->AddButton( m_buttonCancel );
m_button->Realize();
bSizer5->Add( m_button, 0, wxEXPAND, 5 );
bSizer1->Add( bSizer5, 0, wxEXPAND, 5 );
this->SetSizer( bSizer1 );
this->Layout();
this->Centre( wxBOTH );
// Connect Events
m_searchBox->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnInterceptSearchBoxKey ), NULL, this );
m_searchBox->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxChange ), NULL, this );
m_searchBox->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxEnter ), NULL, this );
m_libraryComponentTree->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeMouseUp ), NULL, this );
m_libraryComponentTree->Connect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnDoubleClickTreeSelect ), NULL, this );
m_libraryComponentTree->Connect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeSelect ), NULL, this );
m_componentView->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnStartComponentBrowser ), NULL, this );
}
DIALOG_CHOOSE_COMPONENT_BASE::~DIALOG_CHOOSE_COMPONENT_BASE()
{
// Disconnect Events
m_searchBox->Disconnect( wxEVT_KEY_DOWN, wxKeyEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnInterceptSearchBoxKey ), NULL, this );
m_searchBox->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxChange ), NULL, this );
m_searchBox->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnSearchBoxEnter ), NULL, this );
m_libraryComponentTree->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeMouseUp ), NULL, this );
m_libraryComponentTree->Disconnect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnDoubleClickTreeSelect ), NULL, this );
m_libraryComponentTree->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnTreeSelect ), NULL, this );
m_componentView->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( DIALOG_CHOOSE_COMPONENT_BASE::OnStartComponentBrowser ), NULL, this );
}

View File

@ -0,0 +1,710 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="11" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file">dialog_choose_component_base</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="internationalize">0</property>
<property name="name">dialog_choose_component_base</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="ui_table">UI</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Dialog" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="center">wxBOTH</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="extra_style"></property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size">450,-1</property>
<property name="name">DIALOG_CHOOSE_COMPONENT_BASE</property>
<property name="pos"></property>
<property name="size">450,500</property>
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
<property name="title"></property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnActivate"></event>
<event name="OnActivateApp"></event>
<event name="OnAuiFindManager"></event>
<event name="OnAuiPaneButton"></event>
<event name="OnAuiPaneClose"></event>
<event name="OnAuiPaneMaximize"></event>
<event name="OnAuiPaneRestore"></event>
<event name="OnAuiRender"></event>
<event name="OnChar"></event>
<event name="OnClose"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnHibernate"></event>
<event name="OnIconize"></event>
<event name="OnIdle"></event>
<event name="OnInitDialog"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer1</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">bSearchSizer</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Search</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_searchLabel</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">1</property>
<object class="wxTextCtrl" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size">-1,-1</property>
<property name="maxlength"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_searchBox</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxTE_PROCESS_ENTER</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown">OnInterceptSearchBoxKey</event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText">OnSearchBoxChange</event>
<event name="OnTextEnter">OnSearchBoxEnter</event>
<event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">2</property>
<object class="wxTreeCtrl" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">-1,50</property>
<property name="moveable">1</property>
<property name="name">m_libraryComponentTree</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxTR_DEFAULT_STYLE|wxTR_HIDE_ROOT</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp">OnTreeMouseUp</event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnTreeBeginDrag"></event>
<event name="OnTreeBeginLabelEdit"></event>
<event name="OnTreeBeginRDrag"></event>
<event name="OnTreeDeleteItem"></event>
<event name="OnTreeEndDrag"></event>
<event name="OnTreeEndLabelEdit"></event>
<event name="OnTreeGetInfo"></event>
<event name="OnTreeItemActivated">OnDoubleClickTreeSelect</event>
<event name="OnTreeItemCollapsed"></event>
<event name="OnTreeItemCollapsing"></event>
<event name="OnTreeItemExpanded"></event>
<event name="OnTreeItemExpanding"></event>
<event name="OnTreeItemGetTooltip"></event>
<event name="OnTreeItemMenu"></event>
<event name="OnTreeItemMiddleClick"></event>
<event name="OnTreeItemRightClick"></event>
<event name="OnTreeKeyDown"></event>
<event name="OnTreeSelChanged">OnTreeSelect</event>
<event name="OnTreeSelChanging"></event>
<event name="OnTreeSetInfo"></event>
<event name="OnTreeStateImageClick"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer3</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">TODO&#x0A;(mini. comp image)</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">100,100</property>
<property name="moveable">1</property>
<property name="name">m_componentView</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size">100,100</property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp">OnStartComponentBrowser</event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">2</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer6</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxTextCtrl" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">-1,100</property>
<property name="moveable">1</property>
<property name="name">m_componentDetails</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size">-1,-1</property>
<property name="style">wxTE_MULTILINE</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxComboBox" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices"></property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">0</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">1</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_unitChoice</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">-1</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value">Unit A</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnCombobox"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALIGN_RIGHT</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer5</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxStdDialogButtonSizer" expanded="0">
<property name="Apply">0</property>
<property name="Cancel">1</property>
<property name="ContextHelp">0</property>
<property name="Help">0</property>
<property name="No">0</property>
<property name="OK">1</property>
<property name="Save">0</property>
<property name="Yes">0</property>
<property name="minimum_size"></property>
<property name="name">m_button</property>
<property name="permission">protected</property>
<event name="OnApplyButtonClick"></event>
<event name="OnCancelButtonClick"></event>
<event name="OnContextHelpButtonClick"></event>
<event name="OnHelpButtonClick"></event>
<event name="OnNoButtonClick"></event>
<event name="OnOKButtonClick"></event>
<event name="OnSaveButtonClick"></event>
<event name="OnYesButtonClick"></event>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

View File

@ -0,0 +1,67 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Nov 6 2013)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __DIALOG_CHOOSE_COMPONENT_BASE_H__
#define __DIALOG_CHOOSE_COMPONENT_BASE_H__
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
class DIALOG_SHIM;
#include "dialog_shim.h"
#include <wx/string.h>
#include <wx/stattext.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/textctrl.h>
#include <wx/sizer.h>
#include <wx/treectrl.h>
#include <wx/combobox.h>
#include <wx/button.h>
#include <wx/dialog.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_CHOOSE_COMPONENT_BASE
///////////////////////////////////////////////////////////////////////////////
class DIALOG_CHOOSE_COMPONENT_BASE : public DIALOG_SHIM
{
private:
protected:
wxStaticText* m_searchLabel;
wxTextCtrl* m_searchBox;
wxTreeCtrl* m_libraryComponentTree;
wxStaticText* m_componentView;
wxTextCtrl* m_componentDetails;
wxComboBox* m_unitChoice;
wxStdDialogButtonSizer* m_button;
wxButton* m_buttonOK;
wxButton* m_buttonCancel;
// Virtual event handlers, overide them in your derived class
virtual void OnInterceptSearchBoxKey( wxKeyEvent& event ) { event.Skip(); }
virtual void OnSearchBoxChange( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSearchBoxEnter( wxCommandEvent& event ) { event.Skip(); }
virtual void OnTreeMouseUp( wxMouseEvent& event ) { event.Skip(); }
virtual void OnDoubleClickTreeSelect( wxTreeEvent& event ) { event.Skip(); }
virtual void OnTreeSelect( wxTreeEvent& event ) { event.Skip(); }
virtual void OnStartComponentBrowser( wxMouseEvent& event ) { event.Skip(); }
public:
DIALOG_CHOOSE_COMPONENT_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 450,500 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
~DIALOG_CHOOSE_COMPONENT_BASE();
};
#endif //__DIALOG_CHOOSE_COMPONENT_BASE_H__

File diff suppressed because it is too large Load Diff

View File

@ -45,11 +45,14 @@
#include <viewlib_frame.h> #include <viewlib_frame.h>
#include <eeschema_id.h> #include <eeschema_id.h>
#include <dialog_choose_component.h>
#include <component_tree_search_container.h>
#include <dialog_get_component.h> #include <dialog_get_component.h>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
// TODO(hzeller): would be good if we could give a pre-selected component.
wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void ) wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void )
{ {
wxSemaphore semaphore( 0, 1 ); wxSemaphore semaphore( 0, 1 );
@ -76,118 +79,66 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void )
return cmpname; return cmpname;
} }
wxString SCH_BASE_FRAME::SelectComponentFromLibrary( const wxString& aLibname, wxString SCH_BASE_FRAME::SelectComponentFromLibrary( const wxString& aLibname,
wxArrayString& aHistoryList, wxArrayString& aHistoryList,
bool aUseLibBrowser, bool aUseLibBrowser,
int* aUnit, int* aUnit,
int* aConvert ) int* aConvert )
{ {
int CmpCount = 0; int cmpCount = 0;
LIB_COMPONENT* libEntry = NULL; wxString dialogTitle;
CMP_LIBRARY* currLibrary = NULL;
wxString cmpName, keys, msg; COMPONENT_TREE_SEARCH_CONTAINER search_container; // Container doing search-as-you-type
bool allowWildSeach = true;
if( !aLibname.IsEmpty() ) if( !aLibname.IsEmpty() )
{ {
currLibrary = CMP_LIBRARY::FindLibrary( aLibname ); CMP_LIBRARY* currLibrary = CMP_LIBRARY::FindLibrary( aLibname );
if( currLibrary != NULL ) if( currLibrary != NULL )
CmpCount = currLibrary->GetCount(); {
cmpCount = currLibrary->GetCount();
search_container.AddLibrary( *currLibrary );
}
} }
else else
{ {
BOOST_FOREACH( CMP_LIBRARY& lib, CMP_LIBRARY::GetLibraryList() ) BOOST_FOREACH( CMP_LIBRARY& lib, CMP_LIBRARY::GetLibraryList() )
{ {
CmpCount += lib.GetCount(); cmpCount += lib.GetCount();
search_container.AddLibrary( lib );
} }
} }
// Ask for a component name or key words if( !aHistoryList.empty() )
msg.Printf( _( "Component selection (%d items loaded):" ), CmpCount ); {
// This is good for a transition for experineced users: giving them a History. Ideally,
// we actually make this part even faster to access with a popup on ALT-a or something.
search_container.AddComponentList( _("-- History --"), aHistoryList, NULL, true );
search_container.SetPreselectNode( aHistoryList[0] );
}
DIALOG_GET_COMPONENT dlg( this, aHistoryList, msg, aUseLibBrowser ); dialogTitle.Printf( _( "Choose Component (%d items loaded)" ), cmpCount );
DIALOG_CHOOSE_COMPONENT dlg( this, dialogTitle, &search_container );
if( aHistoryList.GetCount() )
dlg.SetComponentName( aHistoryList[0] );
if( dlg.ShowModal() == wxID_CANCEL ) if( dlg.ShowModal() == wxID_CANCEL )
return wxEmptyString; return wxEmptyString;
if( dlg.m_GetExtraFunction ) wxString cmpName = dlg.GetSelectedComponentName();
if( dlg.IsExternalBrowserSelected() )
{ {
cmpName = SelectComponentFromLibBrowser(); cmpName = SelectComponentFromLibBrowser(); // Would be good if we could pre-select.
if( aUnit ) if( aUnit )
*aUnit = LIB_VIEW_FRAME::GetUnit(); *aUnit = LIB_VIEW_FRAME::GetUnit();
if( aConvert ) if( aConvert )
*aConvert = LIB_VIEW_FRAME::GetConvert(); *aConvert = LIB_VIEW_FRAME::GetConvert();
if( !cmpName.IsEmpty() )
AddHistoryComponentName( aHistoryList, cmpName );
return cmpName;
}
else
cmpName = dlg.GetComponentName();
if( cmpName.IsEmpty() )
return wxEmptyString;
// Here, cmpName contains the component name,
// or "*" if the Select All dialog button was pressed
#ifndef KICAD_KEEPCASE
cmpName.MakeUpper();
#endif
if( dlg.IsKeyword() )
{
allowWildSeach = false;
keys = cmpName;
cmpName = DataBaseGetName( this, keys, cmpName );
if( cmpName.IsEmpty() )
return wxEmptyString;
}
else if( cmpName == wxT( "*" ) )
{
allowWildSeach = false;
if( GetNameOfPartToLoad( this, currLibrary, cmpName ) == 0 )
return wxEmptyString;
}
else if( cmpName.Contains( wxT( "?" ) ) || cmpName.Contains( wxT( "*" ) ) )
{
allowWildSeach = false;
cmpName = DataBaseGetName( this, keys, cmpName );
if( cmpName.IsEmpty() )
return wxEmptyString;
} }
libEntry = CMP_LIBRARY::FindLibraryComponent( cmpName, aLibname ); if ( !cmpName.empty() )
AddHistoryComponentName( aHistoryList, cmpName );
if( !libEntry && allowWildSeach ) // Search with wildcard
{
allowWildSeach = false;
wxString wildname = wxChar( '*' ) + cmpName + wxChar( '*' );
cmpName = wildname;
cmpName = DataBaseGetName( this, keys, cmpName );
if( !cmpName.IsEmpty() )
libEntry = CMP_LIBRARY::FindLibraryComponent( cmpName, aLibname );
if( !libEntry )
return wxEmptyString;
}
if( !libEntry )
{
msg.Printf( _( "Failed to find part <%s> in library" ), GetChars( cmpName ) );
DisplayError( this, msg );
return wxEmptyString;
}
AddHistoryComponentName( aHistoryList, cmpName );
return cmpName; return cmpName;
} }

View File

@ -200,8 +200,16 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
StAngle = ArcTangente( dy - uy0, dx - ux0 ); StAngle = ArcTangente( dy - uy0, dx - ux0 );
EndAngle = StAngle + m_Angle; EndAngle = StAngle + m_Angle;
if( StAngle > EndAngle ) if( !panel->GetPrintMirrored() )
EXCHG( StAngle, EndAngle ); {
if( StAngle > EndAngle )
EXCHG( StAngle, EndAngle );
}
else // Mirrored mode: arc orientation is reversed
{
if( StAngle < EndAngle )
EXCHG( StAngle, EndAngle );
}
if( typeaff == LINE ) if( typeaff == LINE )
{ {

View File

@ -799,7 +799,7 @@ void MODULE::Flip( const wxPoint& aCentre )
// Mirror pads to other side of board about the x axis, i.e. vertically. // Mirror pads to other side of board about the x axis, i.e. vertically.
for( D_PAD* pad = m_Pads; pad; pad = pad->Next() ) for( D_PAD* pad = m_Pads; pad; pad = pad->Next() )
pad->Flip( m_Pos.y ); pad->Flip( m_Pos );
// Mirror reference. // Mirror reference.
text = m_Reference; text = m_Reference;

View File

@ -214,13 +214,13 @@ void D_PAD::SetOrientation( double aAngle )
} }
void D_PAD::Flip( int aTranslationY ) void D_PAD::Flip( const wxPoint& aCentre )
{ {
int y = GetPosition().y - aTranslationY; int y = GetPosition().y - aCentre.y;
y = -y; // invert about x axis. y = -y; // invert about x axis.
y += aTranslationY; y += aCentre.y;
SetY( y ); SetY( y );

View File

@ -167,7 +167,7 @@ public:
void SetOffset( const wxPoint& aOffset ) { m_Offset = aOffset; } void SetOffset( const wxPoint& aOffset ) { m_Offset = aOffset; }
const wxPoint& GetOffset() const { return m_Offset; } const wxPoint& GetOffset() const { return m_Offset; }
void Flip( int aTranslationY ); void Flip( const wxPoint& aCentre ); // Virtual function
/** /**
* Function SetOrientation * Function SetOrientation

View File

@ -169,9 +169,13 @@ bool EDA_APP::OnInit()
bundledir.RemoveLastDir(); bundledir.RemoveLastDir();
// Prepend in PYTHONPATH the content of the bundle libraries ! // Prepend in PYTHONPATH the content of the bundle libraries !
wxSetEnv("PYTHONPATH",((wxGetenv("PYTHONPATH") != NULL ) ? (wxString(wxGetenv("PYTHONPATH")) + ":") : wxString("")) wxSetEnv("PYTHONPATH",((wxGetenv("PYTHONPATH") != NULL ) ? (wxString(wxGetenv("PYTHONPATH")) + ":") : wxString("")) +
+ bundledir.GetPath() + "/Library/Application Support/kicad/scripting" + ":" +
"/Frameworks/wxPython/lib/python2.6/site-packages/wx-3.0-osx_cocoa" ); bundledir.GetPath() + "/PlugIns" + ":" +
wxString( wxGetenv("HOME") ) + "/Library/Application Support/kicad/scripting" +
bundledir.GetPath() +
"/Frameworks/wxPython/lib/python2.6/site-packages/wx-3.0-osx_cocoa"
);
#endif #endif
#endif #endif
// On linux and osx, 2 others paths are // On linux and osx, 2 others paths are

View File

@ -282,7 +282,7 @@ void BOARD_PRINTOUT_CONTROLLER::DrawPage()
if( printMirror ) if( printMirror )
{ {
// Calculate the mirrored center of the board. // Calculate the mirrored center of the board.
center.y = m_Parent->GetPageSizeIU().y - boardBoundingBox.Centre().y; center.x = m_Parent->GetPageSizeIU().x - boardBoundingBox.Centre().x;
} }
offset += center; offset += center;
@ -301,21 +301,29 @@ void BOARD_PRINTOUT_CONTROLLER::DrawPage()
screen->m_IsPrinting = true; screen->m_IsPrinting = true;
EDA_COLOR_T bg_color = g_DrawBgColor; EDA_COLOR_T bg_color = g_DrawBgColor;
// Print frame reference, if reqquested, before
if( m_PrintParams.m_Print_Black_and_White )
GRForceBlackPen( true );
if( m_PrintParams.PrintBorderAndTitleBlock() )
m_Parent->DrawWorkSheet( dc, screen, m_PrintParams.m_PenDefaultSize,
IU_PER_MILS, titleblockFilename );
if( printMirror ) if( printMirror )
{ {
// To plot mirror, we reverse the y axis, and modify the plot y origin // To plot mirror, we reverse the x axis, and modify the plot x origin
dc->SetAxisOrientation( true, true ); dc->SetAxisOrientation( false, false);
/* Plot offset y is moved by the y plot area size in order to have /* Plot offset x is moved by the x plot area size in order to have
* the old draw area in the new draw area, because the draw origin has not moved * the old draw area in the new draw area, because the draw origin has not moved
* (this is the upper left corner) but the Y axis is reversed, therefore the plotting area * (this is the upper left corner) but the X axis is reversed, therefore the plotting area
* is the y coordinate values from - PlotAreaSize.y to 0 */ * is the x coordinate values from - PlotAreaSize.x to 0 */
int y_dc_offset = PlotAreaSizeInPixels.y; int x_dc_offset = PlotAreaSizeInPixels.x;
y_dc_offset = KiROUND( y_dc_offset * userscale ); x_dc_offset = KiROUND( x_dc_offset * userscale );
dc->SetDeviceOrigin( 0, y_dc_offset ); dc->SetDeviceOrigin( x_dc_offset, 0 );
wxLogTrace( tracePrinting, wxT( "Device origin: x=%d, y=%d" ), wxLogTrace( tracePrinting, wxT( "Device origin: x=%d, y=%d" ),
0, y_dc_offset ); x_dc_offset, 0 );
panel->SetClipBox( EDA_RECT( wxPoint( -MAX_VALUE/2, -MAX_VALUE/2 ), panel->SetClipBox( EDA_RECT( wxPoint( -MAX_VALUE/2, -MAX_VALUE/2 ),
panel->GetClipBox()->GetSize() ) ); panel->GetClipBox()->GetSize() ) );
@ -359,13 +367,9 @@ void BOARD_PRINTOUT_CONTROLLER::DrawPage()
printMirror, &m_PrintParams ); printMirror, &m_PrintParams );
GRForceBlackPen( false ); GRForceBlackPen( false );
} }
else
if( m_PrintParams.m_Print_Black_and_White )
GRForceBlackPen( true ); GRForceBlackPen( true );
if( m_PrintParams.PrintBorderAndTitleBlock() )
m_Parent->DrawWorkSheet( dc, screen, m_PrintParams.m_PenDefaultSize,
IU_PER_MILS, titleblockFilename );
#if defined (GERBVIEW) #if defined (GERBVIEW)
// In B&W mode, do not force black pen for Gerbview // In B&W mode, do not force black pen for Gerbview

View File

@ -48,7 +48,7 @@
str_filename = str(filename) str_filename = str(filename)
if str_filename.endswith(".brd"): if str_filename.endswith(".brd"):
format = IO_MGR.LEGACY format = IO_MGR.LEGACY
if str_filename.endswith(".kicad_brd"): if str_filename.endswith(".kicad_pcb"):
format = IO_MGR.KICAD format = IO_MGR.KICAD
return SaveBoard(filename,self,format) return SaveBoard(filename,self,format)

View File

@ -50,10 +50,11 @@ e.SetShape(S_SEGMENT)
module.Add(e) module.Add(e)
# save the PCB to disk # save the PCB to disk
module.SetLibRef("FPC"+str(pads)) fpid = FPID("FPC"+str(pads)) #the name in library
module.SetFPID( fpid )
try: try:
FootprintLibCreate("fpc40.mod") FootprintLibCreate("fpc40.mod")
except: except:
pass # we try to create, but may be it exists already pass # we try to create, but may be it exists already
FootprintSave("fpc40.mod",module) FootprintSave("fpc40.mod",module)

View File

@ -33,10 +33,10 @@ for y in range (0,10):
# save the PCB to disk # save the PCB to disk
pcb.Save("/tmp/my2.kicad_brd") pcb.Save("my2.kicad_pcb")
pcb.Save("/tmp/my2.brd") pcb.Save("my2.brd")
pcb = LoadBoard("/tmp/my2.brd") pcb = LoadBoard("my2.kicad_pcb")
print map( lambda x: x.GetReference() , list(pcb.GetModules())) print map( lambda x: x.GetReference() , list(pcb.GetModules()))

View File

@ -109,18 +109,22 @@ class QFPWizard(pcbnew.FootprintWizardPlugin):
pad_size = pad_size_left_right pad_size = pad_size_left_right
pad_pos_x = -(pad_horizontal_pitch / 2) pad_pos_x = -(pad_horizontal_pitch / 2)
pad_pos_y = (cur_pad % (num_pads / 4)) * pad_pitch - (side_length / 2)
if side == 2: if side == 2:
pad_pos_x = -pad_pos_x pad_pos_x = -pad_pos_x
pad_pos_y = -pad_pos_y
pad_pos_y = (cur_pad % (num_pads / 4)) * pad_pitch - (side_length / 2)
else: else:
pad_size = pad_size_bottom_top pad_size = pad_size_bottom_top
pad_pos_x = (cur_pad % (num_pads / 4)) * pad_pitch - (side_length / 2) pad_pos_x = (cur_pad % (num_pads / 4)) * pad_pitch - (side_length / 2)
pad_pos_y = -(pad_vertical_pitch / 2) pad_pos_y = -(pad_vertical_pitch / 2)
if side == 1: if side == 1:
pad_pos_y = -pad_pos_y pad_pos_y = -pad_pos_y
else:
pad_pos_x = -pad_pos_x
pad_pos = pcbnew.wxPoint(pad_pos_x, pad_pos_y) pad_pos = pcbnew.wxPoint(pad_pos_x, pad_pos_y)

View File

@ -307,7 +307,7 @@ void PCB_EDIT_FRAME::ReCreateHToolbar()
// Access to the scripting console // Access to the scripting console
#ifdef KICAD_SCRIPTING_WXPYTHON #ifdef KICAD_SCRIPTING_WXPYTHON
m_mainToolBar->AddTool( ID_TOOLBARH_PCB_SCRIPTING_CONSOLE, wxEmptyString, m_mainToolBar->AddTool( ID_TOOLBARH_PCB_SCRIPTING_CONSOLE, wxEmptyString,
KiBitmap( book_xpm ), KiBitmap( py_script_xpm ),
_( "Show/Hide the Scripting console" ) ); _( "Show/Hide the Scripting console" ) );
m_mainToolBar->AddSeparator(); m_mainToolBar->AddSeparator();

View File

@ -1,4 +1,5 @@
#!/bin/bash #!/bin/bash
# v 1.1 Supports migration of links (limited to the same directory) - I should add checks..
# usage osx_fixbundle.sh <bundle-name> <bzr_root> # usage osx_fixbundle.sh <bundle-name> <bzr_root>
if [[ ! -f version.h ]]; then if [[ ! -f version.h ]]; then
@ -11,7 +12,6 @@ fi
EXECUTABLES="`find . -name '*.app'`" EXECUTABLES="`find . -name '*.app'`"
# #
# Copies libraries under <bzr_root> in the bundle and relocates them in the binary # Copies libraries under <bzr_root> in the bundle and relocates them in the binary
# #
@ -29,7 +29,11 @@ function fixbundle() {
if [[ "$library" =~ "$bzroot" ]]; then if [[ "$library" =~ "$bzroot" ]]; then
echo "${exec}: Migrating `basename $library` in the bundle" echo "${exec}: Migrating `basename $library` in the bundle"
if [ ! -f ${exec}.app/Contents/Frameworks/`basename $library` ]; then if [ ! -f ${exec}.app/Contents/Frameworks/`basename $library` ]; then
cp -f $library ${execpath}${exec}.app/Contents/Frameworks if [ ! -L $library ]; then
cp -f $library ${execpath}${exec}.app/Contents/Frameworks
else
resolvelink "$library" "`dirname $library`" "${execpath}/${exec}.app/Contents/Frameworks"
fi
fi fi
install_name_tool -change $library @executable_path/../Frameworks/`basename $library` ${execpath}${exec}.app/Contents/MacOS/${exec} install_name_tool -change $library @executable_path/../Frameworks/`basename $library` ${execpath}${exec}.app/Contents/MacOS/${exec}
fi fi
@ -46,7 +50,11 @@ function fixbundle() {
for library in $LIBRARIES; do for library in $LIBRARIES; do
if [[ "$library" =~ "$bzroot" ]]; then if [[ "$library" =~ "$bzroot" ]]; then
if [ ! -f ${exec}.app/Contents/Frameworks/`basename $library` ]; then if [ ! -f ${exec}.app/Contents/Frameworks/`basename $library` ]; then
cp -f $library ${exec}.app/Contents/Frameworks if [ ! -L $library ]; then
cp -f $library ${exec}.app/Contents/Frameworks
else
resolvelink "$library" "`dirname $library`" "${execpath}/${exec}.app/Contents/Frameworks"
fi
fi fi
install_name_tool -change $library @executable_path/../Frameworks/`basename $library` $module install_name_tool -change $library @executable_path/../Frameworks/`basename $library` $module
fi fi
@ -70,7 +78,11 @@ function fixbundle() {
for library in $LIBRARIES; do for library in $LIBRARIES; do
if [[ "$library" =~ "$bzroot" ]]; then if [[ "$library" =~ "$bzroot" ]]; then
if [ ! -f ${exec}.app/Contents/Frameworks/`basename $library` ]; then if [ ! -f ${exec}.app/Contents/Frameworks/`basename $library` ]; then
cp -f $library ${exec}.app/Contents/Frameworks if [ ! -L $library ]; then
cp -f $library ${exec}.app/Contents/Frameworks
else
resolvelink "$library" "`dirname $library`" "${execpath}/${exec}.app/Contents/Frameworks"
fi
echo "copied `basename $library` into bundle" echo "copied `basename $library` into bundle"
(( dynlib_migrate += 1)) (( dynlib_migrate += 1))
fi fi
@ -84,8 +96,27 @@ function fixbundle() {
cd - >/dev/null cd - >/dev/null
} }
#
# This supports only links on the same dir (TODO ?)
#
#fixbundle $1 $2 $3 function resolvelink() {
local srclib="`basename $1`"
local srcpath="$2"
local destpath="$3"
#if is a file i expect a pointed ""
local pointed="`readlink ${srcpath}/${srclib}`"
if [ ! -f ${pointed} ]; then
resolvelink "${pointed}" "${srcpath}" "${destpath}"
echo "Link ${srclib} -> ${pointed} "
(cd "${destpath}"; ln -s "${pointed}" "${srclib}" )
else
echo "Copy ${srcpath}/${srclib} -> ${destpath} "
cp "${srcpath}/${srclib}" ${destpath}
fi
}
for executable in $EXECUTABLES; for executable in $EXECUTABLES;
do do